1. Evolution complete! Make Darwin proud and go vote in the Techtree Contest #12 - Poll.
    Dismiss Notice
  2. Icon Contest #17 - Results are out! Step by to congratulate our winners!
    Dismiss Notice
  3. Succumb to the whispers and join our Texturing Contest #29 - Old Gods!
    Dismiss Notice
  4. The results for Texturing Contest #28 are out! Step by to congratulate our winners!
    Dismiss Notice
  5. We've created the Staff Job Openings thread. We're currently in need of icon, video production, and social/multimedia positions to be filled. Thank you!
    Dismiss Notice
  6. On May 20th a new law about privacy and data processing comes into work in the EU. I am no lawyer and I need help figuring out if we comply and if not, what we must do about it. Please message me if you can provide any assistance. Read more. Ralle
    Dismiss Notice

Producer Update: Natives List

Discussion in 'Patch Discussion' started by Kam, Dec 7, 2017.

  1. Kam

    Kam

    Blizzard Associate Producer

    Joined:
    Aug 3, 2004
    Messages:
    2,556
    Resources:
    22
    Models:
    8
    Icons:
    2
    Maps:
    12
    Resources:
    22
    Comprehensive features and bugs

    Thank you @Wareditor

    Code (vJASS):


    //===========================================================================
    // NEW FEATURES
    //===========================================================================
    /*
        LIBRARIES & SCOPES
        http://www.wc3c.net/vexorian/jasshelpermanual.html#lib

        GLOBALS BLOCK
        The ability to declare global variable directly in code. This tremendously facilitates installation of new system without the need for a separate 'variable creator' trigger.
        http://www.wc3c.net/vexorian/jasshelpermanual.html#gdf

        STRUCTS
        http://www.wc3c.net/vexorian/jasshelpermanual.html#stru

        2D ARRAYS
        http://www.wc3c.net/vexorian/jasshelpermanual.html#twodarray

        CODE ARRAY
        The abillity to declare code array.

        ARRAY AS AN ARGUMENT
        The ability to use arrays as an argument and the ability to return an array.

        LOCAL DECLARATION
        The ability to declare locals anywhere - not just at the top of the function.
        MULTIPLE MULTIBOARDS / LEADERBOARDS
        The abilty to have multiple multiboards or leaderboards on screen at the same time.

        UNICODE SUPPORT

    */

    //===========================================================================
    // NON DIRECTLY CODE BASE NEW FEATURES
    //===========================================================================
    /*
        HIDE TEXT TAGS OF NATIVE ABILITIES
        The ability to hide (or modify) textags from some native abilities (Evade, Shadow Strike, Critical Strike and Mana Burn) with a flag in Object Editor.

        CUSTOM ATTACK/ARMOR TYPES
        The ability to add custom attack or armor types.
    */

    //===========================================================================
    // INCREASE LIMITS
    //===========================================================================
    /*
        TextTags
        - Currently 100 per local player

        Regions
        - Increase constant integer bj_MAX_DEST_IN_REGION_EVENTS = 64

        Sound
        - Max 4x playing a sound filepath at a time.
        - Max 16 sounds in general at a time.
        - There's a limit before a sound filepath can be played again (seems depend on client), around 0.1 seconds.

        String
        - The amount of text that you can put in a tooltip.
    */

    //===========================================================================
    // FIXES
    //===========================================================================

        //Strings should be automatically garbage collected or at least a native should exist that can be periodically called to help free up disused strings.

        //Local handles declared with the local keyword should automatically cause the reference counter to be decremented at the end of a function just like local handles declared as function arguments.

        native EnableOcclusion takes boolean flag returns nothing
            //Occlusion has been a feature present in the first versions of Warcraft 3 but was broken after a patch.
            //Details explained: https://www.hiveworkshop.com/threads/occlusion-isnt-working-properly.286926/

        native AddUnitToStock takes unit whichUnit, integer unitId, integer currentStock, integer stockMax returns nothing
           //The main tooltip of the added unit will always ignore color tags so the text will always appear to be white. Color tags should be parsed the same as all unit tooltips.
            //The hotkey of the unit isn't working proprely to if it was added using this function.

        native SetCameraBounds takes real x1, real y1, real x2, real y2, real x3, real y3, real x4, real y4 returns nothing
            /*With each of call of this function, the minimap is modified in a bugged way :
           The positions of units and the fog of war are modified to fit to the new camera bound but not the terrain, nor the destructables.
           The minimap is compressed (vertically) according to the current camera's rotation. With a rotation of 90°, there is no compression. With a rotation of 227.40, the minimap is fully compressed. Between 227.5 and 312.6, the game crashes.
             Moreover, the camera bounds will also be adjusted according to the rotation of the current camera. The camera bounds created will be a rectangle going trough the 4 points given and whose sides will be parallel to the camera.*/


        native DestroyTrigger takes trigger whichTrigger returns nothing
            /* Destroy all bound triggeraction objects.
           Currently it only destroys all bound events, triggercondition and the trigger itself leaving all triggeraction objects to leak unless explicitly destroyed before.
            Also destroy all currently scheduled trigger threads from that trigger.
           Currently destroying a trigger with scheduled trigger threads can cause handle stack corruption which has a high chance to cause Warcraft III to crash.*/


        function SmartCameraPanBJ takes player whichPlayer,location loc,real duration returns nothing
           //This BJ function is currently not net safe. Details explained: https://www.hiveworkshop.com/threads/fixing-smartcamerapanbj-desync.243334/

        constant native GetEventDamage takes nothing returns real
           //Return the amount of life damage taken through an imperfect mana shield. Currently returns 0 or negative only even if the unit takes life damage through the shield.

        function GetRandomSubGroupEnum takes integer count, group sourceGroup returns group
            //Not an even distribution. See http://www.hiveworkshop.com/forums/l-715/g-275344

        native PauseTimer takes timer whichTimer returns nothing
            //Pausing a periodic timer should not cause the timer to lose the periodic status.
     
        native CreateQuest takes nothing returns quest
            //Creating quests during map initialization should not cause a game crash.

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

        native UnitApplyTimedLife takes unit whichUnit, integer buffId, real duration returns nothing
            //Only 'BTLF' will be accepted as a buffId, inputing anything else don't work.

        native DestroyImage takes image whichImage returns nothing
            //May crash the game if an invalid image is used (null, before the first image is created).

        native SetImageRenderAlways takes image whichImage, boolean flag returns nothing
            //Does not work. Use SetImageRenderAlways instead.

        native PlayMusic takes string musicName returns nothing
           //This native may cause a short lag spike as soon as the music starts. To circumvent this lag, stop the current music without fadeout before calling this function (`call StopMusic(false)`).
            //PlayMusicEx has the same issue.

        native CameraSetupApplyWithZ takes camerasetup whichSetup, real zDestOffset returns nothing
           //If a player pauses the game after the camerasetup has been applied, the z-offset of the game camera will change to the z-offset of the camerasetup for that player.

        native SetUnitScale takes unit whichUnit, real scaleX, real scaleY, real scaleZ returns nothing
            //Only takes scaleX int account and uses scaleX for all three dimensions.

        native AddHeroXP takes unit whichHero, integer xpToAdd, boolean showEyeCandy returns nothing
           //Adding negative value to experience will decrease it by the stated value, but won't lower the level even if the experience value after deduction is lower than the lower bound of the experience required to get the stated level.
            //If the value will become lower than zero, the experience won't be negative, instead of it it'll be equal to 4294967296+(supposed_negative_experience_value) which actually proves that WarCraft III uses unsigned int type for storing experience points.
        native UnitDamagePoint takes unit whichUnit, real delay, real radius, real x, real y, real amount, boolean attack, boolean ranged, attacktype attackType, damagetype damageType, weapontype weaponType returns boolean
            //Has been known to cause crashes in battle.net

        native AddResourceAmount takes unit whichUnit, integer amount returns nothing
            /*If the value after adding negative amount will be less than zero, then it
            will display negative resource amount, but if some peasant or peon will try to
            gather resources from such a mine, he will bring back 0 gold and the mine will
            be auto-destroyed.*/

        constant native UnitId2String takes integer unitId returns string
            //Always returns null after the game is loaded/if the game is a replay.

        constant native AbilityId takes string abilityIdString returns integer
        constant native AbilityId2String takes integer abilityId returns string
            // Both not working correctly

        native GroupEnumUnitsOfTypeCounted takes group whichGroup, string unitname, boolexpr filter, integer countLimit returns nothing
        native GroupEnumUnitsInRectCounted takes group whichGroup, rect r, boolexpr filter, integer countLimit returns nothing
        native GroupEnumUnitsInRangeCounted takes group whichGroup, real x, real y, real radius, boolexpr filter, integer countLimit returns nothing
        native GroupEnumUnitsInRangeOfLocCounted takes group whichGroup, location whichLocation, real radius, boolexpr filter, integer countLimit returns nothing
            //Causes irregular behavior when used with large numbers
     
        native ResetUbersplat takes ubersplat whichSplat returns nothing
        native FinishUbersplat takes ubersplat whichSplat returns nothing
        native SetTerrainFog takes real a, real b, real c, real d, real e returns nothing
        native AddSpellEffect takes string abilityString, effecttype t, real x, real y returns effect
        native AddSpellEffectLoc takes string abilityString, effecttype t,location where returns effect
        native GetAbilityEffect takes string abilityString, effecttype t, integer index returns string
        native GetAbilitySound takes string abilityString, soundtype t returns string
            //All do nothing.

        native MultiboardSetRowCount takes multiboard lb, integer count returns nothing
            /*It is only safe to change the row count by one. Use multiple calls for bigger values.
            Details explained:  http://www.hiveworkshop.com/forums/l-715/m-250775/
                                http://www.hiveworkshop.com/forums/t-269/w-234897/  
            */

        native GetLocalizedString takes string source returns string
            //Cannot assign it to a constant variable as it will crash the game.
            //constant string foo = GetLocalizedString("bar")

        native SyncStoredString takes gamecache cache, string missionKey, string key returns nothing
            //Doesn't work
     
        native PauseUnit takes unit whichUnit, boolean flag returns nothing
            /* This forces a unit to have a collision until it's unpaused.
            Pausing a unit with a disabled collision will re-enable it for this unit.
            Trying to disable the collision of a paused unit doesn't work.
            This has been tested with the SetUnitPathing native and abilities that affect collision such as 'Aeth'*/


       native UnitModifySkillPoints takes unit whichHero, integer skillPointDelta returns boolean
           //Can only add as many points the Hero can use at the given moment. A vanilla hero level 1 can have only 10 points added to him per call
            //Works as excepted with any negative value  

        native TimerGetRemaining takes timer whichTimer returns real
            //This might not return the correct value if the timer was paused and restarted at one point.
            //Details explained: http://www.wc3c.net/showthread.php?t=95756

        native GetExpiredTimer takes nothing returns timer
            //Might crash the game if called when there is no expired timer.
            //Details explained: http://www.wc3c.net/showthread.php?t=84131
         
        native SetSoundPitch takes sound soundHandle, real pitch returns nothing
            //This native has very weird behaviour.
            //Details explained: http://www.hiveworkshop.com/threads/setsoundpitch-weirdness.215743/#post-2145419
            //For a non-bugged implementation: http://www.hiveworkshop.com/threads/snippet-rapidsound.258991/#post-2611724

        native DisplayTimedTextFromPlayer takes player toPlayer, real x, real y, real duration, string message returns nothing
            //Only the first "%s" will be replaced correctly. Following "%s" will be printed as garbage.
            //Using formatters like "%i" will also print garbage and following "%s" wont work either.

        constant native OrderId takes string orderIdString returns integer
            //Do not use this in a global initialisation as it returns 0 there.
         
        constant native OrderId2String takes integer orderId returns string
        constant native UnitId2String takes integer unitId returns string
            //Do not use this in a global initialisation as it returns null there.
         
        constant native GetObjectName takes integer objectId returns string
            //Do not use this in a global initialisation as it crashes the game there.
         
        native LoadGame takes string saveFileName, boolean doScoreScreen returns nothing
            /*The filename seems to have some limitations:
            - No underscores in campaign names.
            - Shorter file names for savegames.
            - Probably no dots in savegames or campaign names.
           For more info see http://www.hiveworkshop.com/threads/map-transition-does-not-work-when-loading-a-custom-savegame.286927/
            */


        native GetWidgetLife takes widget w returns real
            //The real is not exact? Details lacking.

        native TriggerRegisterUnitStateEvent takes trigger whichTrigger, unit whichUnit, unitstate whichState, limitop opcode, real limitval returns event
            //EQUAL is broken? Details lacking.
     
    //===========================================================================
    // CHANGES TO EXISTING NATIVES
    //===========================================================================

        native SetUnitState takes unit whichUnit,unitstate whichUnitState,real newVal returns nothing
           //Add support for modifying both maximum and regeneration for life and mana. Currently only supports modifying current life.

        native DisplayTimedTextToPlayer takes player toPlayer, real x, real y, real duration, string message returns nothing
            //Change it so that displaying text to a player with unique x and y does not move any other messages.
     
        constant gameevent EVENT_GAME_TRACKABLE_HIT                 = ConvertGameEvent(7)
        constant gameevent EVENT_GAME_TRACKABLE_TRACK               = ConvertGameEvent(8)
            //Make GetTriggerPlayer() Return the player that triggered the trackable event

    //===========================================================================
    // NEW NATIVES
    //===========================================================================
    //===========================================================================
    // GAME
    //===========================================================================

        native EnableCheats takes boolean flag returns nothing
            //Already exist but not usable (game.dll + 0x1C97E0 on 1.28.5).

    //===========================================================================
    // EVENTS
    //===========================================================================

    // > NEW EVENTS

        constant unitevent EVENT_UNIT_REMOVED                
           //The event triggers the instant before the unit is removed from the game. Units get removed from the game by a variety of sources such as triggers, decaying or merging.
        constant unitevent EVENT_UNIT_UNLOADED                
            //Triggers when unit is unloading
        constant unitevent EVENT_UNIT_IDLES                  
           //Similarly to how worker icons appear at the bottom-left corner of the screen when idling, this event detects when ANY unit is idling.
        constant unitevent EVENT_UNIT_ENTERS_COMBAT          
           //What it says on the tin - this event fires when a unit enters combat. Will be useful for in/out of combat regeneration, for example.
        constant unitevent EVENT_UNIT_EXITS_COMBAT            
           //What it says on the tin - this event fires when a unit leaves combat. Will be useful for in/out of combat regeneration, for example.
        constant unitevent EVENT_UNIT_DAMAGE_RELEASE          
           //This triggers when a unit's attack is released, aka when a melee unit hits its target or a ranged unit launches a missile.
        constant unitevent EVENT_UNIT_MOVES                  
            //Fires when a unit moves.
        constant unitevent EVENT_UNIT_EVADE                  
            //The event triggers when a unit evades an attack using an evade ability (Evasion, Drunken Brawler, etc).

        constant playerunitevent EVENT_PLAYER_UNIT_DAMAGE_RELEASE
            //Same as EVENT_UNIT_DAMAGE_POINT except as a player unit event.
        constant playerunitevent EVENT_PLAYER_UNIT_EVADE        
            //Same as EVENT_UNIT_EVADE except as a player unit event.
        constant playerunitevent EVENT_PLAYER_UNIT_REMOVED    
            //Same as EVENT_UNIT_REMOVED except as a player unit event.

    // > RESOURCES EVENT EXTENSION

        constant unitevent EVENT_UNIT_RESOURCE_RETURN                //The event triggers when a unit returns a resource such as from gathering.
        constant unitevent EVENT_UNIT_RESOURCE_HARVEST               //The event triggers when a unit harvests a resource. This event means the amount the unit is carrying has changed.
        constant playerunitevent EVENT_PLAYER_UNIT_RESOURCE_RETURN   //Same as EVENT_UNIT_RESOURCE_RETURN except as a player unit event.
        constant playerunitevent EVENT_PLAYER_UNIT_RESOURCE_HARVEST  //Same as EVENT_UNIT_RESOURCE_HARVEST except as a player unit event.

        constant resourcetype RESOURCE_GOLD                          //Used by natives below.
        constant resourcetype RESOURCE_LUMBER                        //Used by natives below.

        function GetEventResourceType takes nothing returns resourcetype                      
            //The resource type the event responded to. For example RESOURCE_LUMBER when a wisp unit gathers lumber.
        function GetEventResourceAmount takes nothing returns integer                        
            //The resource amount the event responded to. For example 10 when a Haunted Gold Mine extracts 10 gold.
     

    // > DAMAGE EVENT EXTENSION

        constant playerunitevent EVENT_PLAYER_UNIT_DAMAGED           //Same as EVENT_UNIT_DAMAGED except as a player unit event.

        function GetEventDamageAttackType takes nothing returns attacktype                    
            //In response to a damage event returns the attacktype (Spell, Hero, Chaos, etc) of the damage.
        function GetEventDamageDamageType takes nothing returns damagetype
            //In response to a damage event returns the damagetype (unkown, magic, normal, enhanced, etc) of the damage.
        function GetEventDamageAbilityId takes nothing returns integer                        
           //In response to a damage event returns the ability ID that caused the damage. This ability can be a damage spell (Flame Strike, Storm Bolt, etc) or an attack modifier ability (Cold Arrow, orb of fire, etc). Normal attack damage returns some safe default value such as 0.
        function GetEventDamageUnmodified takes nothing returns real                          
           //In response to a damage event returns the damage dealt to the unit before any modifications (armor, attacktype reduction, etc) were applied.
        function GetEventDamageMana takes nothing returns real                                
            //In response to a damage event returns the mana lost due to an active mana shield.

    // > ALREADY ADDED NATIVES IN 1.29 PTR
    /*
        native SetEventDamage                           takes real damage returns nothing
    */

    //===========================================================================
    // TRIGGER
    //===========================================================================

        function EvaluateBoolexpr takes boolexpr func returns boolean
           //Simple function to evaluate a boolexpr in a single call. Currently one has to bind it to a trigger as a condition, evaluate the trigger and then destroy the trigger after evaluation. The way the boolexpr is executed should be similar to the current trigger approach.

    //===========================================================================
    // TIMER
    //===========================================================================

        function TimerSetRemaining takes timer t, real newTime returns nothing
            //Set Remaining time would allow to enlarge/shorten a timer's duration.
            //Or evoke its execution instantly
            //without changing execution code nor repeat mode.

        function TimerSetRepeat takes timer t, real repeatTime returns nothing
            //change the repeatTime of an timer.
            //will en/disable repeat mode, if needed.
     
    //===========================================================================
    // PLAYER
    //===========================================================================

    // > ALREADY ADDED NATIVES IN 1.29 PTR
    /*
        constant native DecPlayerTechResearched         takes player whichPlayer, integer techid, integer levels returns nothing
    */

    //===========================================================================
    // FORCE
    //===========================================================================
     
       function FirstOfForce takes force f returns player
           //same as FirstOfGroup, for player-groups.

    //===========================================================================
    // PATHING
    //===========================================================================

        function GetPathingCost takes real x1 real y1 real x2 real y2 returns int
            // GetPathing returns the pathing cost between two points and returns -1 if it's unreachable.

    //===========================================================================
    // TERRAIN
    //===========================================================================

        function GetWaterZ takes real x, real y returns real
            //returns the water level (shallow or deep) since currently GetLocationZ() ignores water level.
        function GetCliffZ takes real x, real y returns real
            //related to this https://www.hiveworkshop.com/threads/calculating-a-flying-units-flyheight.270925/

    //===========================================================================
    // UBERSPLAT
    //===========================================================================

        function SetUbersplatPos takes ubersplat u, real x, real y returns nothing
            //Moves an ubersplat to a new map relative coordinate.
        function SetUbersplatScale takes ubersplat u, real x, real y returns nothing
           //Allows the distortion of an ubersplat. This is applied to the ubersplat in its default orientation before it is rotated.
        function SetUbersplatFacing takes ubersplat u, real angle returns nothing
            //Allows an ubersplat to be rotated. Useful for hazard markers or hit markers. Angle is in degrees.
        function SetUbersplatFacingRad takes ubersplat u, real angle returns nothing
            //Same as SetUbersplatFacing except angle is in radians.

    //===========================================================================
    // SPECIAL EFFECT
    //===========================================================================

        function AddSpecialEffectEffect takes string modelName, effect targetEffect, string attachPointName returns effect
            //Create a special effect attached to another special effect.
        function SetSpecialEffectEffect takes effect fx, effect targetEffect, string attachPointName returns nothing
            //Moves a special effect to the target special effect.

    // > ALREADY ADDED NATIVES IN 1.29 PTR
    /*
        native SetSpecialEffectX                        takes effect whichEffect, real x returns nothing
        native SetSpecialEffectY                        takes effect whichEffect, real y returns nothing
        native SetSpecialEffectZ                        takes effect whichEffect, real z returns nothing
        native SetSpecialEffectPositionLoc              takes effect whichEffect, location loc returns nothing
        native GetLocalSpecialEffectX                   takes effect whichEffect returns real
        native GetLocalSpecialEffectY                   takes effect whichEffect returns real
        native GetLocalSpecialEffectZ                   takes effect whichEffect returns real

        native SetSpecialEffectColorByPlayer            takes effect whichEffect, player whichPlayer returns nothing
        native SetSpecialEffectColor                    takes effect whichEffect, integer r, integer g, integer b returns nothing
        native SetSpecialEffectAlpha                    takes effect whichEffect, integer alpha returns nothing

        native SetSpecialEffectScale                    takes effect whichEffect, real scale returns nothing

        native SetSpecialEffectPosition                 takes effect whichEffect, real x, real y, real z returns nothing
        native SetSpecialEffectHeight                   takes effect whichEffect, real height returns nothing

        native SetSpecialEffectTimeScale                takes effect whichEffect, real timeScale returns nothing
        native SetSpecialEffectTime                     takes effect whichEffect, real time returns nothing

        native SetSpecialEffectOrientation              takes effect whichEffect, real yaw, real pitch, real roll returns nothing
        native SetSpecialEffectYaw                      takes effect whichEffect, real yaw returns nothing
        native SetSpecialEffectPitch                    takes effect whichEffect, real pitch returns nothing
        native SetSpecialEffectRoll                     takes effect whichEffect, real roll returns nothing

        native PlaySpecialEffect                        takes effect whichEffect, integer anim returns nothing
        native PlaySpecialEffectWithTimeScale           takes effect whichEffect, integer anim, real timeScale returns nothing
    */

    //===========================================================================
    // LIGHTNING
    //===========================================================================
     
        native SetLightningScale takes lightning whichBolt, real scale returns nothing

    //===========================================================================
    // WEATHER EFFECT
    //===========================================================================

        function SetWeatherEffectHeight takes weathereffect whichEffect, real height returns nothing
        function SetWeatherEffectScale takes weathereffect whichEffect, real scale returns nothing
        function SetWeatherEffectColor takes weathereffect whichEffect, real r, real g, real b, real a returns nothing
        function SetWeatherEffectSound takes weathereffect whichEffect, sound soundHandle returns nothing

    //===========================================================================
    // WIDGET
    //===========================================================================

    // > WIDGET VISUAL

        function SetWidgetTexure takes widget whichWidget, string texturePath, integer replaceableId returns boolean
        /*Models can have textures with a Replaceable ID instead of a texture path.
        The most common use of this is for team color and hero glow (Replaceable ID 1 & 2).
        While there are natives to set a units team color, that's about all that is natively supported.
        The Mountain Giant's War Club ability will change any texture on the caster that uses "Replaceable ID 32" to the texture of the targeted destructable.
         While this allows us to modify ID 32, it's not enough and has some overhead.

        If we can allow the user to change any ID, then we can switch the texture of any part of the model dynamically.
        Of course this requires models to use Replaceable ID's instead of texture paths, so many vanilla models won't have uses other than custom team colors.
        Perhaps a complete API to modify model data would be better, however this would be the easiest to implement.
        There is already an internal function capable of doing this. However it requires a destructable as one of the paramaters, but I think it should be fairly easy to find a way to not require one.
        The way I do it is by using a dummy destructable object (not handle) and switching it's texture, but there is probably a better way.*/


        function GetWidgetTexure takes widget whichWidget, replaceableId returns string

    // > WIDGET ATTACHEMENT

        function GetLocalTargetAttachmentX takes widget who, string attachmentname returns real
            //Get the map relative x coordinate of the specified attachment site. Not net safe.
            //for instance GetLocalTargetAttachmentX(unit,"hand") would return the projected X coordinate of the hand
        function GetLocalTargetAttachmentY takes widget who, string attachmentname returns real
            //Get the map relative y coordinate of the specified attachment site. Not net safe.
        function GetLocalTargetAttachmentZ takes widget who, string attachmentname returns real
            //Get the map relative z coordinate of the specified attachment site. Not net safe.
     
    // > WIDGET EVENTS

        function TriggerRegisterWidgetInRange takes trigger whichTrigger, widget whichWidget, real range, boolexpr filter returns event
     
    // > WIDGET GROUP
        type widgetgroup extends agent
            //this would allow tot make groups of items and destructables
     
        function CreateWidgetGroup                      takes nothing returns widgetgroup
        function DestroyGroup                           takes widgetgroup whichGroup returns nothing
        function GroupAddWidget                         takes widgetgroup whichGroup, widget wichWidget returns nothing
        function GroupRemoveWidget                      takes widgetgroup whichGroup, widget wichWidget returns nothing
        function GroupClear                             takes widgetgroup whichGroup returns nothing
        function GroupEnumWidgetsOfType                 takes widgetgroup whichGroup, string widgetname, boolexpr filter returns nothing
        function GroupEnumWidgetsOfTypeCounted          takes widgetgroup whichGroup, string widgetname, boolexpr filter, integer countLimit returns nothing
        function GroupEnumWidgetsInRect                 takes widgetgroup whichGroup, rect r, boolexpr filter returns nothing
        function GroupEnumWidgetsInRectCounted          takes widgetgroup whichGroup, rect r, boolexpr filter, integer countLimit returns nothing
        function GroupEnumWidgetsInRange                takes widgetgroup whichGroup, real x, real y, real radius, boolexpr filter returns nothing
        function GroupEnumWidgetsInRangeOfLoc           takes widgetgroup whichGroup, location whichLocation, real radius, boolexpr filter returns nothing
        function GroupEnumWidgetsInRangeCounted         takes widgetgroup whichGroup, real x, real y, real radius, boolexpr filter, integer countLimit returns nothing
        function GroupEnumWidgetsInRangeOfLocCounted    takes widgetgroup whichGroup, location whichLocation, real radius, boolexpr filter, integer countLimit returns nothing
        function ForGroup                               takes widgetgroup whichGroup, code callback returns nothing
        function FirstOfGroup                           takes widgetgroup whichGroup returns widget
            //native widgetgroup API update for widget widgetgroup

    //===========================================================================
    // DESTRUCTABLE
    //===========================================================================

        constant destructableevent DESTRUCTIBLE_DEATH                //Triggers when a destructible dies. I put this here to standardise the way destructible events work.
        constant destructableevent DESTRUCTIBLE_COMBAT               //Triggers when a destructible takes damage from a combat source. Ignores tree-harvesting.
        constant destructableevent DESTRUCTIBLE_HARVESTED            //Triggers when a destructible takes damage from a tree-harvest ability. Ignores combat damage.
        constant destructableevent DESTRUCTIBLE_DAMAGED              //Triggers when a destructible takes any damage at all.

        function IsDestructableTree takes destructable d returns boolean
            //Returns true if a destructable can be used as a tree. Otherwise false.
        function TriggerRegisterDestructibleEvent takes trigger whichTrigger, destructable d, destructableevent whichEvent returns event
            //Like TriggerRegisterUnitEvent. Some of the important event constants are listed but others might also exist.
        function TriggerRegisterAnyDestructibleEvent takes trigger whichTrigger, destructableevent whichEvent returns event
            //Like TriggerRegisterDestructibleEvent except applies to all destructables on the map, even ones yet to be created.
     
    //===========================================================================
    // TRACKABLE
    //===========================================================================

        function SetTrackablePos takes trackable t, real x, real y returns nothing
            //Moves a trackable to the specified map realative coordinate.
        function SetTrackableZ takes trackable t, real z returns nothing
            //Sets the map realative z coordinate of the trackable. This disables automatic Z positioning.
        function SetTrackableZOffset takes trackable t, real zOffset returns nothing
           //Sets the Z offset of a trackable. This is realitive to the Z it is automatically positioned at. This enables automatic Z positioning.
        function GetTrackableX takes trackable t returns real
            //Returns the map relative x coordinate of the trackable.
        function GetTrackableY takes trackable t returns real
            //Returns the map relative y coordinate of the trackable.
        function GetTrackableZ takes trackable t returns real
           //Returns the map relative z coordinate of the trackable if in map relative z mode. Returns the z offset if in automatic z mode.
        function DestroyTrackable takes trackable t returns nothing
            //Trackables currently cannot be destroyed through triggers, so this native is needed for them to be useful.

    //===========================================================================
    // UNIT
    //===========================================================================

        constant unitstate UNIT_STATE_LIFE_REGEN                     //Unit current life regeneration. Compatible with GetUnitState and SetUnitState.
        constant unitstate UNIT_STATE_MANA_REGEN                     //Unit current mana regeneration. Compatible with GetUnitState and SetUnitState.

        constant armortype ARMOR_TYPE_SMALL                          //Used by natives below.
        constant armortype ARMOR_TYPE_MEDIUM                         //Used by natives below.
        constant armortype ARMOR_TYPE_LARGE                          //Used by natives below.
        constant armortype ARMOR_TYPE_FORTIFIED                      //Used by natives below.
        constant armortype ARMOR_TYPE_NORMAL                         //Used by natives below.
        constant armortype ARMOR_TYPE_HERO                           //Used by natives below.
        constant armortype ARMOR_TYPE_DIVINE                         //Used by natives below.
        constant armortype ARMOR_TYPE_UNARMORED                      //Used by natives below.
        constant armortype ARMOR_TYPE_UNKNOWN                        //Invalid armor type. Has been observed randomly in game, likely as the result of a non fatal memory corruption error to the armor type field.
        constant herostat HERO_STAT_STR                              //Used by natives below.
        constant herostat HERO_STAT_AGI                              //Used by natives below.
        constant herostat HERO_STAT_INT                              //Used by natives below.

        constant movementtype MOVEMENT_TYPE_NONE                     //Used by natives below.
        constant movementtype MOVEMENT_TYPE_FOOT                     //Used by natives below.
        constant movementtype MOVEMENT_TYPE_HORSE                    //Used by natives below.
        constant movementtype MOVEMENT_TYPE_FLY                      //Used by natives below.
        constant movementtype MOVEMENT_TYPE_HOVER                    //Used by natives below.
        constant movementtype MOVEMENT_TYPE_FLOAT                    //Used by natives below.
        constant movementtype MOVEMENT_TYPE_AMPHIBIOUS               //Used by natives below.

    // > UNIT LEVEL

        function SetUnitLevel takes unit u, integer newLevel returns nothing
            //Set the unit level of a non hero unit to the specified level. Does nothing to heroes.

    // > UNIT ABILITIES

        function SetUnitAbilityCooldownRemaining takes unit u, integer abilityId, real remaining returns nothing
        function IsUnitAbilityOnCooldown takes unit u, integer abilityId returns boolean
            //Returns true if an ability is on cooldown for a unit.

    // > UNIT VISUALS
                     
        function GetUnitIconPath takes unit u returns string
            //Returns the command card icon path of a unit.
        function GetUnitTypeIconPath takes integer unitId returns string
            //Returns the command card icon path of a unit type.
        function SetUnitIconPath takes unit u, string path returns nothing
            //Changes the command card icon path of a unit.
        function GetUnitModelPath takes unit u returns string
            //Returns the model path of a unit.
        function GetUnitTypeModelPath takes integer unitId returns string
            //Returns the model path of a unit type.
        function SetUnitModelPath takes unit u, string path returns nothing
            //Changes the model path of a unit.

        function ShowUnitLocalPlayer takes unit whichUnit, player pUnit, boolean show returns nothing
            //Native Show Unit with GetLocalPlayer()  work to hide a unit for a single player.
     
        function SetUnitSelectionCircle takes unit u, image circle returns nothing
            //Sets a selection circle image for a unit
        function ResetUnitSelectionCircle takes unit u returns nothing
            //Returns the original selection circle of the unit
        function GetUnitShadow takes unit whichUnit returns image
            // or at least this: function ShowUnitShadow takes unit whichUnit, boolean flag returns nothing
     
     
    // > UNIT MOVEMENT

        function SetUnitMovementType takes unit u, movementtype movementType returns nothing
            //Changes the movement type of a unit to the specified movement type.
        function GetUnitMovementType takes unit u returns movementtype
            //Get the movement type of a unit.

        function UnitDisableMovement takes unit u, boolean flag returns nothing
           //toggles a unit's movement on or off. Currently feasible with SetUnitPropWindow to zero, but restoring requires radians but GetUnitDefaultPropWindow returns degrees. Not a big issue, but it's hidden information.
        function UnitDisableTurning    takes unit u, boolean flag returns nothing
            //toggles a unit's ability to turn on or off.
     
        function IsUnitMoving takes unit u returns boolean
           //Returns true if a unit is trying to move. The unit might not actually be moving if it is waiting for the pathfinder to attend to it.
        function IsUnitIdle takes unit u returns boolean
            //Returns true if a unit is not moving, is not attacking, is not casting and is not using an item.
     
        function SetUnitMaxSpeed takes unit u, real r returns nothing
        function GetUnitMaxSpeed takes unit u, nothing returns real
        function SetUnitMinSpeed takes unit u, real r returns nothing
        function GetUnitMinSpeed takes unit u, nothing returns real
            //Does maximum and minimum unit speed even do anything? If so, the ability to modify those would be welcome.


    // > UNIT ATTACK

        function SetUnitAttackCooldown takes unit u, real duration returns nothing
           //Sets the current attack cooldown time to a different value, potentially overriding/ignoring backswing point. Set to zero to cause the next attack to occur instantly. Can start attack cooldown.
        function GetUnitAttackCooldownRemaining takes unit u returns real
           //Returns the remaining time in game seconds of the currently occuring attack cooldown. Returns 0.0 if attack is not on cooldown.
        function UnitAttackTarget takes unit whichUnit, widget target, real amount, attacktype attackType, damagetype damageType, weapontype weaponType returns boolean
            //Similar to UnitDamageTarget but does so with the source's attack modifiers like Orb Effects, Critical Strike, Bash, Lifesteal, etc.
        function UnitAttackArea takes unit whichUnit, real radius, real x, real y, real amount, attacktype attackType, damagetype damageType, weapontype weaponType, boolexpr filterFunc returns boolean
           //Just like UnitAttackTarget(), but this takes a boolexpr argument at the end to filter out unwanted victims. This is helpful in the case of area attacks with chance modifiers like bash.
        function GetUnitAttackSpeedBonus takes unit u,  returns real
           //Returns the current attack speed bonus of a unit. For instance a hero with a glove of haste (+15% attack speed) would return 0.15
        function ModifyUnitAttackSpeedBonus takes unit u, real fraction returns nothing
            //Applies a bonus to the attack speed of a unit, being treated the same as other attack speed modifiers.
         
        function IsUnitInCombat takes unit u returns boolean
            //Returns true if a unit has recently attacked or been attacked. Possibly tied into the forces under attack mechanics?


    // > UNIT POSITION
        function SetUnitFacingInstant takes unit u, real facingAngle returns nothing
           //Similar to SetUnitFacing but with angle change being instant with turn rate and orientation interpolation being ignored. Angle is in degrees.
        function SetUnitFacingInstantRad takes unit u, real facingAngle returns nothing
            //Same as SetUnitFacingInstant except angle is in radians.
        function SetUnitFacingRad takes unit whichUnit, real facingAngle returns nothing
            //Same as SetUnitFacing except angle is in radians.


    // > UNIT ARMOR

        function GetUnitArmorType takes unit u returns armortype                              
        function SetUnitArmorType takes unit u, armortype armorType returns nothing    

        function GetUnitArmorBonus takes unit u returns real
            //Returns the current armor bonus of a unit.
        function ModifyUnitArmorBonus takes unit u, real amount returns nothing
            //Applies armor modifier to a unit, being treated the same as all other armor modifiers.
     
     
    // > UNIT COST

        function GetUnitGoldCost takes integer unitid returns integer
            //AI native copied to normal JASS for convince.
        function GetUnitWoodCost takes integer unitid returns integer
            //AI native copied to normal JASS for convince.
     
        function SetUnitAbilityManaCost takes unit u, integer abilityId, integer level, integer newcost returns integer

    // > UNITS CONTROL

        function UnitDisableControl takes unit u boolean flag returns nothing
            //toggles whether a unit responds to player commands on or off. Can still respond to trigger commands.
        function UnitFullDisable takes unit u, boolean flag returns nothing
           //toggles whether a unit responds to ANY commands on or off. Similar to being stunned, but will not 'unstun' until UnitFullDisable is set to false.
        function UnitDisableAttack takes unit u, boolean flag returns nothing
           //Turns off one of the two attack indices. Currently feasible by adding Cargo Hold ability to the unit, but it disables both indices.
        function UnitDisableSelection takes unit u, boolean flag returns nothing
            //Same as giving Locust ability to a unit (Aloc), but can be enabled/disabled without any buggy side effects.
        function UnitApplyTimer takes unit u, integer buffId, real timeout returns timer
           //Applies a non-fatal timer to a unit that shows the time ticking down like with a spell like Avatar or Metamorphosis. When the timer expires, a TimerRegisterExpireEvent fires.
        function UnitDisableItems takes unit u, boolean flag, boolean passive returns nothing
            //Toggles whether a unit can use items. Item passive effects are optionally able to be turned on or off.
        function UnitChangeUnitId takes unit u, integer unitid returns nothing
            //Changes the unit type ID of a unit. Results are the same as unit a morph ability except without needing an ability.
        function ReviveUnit takes unit u returns nothing
           //Revives a dead unit at the position of its corpse. Mechanically the same as the unit being effected by Paladin's Resurrection ability.
     
    // > HEROES

        function GetHeroPrimaryStat takes unit u returns herostat
           //Returns the integer code for the attribute that is set as primary. Eg if the unit is a Paladin, it returns the id for Strength.
        function GetHeroPrimaryStatById takes integer unitid returns herostat
            //Same as above but references the object editor value instead of an actual unit.
        function SetHeroPrimaryStat takes unit u, herostat stat returns integer
           //Allows the game to individual modify which attribute of the hero becomes its primary. Damage modifier from primary hero stat has to be reapplied.
        function GetHeroStat takes herostat whichStat, unit whichHero, boolean includeBonuses returns integer
            //Mechanically same as the GetHeroStatBJ function except takes the new native herostat constants.
        function SetHeroStatEx takes unit whichHero, herostat whichStat, integer value, boolean permanent returns nothing
           //Mechanically similar to the SetHeroStat function except takes the new native herostat constants and can set permanence.
     
    // > CONSTRUCTION & TRAINING

        function GetUnitBuildTime takes integer unitid returns integer
            //AI native ported to standard JASS.
        function GetHeroBuildTime takes integer unitid, player whichPlayer returns integer
           //Returns the train time in seconds for a player to make the specified hero type. Factors in train time increases with sequential heroes in melee.
        function GetHeroReviveTime takes unit whichUnit returns integer
            //Returns the revive time in seconds for a player to revive the specified hero if it were dead.
        function GetBuilderUnit takes unit building returns unit
           //Returns the unit that constructed a building/unit. In the case of buildings this should be the unit that converted the foundation into a unit.
        function GetUnitBuildProgress takes unit u returns real
           //Returns the fraction (percent / 100) completion of a building/unit in progress. If the unit has no progress (already built) returns 1.0.
        function SetUnitBuildProgress takes unit u, real fraction returns nothing
           //Modifies the fraction completion of a building/unit in progress. A fraction of 1.0 causes the unit to be instantly completed. Does nothing to a unit that is complete.
        function GetUnitTrainProgress takes unit factory returns real
            //Returns the fraction completion of a unit that is being trained. Returns 1.0 if no unit is being trained.
        function SetUnitTrainProgress takes unit factory, real fraction returns nothing
           //Modifies the fraction completion of a unit that is currently being trained. A fraction of 1.0 causes the unit to be instantly trained. Does nothing to a factory that is not training anything.
        function GetTrainingQueueSize takes unit factory returns integer
            //Returns the number of queued training orders.
        function GetMaxTrainingQueueSize takes unit factory returns integer
            //Returns the maximum number of queued training orders a factory allows.
        function CancelTraining takes unit factory, integer slot returns boolean
           //Cancels a train order from the training queue of a building determined by slot number (eg 0 - 6). Returns true if a unit was actually canceled.
        function ClearTrainingQueue takes unit factory returns boolean
           //Equivelant to calling CancelTraining on all occupied training slots of a building. Returns true if at least 1 training order was canceled.
     
    // > UNIT MARKET

        function SetItemStock takes unit u, integer itemId, integer stock returns nothing
           //Set the stock of an item id in a shop to the specified number. Maximum stock count is respected and if full cooldown progress will be lost.
        function SetItemStockMax takes unit u, integer itemId, integer stock returns nothing
           //Set the maximum stock permitted of an item id in a shop to the specified number. Maximum stock count is respected and if below current stock cooldown and stock items will be lost.
        function GetItemStock takes unit u, integer itemId returns integer
            //Get the stock available of an item id in a shop.
        function GetItemStockMax takes unit u, integer itemId returns integer
            //Get the maximum stock permitted of an item id in a shop.
     
     
    // > UNIT TECH

        function UnitDisableTechBoni takes unit u, boolean flag returns nothing
            //Allows/Disallows a unit benefiting from techs researched.


    // > OTHER UNIT NATIVES

        function SetUnitVisionType takes unit u, boolean flying returns nothing
            //Changes the vision mechanics of a unit to either be ground (can be occluded by terrain) or flying (absolute).
        function GroupEnumCorpsesInRange takes group g, real x, real y, real radius, boolexpr filter returns nothing
            //Convenience function to enum all corpses in range of a position.
        function GroupEnumCorpsesInRangeloc takes group g, location whichLocation, real radius, boolexpr filter returns nothing
            //Same as above but with location parameter.
     
    // > ALREADY ADDED NATIVES IN 1.29 PTR
    /*
        native SetHeroName                              takes unit u, string name returns nothing
        native DeleteHeroAbility                        takes unit whichUnit, integer abilCode returns nothing
         
        native GetUnitMaxHP                             takes unit whichUnit returns integer
        native SetUnitMaxHP                             takes unit whichUnit, integer hp returns nothing
        native GetUnitMaxMana                           takes unit whichUnit returns integer
        native SetUnitMaxMana                           takes unit whichUnit, integer mana returns nothing

        native SetUnitName                              takes unit whichUnit, string name returns nothing
        native SetUnitNameAll                           takes unit whichUnit, string name returns nothing

        native GetUnitBaseDamage                        takes unit whichUnit, integer weaponIndex returns integer
        native SetUnitBaseDamage                        takes unit whichUnit, integer baseDamage, integer weaponIndex returns nothing
        native GetUnitDiceNumber                        takes unit whichUnit, integer weaponIndex returns integer
        native SetUnitDiceNumber                        takes unit whichUnit, integer diceNumber, integer weaponIndex returns nothing
        native GetUnitDiceSides                         takes unit whichUnit, integer weaponIndex returns integer
        native SetUnitDiceSides                         takes unit whichUnit, integer diceSides, integer weaponIndex returns nothing
        native GetUnitAttackCooldown                    takes unit whichUnit, integer weaponIndex returns real
        native SetUnitAttackCooldown                    takes unit whichUnit, real cooldown, integer weaponIndex returns nothing

        native GetUnitArmor                             takes unit whichUnit returns real
        native SetUnitArmor                             takes unit whichUnit, real armorAmount returns nothing

        native UnitHideAbility                          takes unit whichUnit, integer abilId, boolean flag returns nothing
        native UnitDisableAbility                       takes unit whichUnit, integer abilId, boolean flag, boolean hideUI returns nothing

        native UnitCancelTimedLife                      takes unit whichUnit returns nothing

        native IsUnitSelectable                         takes unit whichUnit returns boolean
        native IsUnitInvulnerable                       takes unit whichUnit returns boolean

        native UnitInterruptAttack                      takes unit whichUnit returns nothing

        native GetUnitCollisionSize                     takes unit whichUnit returns real

        native SetUnitAbilityCooldown                   takes unit whichUnit, integer abilId, integer level, real cooldown returns nothing
        native GetUnitAbilityCooldown                   takes unit whichUnit, integer abilId, integer level returns real
        native GetUnitAbilityCooldownRemaining          takes unit whichUnit, integer abilId returns real
        native EndUnitAbilityCooldown                   takes unit whichUnit, integer abilCode returns nothing

        native GetUnitAbilityManaCost                   takes unit whichUnit, integer abilId, integer level returns integer

        native GetLocalUnitZ                            takes unit whichUnit returns real
    */

    //===========================================================================
    // ABILITIES
    //===========================================================================

        constant playerevent EVENT_PLAYER_ABILITY_PRESSED
            /*The event triggers when a player presses an ability button and begins targeting.
            Requires netsync from the player so is not instant.
            Most spell event natives like trigger unit and spell ability id work in response to this event.*/


        function GetTriggerPlayerAbilityPressed takes player returns integer
        function SetAbilityManaCost takes integer abilityId, integer level, integer newcost returns integer
        function SetAbilityCooldown takes integer abilityId, integer level, integer newcool returns integer

    // > ALREADY ADDED NATIVES IN 1.29 PTR
    /*
        native GetAbilityManaCost                       takes integer abilId, integer level returns integer
        native GetAbilityCooldown                       takes integer abilId, integer level returns real

        native SetAbilityTooltip                        takes integer abilCode, string tooltip, integer level returns nothing
        native SetAbilityOnTooltip                      takes integer abilCode, string tooltip, integer level returns nothing
        native SetAbilityExtendedTooltip                takes integer abilCode, string ExtendedTooltip, integer level returns nothing
        native SetAbilityOnExtendedTooltip              takes integer abilCode, string ExtendedTooltip, integer level returns nothing
        native SetAbilityResearchTooltip                takes integer abilCode, string researchTooltip, integer level returns nothing
        native SetAbilityResearchExtendedTooltip        takes integer abilCode, string researchExtendedTooltip, integer level returns nothing
        native GetAbilityTooltip                        takes integer abilCode, integer level returns string
        native GetAbilityOnTooltip                      takes integer abilCode, integer level returns string
        native GetAbilityExtendedTooltip                takes integer abilCode, integer level returns string
        native GetAbilityOnExtendedTooltip              takes integer abilCode, integer level returns string
        native GetAbilityResearchTooltip                takes integer abilCode, integer level returns string
        native GetAbilityResearchExtendedTooltip        takes integer abilCode, integer level returns string

        native SetAbilityIcon                           takes integer abilCode, string iconPath, integer level returns nothing
        native GetAbilityIcon                           takes integer abilCode, integer level returns string
        native SetAbilityOnIcon                         takes integer abilCode, string iconPath returns nothing
        native GetAbilityOnIcon                         takes integer abilCode returns string

        native GetAbilityPosX                           takes integer abilCode returns integer
        native GetAbilityPosY                           takes integer abilCode returns integer
        native SetAbilityPosX                           takes integer abilCode, integer x returns nothing
        native SetAbilityPosY                           takes integer abilCode, integer y returns nothing
        native GetAbilityOnPosX                         takes integer abilCode returns integer
        native GetAbilityOnPosY                         takes integer abilCode returns integer
        native SetAbilityOnPosX                         takes integer abilCode, integer x returns nothing
        native SetAbilityOnPosY                         takes integer abilCode, integer y returns nothing
    */

    //===========================================================================
    // BUFF
    //===========================================================================

        unitevent EVENT_UNIT_BUFF_APPLIED
        unitevent EVENT_UNIT_BUFF_EXPIRED
            //Triggers when the buff expires or gets removed
        function UnitApplyBuff takes unit u, integer rawcode, integer level returns nothing
           //Applies specified buff and pauses dissipation timer. SetUnitBuffTimeout can be called later on to remove the paused state and to set the timeout
        function UnitRemoveBuff takes unit u, integer rawcode returns nothing
        function GetEventBuffApplied takes nothing returns integer
        function GetEventBuffExpired takes nothing returns integer
            //Returns buff rawcode
        function SetUnitBuffTimeout takes unit u, integer rawcode, real timeout returns nothing /
            //Starts dissipation timer
        function SetUnitBuffPermanent takes unit u, integer rawcode, boolean flag returns nothing
            //Pauses dissipation timer
        function SetUnitBuffPositive takes unit u, integer rawcode, boolean flag returns nothing
            // By default this parameter inherits buff type settings
     
        function SetUnitBuffLevel takes unit u, integer rawcode, integer level returns nothing
        function SetUnitBuffTip takes unit u, integer rawcode, string tip returns nothing
        function SetUnitBuffUbertip takes unit u, integer rawcode, string tip returns nothing
        function SetUnitBuffArt takes unit u, integer rawcode, string path returns nothing
        function IsUnitBuffPermanent takes unit u, integer rawcode returns boolean
        function IsUnitBuffPositive takes unit u, integer rawcode returns boolean
        function GetTriggerBuff takes nothing returns integer
           //Actually this can be achieved with current methods, but one must use GetUnitAbilityLevel(buffRawcode) function which is not intuitive.

        function GetUnitBuffTimeout takes unit u, integer rawcode returns real
        function GetUnitBuffElapsed takes unit u, integer rawcode returns real
        function GetUnitBuffRemaining takes unit u, integer rawcode returns real
        function GetUnitBuffLevel takes unit u, integer rawcode returns integer
        function GetUnitBuffTip takes unit u, integer rawcode returns string
        function GetUnitBuffUbertip takes unit u, integer rawcode returns string
        function GetUnitBuffArt takes unit u, integer rawcode returns string

    //===========================================================================
    // ITEMS
    //===========================================================================

        function GetItemAbilityCooldownRemaining takes item whichItem returns real
            //Returns the remaining cooldown time on a used item.
        function GetItemAbilityCooldownTimeoutById takes integer itemId returns real
            //Returns the default timeout cooldown of an item type.
        function SetItemAbilityCooldown takes item whichItem, real timeout, real remaining returns real
           //Sets the remaining cooldown time of an item to a specific value. Timeout will clamp remaining for logical reasons and might be ignored for unowned items. Set timeout or remaining to zero to instantly complete cooldown.
        function EnableItem takes item whichItem, boolean flag returns nothing
            //Enables/Disables an item. Items that are disabled provide no modifiers and cannot be used.
    // > ALREADY ADDED NATIVES IN 1.29 PTR
    /*
        native SetItemName                              takes item whichItem, string name returns nothing
        native SetItemDescription                       takes item whichItem, string name returns nothing
        native GetItemDescription                       takes item whichItem returns string
        native SetItemTooltip                           takes item whichItem, string name returns nothing
        native GetItemTooltip                           takes item whichItem returns string
        native SetItemExtendedTooltip                   takes item whichItem, string name returns nothing
        native GetItemExtendedTooltip                   takes item whichItem returns string

        native SetItemIconPath                          takes item whichItem, string name returns nothing
        native GetItemIconPath                          takes item whichItem returns string
    */

    //===========================================================================
    // UI
    //===========================================================================

        constant minimapevent PING                                   //Trigger on a minimap ping
        constant minimapevent MINIMAP_BUTTON_PRESSED                 //Triggers when one of the associated minimap buttons have been pressed.
        function ShowUI takes boolean flag returns nothing
           //True/false arguments would show/hide the UI. That includes disabling the black borders at the top and bottom of the screen.
    // > HP / MANA UI
        function ShowManaBar takes boolean flag returns nothing
           //Turns mana bar display over units on or off. Whether they display depends on the player's Gameplay options but this can overwrite that for a session.
        function SetPlayerHPBarColor takes player p, real red, real green, real blue returns nothing
            //Changes the health bar color of units belonging to a particular player.
        function SetPlayerMPBarColor takes player p, real red, real green, real blue returns nothing
            //Changes the mana bar color of units belonging to a particular player.
        function SetPlayerHPTextColor takes player p, real red, real green, real blue returns nothing
            //Changes the health text color under units portrait belonging to a particular player.
        function SetPlayerMPTextColor takes player p, real red, real green, real blue returns nothing
            //Changes the mana text color under units portrait belonging to a particular player.

    // > BAR

        function CreateBar takes real red, real green, real blue, real alpha returns bar
           //'New' object type. Creates a bar (like the health bars above units) and colours them according to the values used. Eg recreating Protoss shields.
        function AttachBarTarget takes bar whichBar, widget target, real z returns nothing
            //Attaches a bar to a unit, destructable, item etc with the option to move it up and down the z axis.
        function GetBarX takes bar whichBar returns real
            //Returns the x coordinate of a bar.
        function GetBarY takes bar whichBar returns real
            //Returns the y coordinate of a bar.
        function GetBarZ takes bar whichBar returns real
            //Returns the z coordinate of a bar.
        function SetBarPos takes bar, real x, real y, real heightOffset returns nothing
            //Manually repoisitions a bar to map relative coordinates like floating texts.

    // > SCREEN

        function DisplayScreenMessage takes string s, real x, real y, real timeout returns nothing
           //This displays a text message for a period but with respect to normalised X / Y value of the screen. Can overlap other text messages. An invalid timeout will automatically compute a timeout based on message length.
        function GetLocalDisplayResolutionHorizontal takes nothing returns real
            //Returns the horizontal resolution in pixels being used to display Warcraft III for the local client. Not net safe.
        function GetLocalDisplayResolutionVertical takes nothing returns real
            //Returns the vertical resolution in pixels being used to display Warcraft III for the local client. Not net safe.

    // > MINIMAP

        function GetPingX takes ping whichPing returns real
            //returns the corresponding map relative x coordinate of a ping.
        function GetPingY takes ping whichPing returns real
            //returns the corresponding map relative y coordinate of a ping.
        function TriggerRegisterPlayerPingEvent takes trigger whichTrigger, player whichPlayer returns event
           //New event that fires the trigger when the specified player sends a ping. Both GetTriggerPlayer and GetTriggerPing are valid with this event.
        function GetTriggerPing takes nothing returns ping
            //In response to a player ping event returns the ping object that triggered the event.
     
    //===========================================================================
    // CUSTOM UI
    //===========================================================================
        /*
        Someone suggested the ability to customize the UI similar to StarCraft II where one can place custom UI elements anywhere on a clients screen.
        They did not suggest an API to do this however.
        Due to the complexity of such an API I would suggest looking at StarCraft II's implementation which allows the UI to be heavilly customized.
        */

    //===========================================================================
    // MULTIBOARD
    //===========================================================================

        function SetMultiboardScreenPositionXY takes multiboard mb, real x, real y returns nothing
            //This changes the position of a multiboard with respect to normalised X / Y value of the screen

    //===========================================================================
    // LEADERBOARD
    //===========================================================================

        function SetLeaderboardScreenPositionXY takes leaderboard lb, real x, real y returns nothing
            //This changes the position of a leaderboard with respect to normalised X / Y value of the screen
     
    //===========================================================================
    // TEXTTAG
    //===========================================================================

        constant textagalignment TEXTTAG_CENTER
        constant textagalignment TEXTTAG_RIGHT
        constant textagalignment TEXTTAG_LEFT

        function SetTexTagAlignment takes texttag tt, textagalignment alignment returns nothing
        // left—the text is aligned along the left margin (default);
        // right—the text is aligned along the right margin;
        // centered—text is aligned to neither the left nor right margin; there is an even gap on each side of each line.

    //===========================================================================
    // DIALOG
    //===========================================================================

        function IsPlayerInDialog takes player p returns boolean
            //Returns true if the player currently has any dialog box visible to them. Might require net sync.

    //===========================================================================
    // HARDWARE INPUT
    //===========================================================================

        constant mouseevent MOUSE_WHEEL_ANY                          //Triggers when the mouse wheel scrolls up or down
        constant mouseevent MOUSE_WHEEL_UP                           //Triggers when the mouse wheel scrolls up
        constant mouseevent MOUSE_WHEEL_DOWN                         //Triggers when the mouse wheel scrolls down

    // > MOUSE

        function GetLocalCursorTargetX takes nothing returns real
           //Returns the map relative x coordinate that the local client cursor is targeting. If the cursor is not targeting anything on the map returns 0. Not net safe.
        function GetLocalCursorTargetY takes nothing returns real
           //Returns the map relative y coordinate that the local client cursor is targeting. If the cursor is not targeting anything on the map returns 0. Not net safe.
        function GetLocalCursorTargetZ takes nothing returns real
           //Returns the map relative z coordinate that the local client cursor is targeting. If the cursor is not targeting anything on the map returns 0. Not net safe.
        function SetLocalCursorX takes real x returns nothing
            //Set the local client cursor position to the specified screen space normalised x coordinate.
        function SetLocalCursorY takes real y returns nothing
            //Set the local client cursor position to the specified screen space normalised y coordinate.
        function IsLocalCursorOverUI takes nothing returns boolean
            //Returns true if the cursor is currently not targeting the map. Not net safe.
        function IsLocalMouseButtonPressed takes mousebutton mouseButton returns boolean
           //Returns true or false depending on which mouse button is being held down. Will be useful for click-and-drag functions. Not net safe.
        function GetTriggerPlayerMouseEvent takes nothing returns mouseevent
            //In response to player mouse event returns which mouseevent triggered the trigger.
        function GetTriggerPlayerMouseScreenX takes nothing returns real
            //In response to player mouse event returns the screen space normalised x coordinate the event occurred at. Is net safe.
        function GetTriggerPlayerMouseScreenY takes nothing returns real
            //In response to player mouse event returns the screen space normalised y coordinate the event occurred at. Is net safe.

        function GetTriggerPlayerMouseY takes nothing returns real
           //In response to player mouse event returns the map relative z coordinate the event occurred at. Return value non 0.0 only if the mouse event targeted the map. Is net safe.

    // > KEYBOARD

        function TriggerRegisterPlayerKeyboardEvent takes trigger whichTrigger, player whichPlayer, keyboardbutton hotkey, boolean state returns event
           //Fires when the corresponding key is pressed by the player. The keyboardbutton constants are not mentioned but should cover most common keyboard buttons. If state is true then fires when key is pressed, otherwise fires when key is released. Attaching this event causes keyboard button sync traffic from the player.
        function GetTriggerKeyboardButton takes nothing returns keyboardbutton
            //In response to player keyboard event returns which button caused the event.
        function GetTriggerKeyboardState takes nothing returns boolean
           //In response to player keyboard event returns the state that caused the event. True if it was pressed, false if released.
        function GetLocalKeyboardButtonState takes keyboardbutton whichButton returns boolean
           //Returns true if the local client has the specified keyboard button (eg arrow keys) depressed or false if released. Not net safe.

    // > ALREADY ADDED NATIVES IN 1.29 PTR
    /*
        constant mousebuttontype    MOUSE_BUTTON_TYPE_LEFT          = ConvertMouseButtonType(1)
        constant mousebuttontype    MOUSE_BUTTON_TYPE_MIDDLE        = ConvertMouseButtonType(2)
        constant mousebuttontype    MOUSE_BUTTON_TYPE_RIGHT         = ConvertMouseButtonType(3)
        constant playerevent        EVENT_PLAYER_MOUSE_DOWN                 = ConvertPlayerEvent(269)
        constant playerevent        EVENT_PLAYER_MOUSE_UP                   = ConvertPlayerEvent(270)
        constant playerevent        EVENT_PLAYER_MOUSE_MOVE                 = ConvertPlayerEvent(271)
        native GetTriggerPlayerMouseX                   takes nothing returns real
        native GetTriggerPlayerMouseY                   takes nothing returns real
        native GetTriggerPlayerMousePosition            takes nothing returns location
        native GetTriggerPlayerMouseButton              takes nothing returns mousebuttontype
    */

    //===========================================================================
    // AI
    //===========================================================================
    /*
        One of the biggest problems with the AI is the very inflexible use of captain widgets.
        Currently, captain widgets are a "middleman" in charge of orders given to the computer player.
        The AI player moves, or teleports, the captain widget to a target location and the units assigned to the captain follow.
        There are two captains: attack and defense, each with it's own problems.
        The units assigned to the defense captain will stay still even when given an order to change location, until one of three cases:
            aggroed,
            player town under attack,
            another unit is added to the defense captain.
        But the bigger problem is with the attack captain: once a unit has been added to the attack captain, it cannot be removed manually.
        If it is injured, and the attack group requires units with a higher health percentage, then the unit will be removed, but it cannot be done manually.
        I have two ideas for solutions in mind, both in a way that should not break backwards compatibility and enhance the AI greatly:
        1. Add an  */
    Empty attack group /* native.
        A simple native that will allow one to manually remove all units from the attack group.
        That alone will not change existing scripts and will remove a lot of limitations.
        2. Allow multiple captains. This one is a bit more radical change, but it will make the AI far better and more flexible.
        The thing with captains is that you can only have one of each, but that is not to say that you can't create more.
        In fact, you can use the */
    native CreateCaptains /* as many times as you want, and it will create new captains.
        Also, it doesn't remove the old captains, as units assigned to them cannot be added to the new captains, and will continue following the old captain to the last target it received.
        The problem here, is that referencing the captains is done by constant integers set in the common.ai file:
        */

            constant integer ATTACK_CAPTAIN     = 1
            constant integer DEFENSE_CAPTAIN    = 2
            constant integer BOTH_CAPTAINS      = 3
        /*
        Once you create new captains, these variables will reference the new captains instead of the old ones.
        If you could allow users to reference older captains (for example allocating another 3 numbers for older captains for every time CreateCaptains is called), AI will be much more usable.
        */

    //===========================================================================
    // MISSILE
    //===========================================================================

        type missile extends agent //New variable type - missile
        type missileevent extends eventid //New event type for missiles

        constant unitevent EVENT_UNIT_MISSILE //Event of missile hitting a unit
        constant missileevent EVENT_MISSILE_IMPACT //Even of missile reaching a point

        function CreateMissileOnUnitToUnit takes unit target, unit source, real height, real speed, real arcangle, real scale, string modelpath returns missile //Creates a missile that moves from one point to another. Upon impact triggers EVENT_UNIT_MISSILE.
        function CreateMissileOnPointToUnit takes unit source, unit target, real x, real y, real height, real speed, real arcangle, real scale, string modelpath returns missile //Like one above but from point to unit
        function CreateMissileOnPointToPoint takes unit source, real x1, real y1, real x2, real y2, real height, real speed, real arcangle, real scale, string modelpath returns missile //Like ones above but from point to point. Upon impact triggers EVENT_MISSILE_IMPACT.

        function SetMissileX takes missile m, real x returns nothing //Sets X coordinate of missile
        function SetMissileY takes missile m, real y returns nothing //Sets Y coordinate of missile
        function SetMissileHeight takes missile m, real height returns nothing //Sets height of missile
        function SetMissileTargetPoint takes missile m, real x, real y returns nothing //Sets the target that missile will move at
        function SetMissileTargetUnit takes missile m, unit u returns nothing //Missile will move to targeted unit
        function SetMissileSourceUnit takes missile m, unit u returns nothing //Detects a unit that spawned missile
        function SetMissileSpeed takes missile m, real speed returns nothing //Sets missile speed
        function SetMissileScale takes missile m, real scale returns nothing //Sets missile size
        function SetMissileArcAngle takes missile m, real angle returns nothing //Sets missile arcangle
        function SetMissileModel takes missile m, string path returns nothing //Sets missile model

        function GetEventMissile takes nothing returns missile //Returns a missile that reached its target

        function GetMissileX takes missile m returns real //Returns current X of a missile
        function GetMissileY takes missile m returns real //Returns current Y of a missile
        function GetMissileHeight takes missile m returns real //Returns current height of a missile
        function GetMissileSpeed takes missile m returns real //Returns current speed of a missile
        function GetMissileScale takes missile m returns real //Returns current size of a missile
        function GetMissileArcAngle takes missile m returns real //Returns current arcangle of a missile

        function RemoveMissile takes missile m, boolean animation returns nothing //Deletes a missile. Flag animation depends if it will play death animation or not

    //===========================================================================
    // OBJECT EDITOR API
    //===========================================================================
        /*
        Read only object editor API. Similar to StarCraft II catalog natives, hence the naming.
        The field string would be the attribute key in the object editor, ie "regenHP" for the unit's base health regeneration.
        Passing an invalid key (or one that would return an incorrect data type for the function) would return some sensible default (0, 0.0, null, etc).
        */

        constant catalog CATALOG_UNIT                                //Used by natives below.
        constant catalog CATALOG_ITEM                                //Used by natives below.
        constant catalog CATALOG_ABILITY                             //Used by natives below.
        constant catalog CATALOG_BUFF                                //Used by natives below.
        constant catalog CATALOG_UPGRADE                             //Used by natives below.
        constant catalog CATALOG_DOODAD                              //Used by natives below.
        constant catalog CATALOG_DESTRUCTABLE                        //Used by natives below.

        function GetUnitTypeAttributeInteger takes catalog whichCatalog, integer typeId, string field returns integer
        function GetUnitTypeAttributeReal takes catalog whichCatalog, integer typeId, string field returns real
        function GetUnitTypeAttributeString takes catalog whichCatalog, integer typeId, string field returns string

    //===========================================================================
    // BENCHMARKING
    //===========================================================================

        /*
        Whoever suggested these did not explain their purpose or what they are meant to do.
        I am guessing they are meant to be client local performance counters for measuring performance of various scripts.
        If this is the case then all calls made to these during multiplayer these should return default safe values that do nothing.
        */

        function CreateStopWatch takes nothing returns stopwatch
            //Create a performance counter stop watch.
        function StopWatchStart takes stopwatch returns nothing
            //Start the stop watch, causing it to record time progression. If it has been paused, resumes recording.
        function GetStopWatchTime takes stopwatch returns real
           //Pause the stop watch and get the current elapsed stop watch time, which is the sum of all time it has been left running.
        function StopWatchEnd takes stopwatch returns nothing
            //Destroy the stop watch freeing all resources it used.
        function StopWatchPause takes stopwatch returns nothing
           //Pause the stop watch causing it to stop recording time progression. If trying to accuratly measure execution time of a piece of script this should be called between game frames to prevent the stop watch measuring the game loop time.

    //===========================================================================
    // DEBUG
    //===========================================================================

        function DisplayErrorMsg takes string s, real duration returns nothing
           //Display the given error message string in the error message area. The message is also written out to an error log file.
        function GetOPLimit takes nothing returns integer
           //Get the current remaining JASS thread operation limit. Due to how the JASS virtual machine works the returned value may be larger than the actual limit by the time it can be processed.
        function SetOPLimit takes integer newlimit returns nothing
           //Changes the current JASS thread operation limit to the specified value. Due to how the JASS virtual machine works the actual limit may be slightly smaller than the specified amount by the time the function returns. Care must be taken when using this native as it negates the infinite loop protection offered by the operation limit.
        function ResetOPLimit takes nothing returns nothing
           //Resets the current JASS thread operation limit to the default operation limit of that thread, as if it was freshly created. Due to how the JASS virtual machine works the actual limit may be smaller than the default amount by the time the function returns. Care must be taken when using this native as it negates the infinite loop protection offered by the operation limit.
        type func extends code
            //Function type to be used with debugging natives. Possibly has special syntax requirements to prevent code exploit.
        function TriggerRegisterJassOpLimitEvent takes trigger whichTrigger returns event
           //Event fires in response to a JASS virtual machine thread crash as a result of the thread reaching its operation limit. Useful for detecting when a thread crash occurs.
        function TriggerRegisterJassDivideByZeroEvent takes trigger whichTrigger returns event
           //Event fires in response to a JASS virtual machine thread crash as a result of attempted division by 0. Useful for detecting when a thread crash occurs.
        function TriggerRegisterJassNoBlockEvent takes trigger whichTrigger returns event
           //Event fires in response to a JASS virtual machine thread crash as a result of attempting to block when blocking is not allowed (eg TriggerSleepAction in a condition function). Useful for detecting when a thread crash occurs.
        function GetTriggerFunction takes nothing returns func
            //In response to all JASS thread crash events returns the function the crash occured at.
        function GetEventJassError takes nothing returns string
           //In response to all JASS thread crash events returns a human readable string with as much information about the crash as possible. Intended to be printed out or logged to help map makers track down where/why a thread crash occured.
        function GetHandleIdCount takes nothing returns integer
           //Returns the number of currently allocated handle ids. If this number is observed increasing as a game progresses there is likely an object leak of sorts.
        function GetHandleIdFreeCount takes nothing returns integer
           //Returns the number of handle ids on the free handle id stack. If this number is very large then either the map has suffered from object count reduction over time or there was a step that required a large number of objects be created and destroyed.

    //===========================================================================
    // BINARY DATA
    //===========================================================================

        // Each function is annotated with it's C++ equivalent
        function BitwiseNot takes integer a returns integer
            // ~a
        function BitwiseAnd takes integer a, integer b returns integer
            // a & b
        function BitwiseOr takes integer a, integer b returns integer
            // a | b
        function BitwiseXor takes integer a, integer b returns integer
            // a ^ b

        function BitwiseShl takes integer a, integer b returns integer
            // a << b

        function BitwiseShr takes integer a, integer b returns integer
            // a >> b

        function Char2Byte takes string a returns integer
            // Returns the byte value of the first character in the string, or -1 if string is empty
            // Return value is guaranteed to be in the bound of [0, 256)

        function Byte2Char takes integer a returns string
            // Converts the byte into a single character corresponding to that character's value
            // The argument should be in the bound of [0, 256), if it is not, the returned string should be null
     
    //===========================================================================
    // FILE I/O
    //===========================================================================

        constant integer FILEMODE_READ = 1
        constant integer FILEMODE_WRITE = 2
        constant integer FILEMODE_READWRITE = 3
        type file extends handle
        type directory extends handle
        function FileExists takes string path returns boolean
        function DirectoryExists takes string path returns boolean

        function GetDirectory takes string path returns directory
             // Returns an iterator to a directory's contents
            // Returns null if path doesn't exist or isn't a directory

        function ForDirectory takes directory dir, code callback returns nothing
        function GetEnumPath takes nothing returns string
            // Callback-style iteration
     
        function PopDirectoryPath takes directory dir returns string
            // Pops a single path from this directory object, allowing us to iterate it using a while loop
        function OpenFile takes string path, integer mode returns file
            // Opens a new file, creating it if necessary
            // There should probably be a restriction on which extensions are allowed
            // Good candidates are probably ".txt" and ".dat"


        function OpenFile takes string path, integer mode, player owner returns file
            // Opens a new file only for a certain player
            // This is necessary to allow reading/writing locally, because creating a handle locally would desync, so
            // we need to create it in shared code
            // Reading/Writing for other players on this handle will have no effect, unless SyncFile has been called,
            // then reading operations should become available

        function SyncFile takes file f, player sender returns nothing
           // (I'm not sure if this should be added or not) Tries to send the contents of an entire file from one players to the rest
           // Calling this in a local block will read the whole file and start sending it to other players, allowing us to read the file
            // synchronously in shared code without issues

        function SyncFileWait takes file f returns nothing
             // If this can be implemented, it'd be really neat
            // Pauses the current thread until the file has finished syncing

        function TriggerRegisterFileSync takes trigger t returns nothing
        function GetSyncedFile takes nothing returns file
            // Async events for syncing to signal when it's finished

        function CloseFile takes file f returns nothing
             // Flushes the changes and closes the file
       
        function GetFileSize takes file f returns integer
        function SetFileSeekPos takes file f, integer pos returns nothing
        function GetFileSeekPos takes file f returns integer

        function IsFileEOF takes file f returns boolean
            // Checks whether the file has hit EOF
     
        function FileReadString takes file f, integer max returns string
            // Reads the contents of the file into a string, up to specified amount of characters
        function FileWriteString takes file f, string s returns nothing
            // Writes the contents of the string into the file as-is, without null-terminators


        function FileWriteUInt8 takes file f, integer a returns nothing
        function FileWriteUInt16 takes file f, integer a returns nothing
        function FileWriteUInt32 takes file f, integer a returns nothing
        function FileWriteInt8 takes file f, integer a returns nothing
        function FileWriteInt16 takes file f, integer a returns nothing
        function FileWriteInt32 takes file f, integer a returns nothing
            // Natives for reading and writing bytes directly, rather than using a string
            // Since WC3 runs only on little-endian platforms, these too should probably be little-endian

        function FileReadUInt8 takes file f returns integer
        function FileReadUInt16 takes file f returns integer
        function FileReadUInt32 takes file f returns integer
        function FileReadInt8 takes file f returns integer
        function FileReadInt16 takes file f returns integer
        function FileReadInt32 takes file f returns integer
            // Natives for reading bytes directly

        function FileWriteReal takes file f, real a returns nothing
        function FileReadReal takes file f returns real
            // Writing/Reading reals

    //===========================================================================
    // SYNCH
    //===========================================================================

    // > METHOD 1

        function SyncHashtableParent takes hashtable ht returns nothing
            // When called locally, will start syncing the contents of this hashtable to other players
        function SyncHashtableChild takes hashtable ht, integer parentKey returns nothing
            // Same as SyncHashtable, but only for a child hashtable

        function SyncHashtableWait takes hashtable ht returns nothing
            // Pauses the thread until the specified hashtable has finished syncing
        function TriggerRegisterHashtableSync takes trigger t returns nothing
        function GetSyncedHashtable takes nothing returns hashtable
            // Events for hashtable syncs

    // > METHOD 2

        type bytes extends handle
        function CreateBytes takes nothing returns bytes
        function DestroyBytes takes bytes b returns nothing
        function BytesWriteUInt8 takes bytes b, integer pos, integer a returns nothing
        function BytesWriteUInt16 takes bytes b, integer pos, integer a returns nothing
        function BytesWriteUInt32 takes bytes b, integer pos, integer a returns nothing
        function BytesWriteInt8 takes bytes b, integer pos, integer a returns nothing
        function BytesWriteInt16 takes bytes b, integer pos, integer a returns nothing
        function BytesWriteInt32 takes bytes b, integer pos, integer a returns nothing
        function BytesReadUInt8 takes bytes b, integer pos returns integer
        function BytesReadUInt16 takes bytes b, integer pos returns integer
        function BytesReadUInt32 takes bytes b, integer pos returns integer
        function BytesReadInt8 takes bytes b, integer pos returns integer
        function BytesReadInt16 takes bytes b, integer pos returns integer
        function BytesReadInt32 takes bytes b, integer pos returns integer
        function BytesWriteReal takes bytes b, integer pos, real r returns nothing
        function BytesReadReal takes bytes b, integer pos returns nothing
        function BytesWriteString takes bytes b, integer pos, string s returns nothing
        function BytesReadString takes bytes b, integer pos, integer amount returns string
        function GetBytesSize takes bytes b returns integer
            // Get the amount of data in this buffer
        function ReserveBytesCapacity takes bytes b, integer capacity returns nothing
            // Reserve capacity for this buffer

        function GetBytesCapacity takes bytes b returns bytes
             // Get capacity for this buffer
       

        function SyncBytes takes bytes b returns nothing
            // Tries to sync the local contents of this bytes object to other players

        function SyncBytesWait takes bytes b returns nothing
            // Pauses the current thread until syncing has finished

        function TriggerRegisterBytesSync takes trigger t returns nothing
        function GetSyncedBytes takes nothing returns bytes
            // Events
     
    //===========================================================================
    // STREAMLINING
    //===========================================================================
        /*
        This list of suggested additions is meant as a way to streamline existing processes or change them entirely.
        */


        //Proxies
        /*
        Proxies are essentially units - dummy casters to be exact, that are less performance-heavy. They have no collision, no model (though you may attach something to their "origin"), no
        movement type, nothing. They only move through triggers (SetUnitX/Y) and can cast spells regardless of mana cost, tech requirement, cooldown. They can also cast an unlimited amount
        of spells without any downtime so potentially only 1 proxy will ever be needed per map, or per player. One key aspect to proxies is that all actions they take is creditted to a source
        unit, so this way if a proxy kills a unit using a spell, the game will register the source unit as having earned that kill. Depending on the allegiance of the source will determine
        whether a target can be hit with a spell or not (eg: if the source is an ally of the target of the Proxy, the Proxy cannot cast Storm Bolt at the target).
        NB: the Proxy type is affected by most of the relevant unit triggers, like SetUnitX/Y and RemoveUnit. It can be added to unit groups, etc.
        */

        function CreateAbilityProxy takes unit source, real x, real y, real z returns proxy    //This is essentially a dummy of which all the actions it takes will be credited to the source.
        function SetProxySource takes proxy dummy, unit source returns nothing               //Modifies the source of the proxy.
        //ApllySpellEffect

        /*
        This approach is an attempt to change the way modders apply spells to targets. Rather than using dummy units, what if spells - and their corresponding effect - could be cast directly on
        a target unit/point? There are multiple ways in which we thought this could happen, but ultimately it's up to the people with the source code who will know how best to do this.
        */

        //Method 1
        //The ApplySpellEffect idea will look like spells can be cast at any point, anywhere. However, there's the issue of auras, which means that those natives should probably return something other than a boolean (maybe a spelleffect type?)

        function ApplySpellEffect takes player owner, real x, real y, integer abilcode returns nothing                            //returns false for spells that only affect the caster (eg. Storm Crow Form)
        function ApplySpellEffectTarget takes player owner, unit target, integer abilcode returns boolean                        //returns null if the target is invalid (eg Spell immune, invulnerable, etc)
        function ApplySpellEffectPoint takes player owner, real xcast, real ycast, real zcast, real xtarget, real ytarget, integer abilcode returns boolean //returns false on untargertable context (eg Inferno over water, Force of Nature with no trees)
        function ApplySpellEffectChanneled takes player owner, real x, real y, real timeout, integer abilcode returns boolean    //ends after the timer has expired. The timeout overrides the spell's internal duration.
        function ApplySpellEffectTargetChanneled takes player owner, unit target, real timeout, integer abilcode returns boolean              
        function ApplySpellEffectPointChanneled takes player owner, real xcast, real ycast, real zcast, real xtarget, real ytarget, real timeout, integer abilcode returns boolean

        //Method 2
        //While the above could work, I suppose it's hardly the most elegant solution to go around. User MindWorX suggested the atomic approach:
        local leveldata data = CreateLevelData()
        call SetLevelDataDuration(1.00)
        call SetLevelDataDataA(RealData(10))
        call SetLevelDataDataB(RealData(100))
        call ApplyBuff(target, 'Ahea', data)
        //Method 3
        //Implement structs and have Struct-based triggers to use.
        local leveldata data = CreateAbility()
        set leveldata.Duration = 1.00
        set leveldata.DataA = RealData(10)
        //etc...

    //===========================================================================
    //
    //===========================================================================
     
     
    Last edited: Mar 25, 2018
  2. Kyrbi0

    Kyrbi0

    Joined:
    Jul 29, 2008
    Messages:
    7,319
    Resources:
    1
    Models:
    1
    Resources:
    1
    I'll be honest; few of those are meaningful to me personally.

    However, I've spent enough time around here to know that even a quarter of those would be a dream come true for many modders here. :p So I'm all for it.

    For me, it'd be great to have a "Unit Is Damaged" event that actually works & keeps track of the damage dealt & all that. Past that... I can't recall.
     
  3. Spellbound

    Spellbound

    Joined:
    Jan 9, 2005
    Messages:
    1,877
    Resources:
    14
    Skins:
    4
    Spells:
    9
    JASS:
    1
    Resources:
    14
    In case anyone is wondering why the formatting is like that, I was working on that list on Sublime Text and for some reason the spacing in the JASS tag don't match. It's the same for Notepad++. I tried fixing the spacin inside of World Edit but it still came out looking like that. If Anyone has a solution on how to better showcase the list, please let me or @Kam know, aside from manually bumping everything in line.

    Aside from that, happy brainstorming! We hope you can come up with some helpful new native functions that can be added to the list.
     
  4. GhostWolf

    GhostWolf

    Joined:
    Jul 29, 2007
    Messages:
    4,819
    Resources:
    2
    Tools:
    1
    Tutorials:
    1
    Resources:
    2
    Most of the functions implemented by Memory Hack are implemented by Memory Hack because people want them, and they do not exist. I'd say that's a pretty good place to start.
    Memory hack

    Proper unicode support, no more localized versions with characters that work for some and don't for others.
    Not strictly a part of Jass, but definitely related.
    utf8-aware iterator

    Removing the requirement of nulling handles to update the reference count would be pretty nice (make locals work like locals).
     
  5. MyPad

    MyPad

    Spell Reviewer

    Joined:
    May 9, 2014
    Messages:
    933
    Resources:
    2
    Models:
    1
    Icons:
    1
    Resources:
    2
    How about the following functions?

    Code (vJASS):

    /*
        Unit section
    */

    function GetUnitDamage takes unit u, boolean isBonus returns real
        // Returns either base damage or bonus damage, but not both.
    function GetUnitDamageEx takes unit u returns real
        // Returns full damage.
    function GetUnitArmor takes unit u returns real
    function GetUnitAttackSpeed takes unit u, boolean current returns real
        // If current, returns current. If not, returns base attack speed.
    function GetUnitRegen takes unit u, regentype type returns real
        if type == REGEN_TYPE_HEALTH then
        elseif type == REGEN_TYPE_MANA then
        endif
    function GetEventDamageType takes nothing returns damagetype
        // Returns damagetype
    function GetEventDamageAbil takes nothing returns integer
        // Will usually return 'Aatk' but can be changed by attack modifiers.

    //    Consider if attack-data pointer exists
    function SetUnitDamage takes unit u, boolean isBonus, real newDamage returns boolean
    function SetUnitDamageEx takes unit u, real newDamage returns boolean
        // Sets actual damage attribute (considers bonus before base)

    function SetUnitArmor takes unit u, real newArmor returns nothing
    function SetUnitAttackSpeedEx takes unit u, real newSpeed returns nothing
        // Ignores the maximum attack speed, but considers the minimum 0.1
    function SetUnitAttackSpeed takes unit u, real newRatio returns boolean
        // Based on read-only game constant 0.1
        if newRatio >= 4.00 then
            set newRatio = 4.00
        elseif newRatio <= 0.2 then
            set newRatio = 0.2
        endif
        call SetUnitAttackSpeedEx(u, GetUnitAttackSpeed(u, false)*newRatio)

    function UnitDamageTargetPure takes unit whichUnit, widget target, real amount returns boolean
        // Deals pure damage.

    function UnitDamageTargetMagic takes unit whichUnit, widget target, real amount returns boolean
        // Deals magic damage, although it can be coded.

    constant unitevent EVENT_UNIT_EVADE = ConvertUnitEvent(integer n)

    //  Effects.
    function GetEffectX takes effect whichEffect returns real
    function GetEffectY takes effect whichEffect returns real
    function GetEffectZ takes effect whichEffect returns real
        // Z-coordinate is based on host player and will need to be synced.

    function SetEffectX takes effect whichEffect, real newX returns nothing
    function SetEffectY takes effect whichEffect, real newY returns nothing
    function SetEffectZ takes effect whichEffect, real newZ returns nothing

    //  Debug purposes
    type func extends code

    function GetOPLimit takes nothing returns integer
    function SetOPLimit takes integer newlimit returns nothing

    function ResetOPLimit takes nothing returns nothing
        // Naturally called when leaving the game either due to crash, shut down or
    constant function GetTriggeringFunction takes nothing returns func

    constant eventvm EVENT_OP_LIMIT_BREAK = ConvertEventVM(1)

    //  Fixes
    native GetWidgetLife takes widget w returns real
        // Must return exact real, nitpicking
    native EnableOcclusion takes boolean flag returns nothing

    native TriggerRegisterUnitStateEvent(trigger trig, unit whichUnit, unitstate whichState, oplimit operator, real value)
        fix ..
            EQUAL

    //  Suggestions
    //
     
     
  6. Spellbound

    Spellbound

    Joined:
    Jan 9, 2005
    Messages:
    1,877
    Resources:
    14
    Skins:
    4
    Spells:
    9
    JASS:
    1
    Resources:
    14
    Hmm, it appears a large portion of the list is missing. I'll notify Kam about it.
     
  7. Wareditor

    Wareditor

    Joined:
    Jan 16, 2009
    Messages:
    534
    Resources:
    2
    Maps:
    2
    Resources:
    2
    This kills the 1.26

    Here are my suggestions. Maybe will write more when I have the time
    Code (vJASS):

    // > NEW
    //ScreenResolution
    function GetScreenResolutionX takes nothing returns real
    function GetScreenResolutionY takes nothing returns real

    //Textag Alignment (please let us center texttag)
    function SetTexTagAlignment takes texttag tt, integer alignment returns nothing
    //0 = left—the text is aligned along the left margin (default);
    //1 = right—the text is aligned along the right margin;
    //2 = justified—text is aligned along the left margin, and letter- and word-spacing is adjusted so that the text falls flush with both margins;
    //3 = centered—text is aligned to neither the left nor right margin; there is an even gap on each side of each line.
    //This would be so cool even if there is only the option to center the textag. Right now it's a pein to center the texttag on a unit.*/

    //Dialog
    function IsPlayerInDialog takes player p returns boolean
    //Return true if player is presented a dialog box

    //Units
    function GetUnitIconPath takes unit u returns string
    function GetUnitTypeIconPath takes integer unitId returns string
    function SetUnitIconPath takes unit u, string new returns nothing

    function GetUnitModelPath takes unit u returns string
    function GetUnitTypeModelPath takes integer unitId returns string
    function SetUnitModelPath takes unit u, string new returns nothing

    function SetUnitName takes unit u, string new returns nothing
    function SetUnitLevel takes unit u, integer new returns nothing


    // > FIXES
    native DisplayTimedTextToPlayer takes player toPlayer, real x, real y, real duration, string message returns nothing
    //make it so displaying a text to a player with unique x and y coordinates doesn't move all other displayed texts.

    native AddUnitToStock takes unit whichUnit, integer unitId, integer currentStock, integer stockMax returns nothing
    //The main tooltip of added unit will always ignore color tags so the text will always appear to be white.

    native SetCameraBounds takes real x1, real y1, real x2, real y2, real x3, real y3, real x4, real y4 returns nothing
    //With each of call of this function, the minimap is modified in a bugged way :
    // - The positions of units and the fog of war are modified to fit to the new camera bound but not the terrain, nor the destructables.
    // - The minimap is compressed (vertically) according to the current camera's rotation. With a rotation of 90°, there is no compression. With a rotation of 227.40, the minimap is fully compressed. Between 227.5 and 312.6, the game crashes.
    //Moreover, the camera bounds will also be adjusted according to the rotation of the current camera. The camera bounds created will be a rectangle going trough the 4 points given and whose sides will be parallel to the camera.

     
     


    Credits to @Tirlititi for the camera bounds bug (huge list of native bugs in french)
     
  8. Kaijyuu

    Kaijyuu

    Joined:
    Jun 2, 2004
    Messages:
    848
    Resources:
    0
    Resources:
    0
    How about a generic function for object editor data? Not data from objects on the map, like units and whatnot, but a way to get object editor data straight into triggers without hassle.

    IE:
    Code (Text):

    native GetUnitTypeAttributeInteger takes integer unittype, string s returns integer
    native GetUnitTypeAttributeString takes integer unittype, string s returns string
    ...
     
    The string would be the attribute key in the object editor, ie "regenHP" for the unit's base health regeneration. Passing an invalid key (or one that would return an incorrect data type for the function) would return some sensible default (0, empty string, etc) instead of crashing. The only hiccup I can think of are some of the lists of data, but iirc aren't those just comma separated values in a string anyway? Just have the user parse it if needed.


    The current way of having specific hardcoded functions for specific data isn't versatile, would require maintenance should the game continue to get it, and clutters the native list.


    A non-trigger but related thing I would like would be user defined object editor data keys intended to work with the above suggested natives, though that would come with implementing new UI for the object editor and thus probably be prohibitively bothersome to implement.
     
    Last edited: Dec 7, 2017
  9. Kam

    Kam

    Blizzard Associate Producer

    Joined:
    Aug 3, 2004
    Messages:
    2,556
    Resources:
    22
    Models:
    8
    Icons:
    2
    Maps:
    12
    Resources:
    22
    I've updated the list to be the correct starting version. Please take another look.
     
  10. HappyTauren

    HappyTauren

    Joined:
    Nov 3, 2006
    Messages:
    8,427
    Resources:
    87
    Models:
    61
    Icons:
    23
    Packs:
    1
    Tutorials:
    2
    Resources:
    87
    I am not sure if any native referenced this, but I want free drawing on the interface. I want to be able to draw things on the 2D plane that the screen represents, this kills the need for dummy units you have to move all the time. If I can use this with mouse coordinates and click/keyboard press detection I can in theory create my own API to create an interface that works however I want. This is pretty low level in general, but just opening the possibility of:
    1) Detecting mouse/keyboard events/coordinates
    2) Freely drawing on the 2D plane
    would make interface making really awesome.
     
  11. Dr Super Good

    Dr Super Good

    Spell Reviewer

    Joined:
    Jan 18, 2005
    Messages:
    24,537
    Resources:
    3
    Maps:
    1
    Spells:
    2
    Resources:
    3
    A simpler procedure to execute code would be nice. Currently one has to make a trigger object, wrap code into a boolexpr, bind the boolexpr as a condition to the trigger and then evaluate the trigger. Since this is not that trivial one often caches the trigger object and passes it around.

    Something like this would simplify the job.
    Code (vJASS):
    native EvaluateBoolexpr takes boolexpr func returns boolean


    Currently destroying a trigger will correctly remove all generated event and condition objects. It will however not automatically remove all generated action objects meaning a possible leak that is annoying to fix.

    Of course fixing the infamous local declared local handle variable reference counter leak on return bug would be very nice.
     
  12. deepstrasz

    deepstrasz

    Map Reviewer

    Joined:
    Jun 4, 2009
    Messages:
    6,738
    Resources:
    1
    Maps:
    1
    Resources:
    1
    I'm not sure if it was mentioned or not, but would there be a need for destructible and item groups and a way to destroy them to avoid leaks?
     
  13. IcemanBo

    IcemanBo

    JASS Class Tutor

    Joined:
    Sep 6, 2013
    Messages:
    5,670
    Resources:
    22
    Maps:
    3
    Spells:
    11
    Template:
    1
    Tutorials:
    4
    JASS:
    3
    Resources:
    22
    There's no item/destructable group per se, but only an enumeration through them in range/rect. -> no leak. But there are some limits that can be re-considered:
    • constant integer bj_MAX_DEST_IN_REGION_EVENTS = 64
    • constant integer JASS_MAX_ARRAY_SIZE = 8192

    • Limit of 100 for TextTags
    • Max 4x playing a sound filepath at a time.
    • Max 16 sounds in general at a time.
    • There's a limit before a sound filepath can be played again (seems depend on client), around 0.1 seconds.
    • Speed limit 522.
    Also
    • Natives that don't sync ArrowKey events, this will extremly reduce the delay when using keys.
    • Event for removed unit.
    • Event when an ability is clicked.
    • More universal keyboard events, like characters 'a-z'.
    • Events for resource gathering.
    • Events when a unit gets order to buy an object (item/unit) to refer to unit, shop, and object id of wanted object.
    • Making units unclickable without having to rely on hacks.
    • Fix
      SmartCameraPanBJ
      , explained here.
    • A JASS operation to get amount of currently used handle ids.
    • native GetUnitBuildTime takes integer unitid returns integer
      only works for normal units, but we have nothing for heroes.
     
  14. Dr Super Good

    Dr Super Good

    Spell Reviewer

    Joined:
    Jan 18, 2005
    Messages:
    24,537
    Resources:
    3
    Maps:
    1
    Spells:
    2
    Resources:
    3
    This limit is needed for performance reasons. More parallel sound channels means more CPU time needed to compose the sound. If it were to be changed it would need to be done in the user options.
    Worth pointing out that these would only be useful for UI purposes where one can sync the player selection at time of choice allowing for more responsive UI navigation. Ultimately when a game changing result is made one must sync which in turn will result in latency delay.

    I would like to see garbage collection added to location, group, force, etc types. That way one does not even need to call the destructor. This is what SC2 does.
     
  15. TempMail

    TempMail

    Joined:
    Nov 3, 2017
    Messages:
    25
    Resources:
    0
    Resources:
    0
    MoveSpeed limit change requires whole pathfinding overhaul
     
  16. deepstrasz

    deepstrasz

    Map Reviewer

    Joined:
    Jun 4, 2009
    Messages:
    6,738
    Resources:
    1
    Maps:
    1
    Resources:
    1
    Can we get a detection system for Mana Shield? As of now, damage is only detected below and equal to 0 with the Damage Taken (real) condition. Absorption ratio has no influence over it.
    Or even for Disease? :D I know there are bypasses but why not?
     
  17. SpasMaster

    SpasMaster

    Joined:
    Jan 29, 2010
    Messages:
    1,829
    Resources:
    4
    Icons:
    2
    Maps:
    2
    Resources:
    4
    Holy moly, that's so sweet. Some of those would be just incredible... I simply love the idea of changing health bar colors!

    I have an issue to report with the World Editor and I hope it can be looked at: Awhile ago (probably over 2 years) I've reached a point in my project where the amount of data in the object editor started getting too much (items/abilities). This is when I started experiencing the following issue; whenever an object was deleted from the World Editor, it resulted in a crash. For example, if I have 500 custom items and I delete 1 of them, it crashes the editor. Apparently I wasn't the only one who encountered this problem. Here are a few threads that report the same issue (1, 2). If you look around you can find more, these 2 aren't the only ones. As explained in such threads, the 'solution' would be to export data in an empty map and delete there. It works... but it is an annoying issue. I hope it can be looked at, as it has been bothering me (and probably others too) for a long time.

    Lastly, I have a question, @Kam. If it's ok to answer it, of course:
    What you have in here as a list of possible features, is it a list that is yet to be looked at by Blizzard and to be determined if any of this is going to be implemented at all, or is it rather things that have already been looked at, considered and already being worked on in attempts for implementation? TL;DR: is all of this still on the drawing board, or has work on it already began?

    Cheers!
     
  18. Kam

    Kam

    Blizzard Associate Producer

    Joined:
    Aug 3, 2004
    Messages:
    2,556
    Resources:
    22
    Models:
    8
    Icons:
    2
    Maps:
    12
    Resources:
    22
    I have also run into that before. When there is time it will be looked into.

    At this point it's all speculative. HL3 confirmed.
     
  19. MyPad

    MyPad

    Spell Reviewer

    Joined:
    May 9, 2014
    Messages:
    933
    Resources:
    2
    Models:
    1
    Icons:
    1
    Resources:
    2
    @Kam

    Perhaps you can bring back @DracoL1ch from the banyard with a Reacceptance spell.
     
  20. Dr Super Good

    Dr Super Good

    Spell Reviewer

    Joined:
    Jan 18, 2005
    Messages:
    24,537
    Resources:
    3
    Maps:
    1
    Spells:
    2
    Resources:
    3
    This post is no longer valid, see a later post for a more up to date list.
     
    Last edited: Dec 16, 2017