Things we NEED in the new EDITOR

The best method, like Alexgaby said earlier, is to use Unit - Damage Target, and set damage value to your desire. From what you asked, you will need to use ‘Conversion - Convert Real to Integer’ in order to point to Hero attributes, and make some maths formula.

Good luck making an abilities that scales off of other stats without triggers.

GUI with the other options, duh.

I fixed it, I found the hero attribute thing.

Now I just need to figure out how to add a cooldown to my custom seal of command ability.

I want it to proc on a auto attack, but I want it to only be able to proc once every 10 seconds. The “wait 10 seconds” feature does not do its job.

That’s kind of what SC2 did with its data editor. It was hella powerful but a logistical nightmare to use

@Zartakos

1: An easier method of positioning where our custom abilities are located in the “spellbook ui” in game. Not everyone is a CNC programmer that is familiar with X and Y.

the XY coordinates on icons is the only thing you cant trigger but i think its okay for ppl to learnt that 0,0 is the icon top left and 3,2 is the one bottom right … there arent that many buttons

all those things you called there can EASILY be done with triggers, idk why you need functions for that?

2: A function that remembers where a unit was at the start of the game, so we can do respawn triggers and have packs spawn in the same location as opposed to where they died.

a respawn system on the point where unit originally was palced takes 2 triggers, 2 arrays (unit type and point) and one integer variable

first trigger runs on map init and picks every unit and for each unit picked it does:
set counter = counter +1
set custom value of picked unit to counter
set unit-type array [counter] = unit type of picked unit
set point array [counter] = point of picked unit

second trigger reacts on death of a unit and does:
wait XX.XX sec. (30 or 60 or 485673956, doesnt matter)
create 1 (unit type array [custom value of dying unit]) at (point array [custom value of dying unit]) for player (owner of dying unit) facing random angle
set custom value of last created unit to custom value of dying unit

you refine this system more to filter out bosses, make it work only for certain players and so on, super simple super easy, why do blizzard needs to put work in work such a simple thing?

3: An easier method to to add lets say +100 healing to holy light on items (to manipulate the power of hero abilities with items).

holy light increase without a second trigger (works the same way for all abilities basically):
event:
unit starts effect of an ability
condition:
action:
if then else
or multiple
item carried by hero in slot 1 = youritem
item carried by hero in slot 2 = your item
… repeat for all 6 slots
then
set ability real level field: (triggering unit) ability with ability code: (ability being cast) real level field: amount healed/damaged (should be ‘Hhb1’ for holy light) of level: (level of ability being cast) for (triggering unit) to (ability: (triggering unit) ability (ability being cast) real level field amount healed/damaged ( as i said should be ‘Hhb1’), of (level of (ability being cast) for (triggering unit))) + 100.00)
else
set ability real level field: (triggering unit) ability with ability code: (ability being cast) real level field: amount healed/damaged (should be ‘Hhb1’ for holy light) of level: (level of ability being cast) for (triggering unit) to (ability: (triggering unit) ability (ability being cast) real level field amount healed/damaged ( as i said should be ‘Hhb1’), of (level of (ability being cast) for (triggering unit))) + 0.00)
again super easily done wihtin less than 5 minutes, why do you need something else for that?

4: If you want to take RPG maps to another level, add elemental damage types, but I can live without that. The other 3 are a must imo.

you can easily do elemental dmg as well
lets say your hero has an item that says +7% of your weapon dmg is dealt as additional fire dmg

you create a trigger with no event (you add the event later with another trigger)

condition:
if then else
or multiple
item carried by hero in slot 1 = youritem
item carried by hero in slot 2 = your item
… repeat for all 6 slots
action:
cause damage source to damage triggering unit dealing (damage taken * 0,07 (- XY))
i left -XY in there in case you want something like elemental resistances or smth you just put the resistance in there and will reduce the damage again
to really felsh out the system you do the calculation before to null the value if it becomes negative, but as a short dmeonstration of the basics this is suitable enough.

then you make the other trigger to add the event:
event:
gametime elapsed 0.01 sec
condition:
action:
custom script: call TriggerRegisterAnyUnitEventBJ( gg_trg_YOURTRIGGER, EVENT_PLAYER_UNIT_DAMAGING)

and you are done
for multiple resistances i would instead use hidden abilities on the unit or a hashtable and change the values in on that hidden abilities or in the hashtable on item pickup/drop according to the value of resistance and just call that value in the dmg calculation (also you can leave out the condition checking for the item carried by the hero)

all these are made in a total time of less than 15 min, idk why but i feel like the functions you are asking for are already there and really simple… if u need help with triggering i suggest looking up some tutorials first.
i dont want to be mean but your “serious experience” that you have been talking about seems to come from the terrain editor alone…
i’m always up to offer help with triggers but ur attitude makes not want to. yet i did and if you want further help i’m open for a dm of yours.

note: all these triggers i posted are done from my memory

-Need any and all of the ‘if keyboard button pressed’ events like sc2 trigger Editor.

