• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[Feedback] Request Features for JASS and the World Editor

Status
Not open for further replies.

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
A means to change the text size within strings so things like in the picture below won't happen:
footmenShields.png
heroesNameText.png
heroesNameTextHero.png

The unit classification is over the secondary attack. Same would probably happen with neutral hostile level and the hero's experience bar.
Strangely on heroes it becomes smaller as that of the unit classification. Well, at least heroes don't have their classification visible.

I understand that with the UI natives things could be modified but that's not GUI.
 
Last edited:

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
Triggers with arrays so that if you use loops you turn on/off each trigger based on the array instead of the whole trigger of the loop.

There's a Trigger variable which can have an array. They question is, would setting it as this trigger after the trigger's event fires make it a different trigger so that turning it off won't close all it's array numbers?
 
Level 9
Joined
Jul 20, 2018
Messages
176
Triggers with arrays so that if you use loops you turn on/off each trigger based on the array instead of the whole trigger of the loop.
May you explain this more deeply? I do not understand what you want.

They question is, would setting it as this trigger after the trigger's event fires make it a different trigger so that turning it off won't close all it's array numbers?
trigger array and trigger are different types, you cannot assign to a trigger array variable a single trigger. You can assign a single trigger to specific cell of the array.

GetTriggeringTrigger() (This Trigger in GUI) is just a link to a trigger object. Trigger vars hold links to trigger objects too. So, whenever you assign a trigger to a variable, trigger is not copied. To create a different trigger, you need to call CreateTrigger().
 

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
May you explain this more deeply? I do not understand what you want.
So it doesn't work like

  • Shields Regenerate
    • Events
      • Time - Every 0.50 seconds of game time
    • Conditions
    • Actions
      • For each (Integer ShieldsRegenerateLoopInteger) from 1 to ShieldsIndexInteger, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ShieldsInitialValue[ShieldsRegenerateLoopInteger] Less than ShieldsMaxValue[ShieldsRegenerateLoopInteger]
            • Then - Actions
              • Set ShieldsInitialValue[ShieldsRegenerateLoopInteger] = (ShieldsInitialValue[ShieldsRegenerateLoopInteger] + 1)
              • Game - Display to (All players) the text: ((ShieldValue + (String(ShieldsRegenerateLoopInteger))) + (String(ShieldsMaxValue[ShieldsRegenerateLoopInteger])))
              • Floating Text - Change text of ShieldsFloatingText[ShieldsRegenerateLoopInteger] to ((String(ShieldsInitialValue[ShieldsRegenerateLoopInteger])) + ( / + (String(ShieldsMaxValue[ShieldsRegenerateLoopInteger])))) using font size 8.00
            • Else - Actions
          • -------- Surplus Decrease --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ShieldsInitialValue[ShieldsRegenerateLoopInteger] Greater than ShieldsMaxValue[ShieldsRegenerateLoopInteger]
            • Then - Actions
              • Set ShieldsInitialValue[ShieldsRegenerateLoopInteger] = (ShieldsInitialValue[ShieldsRegenerateLoopInteger] - 1)
              • Game - Display to (All players) the text: ((ShieldValue + (String(ShieldsRegenerateLoopInteger))) + (String(ShieldsMaxValue[ShieldsRegenerateLoopInteger])))
              • Floating Text - Change text of ShieldsFloatingText[ShieldsRegenerateLoopInteger] to ((String(ShieldsInitialValue[ShieldsRegenerateLoopInteger])) + ( / + (String(ShieldsMaxValue[ShieldsRegenerateLoopInteger])))) using font size 8.00
            • Else - Actions
          • -------- Floating Text with Armour --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ShieldsArmourValue[ShieldsRegenerateLoopInteger] Greater than 0
            • Then - Actions
              • Floating Text - Change text of ShieldsArmourFloatingText[ShieldsRegenerateLoopInteger] to ((+ + ((String(ShieldsArmourValue[ShieldsRegenerateLoopInteger])) + ))) using font size 8.00
            • Else - Actions

?

I would need something like this:
Event: Every 0.5s

For Each integer TriggerInteger from 1 to IndexInteger do actions:
Set variable Trigger[TriggerInteger]=this trigger.

If Unit has Buff Shield Bonus then:
Set var ShieldValueInteger=ShieldValueInteger+ShieldBonusValueInteger.
Turn OFF Trigger[TriggerInteger].
Else Turn ON Trigger[TriggerInteger]
 
Level 9
Joined
Jul 20, 2018
Messages
176
For Each integer TriggerInteger from 1 to IndexInteger do actions:
Set variable Trigger[TriggerInteger]=this trigger.

