Furby
Current occupation: News poster
- Reaction score
- 144
v1.2
- v1.2
- all use of locations removed, using X and Y now
- it now destroys group which is not useful after initialization- v1.1
- TimerUtils added to required systems
- struct base removed, using array group now
- struct revive removed, it was making nonsense
- fixed leak in SaveBase function
- fixed few other errors
I am making a map, an AoS. I needed a revival system. However all revival systems are bugged or does not work as I wanted it. Even revival system in one of the most famous map is bugged. Meaning that when you come to creep base and go further from it with creeps from the base which attacks your hero and when you wait until the periodic respawn, which is next thing I don't like on revival systems, triggers then new units are spawned even if old ones are still alive. Thah sucked and it still does, so I made my own system!
- vJass compiler
- TimerUtils
Make new trigger.
Rename it to Creep Revival System or whatever you want.
Edit > Convert to custom text.
Replace the whole trigger with the code.
You don't have to do anything else! Just put creeps on map! You don't have to set any variables or call any functions! It will do all job for you!
Rename it to Creep Revival System or whatever you want.
Edit > Convert to custom text.
Replace the whole trigger with the code.
You don't have to do anything else! Just put creeps on map! You don't have to set any variables or call any functions! It will do all job for you!
JASS:
//=====================================
//*************************************
// CREEP REVIVAL SYSTEM
// by Furby
// v1.2
//*************************************
//=====================================
scope CreepSystem initializer Init
globals
// CONFIGURATION
// Who owns creeps - 12 is player 13 (Neutral Hostile)
private constant integer CREEP_OWNER = 12
// Maximum radius of one base
private constant real BASE_MAXRADIUS = 750.
// How long time needs camp to respawn
private constant real RESPAWN_TIME = 30.
// END OF CONFIGURATION
private boolean tempBoolean = true
private group SavedUnits = CreateGroup()
private group array Creeps
private integer BaseCount = 0
private integer CreepCount = 0
private unit array Creep
private integer array CreepType
private real array CreepX
private real array CreepY
private real array CreepAngle
endglobals
private function Unhide takes nothing returns nothing
call ShowUnit(GetEnumUnit(), true)
endfunction
private function Revive takes nothing returns nothing
local timer t = GetExpiredTimer()
call ForGroup(Creeps[GetTimerData(t)], function Unhide)
call ReleaseTimer(t)
set t = null
endfunction
private function DeadCheck takes nothing returns nothing
if IsUnitHidden(GetEnumUnit()) == false then
set tempBoolean = false
endif
endfunction
private function Conditions takes nothing returns boolean
local integer i = 0
local integer n
local timer t
loop
set i = i + 1
if IsUnitInGroup(GetTriggerUnit(), Creeps<i>) then
call GroupRemoveUnit(Creeps<i>, GetTriggerUnit())
set n = 0
loop
set n = n + 1
if GetTriggerUnit() == Creep[n] then
set Creep[n] = CreateUnit(Player(CREEP_OWNER), CreepType[n], CreepX[n], CreepY[n], CreepAngle[n])
call GroupAddUnit(Creeps<i>, Creep[n])
call ShowUnit(Creep[n], false)
endif
exitwhen n > CreepCount
endloop
set tempBoolean = true
call ForGroup(Creeps<i>, function DeadCheck)
if tempBoolean == true then
set t = NewTimer()
call TimerStart(t, RESPAWN_TIME, false, function Revive)
call SetTimerData(t, i)
endif
endif
exitwhen i > BaseCount
endloop
set t = null
return false
endfunction
private function SaveBase takes nothing returns boolean
local unit filter = GetFilterUnit()
local boolean b = GetOwningPlayer(filter) == Player(CREEP_OWNER) and GetWidgetLife(filter) > 0.405 and IsUnitType(filter, UNIT_TYPE_STRUCTURE) == false and IsUnitInGroup(filter, SavedUnits) == false
set filter = null
return b
endfunction
private function InitializeCreeps takes nothing returns boolean
local unit filter = GetFilterUnit()
local real x = GetUnitX(filter)
local real y = GetUnitY(filter)
local group g = CreateGroup()
local unit u
if GetOwningPlayer(filter) == Player(CREEP_OWNER) and GetWidgetLife(filter) > 0.405 and IsUnitType(filter, UNIT_TYPE_STRUCTURE) == false and IsUnitInGroup(filter, SavedUnits) == false then
call GroupEnumUnitsInRange(g, x, y, BASE_MAXRADIUS, Condition(function SaveBase))
set BaseCount = BaseCount + 1
set Creeps[BaseCount] = CreateGroup()
loop
set u = FirstOfGroup(g)
exitwhen u == null
call GroupRemoveUnit(g, u)
set CreepCount = CreepCount + 1
call GroupAddUnit(SavedUnits, u)
call GroupAddUnit(Creeps[BaseCount], u)
set Creep[CreepCount] = u
set CreepType[CreepCount] = GetUnitTypeId(u)
set CreepX[CreepCount] = GetUnitX(u)
set CreepY[CreepCount] = GetUnitY(u)
set CreepAngle[CreepCount] = GetUnitFacing(u)
endloop
endif
call DestroyGroup(g)
set g = null
set u = null
set filter = null
return false
endfunction
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
local integer i = 0
local group g = CreateGroup()
call GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, Condition(function InitializeCreeps))
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(t, Condition( function Conditions))
set t = null
call DestroyGroup(SavedUnits)
set SavedUnits = null
call DestroyGroup(g)
set g = null
endfunction
endscope</i></i></i></i>
- Does it respawn the whole camp of creeps at once?
- Yes, all units of camp at once.
- Will it also respawn one dead creep of camp?
- No, it will wait until all units of camp are dead.