stoneharry

Untitled

Aug 7th, 2012
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 21.51 KB | None | 0 0
  1.  
  2. -- AoE Tower: Use Spell 66313 On Target
  3. -- Phasing mobs
  4. -- More bosses
  5.  
  6. local WaveList = {
  7. --  {entry, bounty, spawns}
  8.     {17707, 1, 5}, --Dawnstone Crab
  9.     {17707, 1, 10}, --Dawnstone Crab
  10.     {17707, 1, 15}, --Dawnstone Crab
  11.     {34165, 12, 1}, --Boss 1
  12.     {135401, 1, 10}, --Elder Dawnstone Crab
  13.     {70461, 2, 4}, --Shield Turtle
  14.     {250081, 2, 3}, --Flying
  15.     {70461, 1, 6}, --Shield Turtle
  16.     {250081, 1, 6}, --Flying
  17.     {70461, 1, 8}, --Shield Turtle
  18.     {250081, 1, 8}, --Flying
  19.     {135401, 1, 15}, --Elder Dawnstone Crab
  20.     {17707, 1, 25}, --Dawnstone Crab
  21.     {250081, 1, 8}, --Flying
  22.     {109921, 10, 1}, --Boss 2
  23.     {101831, 1, 2},  --Flying Lizards
  24.     {101831, 1, 4},  --Flying Lizards
  25.     {101831, 1, 1}  --Flying Lizards
  26.     --Last wave repeats with (spawns * wavenum) spawns.
  27. }
  28.  
  29. local runcoords = {
  30.     {2846.48, 913.36, 0.1, 0},
  31.     {2822.08, 913.5, 0.1, 0},
  32.     {2822.47, 919.3, 0.1, 0},
  33.     {2846.5, 919.5, 0.1, 0},
  34.     {2846.6, 925, 0.1, 0},
  35.     {2822.1, 925.1, 0.1, 0},
  36.     {2822.3, 931, 0.1, 0},
  37.     {2846.68, 931.66, 0.1, 0},
  38.     {2846.73, 943.3, 0.1, 0}
  39. }
  40. local runcoords2 = {}
  41. local flyingcoords = {
  42.     {2847, 910, 5.6, 0},
  43.     {2847.1, 937, 5, 0},
  44.     {2846.73, 943.3, 0.1, 0}
  45. }
  46. local flyingcoords2 = {}
  47.  
  48. SetDBCSpellVar(55811, "Effect", 0, 0)
  49.  
  50. local running = false
  51. local waverunning = false
  52. local waveentry = 100
  53. local shieldvalue = 100
  54. local wavenum = 1
  55. local resources = 20
  56. local upvalue = 1
  57. local creepsLeft = 0
  58. local FuckingPlayer = nil
  59.  
  60. local SMSG_INIT_WORLD_STATES = 0x2C2
  61. local SMSG_UPDATE_WORLD_STATE = 0x2C3
  62. local OBJECT_END = 0x0006
  63. local UNIT_FIELD_FLAGS = OBJECT_END + 0x0035 -- Size: 1, Type: INT, Flags: PUBLIC
  64. local UNIT_FLAG_NOT_SELECTABLE = 0x02000000 -- 26    33554432  cannot select the unit
  65. local UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074 -- Size: 1, Type: BYTES, Flags: PUBLIC
  66.  
  67. -- Mob running + despawning + damage to shield
  68.  
  69. function Fill_runcoords2(player)
  70.     for i = 1, (#runcoords) do
  71.         if (runcoords2[i]) then runcoords2[i]:Despawn(1, 0); end
  72.         runcoords2[i] = player:SpawnCreature(135400, runcoords[i][1], runcoords[i][2], runcoords[i][3], 0, 35, 3600000)
  73.     end
  74. end
  75. function Fill_flyingcoords2(player)
  76.     for i = 1, (#flyingcoords) do
  77.         if (flyingcoords2[i]) then flyingcoords2[i]:Despawn(1, 0); end
  78.         flyingcoords2[i] = player:SpawnCreature(135400, flyingcoords[i][1], flyingcoords[i][2], flyingcoords[i][3], 0, 35, 3600000)
  79.     end
  80. end
  81.  
  82. function Mob_PathFind(pUnit)
  83.     if (not pUnit:IsAlive()) then return; end
  84.     local cp = pUnit:GetValue("TD_NextPoint")
  85.     local flying = pUnit:GetValue("TD_IsFlying")
  86.     local cps
  87.     if (flying) then
  88.         cps = flyingcoords2
  89.     else
  90.         cps = runcoords2
  91.     end
  92.     local x, y, z = cps[cp]:GetLocation()
  93.     local dist = pUnit:CalcToDistance(x, y, z)
  94.     if (dist < 3 and cp == (#cps)) then
  95.         creepsLeft = creepsLeft - 1
  96.         shieldvalue = shieldvalue - 5
  97.         if (shieldvalue < 1) then shieldvalue = 0; end
  98.         for _, player in pairs (pUnit:GetInRangePlayers()) do
  99.             UpdateAttempts(player, shieldvalue)
  100.         end
  101.         pUnit:RemoveEvents()
  102.         pUnit:Despawn(100, 0)
  103.     elseif (dist < 2) then
  104.         cp = cp + 1
  105.         pUnit:SetValue("TD_NextPoint", cp)
  106.         pUnit:SetUnitToFollow(cps[cp], 0, 0)
  107.     end
  108. end
  109.  
  110. function Mob_SpawnEventHandle(pUnit, Event)
  111.     pUnit:RegisterEvent("Mob_MoveAtRandom", 200, 1)
  112.     if pUnit:GetEntry() == 109921 then
  113.         pUnit:RegisterEvent("Boss2Visuals_Tower", 1000, 1)
  114.         for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  115.             plrs:CastSpell(50224) -- zombie vision
  116.         end
  117.     end
  118. end
  119.  
  120. function Mob_MoveAtRandom(pUnit)
  121.     pUnit:SetValue("TD_NextPoint", 1)
  122.     pUnit:SetValue("TD_IsFlying", false)
  123.     pUnit:SetCombatCapable(true)
  124.     pUnit:SetCombatTargetingCapable(true)
  125.     pUnit:AIDisableCombat(true)
  126.     pUnit:SetMovementFlags(1)
  127.     pUnit:SetUnitToFollow(runcoords2[1])
  128.     pUnit:RegisterEvent("Mob_PathFind", 500, 0)
  129. end
  130.  
  131. RegisterUnitEvent(17707, 18, "Mob_SpawnEventHandle")
  132. RegisterUnitEvent(34165, 18, "Mob_SpawnEventHandle")
  133. RegisterUnitEvent(135401, 18, "Mob_SpawnEventHandle")
  134. RegisterUnitEvent(70461, 18, "Mob_SpawnEventHandle")
  135. RegisterUnitEvent(109921, 18, "Mob_SpawnEventHandle")
  136.  
  137. function DiabloBosssDeath_Tower(pUnit, Event)
  138.     for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  139.         plrs:RemoveAura(50224) -- zombie vision
  140.     end
  141. end
  142.  
  143. RegisterUnitEvent(109921, 4, "DiabloBosssDeath_Tower")
  144.  
  145. function FlyingMob_SpawnEventHandle(pUnit, Event)
  146.     pUnit:RegisterEvent("FlyingMob_MoveAtRandom", 200, 1)
  147. end
  148.  
  149. function FlyingMob_MoveAtRandom(pUnit)
  150.     pUnit:SetValue("TD_NextPoint", 1)
  151.     pUnit:SetValue("TD_IsFlying", true)
  152.     pUnit:SetCombatCapable(true)
  153.     pUnit:SetCombatTargetingCapable(true)
  154.     pUnit:AIDisableCombat(true)
  155.     pUnit:SetMovementFlags(2)
  156.     pUnit:SetUnitToFollow(flyingcoords2[1])
  157.     pUnit:RegisterEvent("Mob_PathFind", 500, 0)
  158. end
  159.  
  160. RegisterUnitEvent(250081, 18, "FlyingMob_SpawnEventHandle")
  161. RegisterUnitEvent(101831, 18, "FlyingMob_SpawnEventHandle")
  162.  
  163. -- boss 2
  164.  
  165. function Boss2Visuals_Tower(pUnit)
  166.     local x = math.random(2815,2853)
  167.     local y = math.random(905,940)
  168.     pUnit:CastSpellAoF(x,y,0,57467)
  169.     pUnit:RegisterEvent("Boss2Visuals_Tower", math.random(100,1000), 1)
  170. end
  171.  
  172. local function CanAttack(pUnit, target)
  173.     local f1 = pUnit:GetValue("TD_target")
  174.     local f2 = target:GetValue("TD_IsFlying")
  175.     if (f2) then f2 = 2; else f2 = 1; end
  176.     if (f1 == 3 or f1 == f2) then
  177.         return true
  178.     end
  179.     return false
  180. end
  181. local function GetCreeps(pUnit, amt, distance)
  182.     if (not pUnit) then return {}; end
  183.     if (type(amt) ~= "number" or amt < 1) then amt = 1; end
  184.     local targets = {}
  185.     local i = 0
  186.     for _, unit in pairs (pUnit:GetInRangeUnits()) do
  187.         if (unit:GetEntry() == waveentry and unit:IsAlive() and
  188.          CanAttack(pUnit, unit) and unit:GetDistanceYards(pUnit) < distance) then
  189.             table.insert(targets, unit)
  190.             i = i + 1
  191.             if (i >= amt) then break; end
  192.         end
  193.     end
  194.     return targets
  195. end
  196. local function TowerDmg(pUnit, dmg)
  197.     if (dmg < pUnit:GetHealth()) then
  198.         pUnit:SetHealth(pUnit:GetHealth() - dmg)
  199.     else
  200.         pUnit:Kill(pUnit)
  201.     end
  202. end
  203.  
  204. -- Rock Tower
  205.  
  206. function TowerOnSpawn(pUnit, Event)
  207.     pUnit:SetValue("TD_target", 1)
  208.     pUnit:SetScale(0.15)
  209.     pUnit:RegisterEvent("Tower_DoDamage", 1500, 0)
  210. end
  211.  
  212. function Tower_DoDamage(pUnit)
  213.     for _, unit in pairs(GetCreeps(pUnit, 1, 8)) do
  214.         -- when facing units, it turns too fast to play visuals
  215.         --pUnit:SetPosition(pUnit:GetX(), pUnit:GetY(), pUnit:GetZ(), pUnit:CalcRadAngle(pUnit:GetX(), pUnit:GetY(), unit:GetX(), unit:GetY()))
  216.         TowerDmg(unit, math.random(2000, 4000))
  217.         pUnit:CastSpellOnTarget(55811, unit)
  218.     end
  219. end
  220.  
  221. RegisterUnitEvent(31229, 18, "TowerOnSpawn")
  222.  
  223. -- Upgrade Rock Tower
  224.  
  225. function TowerRock_Gossip(pUnit, event, player)
  226.     pUnit:GossipCreateMenu(1, player, 0)
  227.     pUnit:GossipMenuAddItem(4, "Rock Tower", 250, 0)
  228.     pUnit:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 250, 0)
  229.     if pUnit:GetDisplay() == 8811 then
  230.         pUnit:GossipMenuAddItem(4, "Upgrade to level 2 (0.5 seconds faster attack) (Costs 3)", 1, 0)
  231.     elseif pUnit:GetDisplay() == 1461 then
  232.         pUnit:GossipMenuAddItem(4, "Upgrade to level 3 (0.5 seconds faster attack) (Costs 3)", 2, 0)
  233.     end
  234.     pUnit:GossipMenuAddItem(0, "Nevermind.", 250, 0)
  235.     pUnit:GossipSendMenu(player)
  236. end
  237.  
  238.  
  239. function TowerRock_Click(pUnit, event, player, id, intid, code)
  240.     if intid == 1 then
  241.         if resources < 3 then
  242.             player:SendBroadcastMessage("Not enough resources!")
  243.         else
  244.             resources = resources - 3
  245.             pUnit:RemoveEvents()
  246.             pUnit:SetModel(1461)
  247.             pUnit:RegisterEvent("Tower_DoDamage", 1000, 0)
  248.         end
  249.     elseif intid == 2 then
  250.         if resources < 3 then
  251.             player:SendBroadcastMessage("Not enough resources!")
  252.         else
  253.             resources = resources - 3
  254.             pUnit:RemoveEvents()
  255.             pUnit:SetModel(1460)
  256.             pUnit:SetNPCFlags(2)
  257.             pUnit:SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)
  258.             pUnit:RegisterEvent("Tower_DoDamage", 500, 0)
  259.         end
  260.     end
  261.     player:GossipComplete()
  262. end
  263.  
  264. RegisterUnitGossipEvent(31229, 1, "TowerRock_Gossip")
  265. RegisterUnitGossipEvent(31229, 2, "TowerRock_Click")
  266.  
  267. -- Ice Tower
  268.  
  269. function IceTowerSpawn(pUnit, Event)
  270.     pUnit:SetValue("TD_target", 1)
  271.     pUnit:RegisterEvent("IceLance_Slow_Units", 2000, 0)
  272. end
  273.  
  274. function IceLance_Slow_Units(pUnit)
  275.     local creeps = {}
  276.     if (pUnit:HasAura(7742)) then creeps = GetCreeps(pUnit, 999, 8);
  277.     else creeps = GetCreeps(pUnit, 1, 8);
  278.     end
  279.     for _, unit in pairs(creeps) do
  280.         if (not pUnit:HasAura(7742)) then
  281.             pUnit:ChannelSpell(63676, unit)
  282.             pUnit:RegisterEvent("StopChannelIceTower", 1500, 1)
  283.         end
  284.         unit:CastSpell(26036) -- visual
  285.         unit:CastSpell(15571) -- daze
  286.         unit:SetValue("TD_SlowEffect", (os.clock() + 3))
  287.         unit:RegisterEvent("Remove_Slow_Effect_Self", 3000, 1)
  288.     end
  289. end
  290.  
  291. function StopChannelIceTower(pUnit)
  292.     pUnit:StopChannel()
  293. end
  294.  
  295. function Remove_Slow_Effect_Self(unit)
  296.     if (unit:GetValue("TD_SlowEffect") < os.clock()) then
  297.         unit:RemoveAura(26036)
  298.     end
  299. end
  300.  
  301. RegisterUnitEvent(116592, 18, "IceTowerSpawn")
  302.  
  303. -- Upgrade Ice Tower
  304.  
  305. function TowerIce_Gossip(pUnit, event, player)
  306.     pUnit:GossipCreateMenu(1, player, 0)
  307.     pUnit:GossipMenuAddItem(4, "Ice Tower", 250, 0)
  308.     pUnit:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 250, 0)
  309.     if not pUnit:HasAura(7742) then
  310.         pUnit:GossipMenuAddItem(4, "Upgrade to level 2 (Area of Effect) (Costs 10)", 1, 0)
  311.     end
  312.     pUnit:GossipMenuAddItem(0, "Nevermind.", 250, 0)
  313.     pUnit:GossipSendMenu(player)
  314. end
  315.  
  316.  
  317. function TowerIce_Click(pUnit, event, player, id, intid, code)
  318.     if intid == 1 then
  319.         if resources < 10 then
  320.             player:SendBroadcastMessage("Not enough resources!")
  321.         else
  322.             resources = resources - 10
  323.             pUnit:RemoveEvents()
  324.             pUnit:CastSpell(7742)
  325.             pUnit:StopChannel()
  326.             pUnit:SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)
  327.             pUnit:RegisterEvent("IceLance_Slow_Units", 1000, 0)
  328.         end
  329.     end
  330.     player:GossipComplete()
  331. end
  332.  
  333. RegisterUnitGossipEvent(116592, 1, "TowerIce_Gossip")
  334. RegisterUnitGossipEvent(116592, 2, "TowerIce_Click")
  335.  
  336. -- Fire tower
  337.  
  338. function FireTower_Spawn(pUnit, Event)
  339.     pUnit:SetValue("TD_target", 1)
  340.     pUnit:RegisterEvent("FireTower_Damage", 5000, 0)
  341. end
  342.  
  343. function FireTower_Damage(pUnit)
  344.     local targets = pUnit:GetValue("TD_FireTargets")
  345.     for k, unit in pairs(GetCreeps(pUnit, targets, 16)) do
  346.         if (k == 1) then pUnit:Emote(37, 800); end
  347.         local x, y, z = pUnit:GetLocation()
  348.         pUnit:SetPosition(x, y, z, pUnit:CalcRadAngle(x, y, unit:GetX(), unit:GetY()))
  349.         TowerDmg(unit, math.random(10000, 30000))
  350.         pUnit:CastSpellOnTarget(74420, unit)
  351.     end
  352. end
  353.  
  354. RegisterUnitEvent(140512, 18, "FireTower_Spawn")
  355.  
  356. -- Fire tower upgrade
  357.  
  358. function TowerFire_Gossip(pUnit, event, player)
  359.     pUnit:GossipCreateMenu(1, player, 0)
  360.     pUnit:GossipMenuAddItem(4, "Fire Tower", 250, 0)
  361.     pUnit:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 250, 0)
  362.     if not pUnit:HasAura(36006) then
  363.         pUnit:GossipMenuAddItem(4, "Upgrade to level 2 (Hits 2 targets) (Costs 10)", 1, 0)
  364.     end
  365.     pUnit:GossipMenuAddItem(0, "Nevermind.", 250, 0)
  366.     pUnit:GossipSendMenu(player)
  367. end
  368.  
  369.  
  370. function TowerFire_Click(pUnit, event, player, id, intid, code)
  371.     if intid == 1 then
  372.         if resources < 10 then
  373.             player:SendBroadcastMessage("Not enough resources!")
  374.         else
  375.             resources = resources - 10
  376.             pUnit:CastSpell(36006)
  377.             pUnit:SetScale(1.2)
  378.             pUnit:SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)
  379.             pUnit:SetValue("TD_FireTargets", 2)
  380.         end
  381.     end
  382.     player:GossipComplete()
  383. end
  384.  
  385. RegisterUnitGossipEvent(140512, 1, "TowerFire_Gossip")
  386. RegisterUnitGossipEvent(140512, 2, "TowerFire_Click")
  387.  
  388. -- Anti-Air Tower
  389.  
  390. function AntiAirTowerSpawn(pUnit, Event)
  391.     pUnit:RegisterEvent("AntiAirTowerShoot", 1500, 0)
  392. end
  393.  
  394. function AntiAirTowerShoot(pUnit)
  395.     for _, unit in pairs(GetCreeps(pUnit, 1, 15)) do
  396.         local x, y, z = pUnit:GetLocation()
  397.         pUnit:SetPosition(x, y, z, pUnit:CalcRadAngle(x, y, unit:GetX(), unit:GetY()))
  398.         TowerDmg(unit, math.random(10, 20))
  399.         pUnit:CastSpellOnTarget(61647, unit) -- shoot bow
  400.     end
  401. end
  402.  
  403. RegisterUnitEvent(485211, 18, "AntiAirTowerSpawn")
  404.  
  405. -- Anti-Air Tower Upgrade
  406.  
  407. function TowerAir_Gossip(pUnit, event, player)
  408.     pUnit:GossipCreateMenu(1, player, 0)
  409.     pUnit:GossipMenuAddItem(4, "Anti-Air Tower", 250, 0)
  410.     pUnit:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 250, 0)
  411.     if pUnit:GetDisplay() == 4852 then
  412.         pUnit:GossipMenuAddItem(4, "Upgrade to level 2 (0.5 seconds faster attack) (Costs 3)", 1, 0)
  413.     elseif pUnit:GetDisplay() == 4851 then
  414.         pUnit:GossipMenuAddItem(4, "Upgrade to level 3 (0.5 seconds faster attack) (Costs 3)", 2, 0)
  415.     end
  416.     pUnit:GossipMenuAddItem(0, "Nevermind.", 250, 0)
  417.     pUnit:GossipSendMenu(player)
  418. end
  419.  
  420.  
  421. function TowerAir_Click(pUnit, event, player, id, intid, code)
  422.     if intid == 1 then
  423.         if resources < 3 then
  424.             player:SendBroadcastMessage("Not enough resources!")
  425.         else
  426.             resources = resources - 3
  427.             pUnit:RemoveEvents()
  428.             pUnit:SetModel(4851)
  429.             pUnit:RegisterEvent("AntiAirTowerShoot", 1000, 0)
  430.         end
  431.     elseif intid == 2 then
  432.         if resources < 3 then
  433.             player:SendBroadcastMessage("Not enough resources!")
  434.         else
  435.             resources = resources - 3
  436.             pUnit:RemoveEvents()
  437.             pUnit:SetModel(4849)
  438.             pUnit:SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)
  439.             pUnit:RegisterEvent("AntiAirTowerShoot", 500, 0)
  440.         end
  441.     end
  442.     player:GossipComplete()
  443. end
  444.  
  445. RegisterUnitGossipEvent(485211, 1, "TowerAir_Gossip")
  446. RegisterUnitGossipEvent(485211, 2, "TowerAir_Click")
  447.  
  448. -- Gossip
  449.  
  450. function towerdefenseclick(item, event, player)
  451.     showmenutowerdefense(item, player)
  452. end
  453.  
  454. function showmenutowerdefense(item, player)
  455.     item:GossipCreateMenu(1, player, 0)
  456.     if not running then
  457.         item:GossipMenuAddItem(4, "|cff3060B5Start The Event.|r", 5, 0)
  458.     else
  459.         item:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 98, 0)
  460.         if not waverunning then
  461.             item:GossipMenuAddItem(4, "Start wave "..tostring(wavenum)..".", 7, 0)
  462.         end
  463.         item:GossipMenuAddItem(4, "Spawn a Rock Tower at the nearest block (Cost 10).", 8, 0)
  464.         if wavenum > 1 then
  465.             item:GossipMenuAddItem(4, "Spawn a Ice Tower at the nearest block (Cost 10).", 10, 0)
  466.         end
  467.         if wavenum > 4 then
  468.             item:GossipMenuAddItem(4, "Spawn a Fire Tower at the nearest block (Cost 15).", 9, 0)
  469.         end
  470.         if wavenum > 6 then
  471.             item:GossipMenuAddItem(4, "Spawn a Anti-Air Tower at the nearest block (Cost 5).", 11, 0)
  472.         end
  473.         item:GossipMenuAddItem(4, "Exit The Event.", 6, 0)
  474.     end
  475.     item:GossipMenuAddItem(0, "Nevermind.", 99, 0)
  476.     item:GossipSendMenu(player)
  477. end
  478.  
  479. function showconfirmed(item, player)
  480.     item:GossipCreateMenu(1, player, 0)
  481.     if running then
  482.         item:GossipMenuAddItem(4, "Spawned Tower!", 98, 0)
  483.         item:GossipMenuAddItem(4, "Return to main menu.", 98, 0)
  484.     end
  485.     item:GossipSendMenu(player)
  486. end
  487.  
  488. function SpawnWaveCreature()
  489.     FuckingPlayer:SpawnCreature(waveentry, 2846.7, 901.96, 0, 1.561545, 35, 0)
  490. end
  491. local function CanPlaceTower(object)
  492.     local x, y, z = object:GetLocation()
  493.     for _, units in pairs(object:GetInRangeUnits()) do
  494.         if (units:GetObjectType() ~= "Player" and units:CalcToDistance(x, y, z) < 0.6) then
  495.             return false
  496.         end
  497.     end
  498.     return true
  499. end
  500.  
  501. function towerdefesneselect(item, event, player, id, intid, code)
  502.     if intid == 5 then
  503.         shieldvalue = 100
  504.         resources = 20
  505.         running = true
  506.         player:SendBroadcastMessage("The event has started, you can now place towers.")
  507.         UpdateWorldstatesUI(player)
  508.         UpdateAttempts(player, shieldvalue)
  509.         showmenutowerdefense(item, player)
  510.         Fill_runcoords2(player)
  511.         Fill_flyingcoords2(player)
  512.     elseif intid == 6 then
  513.         wavenum = 1
  514.         resources = 0
  515.         shieldvalue = 0
  516.         running = false
  517.         waverunning = false
  518.         for _,unit in pairs(player:GetInRangeUnits()) do
  519.             if unit:GetEntry() ~= 32298 then
  520.                 unit:RemoveEvents()
  521.                 unit:Despawn(1,0)
  522.             end
  523.         end
  524.         for _, plr in pairs(player:GetInRangePlayers()) do
  525.             ResetWorldstatesUI(plr)
  526.         end
  527.         player:GossipComplete()
  528.     elseif intid == 7 then
  529.         if not waverunning then
  530.             waverunning = true
  531.             local wavenum2 = wavenum
  532.             local mult = 1
  533.             if (wavenum2 >= #WaveList) then
  534.                 wavenum2 = #WaveList
  535.                 mult = wavenum
  536.             end
  537.             waveentry = WaveList[wavenum2][1]
  538.             upvalue = WaveList[wavenum2][2]
  539.             local numSpawns = math.floor(WaveList[wavenum2][3] * mult)
  540.             creepsLeft = numSpawns
  541.             FuckingPlayer = player
  542.             for i = 1, numSpawns do
  543.                 CreateLuaEvent(SpawnWaveCreature, (350 * i), 1)
  544.             end    
  545.         end
  546.         player:GossipComplete()
  547.     elseif intid == 8 then
  548.         local object = player:GetGameObjectNearestCoords(player:GetX(), player:GetY(), player:GetZ(), 185301)
  549.         if (object == nil or player:CalcToDistance(object:GetLocation()) > 1.5) then
  550.             player:SendBroadcastMessage("No nearby block found!")
  551.             showmenutowerdefense(item, player)
  552.         elseif (CanPlaceTower(object)) then
  553.             if resources > 9 then
  554.                 resources = resources - 10
  555.                 player:SpawnCreature(31229, object:GetX(), object:GetY(), object:GetZ()+0.5, 0, 35, 0)
  556.                 showconfirmed(item, player)
  557.             else
  558.                 player:SendBroadcastMessage("Not enough resources!")
  559.                 showmenutowerdefense(item, player)
  560.             end
  561.         else
  562.             player:SendBroadcastMessage("Another tower is too close.")
  563.             showmenutowerdefense(item, player) 
  564.         end
  565.     elseif intid == 9 then
  566.         local object = player:GetGameObjectNearestCoords(player:GetX(), player:GetY(), player:GetZ(), 185301)
  567.         if (object == nil or player:CalcToDistance(object:GetLocation()) > 1.5) then
  568.             player:SendBroadcastMessage("No nearby block found!")
  569.             showmenutowerdefense(item, player)
  570.         elseif (CanPlaceTower(object)) then
  571.             if resources > 14 then
  572.                 resources = resources - 15
  573.                 player:SpawnCreature(140512, object:GetX(), object:GetY(), object:GetZ()+0.5, 0, 35, 0)
  574.                 showconfirmed(item, player)
  575.             else
  576.                 player:SendBroadcastMessage("Not enough resources!")
  577.                 showmenutowerdefense(item, player)
  578.             end
  579.         else
  580.             player:SendBroadcastMessage("Another tower is too close.")
  581.             showmenutowerdefense(item, player) 
  582.         end
  583.     elseif intid == 10 then
  584.         local object = player:GetGameObjectNearestCoords(player:GetX(), player:GetY(), player:GetZ(), 185301)
  585.         if (object == nil or player:CalcToDistance(object:GetLocation()) > 1.5) then
  586.             player:SendBroadcastMessage("No nearby block found!")
  587.             showmenutowerdefense(item, player)
  588.         elseif (CanPlaceTower(object)) then
  589.             if resources > 9 then
  590.                 resources = resources - 10
  591.                 player:SpawnCreature(116592, object:GetX(), object:GetY(), object:GetZ()+0.5, 0, 35, 0)
  592.                 showconfirmed(item, player)
  593.             else
  594.                 player:SendBroadcastMessage("Not enough resources!")
  595.                 showmenutowerdefense(item, player)
  596.             end
  597.         else
  598.             player:SendBroadcastMessage("Another tower is too close.")
  599.             showmenutowerdefense(item, player) 
  600.         end
  601.     elseif intid == 11 then
  602.         local object = player:GetGameObjectNearestCoords(player:GetX(), player:GetY(), player:GetZ(), 185301)
  603.         if (object == nil or player:CalcToDistance(object:GetLocation()) > 1.5) then
  604.             player:SendBroadcastMessage("No nearby block found!")
  605.             showmenutowerdefense(item, player)
  606.         elseif (CanPlaceTower(object)) then
  607.             if resources > 4 then
  608.                 resources = resources - 5
  609.                 player:SpawnCreature(485211, object:GetX(), object:GetY(), object:GetZ()+0.5, 0, 35, 0, 0, 0, 44643):SetUInt32Value(UNIT_FIELD_BYTES_2, 2)
  610.                 showconfirmed(item, player)
  611.             else
  612.                 player:SendBroadcastMessage("Not enough resources!")
  613.                 showmenutowerdefense(item, player)
  614.             end
  615.         else
  616.             player:SendBroadcastMessage("Another tower is too close.")
  617.             showmenutowerdefense(item, player) 
  618.         end
  619.     elseif intid == 98 then
  620.         showmenutowerdefense(item, player)
  621.     elseif intid == 99 then
  622.         player:GossipComplete()
  623.     end
  624. end
  625.  
  626. RegisterItemGossipEvent(57061, 1, "towerdefenseclick")
  627. RegisterItemGossipEvent(57061, 2, "towerdefesneselect")
  628.  
  629. -- Handle win/lose
  630.  
  631. function DummyHandlerSpawn_TowerDefense(pUnit, Event)
  632.     pUnit:RegisterEvent("CheckForStatusChange_TowerDefense", 2000, 0)
  633. end
  634.  
  635. function CheckForStatusChange_TowerDefense(pUnit)
  636.     if waverunning then
  637.         if shieldvalue == 0 then
  638.             pUnit:SendChatMessage(42,0,"You have lost!")
  639.             for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  640.                 ResetWorldstatesUI(plrs)
  641.             end
  642.             for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  643.                 towerdefesneselect(nil, nil, plrs, nil, 6, nil)
  644.                 break
  645.             end
  646.             waverunning = false
  647.         end
  648.         for _,unit in pairs(pUnit:GetInRangeUnits()) do
  649.             if unit:GetEntry() == waveentry then
  650.                 if not unit:IsAlive() then
  651.                     creepsLeft = creepsLeft - 1
  652.                     unit:RemoveEvents()
  653.                     unit:Despawn(1500,0)
  654.                     resources = resources + upvalue
  655.                 end
  656.             end
  657.         end
  658.         if creepsLeft == 0 then
  659.             waverunning = false
  660.             for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  661.                 UpdateWorldstatesUI(plrs)
  662.                 UpdateAttempts(plrs, shieldvalue)
  663.             end
  664.             pUnit:SendChatMessage(42,0,"End of wave "..tostring(wavenum).."!")
  665.             if wavenum == 15 then
  666.                 for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  667.                     if plrs:HasAura(50224) then
  668.                         plrs:RemoveAura(50224) -- zombie vision
  669.                     end
  670.                 end
  671.             end
  672.             wavenum = wavenum + 1
  673.         end
  674.     end
  675. end
  676.  
  677. RegisterUnitEvent(32298, 18, "DummyHandlerSpawn_TowerDefense")
  678.  
  679. -- Handle the worldstates
  680.  
  681. function UpdateWorldstatesUI(plrs)
  682.     local pack = LuaPacket:CreatePacket(SMSG_INIT_WORLD_STATES, 18)
  683.     pack:WriteULong(608) -- Map
  684.     pack:WriteULong(0) -- Zone
  685.     pack:WriteULong(0)
  686.     pack:WriteUShort(1)
  687.     pack:WriteULong(3816) -- ID
  688.     pack:WriteULong(1) -- Value
  689.     plrs:SendPacketToPlayer(pack)
  690. end
  691.  
  692. function UpdateAttempts(plrs, value)
  693.     local pack = LuaPacket:CreatePacket(SMSG_UPDATE_WORLD_STATE, 8)
  694.     pack:WriteULong(3815) -- ID, X
  695.     pack:WriteULong(value) -- Value
  696.     plrs:SendPacketToPlayer(pack)
  697. end
  698.  
  699. function ResetWorldstatesUI(plrs)
  700.     local pack = LuaPacket:CreatePacket(SMSG_INIT_WORLD_STATES, 18)
  701.     pack:WriteULong(0) -- Map
  702.     pack:WriteULong(0) -- Zone
  703.     pack:WriteULong(0)
  704.     pack:WriteUShort(0)
  705.     pack:WriteULong(0) -- ID
  706.     pack:WriteULong(0) -- Value
  707.     plrs:SendPacketToPlayer(pack)
  708. end
  709.  
  710. --
Advertisement
Add Comment
Please, Sign In to add comment