If Unit has Buff Shield Bonus then:
Set var ShieldValueInteger=ShieldValueInteger+ShieldBonusValueInteger.
Turn OFF Trigger[TriggerInteger].
Else Turn ON Trigger[TriggerInteger]
So, all cells of that array will be just pointers to This Trigger.
 
Level 9
Joined
Jul 20, 2018
Messages
176
The idea is for the trigger to turn off only for a certain integer meeting the condition. I don't want the trigger to turn off for every integer value within the loop.
You need to create IndexInteger distinct triggers. Otherwise all cells points to 1 trigger, so passing any of the them to TurnOn\Off function enables\disabled the trigger that a cell points to, i. e. your trigger is either turned off for all integers, or turned on for all integers.

UPD: a trigger is like a unit. You have one unit. You assign this unit to 0..N cells of an unit array (ex. UnitArray). If you call PauseUnit() for any cell of UnitArray from 0 to N, unit will be (un)paused.

WC3 has only 3 value types - boolean, integer and real. Value type = a variable stores value itself. Whenever you do some action witch such vars, you do action with their own value.

Other types are reference, i. e. vars of such type do not hold value, they hold a pointer (reference) to an object. Whenever you do some action witch such vars (except assignment), you do action with the object that is pointed by var. Assignment forces a var to point to another object.

Such types are code, handle and string. Code vars point to a function in code, string vars point to a string in String Table, handle vars point to other objects in memory. Unit and trigger are handle descendants.
 
Last edited:

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
A "Hard-coded" Unit Name action/variable option. Considering the earlier example here [Feedback] Request Features for JASS and the World Editor if you change the unit name it will integrate all that text there instead of the object data field name. There's probably a workaround by creating an arrayed string verified by a condition but that would become annoying when having to create multiple units sharing the same trigger loops. Sure, it's better than copying the loops for each unit type separately.
 

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
A way to make units show as mana/health bars in that they won't be covered by other (usually flying) units. Basically, I need them to always stay on top.

Same happens with special effects. They are also masked by air units if their height is lower than the that of the hovering units.
 
Last edited:

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
Stretching means for units and special effects, not just scale manipulation but also x, y and z modifications of their size. From there on, you could trigger this sort of size according to a unit's size, if for example you'd want a custom shield bar overhead.

Allow to play string animations for special effects too instead of just being forced to select one of the default animation names. What if the used model has other animation names that don't match?

Give us, please :D, the option to attach special FX on units with offset, basically like modifying the attachment point (distance).

Leakless floating text with the capability for a huge amount of it at the same time on various places on the map/screen. Right now, there's a limit of how much of it can be created/seen.
 

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
Means to disable unit control as if that unit would belong to another player so that you could make things like StarCraft Carrier Interceptors.
A workaround would be using another allied player for that since there are 24 now but what if you want a 24 or anyway, more than 12player StarCraft style map?

A way to make units unselectable (Locust) without them gaining idclip powers. This would be useful for units like StarCraft Reaver Scarabs.

(Also, setting the damage type to Spells in a unit's object editor field shows as normal ingame. There's also a Normal armour type aside Medium but both have the same descriptions with the exception of their icons. Normal has the Light armour's icon. Possibly, there might also be defense percentage differences between Normal and Medium. Tested and Normal defense type doesn't take higher damage from Normal attack type as it says, only Medium does.
We could use custom armour and attack types, to add. 6, well 7 might not be enough for some projects.)
 
Last edited:

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
Since we have hide ability for units, what if we could have disable/hide training/building possibilities for a specified unit since we don't have any way to verify if a unit is currently training (no order string for that)?
Also, a way to order a unit to cancel training, researching etc.
And of course, not just Trained Unit for conditions but also Training Unit etc. GUI is quite incomplete since the release of the game.

Means to remove the Rally Point on units that train other but are able to move. Or, make the unit move to that location and/or attack the target of the right click. Workarounds are painful when using MUI. Or an option to leave the Rally Point on the unit's position.

Separate researches/upgrades for specific units as opposed to for every unit of a certain type.
Same with ability tooltips edit through triggers.

An action trigger like continue order since we can use the order variable to store a unit's current order but now we can only use it as a condition but with limited use as there are only some few string available to choose from.
Or an option not to stop a unit's current order by ordering it to do things like deactivate Immolation. Maybe Reset Ability Cooldown could have an option like this? Removing and adding the ability back makes the unit delay any sudden orders for some reason while it continuing its previous one for a short time. Even the buff remains if removed by triggers.
I used Divine Shield with 0.01 duration instead but it briefly cancels enemy attacks. Avatar makes the unit invulnerable to magic and increases scaling value.
Thank the World Editor god that Berserk doesn't interfere with any current orders.

