Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.88 KB | None | 0 0
  1. //TESH.scrollpos=0
  2. //TESH.alwaysfold=0
  3. library Creep initializer Init requires Header
  4.  
  5. globals
  6. constant integer RESPAWN_TIME_FACTION = 120
  7. constant integer RESPAWN_TIME_HOSTILE = 240
  8. constant integer RESPAWN_TIME_PASSIVE = 120
  9. constant integer RESPAWN_PREVENT_RANGE = 800
  10.  
  11. constant real SUPERCHANCE = 1
  12.  
  13. private timer SpawnTimer = CreateTimer()
  14. Creep array Creeps[8190]
  15. Creep array DeadCreeps
  16. integer DeadCreepsCount = 0
  17. integer array CreepId
  18. private integer array RareId
  19. private real array RareChance
  20. private integer RareCount = 0
  21. private integer array CustomSpawn
  22. private integer array CustomSpawnTime
  23. private integer CustomSpawnCount = 0
  24.  
  25. Event CreepDies
  26. endglobals
  27.  
  28. type PlayerQuest extends Quest array[MAXPLAYERS]
  29.  
  30. struct Creep
  31. player owner
  32. unit creep
  33. PlayerQuest q
  34. real xSpawn = 0
  35. real ySpawn = 0
  36. real facing = 0
  37. integer level = 0
  38. integer respawnTime = -1
  39. integer respawnCur = -1
  40. integer creepId = 0
  41. integer creepRareId = 0
  42. boolean super = false
  43. boolean immediateRespawn = false
  44. boolean is_summoned = false
  45. real creepRareChance = 0
  46. endstruct
  47.  
  48. function AddRareSpawn takes integer creepId, integer rareId, real chance returns nothing
  49. set CreepId[RareCount] = creepId
  50. set RareId[RareCount] = rareId
  51. set RareChance[RareCount] = chance
  52. set RareCount = RareCount + 1
  53. endfunction
  54.  
  55. globals
  56. private integer Red = 0
  57. private integer RedCount = 0
  58. private integer Green = 0
  59. private integer GreenCount = 0
  60. private integer Blue = 0
  61. private integer BlueCount = 0
  62. private integer Opacity = 0
  63. private integer OpacityCount = 0
  64. private integer Size = 0
  65. private integer SizeCount = 0
  66. endglobals
  67.  
  68. private function SetRed takes integer red returns nothing
  69. set Red = Red + red
  70. set RedCount = RedCount + 1
  71. endfunction
  72.  
  73. private function SetGreen takes integer green returns nothing
  74. set Green = Green + green
  75. set GreenCount = GreenCount + 1
  76. endfunction
  77.  
  78. private function SetBlue takes integer blue returns nothing
  79. set Blue = Blue + blue
  80. set BlueCount = BlueCount + 1
  81. endfunction
  82.  
  83. private function SetOpacity takes integer opacity returns nothing
  84. set Opacity = Opacity + opacity
  85. set OpacityCount = OpacityCount + 1
  86. endfunction
  87.  
  88. private function SetSize takes integer size returns nothing
  89. set Size = Size + size
  90. set SizeCount = SizeCount + 1
  91. endfunction
  92.  
  93. /////////////////////////////////////////////////////////////////////////////////////
  94. ///////////////////////////////////SETUP!!!//////////////////////////////////////////
  95. /////////////////////////////////////////////////////////////////////////////////////
  96. private function AddPrimary takes unit creep, integer ran returns nothing
  97. if ran == 1 then
  98. call LavaBurst.create(creep)
  99. call SetRed(255)
  100. call SetGreen(0)
  101. call SetBlue(0)
  102. elseif ran == 2 then
  103. call Crystal.create(creep)
  104. call SetRed(23)
  105. call SetGreen(198)
  106. call SetBlue(255)
  107. elseif ran == 3 then
  108. call Doom.create(creep)
  109. call SetRed(40)
  110. call SetGreen(40)
  111. call SetBlue(40)
  112. elseif ran == 4 then
  113. call Lifeline.create(creep)
  114. call SetRed(252)
  115. call SetGreen(255)
  116. call SetBlue(0)
  117. endif
  118. endfunction
  119.  
  120. private function AddSecondary takes unit creep, integer ran returns nothing
  121. if ran == 1 then
  122. call Ghost.create(creep)
  123. call SetOpacity(80)
  124. elseif ran == 2 then
  125. call Giant.create(creep)
  126. call SetSize(300)
  127. elseif ran == 3 then
  128. call Tiny.create(creep)
  129. call SetSize(30)
  130. elseif ran == 4 then
  131. call Damper.create(creep)
  132. elseif ran == 5 then
  133. call Warding.create(creep)
  134. elseif ran == 6 then
  135. call Gladiator.create(creep)
  136. elseif ran == 7 then
  137. call Vampiric.create(creep)
  138. endif
  139. endfunction
  140. /////////////////////////////////////////////////////////////////////////////////////
  141.  
  142. private function CreateSuperSpawn takes Creep c returns nothing
  143. local integer primary = GetRandomInt(1,4)
  144. local integer secondary = GetRandomInt(1,7)
  145. local integer red = 255
  146. local integer green = 255
  147. local integer blue = 255
  148. local integer opacity = 255
  149. local integer size = 100
  150. if GetRandomReal(0,100) <= SUPERCHANCE then
  151.  
  152. call Status[c.creep].modDamagePercentBonus(400)
  153. call Status[c.creep].modHealthBonus(R2I(GetUnitState(c.creep,UNIT_STATE_MAX_LIFE)*4))
  154.  
  155. call AddPrimary(c.creep,primary)
  156. call AddSecondary(c.creep,secondary)
  157.  
  158. if RedCount > 0 then
  159. set red = Red/RedCount
  160. set Red = 0
  161. set RedCount = 0
  162. endif
  163. if BlueCount > 0 then
  164. set blue = Blue/BlueCount
  165. set Blue = 0
  166. set BlueCount = 0
  167. endif
  168. if GreenCount > 0 then
  169. set green = Green/GreenCount
  170. set Green = 0
  171. set GreenCount = 0
  172. endif
  173. if OpacityCount > 0 then
  174. set opacity = Opacity/OpacityCount
  175. set Opacity = 0
  176. set OpacityCount = 0
  177. endif
  178. call SetUnitVertexColor(c.creep,red,green,blue,opacity)
  179. if SizeCount > 0 then
  180. set size = Size/SizeCount
  181. set Size = 0
  182. set SizeCount = 0
  183. endif
  184. if size != 100 then
  185. call SetUnitScalePercent(c.creep,size,size,size)
  186. endif
  187. set c.super = true
  188. else
  189. set c.super = false
  190. endif
  191. endfunction
  192.  
  193. private function SpawnFilter takes nothing returns boolean
  194. if P == Player(PLAYER_NEUTRAL_AGGRESSIVE) then
  195. return GetPlayerId(GetOwningPlayer(GetFilterUnit())) <= 7 and GetUnitTypeId(GetFilterUnit()) != 'tomb' and IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD) == false and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false
  196. endif
  197. return false
  198. endfunction
  199.  
  200. private function Respawn takes nothing returns nothing
  201. local Creep c
  202. local unit creep = null
  203. local integer i = 0
  204. local integer j
  205. local integer creepId
  206. loop
  207. exitwhen i >= DeadCreepsCount
  208. set c = DeadCreeps[i]
  209. set creepId = c.creepId
  210. if c.immediateRespawn then
  211. set c.respawnCur = 0
  212. endif
  213. if c.respawnCur > 0 then
  214. set c.respawnCur = c.respawnCur - 1
  215. else
  216. set P = c.owner
  217. call GroupEnumUnitsInRange(G,c.xSpawn,c.ySpawn,RESPAWN_PREVENT_RANGE,Condition(function SpawnFilter))
  218. if CountUnitsInGroup(G) == 0 then
  219. if c.creepRareId != 0 then // rare spawn
  220. if GetRandomReal(0,100) <= c.creepRareChance then
  221. set creepId = c.creepRareId
  222. endif
  223. endif
  224. set creep = CreateUnit(c.owner,creepId,c.xSpawn,c.ySpawn,c.facing)
  225. set Creeps[GetUnitId(creep)] = c
  226. set c.creep = creep
  227. set c.respawnCur = -1
  228. if c.owner == Player(PLAYER_NEUTRAL_AGGRESSIVE) and IsUnitType(c.creep,UNIT_TYPE_HERO) == false then
  229. call CreateSuperSpawn(c)
  230. endif
  231. if c.owner == Player(PLAYER_NEUTRAL_AGGRESSIVE) and IsUnitType(c.creep,UNIT_TYPE_HERO) == true then
  232. call SetHeroLevel(c.creep,c.level,false)
  233. endif
  234. // quest stuff
  235. if c.q != 0 then
  236. set j = 0
  237. loop
  238. exitwhen j >= MAXPLAYERS
  239. call Heroes[j].updateAllQuests()
  240. set j = j + 1
  241. endloop
  242. endif
  243. //
  244. if i == DeadCreepsCount-1 then
  245. set DeadCreeps[i] = 0
  246. else
  247. set DeadCreeps[i] = DeadCreeps[DeadCreepsCount-1]
  248. set i = i - 1
  249. endif
  250. set DeadCreepsCount = DeadCreepsCount - 1
  251. endif
  252. call GroupClear(G)
  253. endif
  254. set i = i + 1
  255. endloop
  256. endfunction
  257.  
  258. private function RespawnCreepCon takes nothing returns boolean
  259. return Creeps[GetUnitId(GetTriggerUnit())] != 0
  260. endfunction
  261.  
  262. function TriggerRegisterEventCreepDies takes trigger t returns nothing
  263. call CreepDies.register(t)
  264. endfunction
  265.  
  266. private function RespawnCreepStart takes nothing returns nothing
  267. local Creep c = Creeps[GetUnitId(GetTriggerUnit())]
  268. local integer i = 0
  269. call CreepDies.fire()
  270. if c.is_summoned == false then
  271. set c.respawnCur = c.respawnTime
  272. set DeadCreeps[DeadCreepsCount] = c
  273. set DeadCreepsCount = DeadCreepsCount + 1
  274. endif
  275. set Creeps[GetUnitId(GetTriggerUnit())] = 0
  276. //quest stuff
  277. if c.q != 0 then
  278. loop
  279. exitwhen i >= MAXPLAYERS
  280. if c.q[i].sfx[i] != null then
  281. call DestroyEffect(c.q[i].sfx[i])
  282. endif
  283. set i = i + 1
  284. endloop
  285. endif
  286. //
  287. endfunction
  288.  
  289. function SetCustomSpawnTimer takes integer unitId, integer time returns nothing
  290. set CustomSpawn[CustomSpawnCount] = unitId
  291. set CustomSpawnTime[CustomSpawnCount] = time
  292. set CustomSpawnCount = CustomSpawnCount + 1
  293. endfunction
  294.  
  295. private function GetCustomSpawnTime takes integer unitId returns integer
  296. local integer i = 0
  297. loop
  298. exitwhen i >= CustomSpawnCount
  299. if CustomSpawn[i] == unitId then
  300. return CustomSpawnTime[i]
  301. endif
  302. set i = i + 1
  303. endloop
  304. return -1
  305. endfunction
  306.  
  307. private function SetCreepData takes unit u, boolean summoned returns nothing
  308. local Creep c = Creep.create()
  309. local integer i = 0
  310. local integer cusTime = -1
  311. set c.owner = GetOwningPlayer(u)
  312. set c.xSpawn = GetUnitX(u)
  313. set c.ySpawn = GetUnitY(u)
  314. set c.facing = GetUnitFacing(u)
  315. set c.creepId = GetUnitTypeId(u)
  316. set c.is_summoned = summoned
  317. if IsUnitType(u,UNIT_TYPE_HERO) == true then
  318. set c.level = GetHeroLevel(u)
  319. endif
  320. loop
  321. exitwhen i >= RareCount
  322. if c.creepId == CreepId[i] then
  323. set c.creepRareId = RareId[i]
  324. set c.creepRareChance = RareChance[i]
  325. endif
  326. set i = i + 1
  327. endloop
  328. set cusTime = GetCustomSpawnTime.evaluate(c.creepId)
  329. if cusTime >= 0 then
  330. set c.respawnTime = cusTime
  331. elseif GetOwningPlayer(u) == Player(PLAYER_NEUTRAL_AGGRESSIVE) then
  332. set c.respawnTime = RESPAWN_TIME_HOSTILE
  333. elseif GetOwningPlayer(u) == Player(PLAYER_NEUTRAL_PASSIVE) then
  334. set c.respawnTime = RESPAWN_TIME_PASSIVE
  335. else
  336. set c.respawnTime = RESPAWN_TIME_FACTION
  337. endif
  338. set Creeps[GetUnitId(u)] = c
  339. set c.creep = u
  340. endfunction
  341.  
  342. private function CreepSpawnFilter takes nothing returns boolean
  343. return IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false and GetPlayerId(GetOwningPlayer(GetFilterUnit())) >= MAXPLAYERS
  344. endfunction
  345.  
  346. private function InitializeCreeps takes nothing returns nothing
  347. local unit u
  348. local integer count = 0
  349. call GroupEnumUnitsInMap.evaluate(Condition(function CreepSpawnFilter))
  350. loop
  351. set u = FirstOfGroup(G)
  352. exitwhen u == null
  353. call SetCreepData.evaluate(u,false)
  354. if ModuloInteger(count,25) == 0 then
  355. call Load.update.execute(LOAD_CREEPS,count)
  356. endif
  357. set count = count + 1
  358. call GroupRemoveUnit(G,u)
  359. endloop
  360. call TimerStart(SpawnTimer,1,true,function Respawn)
  361. call Load.complete.execute(LOAD_CREEPS)
  362. call Load.update.execute(LOAD_CREEPS,count)
  363. endfunction
  364. private function EnterCreepsInitCon takes nothing returns boolean
  365. return IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE) == false and GetPlayerId(GetOwningPlayer(GetTriggerUnit())) >= MAXPLAYERS
  366. endfunction
  367.  
  368. private function EnterCreepsInit takes nothing returns nothing
  369. if Creeps[GetUnitId(GetTriggerUnit())] == 0 then
  370. call SetCreepData(GetTriggerUnit(), true)
  371. endif
  372. endfunction
  373.  
  374. private function Init takes nothing returns nothing
  375. local trigger InitCreeps = CreateTrigger()
  376. local trigger EnterCreeps = CreateTrigger()
  377. local trigger CreepDeath = CreateTrigger()
  378. call TriggerRegisterEventCustomSpawnsLoaded(InitCreeps)
  379. call TriggerAddAction(InitCreeps,function InitializeCreeps)
  380. call TriggerRegisterEnterRectSimple(EnterCreeps,GetPlayableMapRect())
  381. call TriggerAddCondition(EnterCreeps,Condition(function EnterCreepsInitCon))
  382. call TriggerAddAction(EnterCreeps,function EnterCreepsInit)
  383. call TriggerRegisterAnyUnitEventBJ(CreepDeath,EVENT_PLAYER_UNIT_DEATH)
  384. call TriggerAddCondition(CreepDeath,Condition(function RespawnCreepCon))
  385. call TriggerAddAction(CreepDeath,function RespawnCreepStart)
  386. set CreepDies = Event.create()
  387. endfunction
  388.  
  389. endlibrary
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement