TriggerHappy
...
- Reaction score
- 341
GetUnitAnimation
TriggerHappy187
TriggerHappy187
Introduction
There is no current native (or BJ) that detects a units current animation. I was inspired to make this from this thread.
How it works is whenever a unit is given an order, it sets it's animation according to the order it was given.
If your going to set a units animation via triggers, you will have to use my replacement function.
Requires: AutoIndex,TimerUtils
Code
JASS:
//==============================================================================
// GetUnitAnimation - By TriggerHappy187 -- v1.0
//==============================================================================
//
// WHATS IT DO?
// * It gets the units current animation
//
// FUNCTION LIST
// * SetUnitAnimationEx(unit, animation) -- Sets the units animation
// * GetUnitLastAnimation(unit) -- Gets the units last animation
// * GetUnitAnimation(unit) -- Gets the units current animation
//
// HOWS IT WORK?
// * whenever a unit is given an order, it sets it's animation according to the order it was given.
// If your going to set a units animation via triggers, you will have to use my replacement function.
//
////////////////////////////////////////////////////////////////////////////////////
library GetUnitAnimation initializer InitTrig requires AutoIndex, TimerUtils
globals
private constant real ACCURACY = 0.03 // How fast this updates the units animation
private constant string DEFAULT_ANIMATION = "stand" // What the units default animation is
private constant real POSITION_RADIUS = 50 // How far away from a units destination he must be for the animation to reset
endglobals
globals
private string array lastAnimation
private string array currentAnimation
private timer array t
private real array x
private real array y
private unit array ordered
private boolean b = false
private group g = CreateGroup()
endglobals
private function True takes nothing returns boolean
return true
endfunction
private function Callback takes nothing returns nothing
local integer id = GetTimerData(GetExpiredTimer())
call GroupEnumUnitsInRange(g, x[id], y[id], POSITION_RADIUS, Filter(function True))
if IsTerrainPathable(GetUnitX(ordered[id]),GetUnitY(ordered[id]),PATHING_TYPE_WALKABILITY) then
set currentAnimation[id] = "swim"
endif
if IsUnitInGroup(ordered[id], g) then
set lastAnimation[id] = currentAnimation[id]
set currentAnimation[id] = DEFAULT_ANIMATION
call ReleaseTimer(t[id])
else
call TimerStart(t[id], ACCURACY, false, function Callback)
endif
endfunction
function GetUnitLastAnimation takes unit u returns string
return lastAnimation[GetUnitId(u)]
endfunction
function GetUnitAnimation takes unit u returns string
return currentAnimation[GetUnitId(u)]
endfunction
function SetUnitAnimationEx takes unit whichUnit, string whichAnimation returns nothing
local integer id = GetUnitId(whichUnit)
set t[id] = NewTimer()
set currentAnimation[id] = whichAnimation
call SetUnitAnimation(whichUnit, whichAnimation)
call SetTimerData(t[id], id)
call TimerStart(t[id], ACCURACY, false, function Callback)
endfunction
private function SetLast takes nothing returns nothing
local unit u = GetTriggerUnit()
local string s = OrderId2String(GetIssuedOrderId())
local integer id = GetUnitId(u)
set ordered[id] = u
set x[id] = GetOrderPointX()
set y[id] = GetOrderPointY()
if s == "smart" then
if IsTerrainPathable(GetUnitX(ordered[id]),GetUnitY(ordered[id]),PATHING_TYPE_WALKABILITY) then
set s = "swim"
else
set s = "walk"
endif
elseif s == "stop" then
set s = "stand"
endif
call SetUnitAnimationEx(u, s)
set u = null
endfunction
private function InitTrig takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER)
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
call TriggerAddAction(t, function SetLast)
endfunction
endlibrary