A way to separate the smart order when it is used on the ground and on a unit or enemy unit.
Currently this crashes the map (the loop does):

  • Interceptor Attack Order
    • Events
      • Unit - A unit Is issued an order targeting an object
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • And - All (Conditions) are true
            • Conditions
              • (Ordered unit) Equal to ShieldedUnitPal
              • ((Target unit of issued order) belongs to an enemy of Player 1 (Red)) Equal to True
              • CarrierInterceptorInteger Less than or equal to 8
              • (Issued order) Not equal to CarrierMoveOrder
        • Then - Actions
          • Game - Display to (All players) the text: ATTACK ORDER SMART
          • Set InterceptorTargetUnit = (Target unit of issued order)
          • Unit - Order ShieldedUnitPal to Attack InterceptorTargetUnit
          • Set InterceptorTargetUnit = (Target unit of issued order)
          • Set CarrierAttackOrder = (Issued order)
          • Set InterceptorTargetPoint = (Position of InterceptorTargetUnit)
          • Wait until ((ShieldedUnitPal is in (Units within 800.00 of InterceptorTargetPoint)) Equal to True), checking every 0.10 seconds
          • Custom script: call RemoveLocation (udg_InterceptorTargetPoint)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Target unit of issued order) Equal to InterceptorTargetUnit
            • Then - Actions
              • For each (Integer InterceptorAttackOrderInteger) from 1 to CarrierInterceptorInteger, do (Actions)
                • Loop - Actions
                  • Unit - Order CarrierInterceptorUnit[InterceptorAttackOrderInteger] to Attack InterceptorTargetUnit
            • Else - Actions
        • Else - Actions
  • Carrier Order Store
    • Events
      • Unit - A unit Is issued an order targeting a point
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • And - All (Conditions) are true
            • Conditions
              • (Ordered unit) Equal to ShieldedUnitPal
              • (Issued order) Not equal to CarrierAttackOrder
        • Then - Actions
          • Unit - Order ShieldedUnitPal to Move To (Target point of issued order)
          • Set CarrierMoveOrder = (Issued order)
        • Else - Actions
  • Interceptor Move Order
    • Events
      • Time - Every 0.05 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • And - All (Conditions) are true
            • Conditions
              • (Issued order) Equal to CarrierMoveOrder
              • (Ordered unit) Equal to CarrierInterceptorUnit[CarrierInterceptorInteger]
        • Then - Actions
          • Set CarrierPoint = (Position of ShieldedUnitPal)
          • For each (Integer InterceptorMoveOrderInteger) from 1 to CarrierInterceptorInteger, do (Actions)
            • Loop - Actions
              • Unit - Order CarrierInterceptorUnit[InterceptorMoveOrderInteger] to Move To CarrierPoint
          • Custom script: call RemoveLocation (udg_CarrierPoint)
        • Else - Actions

Tried it with current order as a condition instead of issued order and the same happens.
 
a way to order a unit to cancel training, researching etc.
I know you will probably prefer GUI solution, but just in case, TrainingDetection v3.1a. In trigger "Cancel Demo" there's an exmple:

  • Set u = (Picked unit)
  • Custom script: call CancelTrainingFront(udg_u)
not just Trained Unit for conditions but also Training Unit etc.
Could you elaborate what you mean?:)

Same with ability tooltips edit through triggers.
It's doable, but not in GUI.

The crash trigger, the move point order ends in an infinite loop with the trigger "point order", I guess. Try to turn off the trigger before you move order, and then turn it on again.

Also, could you elaborate what you meant with the text about continue orders?
 

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
Also, could you elaborate what you meant with the text about continue orders?
Basically what happens when you cast Berserk, current unit orders, be they movement, ability casting or attack related, don't cease. So I want a trigger to basically remove the stopping/pausing of units when casting their spells.
The crash trigger, the move point order ends in an infinite loop with the trigger "point order", I guess. Try to turn off the trigger before you move order, and then turn it on again.
Yeah, I'm stupid.

