Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //TESH.scrollpos=0
- //TESH.alwaysfold=0
- library Creep initializer Init requires Header
- globals
- constant integer RESPAWN_TIME_FACTION = 120
- constant integer RESPAWN_TIME_HOSTILE = 240
- constant integer RESPAWN_TIME_PASSIVE = 120
- constant integer RESPAWN_PREVENT_RANGE = 800
- constant real SUPERCHANCE = 1
- private timer SpawnTimer = CreateTimer()
- Creep array Creeps[8190]
- Creep array DeadCreeps
- integer DeadCreepsCount = 0
- integer array CreepId
- private integer array RareId
- private real array RareChance
- private integer RareCount = 0
- private integer array CustomSpawn
- private integer array CustomSpawnTime
- private integer CustomSpawnCount = 0
- Event CreepDies
- endglobals
- type PlayerQuest extends Quest array[MAXPLAYERS]
- struct Creep
- player owner
- unit creep
- PlayerQuest q
- real xSpawn = 0
- real ySpawn = 0
- real facing = 0
- integer level = 0
- integer respawnTime = -1
- integer respawnCur = -1
- integer creepId = 0
- integer creepRareId = 0
- boolean super = false
- boolean immediateRespawn = false
- boolean is_summoned = false
- real creepRareChance = 0
- endstruct
- function AddRareSpawn takes integer creepId, integer rareId, real chance returns nothing
- set CreepId[RareCount] = creepId
- set RareId[RareCount] = rareId
- set RareChance[RareCount] = chance
- set RareCount = RareCount + 1
- endfunction
- globals
- private integer Red = 0
- private integer RedCount = 0
- private integer Green = 0
- private integer GreenCount = 0
- private integer Blue = 0
- private integer BlueCount = 0
- private integer Opacity = 0
- private integer OpacityCount = 0
- private integer Size = 0
- private integer SizeCount = 0
- endglobals
- private function SetRed takes integer red returns nothing
- set Red = Red + red
- set RedCount = RedCount + 1
- endfunction
- private function SetGreen takes integer green returns nothing
- set Green = Green + green
- set GreenCount = GreenCount + 1
- endfunction
- private function SetBlue takes integer blue returns nothing
- set Blue = Blue + blue
- set BlueCount = BlueCount + 1
- endfunction
- private function SetOpacity takes integer opacity returns nothing
- set Opacity = Opacity + opacity
- set OpacityCount = OpacityCount + 1
- endfunction
- private function SetSize takes integer size returns nothing
- set Size = Size + size
- set SizeCount = SizeCount + 1
- endfunction
- /////////////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////SETUP!!!//////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////
- private function AddPrimary takes unit creep, integer ran returns nothing
- if ran == 1 then
- call LavaBurst.create(creep)
- call SetRed(255)
- call SetGreen(0)
- call SetBlue(0)
- elseif ran == 2 then
- call Crystal.create(creep)
- call SetRed(23)
- call SetGreen(198)
- call SetBlue(255)
- elseif ran == 3 then
- call Doom.create(creep)
- call SetRed(40)
- call SetGreen(40)
- call SetBlue(40)
- elseif ran == 4 then
- call Lifeline.create(creep)
- call SetRed(252)
- call SetGreen(255)
- call SetBlue(0)
- endif
- endfunction
- private function AddSecondary takes unit creep, integer ran returns nothing
- if ran == 1 then
- call Ghost.create(creep)
- call SetOpacity(80)
- elseif ran == 2 then
- call Giant.create(creep)
- call SetSize(300)
- elseif ran == 3 then
- call Tiny.create(creep)
- call SetSize(30)
- elseif ran == 4 then
- call Damper.create(creep)
- elseif ran == 5 then
- call Warding.create(creep)
- elseif ran == 6 then
- call Gladiator.create(creep)
- elseif ran == 7 then
- call Vampiric.create(creep)
- endif
- endfunction
- /////////////////////////////////////////////////////////////////////////////////////
- private function CreateSuperSpawn takes Creep c returns nothing
- local integer primary = GetRandomInt(1,4)
- local integer secondary = GetRandomInt(1,7)
- local integer red = 255
- local integer green = 255
- local integer blue = 255
- local integer opacity = 255
- local integer size = 100
- if GetRandomReal(0,100) <= SUPERCHANCE then
- call Status[c.creep].modDamagePercentBonus(400)
- call Status[c.creep].modHealthBonus(R2I(GetUnitState(c.creep,UNIT_STATE_MAX_LIFE)*4))
- call AddPrimary(c.creep,primary)
- call AddSecondary(c.creep,secondary)
- if RedCount > 0 then
- set red = Red/RedCount
- set Red = 0
- set RedCount = 0
- endif
- if BlueCount > 0 then
- set blue = Blue/BlueCount
- set Blue = 0
- set BlueCount = 0
- endif
- if GreenCount > 0 then
- set green = Green/GreenCount
- set Green = 0
- set GreenCount = 0
- endif
- if OpacityCount > 0 then
- set opacity = Opacity/OpacityCount
- set Opacity = 0
- set OpacityCount = 0
- endif
- call SetUnitVertexColor(c.creep,red,green,blue,opacity)
- if SizeCount > 0 then
- set size = Size/SizeCount
- set Size = 0
- set SizeCount = 0
- endif
- if size != 100 then
- call SetUnitScalePercent(c.creep,size,size,size)
- endif
- set c.super = true
- else
- set c.super = false
- endif
- endfunction
- private function SpawnFilter takes nothing returns boolean
- if P == Player(PLAYER_NEUTRAL_AGGRESSIVE) then
- return GetPlayerId(GetOwningPlayer(GetFilterUnit())) <= 7 and GetUnitTypeId(GetFilterUnit()) != 'tomb' and IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD) == false and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false
- endif
- return false
- endfunction
- private function Respawn takes nothing returns nothing
- local Creep c
- local unit creep = null
- local integer i = 0
- local integer j
- local integer creepId
- loop
- exitwhen i >= DeadCreepsCount
- set c = DeadCreeps[i]
- set creepId = c.creepId
- if c.immediateRespawn then
- set c.respawnCur = 0
- endif
- if c.respawnCur > 0 then
- set c.respawnCur = c.respawnCur - 1
- else
- set P = c.owner
- call GroupEnumUnitsInRange(G,c.xSpawn,c.ySpawn,RESPAWN_PREVENT_RANGE,Condition(function SpawnFilter))
- if CountUnitsInGroup(G) == 0 then
- if c.creepRareId != 0 then // rare spawn
- if GetRandomReal(0,100) <= c.creepRareChance then
- set creepId = c.creepRareId
- endif
- endif
- set creep = CreateUnit(c.owner,creepId,c.xSpawn,c.ySpawn,c.facing)
- set Creeps[GetUnitId(creep)] = c
- set c.creep = creep
- set c.respawnCur = -1
- if c.owner == Player(PLAYER_NEUTRAL_AGGRESSIVE) and IsUnitType(c.creep,UNIT_TYPE_HERO) == false then
- call CreateSuperSpawn(c)
- endif
- if c.owner == Player(PLAYER_NEUTRAL_AGGRESSIVE) and IsUnitType(c.creep,UNIT_TYPE_HERO) == true then
- call SetHeroLevel(c.creep,c.level,false)
- endif
- // quest stuff
- if c.q != 0 then
- set j = 0
- loop
- exitwhen j >= MAXPLAYERS
- call Heroes[j].updateAllQuests()
- set j = j + 1
- endloop
- endif
- //
- if i == DeadCreepsCount-1 then
- set DeadCreeps[i] = 0
- else
- set DeadCreeps[i] = DeadCreeps[DeadCreepsCount-1]
- set i = i - 1
- endif
- set DeadCreepsCount = DeadCreepsCount - 1
- endif
- call GroupClear(G)
- endif
- set i = i + 1
- endloop
- endfunction
- private function RespawnCreepCon takes nothing returns boolean
- return Creeps[GetUnitId(GetTriggerUnit())] != 0
- endfunction
- function TriggerRegisterEventCreepDies takes trigger t returns nothing
- call CreepDies.register(t)
- endfunction
- private function RespawnCreepStart takes nothing returns nothing
- local Creep c = Creeps[GetUnitId(GetTriggerUnit())]
- local integer i = 0
- call CreepDies.fire()
- if c.is_summoned == false then
- set c.respawnCur = c.respawnTime
- set DeadCreeps[DeadCreepsCount] = c
- set DeadCreepsCount = DeadCreepsCount + 1
- endif
- set Creeps[GetUnitId(GetTriggerUnit())] = 0
- //quest stuff
- if c.q != 0 then
- loop
- exitwhen i >= MAXPLAYERS
- if c.q[i].sfx[i] != null then
- call DestroyEffect(c.q[i].sfx[i])
- endif
- set i = i + 1
- endloop
- endif
- //
- endfunction
- function SetCustomSpawnTimer takes integer unitId, integer time returns nothing
- set CustomSpawn[CustomSpawnCount] = unitId
- set CustomSpawnTime[CustomSpawnCount] = time
- set CustomSpawnCount = CustomSpawnCount + 1
- endfunction
- private function GetCustomSpawnTime takes integer unitId returns integer
- local integer i = 0
- loop
- exitwhen i >= CustomSpawnCount
- if CustomSpawn[i] == unitId then
- return CustomSpawnTime[i]
- endif
- set i = i + 1
- endloop
- return -1
- endfunction
- private function SetCreepData takes unit u, boolean summoned returns nothing
- local Creep c = Creep.create()
- local integer i = 0
- local integer cusTime = -1
- set c.owner = GetOwningPlayer(u)
- set c.xSpawn = GetUnitX(u)
- set c.ySpawn = GetUnitY(u)
- set c.facing = GetUnitFacing(u)
- set c.creepId = GetUnitTypeId(u)
- set c.is_summoned = summoned
- if IsUnitType(u,UNIT_TYPE_HERO) == true then
- set c.level = GetHeroLevel(u)
- endif
- loop
- exitwhen i >= RareCount
- if c.creepId == CreepId[i] then
- set c.creepRareId = RareId[i]
- set c.creepRareChance = RareChance[i]
- endif
- set i = i + 1
- endloop
- set cusTime = GetCustomSpawnTime.evaluate(c.creepId)
- if cusTime >= 0 then
- set c.respawnTime = cusTime
- elseif GetOwningPlayer(u) == Player(PLAYER_NEUTRAL_AGGRESSIVE) then
- set c.respawnTime = RESPAWN_TIME_HOSTILE
- elseif GetOwningPlayer(u) == Player(PLAYER_NEUTRAL_PASSIVE) then
- set c.respawnTime = RESPAWN_TIME_PASSIVE
- else
- set c.respawnTime = RESPAWN_TIME_FACTION
- endif
- set Creeps[GetUnitId(u)] = c
- set c.creep = u
- endfunction
- private function CreepSpawnFilter takes nothing returns boolean
- return IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false and GetPlayerId(GetOwningPlayer(GetFilterUnit())) >= MAXPLAYERS
- endfunction
- private function InitializeCreeps takes nothing returns nothing
- local unit u
- local integer count = 0
- call GroupEnumUnitsInMap.evaluate(Condition(function CreepSpawnFilter))
- loop
- set u = FirstOfGroup(G)
- exitwhen u == null
- call SetCreepData.evaluate(u,false)
- if ModuloInteger(count,25) == 0 then
- call Load.update.execute(LOAD_CREEPS,count)
- endif
- set count = count + 1
- call GroupRemoveUnit(G,u)
- endloop
- call TimerStart(SpawnTimer,1,true,function Respawn)
- call Load.complete.execute(LOAD_CREEPS)
- call Load.update.execute(LOAD_CREEPS,count)
- endfunction
- private function EnterCreepsInitCon takes nothing returns boolean
- return IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE) == false and GetPlayerId(GetOwningPlayer(GetTriggerUnit())) >= MAXPLAYERS
- endfunction
- private function EnterCreepsInit takes nothing returns nothing
- if Creeps[GetUnitId(GetTriggerUnit())] == 0 then
- call SetCreepData(GetTriggerUnit(), true)
- endif
- endfunction
- private function Init takes nothing returns nothing
- local trigger InitCreeps = CreateTrigger()
- local trigger EnterCreeps = CreateTrigger()
- local trigger CreepDeath = CreateTrigger()
- call TriggerRegisterEventCustomSpawnsLoaded(InitCreeps)
- call TriggerAddAction(InitCreeps,function InitializeCreeps)
- call TriggerRegisterEnterRectSimple(EnterCreeps,GetPlayableMapRect())
- call TriggerAddCondition(EnterCreeps,Condition(function EnterCreepsInitCon))
- call TriggerAddAction(EnterCreeps,function EnterCreepsInit)
- call TriggerRegisterAnyUnitEventBJ(CreepDeath,EVENT_PLAYER_UNIT_DEATH)
- call TriggerAddCondition(CreepDeath,Condition(function RespawnCreepCon))
- call TriggerAddAction(CreepDeath,function RespawnCreepStart)
- set CreepDies = Event.create()
- endfunction
- endlibrary
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement