stoneharry

Untitled

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