This seems to work

  • Interceptor Order Type Set Target Order
    • Events
      • Unit - A unit Is issued an order targeting an object
    • Conditions
    • Actions
      • -------- Smart Target is an Enemy --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • And - All (Conditions) are true
            • Conditions
              • (Ordered unit) Equal to ShieldedUnitPal
              • ((Target unit of issued order) belongs to an enemy of Player 1 (Red)) Equal to True
              • CarrierInterceptorInteger Less than or equal to 8
        • Then - Actions
          • Game - Display to (All players) the text: ATTACK ORDER SMART
          • Set CarrierAttacksON = True
          • Set InterceptorTargetUnit = (Target unit of issued order)
          • Set InterceptorTargetPoint = (Position of InterceptorTargetUnit)
        • Else - Actions
      • -------- Smart Target is an Ally --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • And - All (Conditions) are true
            • Conditions
              • (Ordered unit) Equal to ShieldedUnitPal
              • ((Target unit of issued order) belongs to an ally of Player 1 (Red)) Equal to True
              • CarrierInterceptorInteger Less than or equal to 8
        • Then - Actions
          • Game - Display to (All players) the text: MOVE ORDER SMART
          • Set CarrierAttacksON = False
        • Else - Actions
  • Interceptor Order Type Set Point Order
    • Events
      • Unit - A unit Is issued an order targeting a point
    • Conditions
    • Actions
      • -------- Smart Target is a Point --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • And - All (Conditions) are true
            • Conditions
              • (Ordered unit) Equal to ShieldedUnitPal
              • CarrierInterceptorInteger Less than or equal to 8
        • Then - Actions
          • Game - Display to (All players) the text: POINT ORDER SMART
          • Set CarrierAttacksON = False
        • Else - Actions
  • Interceptor Attack n Move Order
    • Events
      • Time - Every 0.10 seconds of game time
    • Conditions
    • Actions
      • -------- Interceptors Move --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • CarrierAttacksON Equal to False
        • Then - Actions
          • Set CarrierPoint = (Position of ShieldedUnitPal)
          • For each (Integer InterceptorMoveOrderInteger) from 1 to CarrierInterceptorInteger, do (Actions)
            • Loop - Actions
              • Unit - Order CarrierInterceptorUnit[InterceptorMoveOrderInteger] to Move To CarrierPoint
          • Custom script: call RemoveLocation (udg_CarrierPoint)
        • Else - Actions
      • -------- Interceptors Attack --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • CarrierAttacksON Equal to True
        • Then - Actions
          • Set CarrierAttacksON = False \\Still working on this; trying to make the interceptors move to the caster/carrier until the target is in range.
          • Wait until ((ShieldedUnitPal is in (Units within 800.00 of InterceptorTargetPoint)) Equal to True), checking every 0.10 seconds
          • Custom script: call RemoveLocation (udg_InterceptorTargetPoint)
          • Set CarrierAttacksON = True \\As mentioned above.
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (InterceptorTargetUnit is alive) Equal to True
            • Then - Actions
              • For each (Integer InterceptorAttackOrderInteger) from 1 to CarrierInterceptorInteger, do (Actions)
                • Loop - Actions
                  • Unit - Order CarrierInterceptorUnit[InterceptorAttackOrderInteger] to Attack InterceptorTargetUnit
            • Else - Actions
        • Else - Actions
 
One needs to base the spells on such instant spells like you mentioned berserk. There are more like defend, manashield, immolation, devineshield and also some item based abilities can be used that give armor/speed/damage bonus when used etc. Most abilities, like ones that involve ordering a point/unit or so will always interrupt the current order. So the ability base can decide it.

There are some abilities, like avatar, bearform, ravenform, morph, robogoblin, battleroar, stomp, thunderclap that also interrupt the current order, but when finished they will continue with old order again, like moving.
 

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
If location of smart order is null, smart order is on target.
Here's something more bizarre:

True collision off with units not being obstacles. Air units are pushed by other collision off air units. Locust is fine but you can't select units with it.
Because the air unit is pushed, triggers detect that as it would be ordered to move/smart. Actually, for some reason flying units are detected as moving for some reason when flying even if they are attacking during that time and not actually/ordered moving/smarting.

EDIT: scrap the part where air units that stand still are considered moving/smarting. It was an issue related to acquisition range that made me think that.

EDIT2: figured out how to make the Carrier not be moved by interceptors coming to it and remaining "under" without hiding them. I had to make them change position every 0.1s as if they'd be moving around the Carrier.



Hide UI for attack in the unit editor makes triggers not detect the unit attacking or using the smart order to attack. Not sure if intended.
 
Last edited:

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
Modify a specific unit's movement speed past the limit of the constants. Say you want usual Warcraft III spells to slow or haste units like they do in the original game but you want a custom spell to be able to do more than that.

Pheonix Fire type spell which targets a specific target, the one the Pheonix Fire-able unit is actually attacking.
Best it'd be to have a way to make units attack a desired target while moving. Sure using dummy units might be fine but not when you want to have StarCraft like Carrier units sending multiple units at once while they are also creating dummy units for their attacks.
 

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
Means to remove the Rally Point on units that train other but are able to move. Or, make the unit move to that location and/or attack the target of the right click. Workarounds are painful when using MUI. Or an option to leave the Rally Point on the unit's position.
Rally is an ability and can be removed via the remove ability action.

The problem now is, that for a unit to be able to train another it has to be a building. Weirdly, heroes can do this. Making a unit a building creates some issues like modifying the flying height.

EDIT: these units cannot move while training (same with selling units) and their training ability disappears after recovering from polymorph. Flying height remains the same regardless of how much it is. Because they are set as buildings, these units call nearby neutral hostile camps to them.
Bug: if you turn the unit back to a normal units and don't remove the trained unit when it was set as a building, then it will still be able to train the unit.
 
Last edited:

Wrda

Spell Reviewer
Level 26
Joined
Nov 18, 2012
Messages
1,889
JASS:
//Checks whether a player group is empty or not
native IsForceEmpty takes force f returns boolean

//new type
type datetime extends ...
//returns local date time
native GetDateTimeNow takes nothing returns datetime

//returns Utc time, (it's the same as GMT)
native GetDateTimeUtcNow takes nothing returns datetime

//sets the ability that will trigger the damage event. Useful only for triggered spells.
native SetEventDamageAbilityId takes integer abilCode returns nothing

//returns the ability that triggered the damage event
native GetEventDamageAbilityId takes nothing returns integer

//applies a buff of an ability to a unit. no damage, only ability's effects, allowing it to stack
//with itself (one buff), and/or stack with other abilities based on the first one (with another buff)
native UnitApplyUnitBuff takes unit source, unit target, integer abilityId, integer level, real duration, boolean stackself, boolean stackothers returns nothing

native RemoveUnitBuff takes unit whichUnit, integer buffId returns nothing



//These group of natives should act exactly like a unit casting a spell, except no mana cost, cooldown, etc.
//The only issue is auras. These natives should NOT trigger spell events.
//returns false on untargertable context (eg Inferno over water, Force of Nature with no trees)
native ApplySpellEffectUnitToPoint takes unit source, real x, real y, integer abilcode, integer level returns boolean

//returns null if the target is invalid (eg Spell immune, invulnerable, etc)
native ApplySpellEffectPointToTarget takes unit source, real x, real y, real x2, real y2, integer abilcode, integer level returns null

//same as above
native ApplySpellEffectUnitToTarget takes unit source, unit target, integer abilcode, integer level returns unit

//returns false if affected caster only (Storm Crow Form, Metamorphosis)
native ApplySpellEffect takes unit source, integer abilcode, integer level returns boolean




/*fix GroupEnumUnitsInRange, GroupEnumUnitsInRangeOfLoc, GroupEnumUnitsInRangeCounted and   
GroupEnumUnitsInRangeOfLocCounted. As they don't take in consideration units' collision*/

//Make both events act the instant before units die so we can check whether a unit has a specific buff or not,
//Currently units who die have no buff, so there's no proper way to check them.
EVENT_PLAYER_UNIT_DEATH
EVENT_UNIT_DEATH

//Able to detect units in range of other units dynamically we have TriggerRegisterUnitInRange
//but it is for a single unit.
EVENT_PLAYER_UNIT_INRANGE

//Same for detecting when unit leaves the range of another unit
EVENT_PLAYER_UNIT_LEFTRANGE

//GetTriggerUnit() is the unit who becomes in range with another, but there's no way to detect which is
//source
native GetRangeSourceUnit takes nothing returns unit


//triggered by holy light, Heal, Essence of blight, etc.
//How much was the amount of healing, source, target, also can be triggered by ...UNIT_DAMAGED if the
//damage was manipulated to heal
EVENT_PLAYER_UNIT_HEALED

//Able to detect idle units, fires when it becomes idle
EVENT_PLAYER_UNIT_IDLE
EVENT_UNIT_IDLE
native IsUnitIdle takes unit whichUnit returns boolean

//Forgive me if this already exists, but it has been so many natives that I forgot counting them xD
//Returns the bonus damage
native GetUnitBonusDamage takes unit whichUnit, integer weaponIndex returns integer

//Checks if path is available for units to run from point A to B.
native IsPathingBlocked takes real x, real y, real x2, real xy, pathingtype t returns boolean

//Get closest unit/units from group
native GetClosestUnit takes real x, real y, boolexpr filter returns unit
native GetClosestUnitInRange takes real x, real y, real radius, boolexpr filter returns unit
native GetClosestUnitInGroup takes real x, real y, group g returns unit
native GetClosestNUnits takes real x, real y, boolexpr filter returns group
native GetClosestNUnitsInRange takes real x, real y, real radius, integer n, boolexpr filter returns group
native GetClosestNUnitsInGroup takes real x, real y, integer n, group source returns group

