Beetlebomb
New Member
- Reaction score
- 43
Good to know
(only two BJ's used [DisplayTextToForce and GetPlayersAll] but avoiding them is probably more trouble than it's worth)
//===========================================================================
function GetUnitsOfTypeIdAllFilter takes nothing returns boolean
return GetUnitTypeId(GetFilterUnit()) == bj_groupEnumTypeId
endfunction
//===========================================================================
function GetUnitsOfTypeIdAll takes integer unitid returns group
local group result = CreateGroup()
local group g = CreateGroup()
local integer index
set index = 0
loop
set bj_groupEnumTypeId = unitid
call GroupClear(g)
call GroupEnumUnitsOfPlayer(g, Player(index), filterGetUnitsOfTypeIdAll)
call GroupAddGroup(g, result)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call DestroyGroup(g)
return result
endfunction
//===========================================================================
function GroupAddGroupEnum takes nothing returns nothing
call GroupAddUnit(bj_groupAddGroupDest, GetEnumUnit())
endfunction
//===========================================================================
function GroupAddGroup takes group sourceGroup, group destGroup returns nothing
// If the user wants the group destroyed, remember that fact and clear
// the flag, in case it is used again in the callback.
local boolean wantDestroy = bj_wantDestroyGroup
set bj_wantDestroyGroup = false
set bj_groupAddGroupDest = destGroup
call ForGroup(sourceGroup, function GroupAddGroupEnum)
// If the user wants the group destroyed, do so now.
if (wantDestroy) then
call DestroyGroup(sourceGroup)
endif
endfunction
function Trig_Remove_Archers_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 039;AHtc039;
endfunction
function Trig_Remove_Archers_Filter takes nothing returns boolean
local unit U = GetFilterUnit()
if (GetUnitTypeId(U)==039;earc039;) and (GetUnitState(U,UNIT_STATE_LIFE)>0) then
set bj_groupCountUnits = bj_groupCountUnits + 1
call KillUnit(U)
endif
set U = null
return false
endfunction
function Trig_Remove_Archers_Actions takes nothing returns nothing
local group g = CreateGroup()
set bj_groupCountUnits = 0
call GroupEnumUnitsInRect(g, GetWorldBounds(), Condition( function Trig_Remove_Archers_Filter ) )
call DestroyGroup(g)
set g = null
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, I2S(bj_groupCountUnits)+" Archers have been killed.")
endfunction
//===========================================================================
function InitTrig_Remove_Archers takes nothing returns nothing
set gg_trg_Remove_Archers = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Remove_Archers, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Remove_Archers, Condition( function Trig_Remove_Archers_Conditions ) )
call TriggerAddAction( gg_trg_Remove_Archers, function Trig_Remove_Archers_Actions )
endfunction
globals
integer i = 0
endglobals
function Add takes nothing returns nothing
if GetWidgetLife(GetEnumUnit()) > 0.405 then // I won't get involved with the "Is it .405" thing =P
set i = i + 1
endif
endfunction
function Trig_Remove_Archers_Actions takes nothing returns nothing
local group g = GetUnitsOfTypeIdAll(039;earc039;) //only need 1 group
call ForGroup(g, function Add )
call ForGroup(g, function kill2 ) // Kill the archers AFTER you've counted them...
call DestroyGroup(g)
set g = null
call DisplayTextToForce(GetPlayersAll(),I2S(i)+" Archers have been killed." )
set i = 0
endfunction
JASS:call DisplayTextToForce(GetPlayersAll(),I2S(i)+" Archers have been killed." )
call DisplayTextToPlayer(GetLocalPlayer(),0,0,I2S(i)+" Archers have been killed.")