stoneharry

Untitled

May 18th, 2012
679
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 23.01 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. -- Rock Tower
  173.  
  174. function TowerOnSpawn(pUnit, Event)
  175.     pUnit:SetScale(0.15)
  176.     pUnit:RegisterEvent("Tower_DoDamage", 1500, 0)
  177. end
  178.  
  179. function Tower_DoDamage(pUnit)
  180.     for _,unit in pairs(pUnit:GetInRangeUnits()) do
  181.         if unit:GetEntry() == waveentry and unit:IsAlive() and unit:GetValue("TD_IsFlying") == false then
  182.             if unit:GetDistanceYards(pUnit) < 8 then
  183.                 -- when facing units, it turns too fast to play visuals
  184.                 --pUnit:SetPosition(pUnit:GetX(), pUnit:GetY(), pUnit:GetZ(), pUnit:CalcRadAngle(pUnit:GetX(), pUnit:GetY(), unit:GetX(), unit:GetY()))
  185.                 local dmg = math.random(2000, 4000)
  186.                 if (dmg < unit:GetHealth()) then
  187.                     unit:SetHealth(unit:GetHealth() - dmg)
  188.                 else
  189.                     unit:Kill(unit)
  190.                 end
  191.                 pUnit:CastSpellOnTarget(55811, unit)
  192.                 break
  193.             end
  194.         end
  195.     end
  196. end
  197.  
  198. RegisterUnitEvent(31229, 18, "TowerOnSpawn")
  199.  
  200. -- Upgrade Rock Tower
  201.  
  202. function TowerRock_Gossip(pUnit, event, player)
  203.     pUnit:GossipCreateMenu(1, player, 0)
  204.     pUnit:GossipMenuAddItem(4, "Rock Tower", 250, 0)
  205.     pUnit:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 250, 0)
  206.     if pUnit:GetDisplay() == 8811 then
  207.         pUnit:GossipMenuAddItem(4, "Upgrade to level 2 (0.5 seconds faster attack) (Costs 3)", 1, 0)
  208.     elseif pUnit:GetDisplay() == 1461 then
  209.         pUnit:GossipMenuAddItem(4, "Upgrade to level 3 (0.5 seconds faster attack) (Costs 3)", 2, 0)
  210.     end
  211.     pUnit:GossipMenuAddItem(0, "Nevermind.", 250, 0)
  212.     pUnit:GossipSendMenu(player)
  213. end
  214.  
  215.  
  216. function TowerRock_Click(pUnit, event, player, id, intid, code)
  217.     if intid == 1 then
  218.         if resources < 3 then
  219.             player:SendBroadcastMessage("Not enough resources!")
  220.         else
  221.             resources = resources - 3
  222.             pUnit:RemoveEvents()
  223.             pUnit:SetModel(1461)
  224.             pUnit:RegisterEvent("Tower_DoDamage", 1000, 0)
  225.         end
  226.     elseif intid == 2 then
  227.         if resources < 3 then
  228.             player:SendBroadcastMessage("Not enough resources!")
  229.         else
  230.             resources = resources - 3
  231.             pUnit:RemoveEvents()
  232.             pUnit:SetModel(1460)
  233.             pUnit:SetNPCFlags(2)
  234.             pUnit:SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)
  235.             pUnit:RegisterEvent("Tower_DoDamage", 500, 0)
  236.         end
  237.     end
  238.     player:GossipComplete()
  239. end
  240.  
  241. RegisterUnitGossipEvent(31229, 1, "TowerRock_Gossip")
  242. RegisterUnitGossipEvent(31229, 2, "TowerRock_Click")
  243.  
  244. -- Ice Tower
  245.  
  246. function IceTowerSpawn(pUnit, Event)
  247.     pUnit:RegisterEvent("IceLance_Slow_Units", 2000, 0)
  248. end
  249.  
  250. function IceLance_Slow_Units(pUnit)
  251.     for _,unit in pairs(pUnit:GetInRangeUnits()) do
  252.         if unit:GetEntry() == waveentry and unit:IsAlive() and unit:GetValue("TD_IsFlying") == false then
  253.             if unit:GetDistanceYards(pUnit) < 8 then
  254.                 if not unit:HasAura(26036) then
  255.                     pUnit:ChannelSpell(63676, unit)
  256.                     pUnit:RegisterEvent("StopChannelIceTower", 1500, 1)
  257.                     unit:CastSpell(26036) -- visual
  258.                     unit:CastSpell(15571) -- daze
  259.                     unit:RegisterEvent("Remove_Slow_Effect_Self", 3000, 1)
  260.                     break
  261.                 end
  262.             end
  263.         end
  264.     end
  265. end
  266.  
  267. function IceTower_AoE(pUnit)
  268.     for _,unit in pairs(pUnit:GetInRangeUnits()) do
  269.         if unit:GetEntry() == waveentry and unit:IsAlive() and unit:GetValue("TD_IsFlying") == false then
  270.             if unit:GetDistanceYards(pUnit) < 8 then
  271.                 if not unit:HasAura(26036) then
  272.                     unit:CastSpell(26036) -- visual
  273.                     unit:CastSpell(15571) -- daze
  274.                     unit:RegisterEvent("Remove_Slow_Effect_Self", 3000, 1)
  275.                 end
  276.             end
  277.         end
  278.     end
  279. end
  280.  
  281. function StopChannelIceTower(pUnit)
  282.     pUnit:StopChannel()
  283. end
  284.  
  285. function Remove_Slow_Effect_Self(unit)
  286.     unit:RemoveAura(26036)
  287. end
  288.  
  289. RegisterUnitEvent(116592, 18, "IceTowerSpawn")
  290.  
  291. -- Upgrade Ice Tower
  292.  
  293. function TowerIce_Gossip(pUnit, event, player)
  294.     pUnit:GossipCreateMenu(1, player, 0)
  295.     pUnit:GossipMenuAddItem(4, "Ice Tower", 250, 0)
  296.     pUnit:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 250, 0)
  297.     if not pUnit:HasAura(7742) then
  298.         pUnit:GossipMenuAddItem(4, "Upgrade to level 2 (Area of Effect) (Costs 10)", 1, 0)
  299.     end
  300.     pUnit:GossipMenuAddItem(0, "Nevermind.", 250, 0)
  301.     pUnit:GossipSendMenu(player)
  302. end
  303.  
  304.  
  305. function TowerIce_Click(pUnit, event, player, id, intid, code)
  306.     if intid == 1 then
  307.         if resources < 10 then
  308.             player:SendBroadcastMessage("Not enough resources!")
  309.         else
  310.             resources = resources - 10
  311.             pUnit:RemoveEvents()
  312.             pUnit:CastSpell(7742)
  313.             pUnit:StopChannel()
  314.             pUnit:SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)
  315.             pUnit:RegisterEvent("IceTower_AoE", 1000, 0)
  316.         end
  317.     end
  318.     player:GossipComplete()
  319. end
  320.  
  321. RegisterUnitGossipEvent(116592, 1, "TowerIce_Gossip")
  322. RegisterUnitGossipEvent(116592, 2, "TowerIce_Click")
  323.  
  324. -- Fire tower
  325.  
  326. function FireTower_Spawn(pUnit, Event)
  327.     pUnit:RegisterEvent("FireTower_Damage", 5000, 0)
  328. end
  329.  
  330. function FireTower_Damage(pUnit)
  331.     for _,unit in pairs(pUnit:GetInRangeUnits()) do
  332.         if unit:GetEntry() == waveentry and unit:IsAlive() and unit:GetValue("TD_IsFlying") == false then
  333.             if unit:GetDistanceYards(pUnit) < 16 then
  334.                 pUnit:Emote(37, 800)
  335.                 pUnit:SetPosition(pUnit:GetX(), pUnit:GetY(), pUnit:GetZ(), pUnit:CalcRadAngle(pUnit:GetX(), pUnit:GetY(), unit:GetX(), unit:GetY()))
  336.                 local dmg = math.random(10000, 30000)
  337.                 if (dmg < unit:GetHealth()) then
  338.                     unit:SetHealth(unit:GetHealth() - dmg)
  339.                 else
  340.                     unit:Kill(unit)
  341.                 end
  342.                 pUnit:CastSpellOnTarget(74420, unit)
  343.                 break
  344.             end
  345.         end
  346.     end
  347. end
  348.  
  349. function FireTower_DamageTwo(pUnit)
  350.     local i = 0
  351.     for _,unit in pairs(pUnit:GetInRangeUnits()) do
  352.         if unit:GetEntry() == waveentry and unit:IsAlive() and unit:GetValue("TD_IsFlying") == false then
  353.             if unit:GetDistanceYards(pUnit) < 16 then
  354.                 pUnit:SetPosition(pUnit:GetX(), pUnit:GetY(), pUnit:GetZ(), pUnit:CalcRadAngle(pUnit:GetX(), pUnit:GetY(), unit:GetX(), unit:GetY()))
  355.                 local dmg = math.random(10000, 30000)
  356.                 if (dmg < unit:GetHealth()) then
  357.                     unit:SetHealth(unit:GetHealth() - dmg)
  358.                 else
  359.                     unit:Kill(unit)
  360.                 end
  361.                 pUnit:CastSpellOnTarget(74420, unit)
  362.                 i = i + 1
  363.                 if i == 2 then
  364.                     pUnit:Emote(37, 800)
  365.                     break
  366.                 end
  367.             end
  368.         end
  369.     end
  370. end
  371.  
  372. RegisterUnitEvent(140512, 18, "FireTower_Spawn")
  373.  
  374. -- Fire tower upgrade
  375.  
  376. function TowerFire_Gossip(pUnit, event, player)
  377.     pUnit:GossipCreateMenu(1, player, 0)
  378.     pUnit:GossipMenuAddItem(4, "Fire Tower", 250, 0)
  379.     pUnit:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 250, 0)
  380.     if not pUnit:HasAura(36006) then
  381.         pUnit:GossipMenuAddItem(4, "Upgrade to level 2 (Hits 2 targets) (Costs 10)", 1, 0)
  382.     end
  383.     pUnit:GossipMenuAddItem(0, "Nevermind.", 250, 0)
  384.     pUnit:GossipSendMenu(player)
  385. end
  386.  
  387.  
  388. function TowerFire_Click(pUnit, event, player, id, intid, code)
  389.     if intid == 1 then
  390.         if resources < 10 then
  391.             player:SendBroadcastMessage("Not enough resources!")
  392.         else
  393.             resources = resources - 10
  394.             pUnit:RemoveEvents()
  395.             pUnit:CastSpell(36006)
  396.             pUnit:SetScale(1.2)
  397.             pUnit:SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)
  398.             pUnit:RegisterEvent("FireTower_DamageTwo", 5000, 0)
  399.         end
  400.     end
  401.     player:GossipComplete()
  402. end
  403.  
  404. RegisterUnitGossipEvent(140512, 1, "TowerFire_Gossip")
  405. RegisterUnitGossipEvent(140512, 2, "TowerFire_Click")
  406.  
  407. -- Anti-Air Tower
  408.  
  409. function AntiAirTowerSpawn(pUnit, Event)
  410.     pUnit:RegisterEvent("AntiAirTowerShoot", 1500, 0)
  411. end
  412.  
  413. function AntiAirTowerShoot(pUnit)
  414.     for _,unit in pairs(pUnit:GetInRangeUnits()) do
  415.         if unit:GetEntry() == waveentry and unit:IsAlive() and unit:GetValue("TD_IsFlying") == true then
  416.             if unit:GetDistanceYards(pUnit) < 15 then
  417.                 pUnit:SetPosition(pUnit:GetX(), pUnit:GetY(), pUnit:GetZ(), pUnit:CalcRadAngle(pUnit:GetX(), pUnit:GetY(), unit:GetX(), unit:GetY()))
  418.                 local dmg = math.random(10, 20)
  419.                 if (dmg < unit:GetHealth()) then
  420.                     unit:SetHealth(unit:GetHealth() - dmg)
  421.                 else
  422.                     unit:Kill(unit)
  423.                 end
  424.                 pUnit:CastSpellOnTarget(61647, unit) -- shoot bow
  425.                 break
  426.             end
  427.         end
  428.     end
  429. end
  430.  
  431. RegisterUnitEvent(485211, 18, "AntiAirTowerSpawn")
  432.  
  433. -- Anti-Air Tower Upgrade
  434.  
  435. function TowerAir_Gossip(pUnit, event, player)
  436.     pUnit:GossipCreateMenu(1, player, 0)
  437.     pUnit:GossipMenuAddItem(4, "Anti-Air Tower", 250, 0)
  438.     pUnit:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 250, 0)
  439.     if pUnit:GetDisplay() == 4852 then
  440.         pUnit:GossipMenuAddItem(4, "Upgrade to level 2 (0.5 seconds faster attack) (Costs 3)", 1, 0)
  441.     elseif pUnit:GetDisplay() == 4851 then
  442.         pUnit:GossipMenuAddItem(4, "Upgrade to level 3 (0.5 seconds faster attack) (Costs 3)", 2, 0)
  443.     end
  444.     pUnit:GossipMenuAddItem(0, "Nevermind.", 250, 0)
  445.     pUnit:GossipSendMenu(player)
  446. end
  447.  
  448.  
  449. function TowerAir_Click(pUnit, event, player, id, intid, code)
  450.     if intid == 1 then
  451.         if resources < 3 then
  452.             player:SendBroadcastMessage("Not enough resources!")
  453.         else
  454.             resources = resources - 3
  455.             pUnit:RemoveEvents()
  456.             pUnit:SetModel(4851)
  457.             pUnit:RegisterEvent("AntiAirTowerShoot", 1000, 0)
  458.         end
  459.     elseif intid == 2 then
  460.         if resources < 3 then
  461.             player:SendBroadcastMessage("Not enough resources!")
  462.         else
  463.             resources = resources - 3
  464.             pUnit:RemoveEvents()
  465.             pUnit:SetModel(4849)
  466.             pUnit:SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)
  467.             pUnit:RegisterEvent("AntiAirTowerShoot", 500, 0)
  468.         end
  469.     end
  470.     player:GossipComplete()
  471. end
  472.  
  473. RegisterUnitGossipEvent(485211, 1, "TowerAir_Gossip")
  474. RegisterUnitGossipEvent(485211, 2, "TowerAir_Click")
  475.  
  476. -- Gossip
  477.  
  478. function towerdefenseclick(item, event, player)
  479.     showmenutowerdefense(item, player)
  480. end
  481.  
  482. function showmenutowerdefense(item, player)
  483.     item:GossipCreateMenu(1, player, 0)
  484.     if not running then
  485.         item:GossipMenuAddItem(4, "|cff3060B5Start The Event.|r", 5, 0)
  486.     else
  487.         item:GossipMenuAddItem(4, "You have "..tostring(resources).." resources.", 98, 0)
  488.         if not waverunning then
  489.             item:GossipMenuAddItem(4, "Start wave "..tostring(wavenum)..".", 7, 0)
  490.         end
  491.         item:GossipMenuAddItem(4, "Spawn a Rock Tower at the nearest block (Cost 10).", 8, 0)
  492.         if wavenum > 1 then
  493.             item:GossipMenuAddItem(4, "Spawn a Ice Tower at the nearest block (Cost 10).", 10, 0)
  494.         end
  495.         if wavenum > 4 then
  496.             item:GossipMenuAddItem(4, "Spawn a Fire Tower at the nearest block (Cost 15).", 9, 0)
  497.         end
  498.         if wavenum > 6 then
  499.             item:GossipMenuAddItem(4, "Spawn a Anti-Air Tower at the nearest block (Cost 5).", 11, 0)
  500.         end
  501.         item:GossipMenuAddItem(4, "Exit The Event.", 6, 0)
  502.     end
  503.     item:GossipMenuAddItem(0, "Nevermind.", 99, 0)
  504.     item:GossipSendMenu(player)
  505. end
  506.  
  507. function showconfirmed(item, player)
  508.     item:GossipCreateMenu(1, player, 0)
  509.     if running then
  510.         item:GossipMenuAddItem(4, "Spawned Tower!", 98, 0)
  511.         item:GossipMenuAddItem(4, "Return to main menu.", 98, 0)
  512.     end
  513.     item:GossipSendMenu(player)
  514. end
  515.  
  516. function SpawnWaveCreature()
  517.     FuckingPlayer:SpawnCreature(waveentry, 2846.7, 901.96, 0, 1.561545, 35, 0)
  518. end
  519.  
  520. function towerdefesneselect(item, event, player, id, intid, code)
  521.     if intid == 5 then
  522.         shieldvalue = 100
  523.         resources = 20
  524.         running = true
  525.         player:SendBroadcastMessage("The event has started, you can now place towers.")
  526.         UpdateWorldstatesUI(player)
  527.         UpdateAttempts(player, shieldvalue)
  528.         showmenutowerdefense(item, player)
  529.         Fill_runcoords2(player)
  530.         Fill_flyingcoords2(player)
  531.     elseif intid == 6 then
  532.         wavenum = 1
  533.         resources = 0
  534.         shieldvalue = 0
  535.         running = false
  536.         waverunning = false
  537.         for _,unit in pairs(player:GetInRangeUnits()) do
  538.             if unit:GetEntry() ~= 32298 then
  539.                 unit:RemoveEvents()
  540.                 unit:Despawn(1,0)
  541.             end
  542.         end
  543.         for _, plr in pairs(player:GetInRangePlayers()) do
  544.             ResetWorldstatesUI(plr)
  545.         end
  546.         player:GossipComplete()
  547.     elseif intid == 7 then
  548.         if not waverunning then
  549.             waverunning = true
  550.             local wavenum2 = wavenum
  551.             local mult = 1
  552.             if (wavenum2 >= #WaveList) then
  553.                 wavenum2 = #WaveList
  554.                 mult = wavenum
  555.             end
  556.             waveentry = WaveList[wavenum2][1]
  557.             upvalue = WaveList[wavenum2][2]
  558.             local numSpawns = math.floor(WaveList[wavenum2][3] * mult)
  559.             creepsLeft = numSpawns
  560.             FuckingPlayer = player
  561.             for i = 1, numSpawns do
  562.                 CreateLuaEvent(SpawnWaveCreature, (350 * i), 1)
  563.             end    
  564.         end
  565.         player:GossipComplete()
  566.     elseif intid == 8 then
  567.         local object = player:GetGameObjectNearestCoords(player:GetX(), player:GetY(), player:GetZ(), 185301)
  568.         if object == nil then
  569.             player:SendBroadcastMessage("No nearby block found!")
  570.             showmenutowerdefense(item, player)
  571.         else
  572.             local found = false
  573.             for _,units in pairs(player:GetInRangeUnits()) do
  574.                 if units:GetObjectType() ~= "Player" and units:CalcToDistance(object:GetX(), object:GetY(), object:GetZ()) < 2 then
  575.                     found = true
  576.                 end
  577.             end
  578.             if found then
  579.                 player:SendBroadcastMessage("Another tower is too close.")
  580.                 showmenutowerdefense(item, player)         
  581.             else
  582.                 if resources > 9 then
  583.                     resources = resources - 10
  584.                     player:SpawnCreature(31229, object:GetX(), object:GetY(), object:GetZ()+0.5, 0, 35, 0)
  585.                     showconfirmed(item, player)
  586.                 else
  587.                     player:SendBroadcastMessage("Not enough resources!")
  588.                     showmenutowerdefense(item, player)
  589.                 end
  590.             end
  591.         end
  592.     elseif intid == 9 then
  593.         local object = player:GetGameObjectNearestCoords(player:GetX(), player:GetY(), player:GetZ(), 185301)
  594.         if object == nil then
  595.             player:SendBroadcastMessage("No nearby block found!")
  596.             showmenutowerdefense(item, player)
  597.         else
  598.             local found = false
  599.             for _,units in pairs(player:GetInRangeUnits()) do
  600.                 if units:CalcToDistance(object:GetX(), object:GetY(), object:GetZ()) < 2 then
  601.                     found = true
  602.                 end
  603.             end
  604.             if found then
  605.                 player:SendBroadcastMessage("Another tower is too close.")
  606.                 showmenutowerdefense(item, player)         
  607.             else
  608.                 if resources > 14 then
  609.                     resources = resources - 15
  610.                     player:SpawnCreature(140512, object:GetX(), object:GetY(), object:GetZ()+0.5, 0, 35, 0)
  611.                     showconfirmed(item, player)
  612.                 else
  613.                     player:SendBroadcastMessage("Not enough resources!")
  614.                     showmenutowerdefense(item, player)
  615.                 end
  616.             end
  617.         end
  618.     elseif intid == 10 then
  619.         local object = player:GetGameObjectNearestCoords(player:GetX(), player:GetY(), player:GetZ(), 185301)
  620.         if object == nil then
  621.             player:SendBroadcastMessage("No nearby block found!")
  622.             showmenutowerdefense(item, player)
  623.         else
  624.             local found = false
  625.             for _,units in pairs(player:GetInRangeUnits()) do
  626.                 if units:CalcToDistance(object:GetX(), object:GetY(), object:GetZ()) < 2 then
  627.                     found = true
  628.                 end
  629.             end
  630.             if found then
  631.                 player:SendBroadcastMessage("Another tower is too close.")
  632.                 showmenutowerdefense(item, player)         
  633.             else
  634.                 if resources > 9 then
  635.                     resources = resources - 10
  636.                     player:SpawnCreature(116592, object:GetX(), object:GetY(), object:GetZ()+0.5, 0, 35, 0)
  637.                     showconfirmed(item, player)
  638.                 else
  639.                     player:SendBroadcastMessage("Not enough resources!")
  640.                     showmenutowerdefense(item, player)
  641.                 end
  642.             end
  643.         end
  644.     elseif intid == 11 then
  645.         local object = player:GetGameObjectNearestCoords(player:GetX(), player:GetY(), player:GetZ(), 185301)
  646.         if object == nil then
  647.             player:SendBroadcastMessage("No nearby block found!")
  648.             showmenutowerdefense(item, player)
  649.         else
  650.             local found = false
  651.             for _,units in pairs(player:GetInRangeUnits()) do
  652.                 if units:CalcToDistance(object:GetX(), object:GetY(), object:GetZ()) < 2 then
  653.                     found = true
  654.                 end
  655.             end
  656.             if found then
  657.                 player:SendBroadcastMessage("Another tower is too close.")
  658.                 showmenutowerdefense(item, player)         
  659.             else
  660.                 if resources > 4 then
  661.                     resources = resources - 5
  662.                     player:SpawnCreature(485211, object:GetX(), object:GetY(), object:GetZ()+0.5, 0, 35, 0, 0, 0, 44643):SetUInt32Value(UNIT_FIELD_BYTES_2, 2)
  663.                     showconfirmed(item, player)
  664.                 else
  665.                     player:SendBroadcastMessage("Not enough resources!")
  666.                     showmenutowerdefense(item, player)
  667.                 end
  668.             end
  669.         end
  670.     elseif intid == 98 then
  671.         showmenutowerdefense(item, player)
  672.     elseif intid == 99 then
  673.         player:GossipComplete()
  674.     end
  675. end
  676.  
  677. RegisterItemGossipEvent(57061, 1, "towerdefenseclick")
  678. RegisterItemGossipEvent(57061, 2, "towerdefesneselect")
  679.  
  680. -- Handle win/lose
  681.  
  682. function DummyHandlerSpawn_TowerDefense(pUnit, Event)
  683.     pUnit:RegisterEvent("CheckForStatusChange_TowerDefense", 5000, 0)
  684. end
  685.  
  686. function CheckForStatusChange_TowerDefense(pUnit)
  687.     if waverunning then
  688.         if shieldvalue == 0 then
  689.             for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  690.                 ResetWorldstatesUI(plrs)
  691.             end
  692.             for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  693.                 towerdefesneselect(nil, nil, plrs, nil, 6, nil)
  694.                 break
  695.             end
  696.             waverunning = false
  697.         end
  698.         for _,unit in pairs(pUnit:GetInRangeUnits()) do
  699.             if unit:GetEntry() == waveentry then
  700.                 if not unit:IsAlive() then
  701.                     creepsLeft = creepsLeft - 1
  702.                     unit:RemoveEvents()
  703.                     unit:Despawn(1500,0)
  704.                     resources = resources + upvalue
  705.                 end
  706.             end
  707.         end
  708.         if creepsLeft == 0 then
  709.             waverunning = false
  710.             if shieldvalue == 0 then
  711.                 pUnit:SendChatMessage(42,0,"You have lost!")
  712.                 for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  713.                     ResetWorldstatesUI(plrs)
  714.                 end            
  715.             else
  716.                 for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  717.                     UpdateWorldstatesUI(plrs)
  718.                     UpdateAttempts(plrs, shieldvalue)
  719.                 end
  720.                 pUnit:SendChatMessage(42,0,"End of wave "..tostring(wavenum).."!")
  721.                 if wavenum == 15 then
  722.                     for _,plrs in pairs(pUnit:GetInRangePlayers()) do
  723.                         if plrs:HasAura(50224) then
  724.                             plrs:RemoveAura(50224) -- zombie vision
  725.                         end
  726.                     end
  727.                 end
  728.                 wavenum = wavenum + 1
  729.             end
  730.         end
  731.     end
  732. end
  733.  
  734. RegisterUnitEvent(32298, 18, "DummyHandlerSpawn_TowerDefense")
  735.  
  736. -- Handle the worldstates
  737.  
  738. function UpdateWorldstatesUI(plrs)
  739.     local pack = LuaPacket:CreatePacket(SMSG_INIT_WORLD_STATES, 18)
  740.     pack:WriteULong(608) -- Map
  741.     pack:WriteULong(0) -- Zone
  742.     pack:WriteULong(0)
  743.     pack:WriteUShort(1)
  744.     pack:WriteULong(3816) -- ID
  745.     pack:WriteULong(1) -- Value
  746.     plrs:SendPacketToPlayer(pack)
  747. end
  748.  
  749. function UpdateAttempts(plrs, value)
  750.     local pack = LuaPacket:CreatePacket(SMSG_UPDATE_WORLD_STATE, 8)
  751.     pack:WriteULong(3815) -- ID, X
  752.     pack:WriteULong(value) -- Value
  753.     plrs:SendPacketToPlayer(pack)
  754. end
  755.  
  756. function ResetWorldstatesUI(plrs)
  757.     local pack = LuaPacket:CreatePacket(SMSG_INIT_WORLD_STATES, 18)
  758.     pack:WriteULong(0) -- Map
  759.     pack:WriteULong(0) -- Zone
  760.     pack:WriteULong(0)
  761.     pack:WriteUShort(0)
  762.     pack:WriteULong(0) -- ID
  763.     pack:WriteULong(0) -- Value
  764.     plrs:SendPacketToPlayer(pack)
  765. end
  766.  
  767. --
Advertisement
Add Comment
Please, Sign In to add comment