//Creating units should not cause a permanent leak.
native CreateUnit takes player id, integer unitid, real x, real y, real face returns unit

//Make it possible to remove terrain deformation leaks, and fix its desync issues.

//There's been rumors this native is buggy, needs to be checked.
//https://www.hiveworkshop.com/threads/a-major-issue-with-firstofgroup-iterating-method.285635/
native FirstOfGroup takes group g returns unit

//Returns the X and Y center of a tile
native GetTileCenterX takes real x returns real
native GetTileCenterY takes real x returns real
//Currently, we need to do this:
function GetTileCenter takes real pos returns real
    return I2R(R2I(RAbsBJ(pos)/128 + 0.5)*128)
endfunction
/*Problems: 1 - R2I function can bug because of floating points errors   
            2 - Works correctly only on positive values, even if you use RAbsBJ, you still have to turn it
negative afterwards*/

//Able to make widget groups (destructables and item groups) and use them as we use unit groups and
//player groups (force)
Object Editor - Fix orderstring thing; add a field "Ability Behavior" to channel so computer players
can actually cast triggered spells without having to manually code the behavior. For example, if I want a custom
ability (with channel) that will have like a meteor crashing from the sky and is supposed to be used against a
group of units (point and AoE type of ability) so we would set "Ability Behavior - Blizzard" (could be another
ability) and we all could be happy that computer players would cast the spell without making any additional
code.
Let us be able to cast multiple abilities based on the same one, just like we can do with "channel" ability because
of the "Based Order ID" field
Option to stack buffs with themselves and/or similar based buffs (a "Slow" spell cast on a unit will have 50% slow
movement speed and attack speed, if the same spell is cast again on the same unit, it would have 100%,if we want
it done by increment; if we want it in relation to the last spell cast buff (+50% of the last 50% one, in this
case, it will result into 75%); if we want it exponentially (for a roar like spell: UnitDamage =
UnitDamage + UnitDamage*Factor; the next spell cast will do: ResultOfLast = ResultOfLast + ResultOfLast*Factor)
Meaning if a unit has 100 damage and buff is 50%, first cast unit will have a total of 150 damage, by the
second cast, it is 225 damage.
Able to make buffs dispellable/undispellable for all dispelling abilities, and for some only. In object editor
and triggers.
What exactly is the difference bewtween IsPlayerInForce and BlzForceHasPlayer?
Able to make tech tree requirements on hired units and sold items. Even if you try, it doesn't work.
Able to make abilities ignore spell immunity dynamically.
Able to make Abilities whether uninteruptable or not when cast.

Edit: Format sucked because wrote this in notepad++, fixed it.
 
Last edited:

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
Instead of Event Response - Dying Unit, Event Response - Casting Unit etc. it would be much better if the Event Response would be between brackets after Dying Unit, Casting Unit, so on, so we could use the starting letter ket to easily get to the desired event response instead of having to use the mouse.
 

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
Is there a way to export-import gameplay constants? It would be nifty to copy-paste them by selecting them all. Currently, only one at a time can be selected.

Also, the JassHelper saving tab comes over every program/window I have in front. It's annoying as it puts that program in the background.
 

Wrda

Spell Reviewer
Level 26
Joined
Nov 18, 2012
Messages
1,889
Is there a way to export-import gameplay constants? It would be nifty to copy-paste them by selecting them all. Currently, only one at a time can be selected.

Also, the JassHelper saving tab comes over every program/window I have in front. It's annoying as it puts that program in the background.
Use mpq to extract it on a map, then import it to another map via WE manager editor.
Edit: Or wait... You don't even need that, you can simply now save your map as a folder (literally saves your map in a folder with all files just like MPQ) and then you can simply import it :)
 
Last edited:
Level 24
Joined
Nov 9, 2006
Messages
2,558
Melee wishlist:
-Cliff height for bridges configureable without affecting "melee map" definition.
-Mercs can be configureable without affecting "melee map" definition.
-Doodads configureable without affecting "melee map" definition, we can make cooler maps visually = win win.
-Player colors should be configureable for the map, as some colors don't suit a map where terrain is blue = player blue has advantage. Or barrens favor player red.
-Increasing milita duration would make it easier to make melee maps - just something to consider.
-The ability to paint minimap, certain maps don't look good on the minimap, example:
166604-04b44da8504f4a638b20d681f3fc79be.jpg
 

Wrda

Spell Reviewer
Level 26
Joined
Nov 18, 2012
Messages
1,889
Melee wishlist:
-Cliff height for bridges configureable without affecting "melee map" definition.
-Mercs can be configureable without affecting "melee map" definition.
-Doodads configureable without affecting "melee map" definition, we can make cooler maps visually = win win.
Pointless. That's the whole point of Having a map considered "melee map", because it's a standard. You can simply configure thins to your liking, but then it will be considered as altered melee, I don't see how that's a disadvantage.

-Player colors should be configureable for the map, as some colors don't suit a map where terrain is blue = player blue has advantage. Or barrens favor player red.
There's literally 25 colours, how's that not enough for you yet? Advantage over what? I don't see how's this a problem only in melee maps though. Even in melee maps, which I don't play that often, I fail to see how it is hard to see red in barrens or darkgreen in dark grass. I know it might not be that obvious at first, but it's not that hard to see icons moving, or just change ally color mode...

-Increasing milita duration would make it easier to make melee maps - just something to consider.
Can you explain the correlation between changing an ability duration and the ability to make melee maps? Apparently all map makers are militia? lol :D

-The ability to paint minimap, certain maps don't look good on the minimap, example:
166604-04b44da8504f4a638b20d681f3fc79be.jpg
Then paint it. You can literally save your map as a MPQ folder, use war3mapMap.blp.
 
Level 24
Joined
Nov 9, 2006
Messages
2,558
but then it will be considered as altered melee, I don't see how that's a disadvantage.
Don't comment if you're going to make educated guesses on world editor and making melee maps.

-City maps are hard to make pretty without changing doodad size/pathing, because of melee map restrictions.
-Colors are important. You can't change them. Being able to change them to red/green, orange/turqouise to suit the terrain would open up new doors for new tilesets to be used. See screenshot. You can't make red or blue maps.
Then paint it. You can literally save your map as a MPQ folder, use war3mapMap.blp.
Imports = not melee.
 

Attachments

  • blue.jpg
    blue.jpg
    166.8 KB · Views: 226

Wrda

Spell Reviewer
Level 26
Joined
Nov 18, 2012
Messages
1,889
Imports = not melee.
Again, nor it will ever be.
-City maps are hard to make pretty without changing doodad size/pathing, because of melee map restrictions.
-Colors are important. You can't change them. Being able to change them to red/green, orange/turqouise to suit the terrain would open up new doors for new tilesets to be used. See screenshot. You can't make red or blue maps.
This exists for some reason.
  • Player - Change color of Player 1 (Red) to Blue, Changing color of existing units
Oh wait...that doesn't solve your problem because custom triggers, right?
One more thing, changing the colour to another one when a player wants the former will already look stupid, but that is just a consideration to take care of.
Man, the only one who is stopping you is yourself, you keep asking to plug something non-melee into a considered melee map. It's like injecting a banana DNA into an apple and let it grow, it isn't an apple anymore. Melee is a standard map, and it will always be. You could have always wished for an altered melee classification for world editor, but trying to pretend that modifying objects and triggers and try to call it a melee map is ridiculous, no one will get fooled for that.
 

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
@Nudl9, it's tough man. The way I see it, is they will have to accept such tweaking for melee if they want to progress melee, not stagnate it.
We can't cure all eye sight issues either. If they change the colour of terrain on the minimap then it's not going to match with the one on the playable map. If they change the hue for that ice you shot in the picture, another player colour will look bad over it, of course that not being important in ladder since it's usually the first 12 or less colours.

Now, they could change a lot of game/unit textures instead but I guess they won't do that for classic, only for Reforged (where they did that already?).
 
Level 24
Joined
Nov 9, 2006
Messages
2,558
Well i'm just gonna ignore Wrda because he's stupid.

Changing default player colors should be a non-issue.
It should be as simple as adjusting players here.
https://i.imgur.com/HQDlgxD.jpg
Which would solve a lot of problems as far as tileset colors are concerned.
It's actually a pretty big issue, because you often see ladder players play with black minimap (Alt+T) just so that they can see the colors more clearly and react to movements on the minimap.

Changing colors on minimap terrain should also be a non-issue, that would resolve many problems.
Compare these two images:

This is a "melee map".
166604-04b44da8504f4a638b20d681f3fc79be.jpg


This is a not a "melee map" by the standards, because i colored the pathing blockers on the minimap. Looks clean and you know where the edges of the map are.
166659-8cfee7d8512797ccb6e34e7fd879a42d.jpg


This is a "melee map", where i fixed the "map standard" issue by turning all the pathing blockers into an exisiting doodad like barrens tree (indestructable) and lowering them where they aren't visible. But that takes extra memory which is inefficient.
Poo_in_the_loo.jpg


Basicly a lot of tilesets don't work without modifications to the object editor.
Barrens is almost unuseable because the tileset doesn't do much to distinguish different objects and terrain.
There are already a bunch of maps in the competetive map pool that has minor modifications (CH, Synergy, etc), so i don't see a reason not to make it more loose.
 

deepstrasz

Map Reviewer
Level 69
Joined
Jun 4, 2009
Messages
18,883
The thing is any change to melee would have to go through some scanning. No one knows what has been modified until they check it.
It's what I'm saying, that Blizz should learn to progress melee rather than keep it so limited, stop being lazy and check maps if they're melee operational or not, regardless of some neatly edited game doodads being there or not.

Also, don't insult users like that. He has made some valid points.
 
Level 24
Joined
Nov 9, 2006
Messages
2,558
Well they sure did a hack job on Northeren Isles the first round when they tried to make it competetive. I remember there being random trees on the map. Aggro issues. Pathing issues. Tuskars still focus Grunts over Feral Spirits afaik. Not much quality control.

Just think in general it would be better for mapmakers to have control over what is considered a melee map or not, because we can fix the problems ourselves where it concerns pathing, etc.
 
Last edited:

Wrda

Spell Reviewer
Level 26
Joined
Nov 18, 2012
Messages
1,889
Just think in general it would be better for mapmakers to have control over what is considered a melee map or not
Because then if everyone has their own definition of a "melee map" then there is no actual "melee map", genious. It must be objective and clear, not something wide and vague. Just like we have in Hive the categories "melee" and "altered melee" (wasn't there one also called "quirky melee"?) which I think they have their own place and everyone knows what exactly to find for. It would be something I would support 100% if blizzard made those.
That blue colour on blue.jpg seems fine and pretty visible. You have a twisted view on player colours, they're not supposed to fit the terrain, but to be seen on player units. But if they aren't easily seen, one can just change the ally colour mode.
Well i'm just gonna ignore Wrda because he's stupid.
It seems you can't handle a dicussion with someone with different views, even though I support them with a different approach, and I'm the stupid one?
I don't know whether I'm talking to a baboon or a human :)
 

Kyrbi0

Arena Moderator
Level 45
Joined
Jul 29, 2008
Messages
9,504
It's not a question of "completely (in)visible"; it's that, on certain terrain, certain Team Color choices can obfuscate your units, affording you an unfair advantage in the game.

This is a game of split-second combat decisions, where unit positioning is key; even a momentary confusion about where a given unit is can really affect things.

And not just on the main screen; consider how hard it can be to see, say, Dark Gray or Brown on the minimap (though thankfully you can toggle minimap colors; still, it would be nice to not have to do that)
 

Wrda

Spell Reviewer
Level 26
Joined
Nov 18, 2012
Messages
1,889
It's not a question of "completely (in)visible"; it's that, on certain terrain, certain Team Color choices can obfuscate your units, affording you an unfair advantage in the game.
You'd better consult your doctor for eye sight then.
A better question is, why do you play ally colour mode 1? It's hard to see who's enemy or not if you don't remember which colour they are.
(though thankfully you can toggle minimap colors; still, it would be nice to not have to do that)
Alt + A is too hard to press? It's so close...
Some specific colorus might be not easy to be seen on specific terrain, but I don't see how map makers will be able to fix that if blizzard can't/didn't yet.
 
Level 24
Joined
Nov 9, 2006
Messages
2,558
It's not really what i'm looking for.
Upon a little further tinkering i came up with a good way to implement it.
Lets say that a camp has a "jailor" creep, just like a creep would hold an item.
When you slay that creep, the cage behind it will be unlocked and the caged unit will turn to your aid.
Similar to how you free units in the campaign.
I think it could be a good addition to melee maps.
It also ties in with mechanics introduced in the campaign.
The balance is also pretty easy to fix.
A level 1 item drop roughly equals that of a level 2 unit, like a troll priest.
A level 4 item drop roughly equals that of a level 5 unit, like a big ogre.
A troll priest has a little more worth than a level 1 item, but it also adds food cost and can't be sold so it roughly adds up in balance.
 
Level 24
Joined
Nov 9, 2006
Messages
2,558
Well yeah sort of.
I kind of have an idea for the map with that mechanic and removing the mercs is part of the design i had in mind.
Mercs fall off pretty quickly anyway and isn't something you buy mid or late anyway.
You can still creepjack the creep, but Blademaster may not reap such high benefits from units as he would items.
So you can alleviate the problem by sprinkling both unit and item drops across the map, marketplace, etc.
Or even better, give the blademaster the type of creeps that would benefit him: High Troll Priest, Ogre Magi or a creep with Unholy Frenzy (Buff creeps).
 
Status
Not open for further replies.
Top