How to Change a Unit's Move/Regen/Armor (etc...) Type

Level 4
Joined
Jan 5, 2017
Messages
7
PROBLEM: How to change certain properties of a unit

Can mix multiple values:
  • Movement type (Foot, Fly, etc.) -- Apparently a unit can have any combination of move types... I don't know what the purpose is though
  • Targeted as (Ground, Air, Structure, etc.)
  • Unit category (Undead, Peon, Ward, Tauren, etc.)
  • Pathing prevented by (Unwalkable, Unflyable, etc.)
Can only have one value:
  • Armor type (Flesh, Metal, Wood, etc.)
  • Defense type (Hero, Fortified, Heavy, etc.)
  • Regeneration type (None, Always, Blight, Day, Night)
  • Primary hero stat (Strength, Agility, Intelligence)

SOLUTION:

As an example, use the following code to ADD the unit category "Undead" to a unit (does nothing if it already has it):

JASS:
call BlzSetUnitIntegerField(myUnit, UNIT_IF_UNIT_CLASSIFICATION, BlzBitOr(BlzGetUnitIntegerField(myUnit, UNIT_IF_UNIT_CLASSIFICATION), GetHandleId(UNIT_CATEGORY_UNDEAD)))

To REMOVE the "Undead" category from a unit (does nothing if it already does not have it):

JASS:
call BlzSetUnitIntegerField(myUnit, UNIT_IF_UNIT_CLASSIFICATION, BlzBitAnd(BlzGetUnitIntegerField(myUnit, UNIT_IF_UNIT_CLASSIFICATION), -GetHandleId(UNIT_CATEGORY_UNDEAD) - 1))

To TOGGLE the "Undead" category of a unit (switch it to the opposite of its current value):

JASS:
call BlzSetUnitIntegerField(myUnit, UNIT_IF_UNIT_CLASSIFICATION, BlzBitXor(BlzGetUnitIntegerField(myUnit, UNIT_IF_UNIT_CLASSIFICATION), GetHandleId(UNIT_CATEGORY_UNDEAD)))



PROBLEM: How to convert one of these constants into an integer (e.g. MOVE_TYPE_FLY -> 2)

SOLUTION:
JASS:
GetHandleId(MOVE_TYPE_FLY)



PROBLEM: How to convert an integer into one of these constants (e.g. 2 -> MOVE_TYPE_FLY)

SOLUTION:
JASS:
ConvertMoveType(2)



PROBLEM: How to use these values with a hashtable

SOLUTION: Use the two methods above to store the constant as an integer and then convert it back

For example,

JASS:
// Save the value
call SaveInteger(myHashtable, parentKey, childKey, GetHandleId(MOVE_TYPE_FLY))
// Load the value
local movetype mt = ConvertMoveType(LoadInteger(myHashtable, parentKey, childKey))



Addendum

Be aware that not all of these operations are guaranteed to work!
In some instances, such as changing a unit's defense type, it may be necessary to reselect the unit to update its UI.