→ agreed!

-Need the camera locking to cursor option and hiding ui options, also like sc2 trigger editor.

→ create dummy unit with no model, make periodic trigger that always sets the units location to your cursors location (using X and Y of the cursor), pan camera to dummy unit, done

-Fix the server lag with the Wait actions so we can do third person wsad movement properly and easily for custom multiplayer games.

→ use the following in the script code section of your map:

function PolledWait2 takes real duration returns nothing
local timer t
local real timeRemaining

if (duration > 0) then
set t = CreateTimer()
call TimerStart(t, duration, false, null)
loop
set timeRemaining = TimerGetRemaining(t)
exitwhen timeRemaining <= 0
// If we have a bit of time left, skip past 10% of the remaining
// duration instead of checking every interval, to minimize the
// polling on long waits.
if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
call TriggerSleepAction(0.1 * timeRemaining)
else
call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
endif
endloop
call DestroyTimer(t)
set t = null
endif
endfunction

call the function by using the below instead of the normal wait:
Custom script: call PolledWait2(XX.XX) (instead of XX.XX put in your desired wait time)
this wait has no latency issues

-Some sort of integrated model / skin editor would be great, thought i saw this mentioned back in december.

→ i belive this was an announced feature, didnt hear about it anymore, hope its still coming^^

-Would also be great if some animation swapping utility was incorporated. I know i’m gonna want to alpha out a footman’s weapons and replace it with a two-hand sword; it would be nice if i could give him a blademaster’s or paladin’ animation set quickly and easily. I swear somebody made a utility like this for wc3 back in the day.

→ there is still one that does the job for you > “reteras model studio” < you can find the tool on hiveworkshop com

*sorry for the double post but i wanted to answer him in sepperate msg

Thanks for this elaborate reply, i didn’t know about some of this stuff. Hope Reforged editor is good.

Abilities scaling off of stats is quite a pain in the butt, and this is one thing I hope they add at some point.

The solutions others pointed out that changing the damage with triggers before it’s actually dealt, is very unreliable and I wouldn’t do that. Even with Bribe’s Damage Engine it might not be very accurate always. Imagine a situation with a hero who has Shockwave and you try to modify the Shockwave’s damage with triggers. You could do a trigger (with Damage Engine) like this:

Events: 
   DamageModifierEvent becomes equal to 1.00
Conditions: 
   (Current Order) of (DamageEventSource) equal to order(shockwave)
Actions: 
   Set DamageEventAmount = (DamageEventAmount) *  (Hero Strength of (DamageEventSource))

This seems to work fine, but Shockwave actually takes time to travel and there are many units that are going to be damaged. You only have to order the hero to move the second it has cast the ability, and now the current order of the unit is not shockwave anymore, therefore the damage wouldn’t be changed and it would only do the multiplier that you have set for the ability in the Object Editor.

I’ve found that currently the easiest way to make abilities scale with stats is to make the ability have like 50 levels (or whatever the reasonable max stat your hero can get in the map) and then every time there is a chance the hero’s stat could change, set the level of ability to the stat of the hero. For example, if you want Shockwave to do (5 * Strength) damage, you set the 50-level-Shockwave to have 5 damage and make it increase 5 with every level. Then you just set the ability level to the amount of Strength.

Events:
   A unit acquires an item
   A unit gains a level
   etc..
Conditions:
Actions:
   Set level of Shockwave for (Triggering Unit) to (Strength of (Triggering Unit))

This even has the ability to dynamically show the actual numbers of damage in the ability tooltip without (other) triggers.

This is of course flawed in certain situations, but generally works.

Thanks bro for taking your time to go through all of the detail but I have since experimented those methods for 2 weeks, and managed to make all of the things work, in some cases even with simpler methods.

i dont want to be mean but your suggestion is aweful. thats not dynamic scaling. also it takes away leveling from the ability.

if you do as i stated above:

event:
unit starts effect of an ability
condition:
ability being cast = YourAbility
action:
set ability real level field: (triggering unit) ability with ability code: (ability being cast) real level field: ValueFieldName (DamageFieldIndex) of level: (level of ability being cast) for (triggering unit) to (strength of (casting unit) * 0.50)

your ability will do 50% of strength as dmg, you set the dmg of the ability BEFORE any instance of the ability is executed that would actually deal damage, therefore the damage dealt will ALWAYS be accurate as you modify the value field of the ability in the instance the unit starts using it (this is the instance before any damagecalculation, projectile creation).

having a finite number of ability levels would just limit you the stats you can apply via items/attribut systems, you can use lvl ups, you can add % bonus dmg to the ability when using certain items, its really unperformant, large abilities create lagg when the game has to load the ability the first time and increases map size unnecessarily

  • instead of just 0.50 you could also use smth like: 0.45 + (lvl of ability (ability being cast) * 5) wich would make the spell do 50% on lvl 1, 55% on lvl 2, 60% on lvl 3 and so on

