Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
@Darkfang
Making things easier doesn't justify "Let's request stuff that will entirely hide features that already do the same". Also the reason why triggering everything is much better it's because you have the absolute control in what you want do to. Imagine this scenario: A guy asks for 2 additional options for holy light such as "deal damage to enemy undead units and heal nearby allies over time" and "if the target dies with the buff then summons an angel to fight for you giving all nearby ally units 1 armor bonus per second". That's some level of complexity, but then, it is the guy's idea of an ability he wants, something very specific. So if there were other people that would also want more options for the same ability, by the time we got them it would be a lot of fields, a complete mess. Easier to do? Yes, but very personal request and not something objective that opens major opportunities to manipulate every aspect of something. Mostly, things that are impossible to do, or are a complete hassle or are prompt to undesired issues like spike lags. E.g. A missile system, for high demanding maps, creating your own or even using the hive's might generate bad performance if there's quite a lot of missiles (say 300).
Everything takes time, not just triggering. >Having to trigger everything is a bumper, besides the fact that some trigger interactions don't stack well with the system itself, adding buffers with hidden abilities causes spellbook to close and minor lag, they don't interact well with spell shields and may lead to bugs, besides the fact that seing a bug, and not knowing from where it damn comes from a handle of a thousand of triggers that I've made for my maps is frustrating
Just like everything, the map doesn't read your mind. It looks like what you're describing as bad triggering, which can obviously be improved like any one can over time. I don't know what "trigger interactions" don't work well with a "system" as you call it, but might as well post them in the bug and issues thread.
@Devalut >Not for a target going being ordered to walk in the immediate direction of the unit you turned collision off for, the unit will still attempt to walk around it.
Well, that looks more like a bug.
What in the world of the goddamn gods would this even do, Mr. Non-sense King? Must be a genious idea telling no actual units from no player to just defend a point of the map.
devalut come on, this is a discussion topic, you don't need to be dramatic or get offended for no reason when someone criticizes you. I was asking legitimate questions because I didn't really fully understand those points and some look unnecessary.
@Wrda >How would that exactly work?
Did you watch those starcraft 2 trailers, remember the Changeling? Here's the trailer if you haven't seen it, the trigger would work very much like that save for the Color/Morph change.
>What in the world of the goddamn gods would this even do, Mr. Non-sense King?
Like I said before in my previous post, I didn't delve to deeply in this one.
If I had to sum it up, I was trying to convey a quick A.I. prompt that deliver a simple command that would normally be covered by six or seven seperate sets of triggers, if one line can reduce 10 triggers I'll take it without question!
>Devalut come on, this is a discussion topic, you don't need to be dramatic or get offended for no reason when someone criticizes you. I was asking legitimate questions because I didn't really fully understand those points and some look unnecessary.
Offended, far from it, in fact I'm pleased as punch; and I have this silly grin spread across my face from the moment after you posted today, specially when I spent a thousand hours in mspaint drawing your likeness onto an american cartoon character. Did you not like it? I can take if down if you don't like it...
@Darkfang
Making things easier doesn't justify "Let's request stuff that will entirely hide features that already do the same". Also the reason why triggering everything is much better it's because you have the absolute control in what you want do to. Imagine this scenario: A guy asks for 2 additional options for holy light such as "deal damage to enemy undead units and heal nearby allies over time" and "if the target dies with the buff then summons an angel to fight for you giving all nearby ally units 1 armor bonus per second". That's some level of complexity, but then, it is the guy's idea of an ability he wants, something very specific. So if there were other people that would also want more options for the same ability, by the time we got them it would be a lot of fields, a complete mess. Easier to do? Yes, but very personal request and not something objective that opens major opportunities to manipulate every aspect of something. Mostly, things that are impossible to do, or are a complete hassle or are prompt to undesired issues like spike lags. E.g. A missile system, for high demanding maps, creating your own or even using the hive's might generate bad performance if there's quite a lot of missiles (say 300).
Everything takes time, not just triggering. >Having to trigger everything is a bumper, besides the fact that some trigger interactions don't stack well with the system itself, adding buffers with hidden abilities causes spellbook to close and minor lag, they don't interact well with spell shields and may lead to bugs, besides the fact that seing a bug, and not knowing from where it damn comes from a handle of a thousand of triggers that I've made for my maps is frustrating
Just like everything, the map doesn't read your mind. It looks like what you're describing as bad triggering, which can obviously be improved like any one can over time. I don't know what "trigger interactions" don't work well with a "system" as you call it, but might as well post them in the bug and issues thread.
@Devalut >Not for a target going being ordered to walk in the immediate direction of the unit you turned collision off for, the unit will still attempt to walk around it.
Well, that looks more like a bug.
I'm still not buying this if the affected unit is owned by same player. How would that exactly work? >Non-sense, you are just sense-less.
What in the world of the goddamn gods would this even do, Mr. Non-sense King? Must be a genious idea telling no actual units from no player to just defend a point of the map.
devalut come on, this is a discussion topic, you don't need to be dramatic or get offended for no reason when someone criticizes you. I was asking legitimate questions because I didn't really fully understand those points and some look unnecessary.
Oh sorry, thus spoke the super experienced map maker and trigger maker, sorry that I do not care about total control when we can have both total control and making the game more accessible, specially NOW that there will be newcomers with reforged, making things easier for mapmakers is a must, so no, I'm not being silly by requesting something that will both improve gameplay, performance AND mapmaking.
Possibly add garbage collection to (v)jass with support in GUI so that unaware map makers can proceed without having spikes or lags, and so that other other people can stop worrying about leaks in general.
Possibly make lua acknowledge other types (unit, lightning, timer, location, group) etc, and add garbage collection for the objects lua still doesn't clean yet (timer, location, group).
Means to search within triggers and their actions (general search, not one for each window/shelf).
For instance if I write Crypt Fiend (Uber) and the unit is used in a an action like create 1 Crypt Fiend (Uber) or as the name of a trigger, I want the search to get me there directly.
Means to search within triggers and their actions (general search, not one for each window/shelf).
For instance if I write Crypt Fiend (Uber) and the unit is used in a an action like create 1 Crypt Fiend (Uber) or as the name of a trigger, I want the search to get me there directly.
A way to replace existing imported files when mass importing the same file names. This helps against issues where a newer editor version might zero (file size=0KB) some imports out.
Currently if you import a file with the exact same name, it will be added as a new one.
De/Buff for Spell Damage Individual units
Item Bonus Spell %/-/+ For Items
Reminder - Gameplay constants do not cover multiple units and multiple situations and therefore is not, and currently will not alleviate my suggestion.
Any attempt suggest fashioning the current abilities -regarding magic damage- (Anti-Magic / Magic Immunity / Magic Resistance(Runed Bracer)) into some rube goldberg monstrosity is ludicrous. You know who you are~
Special Effects attached to special effects. with an offset parameter too.
Also all unit and doodad enumerations (pick every unit/doodad) don't include the collision size and pathing map of units/buildings/doodads. So we need those functions to work with that, or make additional ones with the same purpose.
create (via triggers) and place items on/over water
set item (flying) height
choose if an item is to be targeted as being on water, in air or on ground for each movement type respectively: foot+amphibious+horse+hover, float, flying units
A special effect enumeration (Pick every special effect just like units/doodads) would also be great, specially "in range" ones, so we could use them for peculiar missile systems.
- Dynamic map terrain (Allows changing terrain in-game, explained later)
- In the Gameplay Constants, allow changing what kind of bonuses are given by attributes (they must also be allowed to overlap on the kinds of bonuses they give)
JASS
1. Dynamic terrain manipulation
Consider the map's terrain as being formed by two-dimensional array of rectangular objects called tile, this individual tile is the minimum size at which the user can edit and manipulate the game's terrain looks. The array itself is static, initialized at map init, but the attributes of its elements (the tiles) can be changed.
Basic Type Structure:
JASS:
enum tiletype
TILE_TYPE_LAND
TILE_TYPE_WATER_SHALLOW
TILE_TYPE_WATER_DEEP
TILE_TYPE_RAMP
enum tilepathing
PATHING_UNPATHABLE
PATHING_WALKABLE = 0x1
PATHING_HOVERABLE = 0x2
PATHING_FLOATABLE = 0x4
class tile
public static constant real TILE_WIDTH = <>
public static constant real TILE_HEIGHT = <>
readonly real x // center x
readonly real y // center y
public integer elevation
public tiletype type
public tilepathing pathing
public void swap(tile other)
//end class
private terrain array gameTerrain[MAP_TERRAIN_SIZE_X][MAP_TERRAIN_SIZE_Y]
private void BlzInitTerrain()
// Runs at map initialization and initializes 'gameTerrain' to the premade terrain made using WE's terrain editor
Suggested APIs
JASS:
function GameTerrainGetTile takes real x, real y returns tile
return gameTerrain[GetXCoordIndex(x)][GetYCoordIndex(y)]
function TileGetCenterX takes tile t returns real
function TileGetCenterY takes tile t returns real
function TileGetMinX takes tile t returns real
function TileGetMinY takes tile t returns real
function TileGetMaxX takes tile t returns real
function TileGetMaxY takes tile t returns real
function TileGetElevation takes tile t returns real
function TileSetElevation takes tile t, integer elevation returns nothing
function TileGetType takes tile t returns tiletype
function TileSetType takes tile t, tiletype type returns boolean
function TileGetPathing takes tile t returns tilepathing
function TileSetPathing takes tile t, tilepathing pathing returns boolean
function TileSwap takes tile a, tile b returns boolean
2. Attack Handling
Due to lack of proper attack handling, I actually made my own Attack System from scratch some time ago here. It brings A LOT of features. It only works on patch 1.30a though and was not completely polished specially on the attack animation part. For some reason it's messed up on the new patch.
So a native support for total control over attack handling would be really good.
JASS:
type attackevent extends event
constant attackevent EVENT_ATTACK_START
/*
* Fires when attack animation starts
*/
constant attackevent EVENT_ATTACK_RELEASED
/*
* Fires before the damage is dealt (for melee)
* Fires before the projectile is launched and before <EVENT_ATTACK_PROJECTILE_LAUNCH> fires (for ranged)
*/
constant attackevent EVENT_ATTACK_PROJECTILE_LAUNCH
/*
* Fires right after <EVENT_ATTACK_RELEASED> fires and before the projectile is launched (for ranged only)
*/
constant attackevent EVENT_ATTACK_PROJECTILE_IMPACT
/*
* Fires when a projectile hits the target and before any damage event fires (for ranged only)
*/
constant attackevent EVENT_ATTACK_PROJECTILE_BOUNCE
/*
* Fires when 'maxBounces' > 0
* Fires after <EVENT_ATTACK_PROJECTILE_IMPACT> and after all damage event fires, and before bouncing to the next target
*/
constant event EVENT_PROJECTILE_DESTROYED
/*
* Fires for both explicitly and implicitly destroyed projectiles (for ranged only)
* For projectiles destroyed implicitly, this fires after <EVENT_ATTACK_PROJECTILE_IMPACT> and after all damage event fires
*/
type projectile extends handle
type attack
class projectile
// For function API, all readonly fields should have its corresponding getter while public members should have its corresponding getter as well as setter functions
public unit source
public widget target
public boolean showShadow
public attacktype attackType
public damagetype damageType
public weapontype weaponType
public real x
public real y
public real z
public real targetX
public real targetY
public real targetZ
public real speed
public real minSpeed
public real maxSpeed
public real acceleration
public real distanceTravelled
public real maxDuration
public real bounceRange
public real pitch
public real scale
public real timeScale
public real damage
public integer maxBounces
readonly integer currentBounces
readonly boolean main // Checks if the projectile is the primary one in case of Split Shot abilities
private integer sfxCount
private string array sfx[sfxCount]
public static projectile create(unit source, widget target)
/*
* Does not play the unit's attack animation and does not interrupt orders (u can use this to launch a ranged attack from a moving unit, much like the phoenix)
* Fires the attack events except for <EVENT_ATTACK_START> and <EVENT_ATTACK_RELEASED>
*/
public void destroy() // Explicit projectile destruction
public void addSfx(string model)
public void removeSfx(string model)
/*
* Very useful for Orb Stacking systems where you need to superimpose many special effects on one projectile
* removeSfx() should also allow for removing the default model of the projectile
*/
class attack
readonly projectile bullet // null if attack is melee
// if the attack is ranged, the fields below should be null and the attack data should be set to the projectile's fields instead
public unit source
public widget target
public real damage
public attacktype attackType
public damagetype damageType
public weapontype weaponType
Suggested APIs (Aside from the ones mentioned above)
JASS:
/*
* There are a lot to suggest, most of them are listed in this link
* [URL]https://www.hiveworkshop.com/resources/attack-system-v1-1.79661/preview?trigger=1[/URL]
*/
3. Illusions
JASS:
function CreateIllusion takes unit source, real x, real y, real z, real facing, real duration returns unit
function CreateIllusionById takes integer unitId, real x, real y, real z, real facing, real duration returns unit
function IllusionGetBaseUnit takes unit u returns unit
function IllusionGetRemainingDuration takes unit u returns real
function IllusionGetElapsedDuration takes unit u returns real
function IllusionGetTotalDuration takes unit u returns real
function IllusionGetDeathEffect takes unit u returns string
function IllusionGetDamageDealtFactor takes unit u returns real
function IllusionGetDamageTakenFactor takes unit u returns real
function IllusionSetRemainingDuration takes unit u, real duration returns nothing
function IllusionSetTotalDuration takes unit u, real duration returns nothing
function IllusionSetDeathEffect takes unit u, string sfxpath returns nothing
function IllusionSetDamageDealtFactor takes unit u, real factor returns nothing
function IllusionSetDamageTakenFactor takes unit u, real factor returns nothing
function IllusionShowTimedLifeIndicator takes unit u, boolean enabled returns nothing
type illusion extends unit
would also be nice instead of the above functions having unit as parameter
4. Spell Cast Order
Seriously, the ability to order a unit to cast spells based SOLELY on oderids and not on ability rawcodes is very limiting
JASS:
function IssueSpellImmediateOrder takes unit u, integer spellId returns boolean
function IssueSpellPointOrder takes unit u, integer spellId, real targetX, real targetY returns boolean
function IssueSpellTargetOrder takes unit u, integer spellId, widget target returns boolean
5. Other
JASS:
function SetWidgetFacingInstant takes widget w, real rad returns nothing // VERY USEFUL
function SetEventSpellSource takes unit newSource returns nothing
function SetEventSpellTarget takes unit newTarget returns nothing
Though I now entirely doubt that blizzard has even touched this thread or will ever...
Object fields equal to 0.00 mean the effect does not proc at all, i.e. no mini-stuns
If someone is so desperate to have a permanent effect they can make one last 27 hours and let me have the spell effect holding the unwanted.
the thing is some maps may want to use infinite duration, so they cannot change it. having flags to disable each part of an ability in particular would be cool, but hey, dont you guys have phones?
Please forgive n00bish questions - this is a line of custom script... how would one put this together in a GUI trigger? Or would it have to be all custom JASS?
Ahh-ha - so using substring instead of exact match will create a detector with a wider range, and then if you leave it as <empty string>, it detects everything...!? I think I got it!? Thank you!!
Would really want a hide buff GUI trigger. Basically it should work by hiding the buff icon in the Status field not cancel/disable its effects. This would help with custom spells that require more buffs to work as intended but spells are supposed to have one buff shown. More would be superfluous when other spell buffs like those from auras would be present.
Replacing, editing or deleting a file in the import manager brings you to the first file in the list or somewhere far from where the replaced/deleted/edited file position was. This is very annoying when having loads of imported files that you have to search again for since there is no way to quick search for them but to scroll down using the alphabetic order sorting.
A possibility is to press an arrow key to bring the screen back where it was.
Would be neat to have more than two attack indices/weapons per unit.
Say you want a unit that attacks ground units using melee normal attack type, attacks air units from a distance/range with piercing and attacks buildings from a distance or melee with siege attack type.
That means, orb items should be able to enable more attack indices.
Hey, is the first post of this thread still maintained or not? I think it is a good idea to collect the feature requests in the first post because this thread has far too many replies. Does Blizzard even look at this thread? Currently, they are only patching chicken footprints.
Some of my recent JASS requests:
Missing item fields:
Support the item integer field 'igol'. It is missing and returns the gold cost for an item. Is there any reason it is missing?
native BlzGetUnitAbilityCount takes unit whichUnit returns integer
native BlzGetUnitAbility takes integer index returns integer
native BlzGetItemAbilityCount takes item whichItem returns integer
native BlzGetItemAbility takes integer index returns integer
Gameplay constants/user interface natives:
JASS:
native SetGameplayConstant takes gameplayconstant g, real/integer/string/boolean value returns nothing
JASS:
native GetGameplayConstant takes gameplayconstant g returns real/integer/string/boolean
JASS:
native SetUserInterfaceConfig takes userinterfaceconfig g, real/integer/string/boolean value returns nothing
JASS:
native GetUserInterfaceConfig takes userinterfaceconfig g returns real/integer/string/boolean
This would require advanced changes during the game. For example, if you decrease the maximum hero level, all heroes would have to change if they reached a level above and it would change their stats etc. etc. so I am not sure if this is a good idea. The same for example for corpses which decay.
Pathing layers and natives:
JASS:
native SetWidgetPathingZ takes widget whichWidget, integer z returns nothing
native SetTerrainPathingZ takes real x, real y, integer z, pathingtype t, boolean flag returns nothing
JASS:
native GetTerrainPathingZ takes real x, real y, integer z, pathingtype t returns boolean
JASS:
native SetCustomPathingMap takes string file, integer z returns nothing
JASS:
native GetCustomPathingMap takes integer z returns string
for Z the default value would be 0, so it works with all standard maps. However, different values allow different layers. When a unit enters a specific rect, you could change its pathing Z value.
heal events (from spells, items, regeneration and repairing): something like GetHealingUnit(), GetHealingItem(), GetHealedUnit(), GetHealingAbilityId()
mana restore events (from spells, items and regeneration): support something like GetManaRestoringUnit(), GetManaRestoringItem(), GetManaRestoredUnit(), GetManaRestoringAbilityId()
gold and lumber harvest/send events: GetSendingPlayer(), GetReceivingPlayer(), GetCollectingUnit(), GetResourceAmount(), GetResourceType() (lumber or gold)
XP events: GetGainedXP()
I know that there are already custom systems and workarounds for some of the events but native systems should be safer and cleaner and not THAT hard to implement.
I've seen some of this stuff has already been requested here: [Feedback] Request Features for JASS and the World Editor
Maybe you should collect more stuff in the first post of the thread to make it visible for Blizzard?
reverse natives:
PlaySoundReversed
SetUnitAnimationReverse (there is already a library for this but again a native would be cooler), SetDestructibleAnimationReverse, play doodad animations reverse
SetWaterTimeScale (it should allow a negative value like for special effects which will reverse the water animation on the whole map) or some natives to change the water texture/model during the game
SetWeatherEffectTimeScale: the same or a native to change the model for a weather effect to a custom model.
SetSoundPlayTimeScale: allow negative values to play the sound reverse and allow values to play it faster or slower
SetMusicPlayTimeScale: the same
SetThematicMusicTimeScale: the same
I guess the chance that these will be supported is very low but for my current map they would be fun to have.
Soundset editor: add custom soundsets, add/remove sounds from existing ones, and set sounds to any sound file in the game
Alternatively, just allow unitacksounds.slk to be overwritten through map import
Support filealiases.json functionality in some way
It makes sense that this is a protected file, but it would be cool if we could setup file aliases with the same limits as overwriting files with imports
Custom race creation: add any number of races that will show up in map setup, and allow modifying of music/console/etc per race
heal events (from spells, items, regeneration and repairing): something like GetHealingUnit(), GetHealingItem(), GetHealedUnit(), GetHealingAbilityId()
mana restore events (from spells, items and regeneration): support something like GetManaRestoringUnit(), GetManaRestoringItem(), GetManaRestoredUnit(), GetManaRestoringAbilityId()
this engine wont work well with all that stuff, JASS threads are heavy
also
regeneration is a vector-based process, where game doesn't heal the unit all the time, updating it's current HP, but rather has 'last HP known' field which updates on damage/heal/regen value manipulations. So this is kinda.. pointless
this engine wont work well with all that stuff, JASS threads are heavy
also
regeneration is a vector-based process, where game doesn't heal the unit all the time, updating it's current HP, but rather has 'last HP known' field which updates on damage/heal/regen value manipulations. So this is kinda.. pointless
What do you mean by "JASS threads are heavy"?. Each thread has its own stack? You mean that they are updating a global value which is then applied to the unit at some point? There are also on damage events with the damage amount, source and target. They could change the way they heal units/regenerate their mana. Even if its vector based, they could store the event information in a vector as well? Maybe it slows down the process a bit but it would be worth it. The custom systems which check for changing unit stats cannot detect the source of HP/mana regeneration. I would need to use custom spells for all regeneration stuff to know what the source is.
Fix that bug which makes upgrades un-desupgradable. There is an option to set the level of the upgrade to a number, but sadly we cannot set it to a lower number than it currently is.
The possibility of adding more races (not only Human undead Night elf and orc), which will be great for altered mele games
The possibility of making custom statuses from units (not only ward, worker, undead, mechanical etc etc)
The possibility of making custom ability UIs so we can finally get the possibility of making infinite spells
This is kinda big, but how about making a model maker and an icon maker? (Or simply make an unofficial one official and stick it with the editor. Retera did a crazy good job with the model maker, you might want to take a look at that; if I were you I would hire that guy , it would mean a lot for the community)
Pathing map preview: I would like to have a preview window for pathing maps. Otherwise, I have to use them and look at the unit on the map. It would be nice to show the collision radius units as well when showing the pathing in the editor. And of course as some have already written some brush for manual pathing and options if placed objects overwrite this pathing or not.
Advanced test settings: so I can choose which player I play and which player slots are filled with computer players etc. I want to test my map in a different team.
Smart level replacement in object editor: One of the oldest bugs is that when I automatically fill object data into fields and it replaces the level, it also replaces the number of the ability ID if it has a 1 in it. Fix it!
Available bug for upgrades: When I create an upgrade in the object editor which has the effect to make a unit available, the OK button is disabled for Available and I have to change it not Available. Besides the initial value is 0.
Allow all handle values in trigger editor: When I select a handle parameter in the trigger editor, I cannot choose a unit/item/destructable variable or from the map although handle is a parent type of them. I have to use custom script to assign a unit variable to the handle variable!
Add an option to hide white circles for unit/destructable item drops. They are quite annoying when terraining. They only disappear when I hide units.
Do not reset the fixed Z height when copying Doodads. I have disabled "Reset fixed object heights" but when copying a torch with a fixed Z value it resets it.
Add a flag to use the classic version of a model and the classic textures. This allows us to use classic version without reimporting the model and playing the map in HD.
Allow unlimited cliff levels on top of each other.
Allow changing the base cliff level/water level for a map after it has been created.
Simplify linked operations in the trigger editor and preselect "matching" entries for filters: Simplify the possibility to add another and or or condition to filters for units in unit groups or players in player groups. Usually you have to add multiple and conditions etc. but when you need to add a another condition you have to discard one and replace it with something. This is the same for arithmetic operations and concatenate strings operations. Whenever you forgot something, it is hard to append or prepend it easily. Also preselect "Matching unit" or "Matching Player" for the selected conditions.
Add a button with some kind static check in the trigger editor whenever you choose a certain type of unit like "Matching Unit" or "Picked Unit" or "Attacked Unit" check whether the trigger is in a pick loop, matching condition or has the corresponding event. This will not find all bugs but might help to detect invalid usage of such functions.
Fix unit height of flying units on water. If I give them a negative height, it is calculated from the water surface ingame but in the editor it is calculated from the ground surface.
Allow giving units a negative flying height via triggers. This is useful for units which fly under water.
Increase Far Clip Z maximum value from 10 000 to something much higher. In some maps you want to see everything even if it might lag on certain computers.
Add trigger function "Random Point in Region with matching condition": You could choose the pathing type or other conditions for the location. Sometimes you want to get a point in a region which is water.
Allow placing items in water/changing the collision size/placement requirement for items: I want to place items under water in my map. Swimming units could be able to pick them up.
Trees are not visible under water?! Only their death animation is seen. All other Doodads are. Maybe it is only the custom model of the coral tree.
Allow changing the fog and weather effects for players only.
Allow command button effects for players only.
Allow quest minimap icons for players only.
Allow custom symbols for quest minimap icons rather than only predefined values.
Allow enabling seeing the water texture from both sides: useful for underwater maps.
Allow modifying the water model/water textures via some object editor (there is a water SLK).
The same for weather effects, lightnings, ubersplats etc.
Function which returns the Z of the actual ground surface below the water surface considering plateaus etc. not only cliff levels.
Add some button in the string editor for the default color code |cffffcc00.
When changing the "Game Data Set" in the map options it does not update the object data. I have to close and open the map again.
Allow copying and pasting object editor fields in an append mode. So you can add certain values to a list instead of replacing the whole list.
It would be nice to be able to add custom Event Objects to the editor (Those things you attach directly to models, like sounds, splats, footprints, spawns, etc). Right now, custom models can only use existing event objects. To add new ones you either have to replace existing ones, or add new ones to a custom slk and then have your end user add it to the correct place in their war3 folder, and fiddle with their registry. It would be much nicer to directly support this in the editor.
This is similar to the open request for custom unit soundsets. So I guess I would like to be able to create new entries of everything stored in every SLK file... in the world editor. This would also allow people to create new tilesets.
It would also be nice to create 'mods' like the StarCraft 2 system, where people can use mods as dependencies for their project.
New / Exposed object editor fields that allow one to dynamically specify the cast point / backswing of spells. Can also be specified to cast instantaneously if the spell issues an immediate order.
Get an ability handle's rawcode. Exposed as BlzGetAbilityId in the latest PTR (Thanks Bribe).
Proper silence / unsilence event.
Requirement bug fix (with multiple requirements, only one would be in effect)
Attack Point / Launched event (Runs whenever the unit's attack has reached the attack point.)
Exposed native to get attack speed bonus modifier (both capped and uncapped).
New function that retrieves the index of a requested animation sequence (string parameter) of a given model. (Returns 0 if not found).
If not already possible, make SetUnitAnimation play a unit's walk or run animation when requested.
Major:
Tiered Spell Immunity mechanics (For example, spell A has Spell Effectiveness level of 1. It will pierce through units with spell Immunity if the highest tier of said spell Immunity is equal to or less than the Spell Effectiveness level. Will not pierce through units with a Spell Immunity tier higher than the Spell Effectiveness level).
Expand the Sound Editor to allow soundset imports directly.
Edit:
- Added new suggestions related to models (should show up as non-compliant formatted bulleted items)
Attack Engine is the closest match, but having to register custom abilities can get annoying. A simple BlzGetUnitCurrentAttackSpeed would simplify things a lot, but the "attack launch" event would be welcome and should incorporate a boolean that allows things like natural critical strike/evasion/curse/bash to be detected for that specific event.
In the Open Document window, It'd be nice to just paste in the path the folder that has the map you need. Currently you gotta hit Browse and then click through the navigation from your hard drive's root all the way to your desired folder. Very 2002... but I think even original world editor didn't have this issue.
In the Open Document window, It'd be nice to just paste in the path the folder that has the map you need. Currently you gotta hit Browse and then click through the navigation from your hard drive's root all the way to your desired folder. Very 2002... but I think even original world editor didn't have this issue.
In the Open Document window, It'd be nice to just paste in the path the folder that has the map you need. Currently you gotta hit Browse and then click through the navigation from your hard drive's root all the way to your desired folder. Very 2002... but I think even original world editor didn't have this issue.
Some more ideas after working on my map and playing multiple custom games.
Debugging:
Debugging maps, JASS and AI code is hell.
The maps can randomly crash and we never know what caused the crash.
Please add verbose stacktraces with variable values on crashes, so we can fix our maps.
I had several crashes from AI scripts for months and don't what exactly causes it since it might happen after 40 minutes of gameplay.
Enabling/disabling stuff takes forever and you might never find the issue.
Breakpoints would be nice.
Advanced Test Settings:
Sometimes I want to test the map with multiple AI players.
Just add a GUI to configure advanced test settings.
Allow to configure how many instances of Warcraft should be started to allow fast multiplayer tests.
Haunted Goldmines:
Allow to configure building types to be classified as haunted goldmines which automatically become a gold mine on death. I had to replace the dying unit with a gold mine using a trigger.
Increase the limit in gameplay constants for the heroes field
Maps with many heroes suffer from this limit.
Native AI Navy support:
New natives in common.ai:
JASS:
// the player might buy ships including transport ships
native SetNavy takes boolean s returns nothing
native PurchaseTransportShip takes nothing returns nothing
Make the player smart enough on how to reach which land targets and consider ships which can attack air units.
You can still manually specify the trained units in an campaign AI script.
The AI player should make sure that he attacks only when he can reach targets from the sea. Otherwise, ships should return to shipyards/base.
There could be a native to specify this return point for ships.
Multiple concurrent AI targets:
Allow AI scripts to attack multiple targets at the same time. It seems that campaign AIs only can attack one single target at a time.
Allow extending common.ai/providing common functions for all AI scripts in a map
Add a section to the trigger editor for AI functions or simply let the AI scripts call all functions available in the map script (not sure about it since I extended the existing common.ai file to provide more functions. Blizzard.j functions seem not to be available in AI scripts. Probably because some of them might lead to crashes. I had many AI functions in my map which needed to be called in multiple AI scripts.
Advanced Destructable API:
JASS:
// the event stuff would be useful for items as well:
- type destructableevent extends handle
- constant native ConvertDestructableEvent takes integer i returns destructableevent
- constant destructableevent EVENT_DESTRUCTABLE_ATTACKED = ConvertDestructableEvent(xxx)
- constant destructableevent EVENT_DESTRUCTABLE_DAMAGED = ConvertDestructableEvent(xxx)
- constant destructableevent EVENT_DESTRUCTABLE_RESTORED_LIFE = ConvertDestructableEvent(xxx) // could also be triggered on repair events
- constant destructableevent EVENT_DESTRUCTABLE_SELECTED = ConvertDestructableEvent(xxx) // also useful for items
- constant destructableevent EVENT_DESTRUCTABLE_DESELECTED = ConvertDestructableEvent(xxx)
- constant native GetTriggerDestructable takes nothing returns destructable
- constant native GetRestoredDestructableLife takes nothing returns real
// some useful natives
- native SetDestructableX takes destructable d, real x returns nothing
- native SetDestructableY takes destructable d, real y returns nothing
- native SetDestructableZ takes destructable d, real z returns nothing
- native GetDestructableZ takes destructable d returns real
- native SetDestructableVariation takes destructable d, integer variation returns nothing
- native GetDestructableVariation takes destructable d returns integer
- native SetDestructableScale takes destructable d, real scale returns nothing
- native GetDestructableScale takes destructable d returns real
- native IsDestructableHidden takes destructable d returns boolean
- native SetDestructablePathing takes destructable d, boolean enabled returns nothing
- native IsDestructablePathingEnabled takes destructable d returns boolean
- native SetDestructableWalkable takes destructable d, boolean enabled returns nothing
- native IsDestructableWalkableEnabled takes destructable d returns boolean
// targetting which is useful for filtering certain destructables (for example if you want to filter for all trees in an area)
// there is already the constant UNIT_IF_TARGETED_AS for the integer field for units which can be used with the native ConvertTargetFlag
// either provide natives with integer fields of destructable types or these two natives:
- native IsDestructableTargetedAs takes destructable d, targetflag t returns boolean
- native SetDestructableTargetedAs takes destructable d, targetflag t, boolean flag returns nothing
Actually, they could provide new types like
JASS:
destructablerealfield
like they did for units and items.
Destructable filter functions in GUI trigger actions. It is possible to filter for certain destructables with the native
JASS:
EnumDestructablesInRect
but the GUI actions do not offer this feature.
I had some issues with walkable destructables/Doodads. Sometimes the preplaced units were on top, sometimes not and even replacing the units did not always help.
Some function like
JASS:
ReplaceUnitBJ
available in GUI triggers (for example
JASS:
ReplaceDestructableBJ
(the same for items) would be useful, too.
Handle Group APIs:
We have group but what about itemgroup, destructablegroup, floatingtextgroup etc.?
Filling arrays is much harder since we need a counter to increment the size which means two variables. Besides, it might be slower to check if an item is in an array than handling it with some kind of hashtable in the background. There are vJass code systems etc. for linked lists etc. but a native approach will always be faster and might be easier to use.
Just provide the same API types and functions as for the type group for these new types.
We only have group and force for now.
Minimap Zoom API:
When you change the camera bounds for a player the minimap is not changed which makes no sense.
This native would allow you to zoom in to certain areas.
It would work if the minimap could be stored with a higher resolution.
We played WoW Reanimated which has plenty of dungeons and a really big map size.
Changing the minimap to the dungeons would help for big maps to still see anything on map.
JASS:
// changes the zoom to scale starting from the point x and y on the map
// can be used with GetLocalPlayer
native SetMinimapScale takes real x, real y, real scale returns nothing
// gives you the boundaries of the minimap
constant native GetMinimapSizeX takes nothing returns real
constant native GetMinimapSizeY takes nothing returns real
native ConvertMapXToMinimapX takes real x returns real
native ConvertMapYToMinimapY takes real y returns real
It would be real nice to have syntax highlighting, in both JASS and LUA. Third-party editors have had this for 15+ years, so it should be possible.
I don't know if this is exclusive to LUA or not, but if I Select All in my map script, and CTRL-V to paste my updated script, it gets replaced with gibberish. But if I Select All, then backspace to erase it all, then I can CTRL-V without problem. Not a huge issue, but it feels like an unnecessary extra hoop to jump through.
Also, how bout an event to detect a unit starting/stopping harvesting?
Silly me meant the folder icon in the taskbar, which frame on bottom of the screen. Never been bothered to know the difference between these two terms...so yeah
In my map World of Warcraft Reforged I had all hero ability levels set to a maximum of 100 to allow players much longer gameplay/leveling since the maximum hero level is 500 and you can skill 5 * 100 ability levels. However, this decreased the loading time massively from like 20-30 seconds to 2 minutes and for many players it led to a disconnect. First of all, the disconnect should be fixed in Reforged but the long loading time is still not acceptable especially if you have to rehost the game multiple times due to leavers.
Sure, I could reduce the XP rate but then you can skill an ability every 2 hours which is NO fun at all and since the number of hero abilities is limited and not every map has a custom skill system with unit abilities, this is not an option.
The long loading time is due to the many per level values in the object data. Widgetizing is annoying as well and the Widgetizer couldn't even handle the big number of ability level fields, so it crashed.
Hence, I had this simple idea based on how the research effects are handled in object data:
Allow to set a boolean flag field per ability and research which says "No specific level values".
If this value is set to true there is no DataA1, DataA2, DataA3 or Col1, Col2, Col3 fields etc. Instead you define the base value and a level factor value like for effects of Warcraft III researches. The actual value is calculated at runtime considering the current ability level for the unit/hero. It won't work for all types of fields like unit types or flags but for integers and reals which is enough for most abilities and researches with multiple levels.
This would require more text placeholders for the current level like in the ability learn tooltip: "Blizzard - Level %d", so you can define only one tooltip text.
To my knowledge the actual values are stored in memory per ability anyway since there are natives to retrieve and change the exact values per ability per unit at runtime. They could be calculated and stored whenever the ability level is changed for example when you call
JASS:
SetUnitAbilityLevel
This solution would allow you to create abilities and researches with like 5000 levels without any significant longer loading time.
They would probably load even faster than the current abilities and researches which have more than 1 level.
This feature would be really useful for maps with long gameplay and savecodes.
Currently, this can only be achieved with triggers by changing the stats of the ability per unit with the help of the new natives. I am not sure if you can change the tooltips without issues.
Standard Summon Ability with fields for the units stats
There are multiple summon abilities like Summon Water Elemental and Dark Portal.
All of them allow you to specify a unit type.
If the ability has many levels like 50 it would be too much work to create like 50 different unit types.
In my map I use a trigger which detects the summoning event and changes the stats of the unit due to the skilled ability level.
Blizzard could add a standard ability which lets you specify the unit type once and the stats bonuses per level like:
HP bonus for summoned unit
Mana bonus for summoned unit
Damage Dices bonus for summoned unit
etc.
This would work better if they added the feature I mentioned before with "no specific level value".
Dark Portal with Time Limit
We all know Archimonde's Dark Portal ability which is pretty awesome and useful. Just add a boolean flag "Limited Time" which considers the duration. I had to solve this issue with a trigger.
File API
Workarounds are currently used to read and write files in the directory "C:\Users\XXX\Documents\Warcraft III\CustomMapData" to store savecodes for example. Since we do it anyway, they could just provide these two simple natives:
JASS:
native WriteFile takes player whichPlayer, string name, string content return boolean
native ReadFile takes player whichPlayer, string name return string
Reading a file automatically synchronizes the content from one player only with the rest, so the resulting string is always sync. They could provide the natives without specifying the player and allow using GetLocalPlayer instead.
Joining Players
Certain maps could allow joining players. The flag could also be overwritten in the lobby of the game.
It would only need these two constants:
The trigger player is joining the game and replacing an empty slot or the slot of a leaving player.
This would allow to host maps as servers like for other multiplayer games and make the games more interesting since they will find a running game with a changed map.
Sync changing level and game cache
Allow changing levels with game cache data which is synchronous for all players. The level map is downloaded from one player and the game cache data is also synchronized from one player. This allows to play something like the Bonus Campaign in multiplayer.
JASS:
native ChangeLevelSync takes player host, string newLevel returns nothing
native LoadGameSync takes player host, string saveFileName returns
Both files will force the other players to download the new level and save file from the specified host player if they do not have it already.
Allow to use natives like SaveGame, RenameSaveDirectory, RemoveSaveDirectory, CopySaveGame and SaveGameExists
to be used with GetLocalPlayer to do it only for the host, for example.
This would allow the specified host player to create the save games etc. just before changing the level.
For the game caches it would require the following natives:
JASS:
native ReloadGameCachesFromDiskSync takes player host returns boolean
native InitGameCacheSync takes player host, string campaignFile returns gamecache
native SaveGameCacheSync takes player host, gamecache whichCache returns boolean
Again the game cache file is downloaded from the specified host player and synchronized with all other players.
This would allow to store and load hero data from the previous level.
I think with these few natives you would change the possibilities of multiplayer campaigns, RPG servers etc. massively. I guess it will never happen.
Extended Warcraft III files per map/campaign
Allow extending existing files from Warcraft III in maps and campaigns. This would help adding additional entries without removing the default ones.
The following files could be extended:
common.j
common.ai
Blizzard.j
TriggerData.txt
TriggerStrings.txt
All SLK files (for example soundsets, unit data etc.)
The "extend" option could be set in the "Import Manager"/"Asset Manager" per file. The file would not overwrite the existing file from Warcraft III but would just extend its content.
This feature would allow custom sound sets, global AI script functions, custom GUI functions, widgetized object data etc. etc. without the requirement of merging and updating files whenever Warcraft III is updated. It would make life as a modder so much easier.
Research to reduce/change training/building/upgrading/stock replenish interval time and stock maximum of unit types and item types
It would be nice to allow such an affect per unit and item type and it would only affect the buildings which have the research configured.
Team colored icons
Many icons have parts in it which are the team color of the unit. It should be possible to mark icon areas as team colors, maybe with a special color value or alpha. These areas should have the team color of the buying unit/building unit/selected unit etc.
Path API
The API allows you to check if areas are reachable and to understand how Warcraft will calculate the paths of units.
JASS:
type path extends handle
// could also use movetype instead
native GetPath takes real sourceX, real sourceY, real targetX, real targetY, pathingtype t returns path
native DestroyPath takes path p returns nothing
native GetPathSize takes path p returns integer
native GetPathPosX takes path p, integer index returns real
native GetPathPosY takes path p, integer index returns real
Attack Cooldown API
JASS:
native SetUnitAttackCooldown takes unit whichUnit, integer index, real cooldown returns nothing
native GetUnitAttackCooldown takes unit whichUnit, integer index returns real
native ResetUnitAttackCooldown takes unit whichUnit, integer index returns nothing
Extended UI API
Allow to have more space in the UI and to use custom race UIs. Custom races support would be even better.
JASS:
// some of them are probably possible by getting the ability but this would be easier to use
native UnitHideAttackAbility takes unit whichUnit, boolean flag returns nothing
native UnitHideMoveAbility takes unit whichUnit, boolean flag returns nothing
native UnitHideStopAbility takes unit whichUnit, boolean flag returns nothing
native UnitHideHaltAbility takes unit whichUnit, boolean flag returns nothing
native UnitHidePatrolAbility takes unit whichUnit, boolean flag returns nothing
native UnitHideRallyPointAbility takes unit whichUnit, boolean flag returns nothing
native UnitHideSelectUserAbility takes unit whichUnit, boolean flag returns nothing
native UnitHideSelectHeroAbility takes unit whichUnit, boolean flag returns nothing
native UnitHideHeroSkillsAbility takes unit whichUnit, boolean flag returns nothing
native UnitHideBuildAbility takes unit whichUnit, boolean flag returns nothing
// can be used with GetLocalPlayer:
function SetAreaOfEffectModel takes string model returns nothing
function SetAreaOfEffectTexture takes string texture returns nothing
function SetRallyPointModel takes string model returns nothing
function SetRallyPointTexture takes string texture returns nothing
// more generic game interface API with GetLocalPlayer:
type gameinterfaceintegerfield extends handle
type gameinterfacestringfield extends handle
type gameinterfacebooleanfield extends handle
type gameinterfacerealfield extends handle
native SetGameInterfaceString takes gameinterfacestringfield whichField, string value returns nothing
native GetGameInterfaceString takes gameinterfacestringfield whichField returns string
native SetGameInterfaceInteger takes gameinterfaceintegerfield whichField, integer value returns nothing
native GetGameInterfaceInteger takes gameinterfaceintegerfield whichField returns integer
native SetGameInterfaceBoolean takes gameinterfacebooleanfield whichField, boolean value returns nothing
native GetGameInterfaceBoolean takes gameinterfacebooleanfield whichField returns boolean
native SetGameInterfaceReal takes gameinterfacerealfield whichField, integer real value returns nothing
native GetGameInterfaceReal takes gameinterfacerealfield whichField returns real
Event API
JASS:
// triggers when the item is actually dropped, the same could be supported for an item pawn event (before and after events)
constant playerunitevent EVENT_PLAYER_UNIT_DROP_ITEM_DONE = ConvertPlayerUnitEvent(XXX)
constant unitevent EVENT_UNIT_DROP_ITEM_DONE = ConvertUnitEvent(XXX)
constant playerunitevent EVENT_PLAYER_UNIT_BUFF_ADDED = ConvertPlayerUnitEvent(XXX)
constant unitevent EVENT_UNIT_BUFF_ADDED = ConvertUnitEvent(XXX)
constant playerunitevent EVENT_PLAYER_UNIT_BUFF_REMOVED = ConvertPlayerUnitEvent(XXX)
constant unitevent EVENT_UNIT_BUFF_REMOVED = ConvertUnitEvent(XXX)
native GetTriggerBuffSource takes nothing returns unit
native GetTriggerBuff takes nothing returns integer
Hero Skill API
The maximum number of hero abilities should not be 5. It should simply be unlimited even if they are not shown.
JASS:
native SetHeroMaximumSkills takes unit hero, integer maximum returns nothing
native GetHeroMaximumSkills takes unit hero returns integer
native GetHeroSkill takes unit hero, integer index returns integer
native GetHeroSkillCount takes unit hero returns integer
native ReplaceHeroSkill takes unit hero, integer old, integer new returns nothing
Plugin API
Plugins could be written for example in C/C++ and be placed in the players directories. They do not have to be enabled for all players at the same time in the same game. Plugins can retrieve data from the running game and send data from the running game. The player is always a parameter.
JASS:
// returns if the player has the
native PlayerHasPlugin takes player whichPlayer, string pluginDllName returns boolean
native GetPlayerPluginVersion takes player whichPlayer, string pluginDllName returns string
native SendPluginData takes player whichPlayer, string pluginDllName, string data0, string data1, string data2, string data3 returns boolean
native TriggerRegisterPluginReceiveData takes trigger whichTrigger returns event
// GetTriggerPlayer is the player whose plugin the data is sent from
native GetPluginDllName takes nothing returns string
native GetPluginData0 takes nothing returns string
native GetPluginData1 takes nothing returns string
native GetPluginData2 takes nothing returns string
native GetPluginData3 takes nothing returns string
In C++ you will somehow have to define the version or it is extracted from the DLL. The plugins would make it easier to transfer game data like into files/databases/live stats of games etc. etc. They could also make really fast calculations.
This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
By continuing to use this site, you are consenting to our use of cookies.