//-------------------------------------------------------------------------------------
function IsUnitAlive takes unit u returns boolean
return not (GetUnitTypeId(u) == 0 or IsUnitType(u, UNIT_TYPE_DEAD))
endfunction
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
function HeroRandomizer_Block takes player pla returns nothing
call SetPlayerTechMaxAllowed(pla, 'HERO', 0) // temporary block training heroes
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[1], 0) //block
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[2], 0) //block
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[3], 0) //block
endfunction
//-------------------------------------------------------------------------------------
function HeroRandomizer_Allow takes player pla returns nothing
//local integer heroCount = GetPlayerTechCount(pla, 'HERO', true) // counts only alive heroes!
local integer heroCount = udg_HRheroCount[GetPlayerId(pla)]
if heroCount==0 then
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[1], 1) //allow training
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[2], 0) //block training
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[3], 0) //block
elseif heroCount==1 then
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[1], 0) //block
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[2], 1) //allow
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[3], 0) //block
elseif heroCount==2 then
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[1], 0) //block
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[2], 0) //block
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[3], 1) //allow
else
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[1], 0) //block
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[2], 0) //block
call SetPlayerTechMaxAllowed(pla, udg_HRdummy[3], 0) //block
endif
call SetPlayerTechMaxAllowed(pla, 'HERO', 3) // allow training 3 heroes
endfunction
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
function HR_TrainStart takes nothing returns boolean
local integer id = GetTrainedUnitType()
local player pla = GetOwningPlayer(GetTriggerUnit())
local integer i = GetPlayerId(pla)
if IsHeroUnitId(id) or id==udg_HRdummy[1] or id==udg_HRdummy[2] or id==udg_HRdummy[3] then
call HeroRandomizer_Block(pla)
set udg_HRtrainInProgress[i] = true
set udg_HRworkingAltar[i] = GetTriggerUnit()
endif
set pla=null
return false
endfunction
//-------------------------------------------------------------------------------------
function HR_TrainCancel takes nothing returns boolean
local integer id = GetTrainedUnitType()
local player pla = GetOwningPlayer(GetTriggerUnit())
local integer i = GetPlayerId(pla)
if IsHeroUnitId(id) or id==udg_HRdummy[1] or id==udg_HRdummy[2] or id==udg_HRdummy[3] then
set udg_HRtrainInProgress[i] = false
set udg_HRworkingAltar[i] = null
call HeroRandomizer_Allow(pla)
endif
set pla=null
return false
endfunction
//-------------------------------------------------------------------------------------
function HR_TrainFinish takes nothing returns boolean
local unit u = GetTrainedUnit()
local integer id = GetUnitTypeId(u)
local player pla = GetOwningPlayer(u)
local integer i = GetPlayerId(pla)
if IsUnitType(u, UNIT_TYPE_HERO) or id==udg_HRdummy[1] or id==udg_HRdummy[2] or id==udg_HRdummy[3] then
set udg_HRtrainInProgress[i] = false
set udg_HRworkingAltar[i] = null
set udg_HRheroCount[i] = udg_HRheroCount[i] + 1
call HeroRandomizer_Allow(pla)
call SetPlayerState(pla, PLAYER_STATE_RESOURCE_HERO_TOKENS, 0)
endif
if id==udg_HRdummy[1] or id==udg_HRdummy[2] or id==udg_HRdummy[3] then
call KillUnit(u)
//create random hero actions
set udg_HRTempPlayer = pla
set udg_HRTempPoint = GetUnitLoc(u)
set udg_HRTempPointRally = GetUnitRallyPoint(GetTriggerUnit())
call TriggerExecute(gg_trg_CreateRandomHero)
endif
set u=null
set pla=null
return false
endfunction
//-------------------------------------------------------------------------------------
function HR_HeroSold takes nothing returns boolean
local integer i = GetPlayerId(GetOwningPlayer(GetSoldUnit()))
if IsUnitType(GetSoldUnit(), UNIT_TYPE_HERO) then
set udg_HRheroCount[i] = udg_HRheroCount[i] + 1
call HeroRandomizer_Allow(Player(i))
endif
return false
endfunction
//-------------------------------------------------------------------------------------
function HR_WorkingAltarDies takes nothing returns boolean
local integer i=0
loop // check if it is working altar:
exitwhen i==bj_MAX_PLAYERS
if GetTriggerUnit()==udg_HRworkingAltar[i] then
// found:
set udg_HRtrainInProgress[i] = false
set udg_HRworkingAltar[i] = null
set udg_HRreviveInProgress[i] = false
set udg_HRrevivingHero[i] = null
call HeroRandomizer_Allow(Player(i))
exitwhen true
endif
set i=i+1
endloop
return false
endfunction
//-------------------------------------------------------------------------------------
//-------------------------------REVIVE TRIGGERS----------------------------------
//-------------------------------------------------------------------------------------
function HR_CheckForQueueCancelRev takes nothing returns nothing
local integer i = 0
loop //find playerId:
exitwhen i==bj_MAX_PLAYERS
if GetExpiredTimer() == udg_HRtimerRevCanceled[i] then
exitwhen true
endif
set i=i+1
endloop
if (not IsUnitAlive(udg_HRworkingAltar[i])) or IsUnitAlive(udg_HRrevivingHero[i]) then // actions in "altar dies" / "finishes reviving"
call PauseTimer(GetExpiredTimer())
endif
if IssueTargetOrder(udg_HRworkingAltar[i], "revive", udg_HRrevivingHero[i]) then
call IssueImmediateOrderById(udg_HRworkingAltar[i], 851976) // cancel id
call PauseTimer(GetExpiredTimer())
// --> here cancel event fires :
if udg_HRreviveInProgress[i] then
set udg_HRreviveCount[i] = udg_HRreviveCount[i] - 1
endif
if udg_HRreviveCount[i]==0 then
set udg_HRreviveInProgress[i] = false
endif
if udg_HRtrainInProgress[i] == false and udg_HRreviveInProgress[i]==false then
set udg_HRworkingAltar[i] = null
set udg_HRrevivingHero[i] = null
call HeroRandomizer_Allow(Player(i))
endif
// --> here cancel event fires : end
endif
endfunction
//===========================================
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
function HR_CancelOrder takes nothing returns nothing
call IssueImmediateOrderById(udg_HRcanceledUnit, 851976)
endfunction
//-------------------------------------------------------------------------
function HR_ReviveStartOrd_Cond takes nothing returns boolean
local integer ord = GetIssuedOrderId()
return ord==852027 or ord==852028 or ord==852029 // means "Begin-revive-hero" order given to ALTAR
endfunction
//-------------------------------------------------------------------------
function HR_ReviveStartOrd_Actions takes nothing returns nothing
local integer i = GetPlayerId(GetOwningPlayer(GetOrderTargetUnit())) // hero owner's id
set udg_HRreviveCount[i] = udg_HRreviveCount[i] + 1
if udg_HRtrainInProgress[i] then //cancel this revive action:
set udg_HRreviveCount[i] = udg_HRreviveCount[i] - 1
set udg_HRcanceledUnit = GetOrderedUnit() //altar
call TimerStart(udg_HRtimerCancel, 0.00, false, function HR_CancelOrder)
elseif udg_HRreviveInProgress[i] then //cancel this revive action:
set udg_HRcanceledUnit = GetOrderedUnit() //altar
call TimerStart(udg_HRtimerCancel, 0.00, false, function HR_CancelOrder)
else
call HeroRandomizer_Block(Player(i))
set udg_HRreviveInProgress[i] = true
set udg_HRworkingAltar[i] = GetOrderedUnit()
set udg_HRrevivingHero[i] = GetOrderTargetUnit()
set udg_HRrevivedByTavern[i] = null
//run periodic timer to catch queue revive cancel event
call TimerStart(udg_HRtimerRevCanceled[i], 1.00, true, function HR_CheckForQueueCancelRev)
endif
endfunction
//-------------------------------------------------------------------------------------
function HR_RevieveCancel takes nothing returns nothing
local integer i = GetPlayerId(GetOwningPlayer(GetTriggerUnit())) // hero's owner
if udg_HRreviveInProgress[i] then
set udg_HRreviveCount[i] = udg_HRreviveCount[i] - 1
endif
if udg_HRreviveCount[i]==0 then
set udg_HRreviveInProgress[i] = false
endif
if udg_HRtrainInProgress[i] == false and udg_HRreviveInProgress[i]==false then
set udg_HRworkingAltar[i] = null
set udg_HRrevivingHero[i] = null
call HeroRandomizer_Allow(Player(i))
endif
endfunction
//-------------------------------------------------------------------------------------
function HR_ReviveFinish takes nothing returns nothing
local integer i = GetPlayerId(GetOwningPlayer(GetRevivingUnit()))
if udg_HRreviveInProgress[i] and udg_HRrevivedByTavern[i] != GetRevivingUnit() then
set udg_HRreviveCount[i] = udg_HRreviveCount[i] - 1
set udg_HRreviveInProgress[i] = false
set udg_HRworkingAltar[i] = null
set udg_HRrevivingHero[i] = null
call HeroRandomizer_Allow(Player(i))
endif
endfunction
//-------------------------------------------------------------------------------------
function HR_ReviveFromTavern takes nothing returns boolean
local integer ord = GetIssuedOrderId()
if ord==852463 or ord==852464 or ord==852465 then // means "instant-revive-hero" order given to TAVERN
set udg_HRrevivedByTavern[GetPlayerId(GetOwningPlayer(GetOrderTargetUnit()))] = GetOrderTargetUnit()
endif
return false
endfunction
//-------------------------------------------------------------------------------------
//==================================================================
function InitTrig_HRSystem takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_TRAIN_START)
call TriggerAddCondition(t, Condition(function HR_TrainStart))
set t=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_TRAIN_CANCEL)
call TriggerAddCondition(t, Condition(function HR_TrainCancel))
set t=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_TRAIN_FINISH)
call TriggerAddCondition(t, Condition(function HR_TrainFinish))
set t=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SELL)
call TriggerAddCondition(t, Condition( function HR_HeroSold))
set t=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(t, Condition(function HR_WorkingAltarDies))
set t=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerAddCondition(t, Condition(function HR_ReviveStartOrd_Cond))
call TriggerAddAction(t, function HR_ReviveStartOrd_Actions)
set t=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_HERO_REVIVE_CANCEL)
call TriggerAddAction(t, function HR_RevieveCancel)
set t=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_HERO_REVIVE_FINISH)
call TriggerAddAction(t, function HR_ReviveFinish)
set t=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerAddCondition(t, Condition( function HR_ReviveFromTavern))
set t=null
endfunction