Apart from being excessively complicated, especially because you are using inventory slots in your condition when you could simply use a boolean comparison, your method will not work. Or, well, it will work one time. Everytime you will use the spell, it will increase itself because the base value is changed and you are using the base value in the formula without reverting the base value to its default value.

Though using the set ability method is a working way to do this (same I used for the Holy fire example), the code you’ve written will not work. The reason is that you use the Level of the cast ability (the base index is 1) while the data field uses 0 as base index. Therefore, you’d need to use ...of level -> Arithmetic (level of ability being cast for triggering unit - 1

Sabeximus you method is indeed interesting and usable in some cases, but limited and restricted cases. Still usable for many situations, but it is not dynamic and therefore can easilly be lacking.

as i said all the things written are written from memory so its expected to have a few flaws like ability lvl -1 in the second trigger^^

yes you could also check fo item owned = true (again think of it at that moment)
in fact i didnt think about it increasing every time :sweat_smile: yet that can be handled easily too by not taking the units ability field instead just taking the ability field (wich is always the base value set in we - again, its written from memory)

but good thing you double checked and corrected the flaws i made :slight_smile:

1 Like

Oh yeah, that’s actually quite genius. Didn’t even think about those new natives.

What if I design 6 items that have different values of + healing to holy light? For example lawbringer bracer, +50 healing, lawbringer helm +100 healing. Won’t your triggers reset holy light value back to default if I unequip any of the items?

You could use any other real or integer value there is for the item, that doesn’t matter for anything else. Like Priority. Then you can set that amount for the bonus healing you want.

For example:

Events
    Unit - A unit Starts the effect of an ability
Conditions
    (Ability being cast) Equal to Your Ability
Actions
    Set BonusDamage = 0
    For each (Integer YourLoopInteger) from 1 to (Size of inventory for (Triggering unit)), do (Actions)
        Loop - Actions
            -------- This if you want only the biggest bonus number to change the Holy Light Damage --------
            Set TempInteger = (Item: (Item carried by (Triggering unit) in slot YourLoopInteger)'s Integer Field: Priority ('ipri'))
            If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                If - Conditions
                    TempInteger Greater than BonusDamage
                Then - Actions
                    Set BonusDamage = TempInteger
                Else - Actions
            -------- --------------------------------------------------------------------- --------
            -------- The next one if you want all the bonuses to stack --------
            Set TempInteger = (Item: (Item carried by (Triggering unit) in slot YourLoopInteger)'s Integer Field: Priority ('ipri'))
            Set BonusDamage = (BonusDamage + TempInteger)
    Ability - Set Ability: (Unit: (Triggering unit)'s Ability with Ability Code: Holy Light)'s Real Level Field: Amount Healed/Damaged ('Hhb1') of Level: 0 to (200.00 + (Real(BonusDamage)))

Thanks for the advanced trigger example, but I think I’ll just keep it simple and use a condition that checks if an item is equipped by a hero and then have it “set health” to “current health” + 100 for example.

That’s super simple and should cover + healing at least.

Been testing the editor quite a bit the past week, started working on developing a third-person RPG game in a huge map. I gotta say the game itself looks pretty nice, I’m liking the models and some of the new additions to the editor.
x_https://imgur.com/a/rS4PDEY

But yea there’s quite a few things missing (that were actually mostly present in SC2 editor which I figured they would carry over to WC3, but its looking grim so far); things that will make games like this DOA if they don’t include out-of-the-box support for:
disabling user interface;
allowing event keyboard, mouse & mouse wheel presses for WSAD;
mouse-tracking coordinates;
camera support for 3d rotation/looking around by moving mouse around like sc2 had; disabling camera collision so you can easily follow your units through peaks and valleys (neither height offset not pan interpolation are working correctly for this).

The potential is definitely there, but there’s some key things missing right now. Its definitely nice to have the WC3 object editor back though

When requesting things from Blizzard, let’s try to be as technically informed as possible here. These items you listed are already possible in the scripting API now, the problem is that they are not exposed to you easily through GUI.

However, your complaint about more advanced camera controls is somewhat valid. The events for tracking the mouse and interacting with it currently are in 3D game world space, and can’t fire if the mouse is “in the sky” such as if you had a World of Warcraft style of camera.
So, we really need a way to query the 2D screen space location of the mouse. That way, moving the mouse could be made to affect the game similar to WoW.

In the game’s current form, it would be able to recreate a diablo style interaction. You can do click to move, and such.

Here is an example that I made one morning a few weeks ago:

This is currently possible, but without being able to query the 2D screen space X and Y of the mouse, we cannot do advanced camera stuff AND we cannot do a custom inventory with Diablo 2 items that drag with the mouse, since we can’t query “where is the mouse in 2D space” to drag and draw the items at that location.

2 Likes

Basically all of this stuff was incorporated in SC2s trigger editor, which was otherwise practically identical to WC3 but much more improved. Not sure why they would go 10 steps backwards and not include these features.

I’ll give blizz some credit though; looks like the gui can now return a Real for a z-elevation at a point / position of unit which is a useful part of this equation.