List of Constants
JASS:
    UNIT_IF_MOVE_TYPE
    constant movetype       MOVE_TYPE_UNKNOWN               = ConvertMoveType(0)
    constant movetype       MOVE_TYPE_FOOT                  = ConvertMoveType(1)
    constant movetype       MOVE_TYPE_FLY                   = ConvertMoveType(2)
    constant movetype       MOVE_TYPE_HORSE                 = ConvertMoveType(4)
    constant movetype       MOVE_TYPE_HOVER                 = ConvertMoveType(8)
    constant movetype       MOVE_TYPE_FLOAT                 = ConvertMoveType(16)
    constant movetype       MOVE_TYPE_AMPHIBIOUS            = ConvertMoveType(32)
    constant movetype       MOVE_TYPE_UNBUILDABLE           = ConvertMoveType(64)
    
    UNIT_IF_TARGETED_AS
    constant targetflag     TARGET_FLAG_NONE                = ConvertTargetFlag(1)
    constant targetflag     TARGET_FLAG_GROUND              = ConvertTargetFlag(2)
    constant targetflag     TARGET_FLAG_AIR                 = ConvertTargetFlag(4)
    constant targetflag     TARGET_FLAG_STRUCTURE           = ConvertTargetFlag(8)
    constant targetflag     TARGET_FLAG_WARD                = ConvertTargetFlag(16)
    constant targetflag     TARGET_FLAG_ITEM                = ConvertTargetFlag(32)
    constant targetflag     TARGET_FLAG_TREE                = ConvertTargetFlag(64)
    constant targetflag     TARGET_FLAG_WALL                = ConvertTargetFlag(128)
    constant targetflag     TARGET_FLAG_DEBRIS              = ConvertTargetFlag(256)
    constant targetflag     TARGET_FLAG_DECORATION          = ConvertTargetFlag(512)
    constant targetflag     TARGET_FLAG_BRIDGE              = ConvertTargetFlag(1024)
    
    UNIT_IF_DEFENSE_TYPE
    constant defensetype    DEFENSE_TYPE_LIGHT              = ConvertDefenseType(0)
    constant defensetype    DEFENSE_TYPE_MEDIUM             = ConvertDefenseType(1)
    constant defensetype    DEFENSE_TYPE_LARGE              = ConvertDefenseType(2)
    constant defensetype    DEFENSE_TYPE_FORT               = ConvertDefenseType(3)
    constant defensetype    DEFENSE_TYPE_NORMAL             = ConvertDefenseType(4)
    constant defensetype    DEFENSE_TYPE_HERO               = ConvertDefenseType(5)
    constant defensetype    DEFENSE_TYPE_DIVINE             = ConvertDefenseType(6)
    constant defensetype    DEFENSE_TYPE_NONE               = ConvertDefenseType(7)
    
    UNIT_IF_PRIMARY_ATTRIBUTE
    constant heroattribute  HERO_ATTRIBUTE_STR              = ConvertHeroAttribute(1)
    constant heroattribute  HERO_ATTRIBUTE_INT              = ConvertHeroAttribute(2)
    constant heroattribute  HERO_ATTRIBUTE_AGI              = ConvertHeroAttribute(3)
    
    UNIT_IF_ARMOR_TYPE
    constant armortype      ARMOR_TYPE_WHOKNOWS             = ConvertArmorType(0)
    constant armortype      ARMOR_TYPE_FLESH                = ConvertArmorType(1)
    constant armortype      ARMOR_TYPE_METAL                = ConvertArmorType(2)
    constant armortype      ARMOR_TYPE_WOOD                 = ConvertArmorType(3)
    constant armortype      ARMOR_TYPE_ETHREAL              = ConvertArmorType(4)
    constant armortype      ARMOR_TYPE_STONE                = ConvertArmorType(5)
    
    UNIT_IF_HIT_POINTS_REGENERATION_TYPE
    constant regentype      REGENERATION_TYPE_NONE          = ConvertRegenType(0)
    constant regentype      REGENERATION_TYPE_ALWAYS        = ConvertRegenType(1)
    constant regentype      REGENERATION_TYPE_BLIGHT        = ConvertRegenType(2)
    constant regentype      REGENERATION_TYPE_DAY           = ConvertRegenType(3)
    constant regentype      REGENERATION_TYPE_NIGHT         = ConvertRegenType(4)
    
    UNIT_IF_UNIT_CLASSIFICATION
    constant unitcategory   UNIT_CATEGORY_GIANT             = ConvertUnitCategory(1)
    constant unitcategory   UNIT_CATEGORY_UNDEAD            = ConvertUnitCategory(2)
    constant unitcategory   UNIT_CATEGORY_SUMMONED          = ConvertUnitCategory(4)
    constant unitcategory   UNIT_CATEGORY_MECHANICAL        = ConvertUnitCategory(8)
    constant unitcategory   UNIT_CATEGORY_PEON              = ConvertUnitCategory(16)
    constant unitcategory   UNIT_CATEGORY_SAPPER            = ConvertUnitCategory(32)
    constant unitcategory   UNIT_CATEGORY_TOWNHALL          = ConvertUnitCategory(64)
    constant unitcategory   UNIT_CATEGORY_ANCIENT           = ConvertUnitCategory(128)
    constant unitcategory   UNIT_CATEGORY_NEUTRAL           = ConvertUnitCategory(256)
    constant unitcategory   UNIT_CATEGORY_WARD              = ConvertUnitCategory(512)
    constant unitcategory   UNIT_CATEGORY_STANDON           = ConvertUnitCategory(1024)
    constant unitcategory   UNIT_CATEGORY_TAUREN            = ConvertUnitCategory(2048)
    
    UNIT_IF_PLACEMENT_PREVENTED_BY
    constant pathingflag    PATHING_FLAG_UNWALKABLE             = ConvertPathingFlag(2)
    constant pathingflag    PATHING_FLAG_UNFLYABLE              = ConvertPathingFlag(4)
    constant pathingflag    PATHING_FLAG_UNBUILDABLE            = ConvertPathingFlag(8)
    constant pathingflag    PATHING_FLAG_UNPEONHARVEST          = ConvertPathingFlag(16)
    constant pathingflag    PATHING_FLAG_BLIGHTED               = ConvertPathingFlag(32)
    constant pathingflag    PATHING_FLAG_UNFLOATABLE            = ConvertPathingFlag(64)
    constant pathingflag    PATHING_FLAG_UNAMPHIBIOUS           = ConvertPathingFlag(128)
    constant pathingflag    PATHING_FLAG_UNITEMPLACABLE         = ConvertPathingFlag(256)
 
Last edited:
Top