PrisonLove
Hard Realist
- Reaction score
- 78
Okay so the goal here was to revive a unit (make a new one) when the old unit dies. If the player has lumber, the unit is revived at the location the old one died after 1 second, otherwise it will be revived after five seconds in one of many predetermined spots. I get an 'Expected a function name' error on a random line and don't know why. Here is the code:
JASS:
function PlayerReviveConditions takes nothing returns boolean
local integer id = GetUnitTypeId(GetTriggerUnit())
call BJDebugMsg("Dead unit Id is " + I2S(id)) //debugging
return (id == 039;h000039; or id == 039;h001039; or id == 039;h002039; or id == 039;h003039;)
endfunction
function PlayerReviveCallback takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit u = LoadUnitHandle(udg_hash, id, 0)
local real ux = LoadReal(udg_hash, id, 1)
local real uy = LoadReal(udg_hash, id, 2)
local boolean xtraLife = LoadBoolean(udg_hash, id, 3)
local player p = GetOwningPlayer(u)
local integer uid = GetUnitTypeId(u)
local integer randomInt = GetRandomInt(1, udg_ReviveZoneMax)
local real xmin = GetRectMinX(udg_ReviveZoneArray[randomInt])
local real xmax = GetRectMaxX(udg_ReviveZoneArray[randomInt])
local real ymin = GetRectMinY(udg_ReviveZoneArray[randomInt])
local real ymax = GetRectMaxY(udg_ReviveZoneArray[randomInt])
local real x = GetRandomReal(xmin, xmax)
local real y = GetRandomReal(ymin, ymax)
call BJDebugMsg("Callback entered") //debugging
if (xtraLife) then
set x = ux
set y = uy
endif
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ReviveHuman\\ReviveHuman.mdl", x, y))
call CreateUnit(p, uid, x, y, 270)
call SelectUnitForPlayerSingle(GetLastCreatedUnit(), p)
call PanCameraToForPlayer(p, x, y)
call FlushChildHashtable(udg_hash, id)
call BJDebugMsg("Hashtable flushed") //debugging
call PauseTimer(t)
call DestroyTimer(t)
set t = null
set u = null
endfunction
function PlayerReviveActions takes nothing returns nothing
local unit u = GetTriggerUnit()
local player p = GetOwningPlayer(u)
local integer i = GetPlayerId(p) + 1
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local timer t = CreateTimer()
local real timeout = 5
local integer id = GetHandleId(t)
local integer playerLumber = GetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER)
local boolean xtraLife = false
set udg_damageAmount<i> = 20
set udg_attackRange<i> = 100
set udg_offsetRange<i> = 50
if (playerLumber >= 1) then
call SetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER, playerLumber - 1)
set timeout = 1
set xtraLife = true
endif
call SaveUnitHandle(udg_hash, id, 0, u)
call SaveReal(udg_hash, id, 1, x)
call SaveReal(udg_hash, id, 2, y)
call SaveBoolean(udg_hash, id, 3, xtraLife)
call BJDebugMsg("Values saved") //debugging
call TimerStart(t, timeout, false, function PlayerReviveCallback)
set u = null
set p = null
set t = null
endfunction
//===========================================================================
function InitTrig_PlayerRevive takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( t, Condition( function PlayerReviveConditions ) )
call TriggerAddAction( t, function PlayerReviveActions )
set t = null
endfunction
</i></i></i>