Advertisement
Guest User

RandomBattle

a guest
Nov 26th, 2013
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.82 KB | None | 0 0
  1. local PREFIX = "duel"
  2.  
  3. local MSG_ON_QUEUE = "Join"
  4. local MSG_ON_LEAVE_QUEUE = "Leave"
  5. local MSG_CURRENTLY_IN = "in"
  6.  
  7. R_A = {
  8.         QUEUE_TBL = {},
  9.         BATTLE_TBL = {},
  10.         CLEAN_TBL = {},
  11.         KILL_TBL = {},
  12.         PHASE_TBL = {[1] = 1}
  13. }
  14.  
  15. local Q_TBL = R_A.QUEUE_TBL
  16. local B_TBL = R_A.BATTLE_TBL
  17. local C_TBL = R_A.CLEAN_TBL
  18. local K_TBL = R_A.KILL_TBL
  19. local P_TBL = R_A.PHASE_TBL
  20.  
  21. function RA_MSG_HOOK(event, plr, msg)
  22.         if (string.lower(msg):find(PREFIX.." ") == 1) then
  23.                 local s_msg = msg:gsub(PREFIX.." ", "")
  24.                 if (string.lower(s_msg) == MSG_ON_QUEUE) then
  25.                         if (not plr:IsInGroup() and plr:GetInstanceId() == 0) then
  26.                                 if (plr:GetPhaseMask() > 1) then return 0; end
  27.                                         if (not R_A.IsPlayerQueued(plr)) then
  28.                                                 table.insert(Q_TBL, plr)
  29.                                                 plr:SendBroadcastMessage("Shoma Varede Liste Entezar Shodid.")
  30.                                         else
  31.                                                 plr:SendBroadcastMessage("Shoma Dar Hale Hazer , Dar Liste Entezar Hastid")
  32.                                         end    
  33.                                 else
  34.                                         plr:SendBroadcastMessage("Zamanike Dar Raid ya Party Hastid , Nemitavanid Join Shavid")
  35.                                 end    
  36.                         end
  37.                        
  38.                         if (string.lower(s_msg) == MSG_ON_LEAVE_QUEUE) then
  39.                                 if (R_A.IsPlayerQueued(plr)) then
  40.                                         table.remove(Q_TBL, R_A.IsPlayerQueued(plr))
  41.                                         plr:SendBroadcastMessage("Shoma az Liste Entezar Kharej Shodid.")
  42.                                 else
  43.                                         plr:SendBroadcastMessage("Shoma Dar Liste Entezar Nistid.")
  44.                                 end
  45.                         end
  46.                        
  47.                         if (string.lower(s_msg) == MSG_CURRENTLY_IN) then
  48.                                 if (#Q_TBL > 0) then
  49.                                         local A_PLR = 0
  50.                                         local H_PLR = 0
  51.                                         for _, v in pairs(Q_TBL) do
  52.                                                 if (v:GetTeam() == 0) then
  53.                                                         A_PLR = A_PLR + 1
  54.                                                 else
  55.                                                         H_PLR = H_PLR + 1
  56.                                                 end
  57.                                         end
  58.                                         plr:SendBroadcastMessage("Dar Hale Hazer Dar Liste Entezar:\nAlliance: "..A_PLR.."\nHorde: "..H_PLR)
  59.                                 else
  60.                                         plr:SendBroadcastMessage("Kesi Dar Liste Entezar Nist.")
  61.                                 end
  62.                         end    
  63.                 return 0;
  64.         end
  65. end    
  66.  
  67. function R_A.IsPlayerQueued(plr)
  68.         for k, v in pairs(Q_TBL) do
  69.                 if (tostring(v) == tostring(plr)) then
  70.                         return k;
  71.                 end
  72.         end
  73.         return false;
  74. end    
  75.  
  76. ----------------------------------------
  77. function TIMED_EVENTS()
  78.         CleanQueue();
  79.         CleanBattle();
  80. end    
  81.  
  82. function TIMED_REGISTER()
  83.         REGISTER_TEAMS();
  84. end    
  85. ----------------------------------------
  86. function CleanQueue()
  87.         CLEAN_OFFLINE(Q_TBL);
  88.         CLEAN_INSTANCE(Q_TBL);
  89.         CLEAN_GROUP(Q_TBL);
  90.         if (#C_TBL > 0) then
  91.                 CLEAN_TBL(Q_TBL);
  92.         end    
  93. end
  94.  
  95. function CleanBattle()
  96.         CLEAN_B_OFFLINE(B_TBL);
  97.         CLEAN_MOUNTED(B_TBL);
  98.         PLR_CHEAT(B_TBL);
  99.         TEAM_RAMPAGE();
  100.         if (#C_TBL > 0) then
  101.                 CLEAN_TBL(B_TBL);
  102.         end    
  103. end    
  104.  
  105. function CLEAN_OFFLINE(TBL)
  106.         for _, v in pairs(TBL) do
  107.                 if (not v:IsInWorld()) then
  108.                         table.insert(C_TBL, v)
  109.                 end
  110.         end
  111. end
  112.  
  113. function CLEAN_B_OFFLINE(TBL)
  114.         for _, _v in pairs(GetActiveRounds()) do
  115.                 for k, v in pairs(TBL[_v]) do
  116.                         if (not v:IsInWorld()) then
  117.                                 TBL[_v][k] = nil;
  118.                                 collectgarbage()
  119.                         end    
  120.                 end
  121.         end
  122. end
  123.  
  124. function CLEAN_INSTANCE(TBL)
  125.         for _, v in pairs(TBL) do
  126.                 if (v:IsInWorld() and v:GetInstanceId() ~= 0) then
  127.                         table.insert(C_TBL, v)
  128.                 end
  129.         end
  130. end
  131.  
  132. function CLEAN_GROUP(TBL)
  133.         for _, v in pairs(TBL) do
  134.                 if (v:IsInWorld() and v:IsInGroup()) then
  135.                         table.insert(C_TBL, v)
  136.                 end
  137.         end
  138. end
  139.  
  140. function CLEAN_MOUNTED(TBL)
  141.         for _, _v in pairs(GetActiveRounds()) do
  142.                 for _, v in pairs(TBL[_v]) do
  143.                         if (v:IsMounted()) then
  144.                                 v:Dismount()
  145.                         end
  146.                 end
  147.         end
  148. end
  149.  
  150. function CLEAN_TBL(TBL)
  151.         for _, v in pairs(C_TBL) do
  152.                 for k, _v in pairs(TBL) do
  153.                         if (v == _v) then
  154.                                 TBL[k] = nil;
  155.                         end
  156.                         if (_v:IsInWorld()) then
  157.                                 _v:SendBroadcastMessage("Shoma Be Ellate Join Shodan Be Party ya Raid , az List Kharej Shodid.")
  158.                         end
  159.                 end
  160.         end
  161.         C_TBL = {}
  162.         collectgarbage()
  163. end    
  164. ----------------------------------------
  165. function REGISTER_TEAMS()
  166.         while (true) do
  167.                 local A_PLR = 0
  168.                 local H_PLR = 0
  169.                 for k, v in pairs(Q_TBL) do
  170.                         if (v:GetTeam() == 0) then
  171.                                 A_PLR = A_PLR + 1
  172.                         else
  173.                                 H_PLR = H_PLR + 1
  174.                         end    
  175.                 end
  176.                 if (A_PLR < 3 or H_PLR < 3) then break; end
  177.                 local count = 0
  178.                 local ROUND_ID = ReturnPhase()
  179.                 local key
  180.                 B_TBL[ROUND_ID] = {}
  181.                 MixTable()
  182.                 for k, v in pairs(Q_TBL) do
  183.                         if (count < 6) then
  184.                                 table.insert(B_TBL[ROUND_ID], v)
  185.                                 Q_TBL[k] = nil;
  186.                                 count = count + 1
  187.                         else
  188.                                 break;
  189.                         end
  190.                 end
  191.                 for k in ipairs(P_TBL) do
  192.                         key = k
  193.                 end
  194.                 P_TBL[key+1] = ROUND_ID
  195.                 table.insert(K_TBL, ROUND_ID)
  196.                 CreateLuaEvent(function() RemoveK_TBL(ROUND_ID); end, 15000, 1)
  197.                 PrepareTeam(ROUND_ID)
  198.         end    
  199. end
  200.  
  201. function PrepareTeam(ROUND_ID)
  202.         for _, v in pairs(B_TBL[ROUND_ID]) do
  203.                 v:SendBroadcastMessage("Mobareze bad az 15 Sanie Aghaz Khahad Shod , Lotfan Amade Bashid !!")
  204.                 v:SetPhaseMask(ROUND_ID)
  205.                 if (v:GetTeam() == 0) then
  206.                         v:Teleport(530, 2893, 5955, 5.1, 0)
  207.                 else
  208.                         v:Teleport(530, 2784, 5902, 5, 0)
  209.                 end
  210.         end
  211.         CreateLuaEvent(function() StartBattle(ROUND_ID); end, 15000, 1)
  212. end
  213.  
  214. function DisbandTeams(ROUND_ID)
  215.         for _, v in pairs(B_TBL[ROUND_ID]) do
  216.                 if (v:IsInWorld()) then
  217.                         if(v:GetPhaseMask() ~= 1) then
  218.                                 v:SetPhaseMask(1)
  219.                         end
  220.                         if (v:GetTeam() == 0) then
  221.                                 v:Teleport(0, -8913.23, 554.63, 94, 0)
  222.                         else
  223.                                 v:Teleport(1, 1502.70, -4415.42, 22, 0)
  224.                         end
  225.                         if (not v:IsAlive()) then
  226.                                 CreateLuaEvent(function() RA_ress(v); end, 3000, 1)
  227.                         end
  228.                 end    
  229.         end    
  230.         B_TBL[ROUND_ID] = nil;
  231.         for k, v in pairs(P_TBL) do
  232.                 if (v == ROUND_ID) then
  233.                         P_TBL[k] = nil;
  234.                 end
  235.         end            
  236.         collectgarbage()
  237. end
  238.  
  239. function StartBattle(ROUND_ID)
  240.         local A_PLR = 0
  241.         local H_PLR = 0
  242.         if (not B_TBL[ROUND_ID]) then return; end
  243.         for k, v in pairs(B_TBL[ROUND_ID]) do
  244.                 if (v:GetTeam() == 0) then
  245.                         A_PLR = A_PLR + 1
  246.                 else
  247.                         H_PLR = H_PLR + 1
  248.                 end
  249.         end
  250.         if (A_PLR == 0 or H_PLR == 0) then return; end
  251.         for _, v in pairs(B_TBL[ROUND_ID]) do
  252.                 if (v:GetTeam() == 0) then
  253.                         v:Teleport(530, 2880, 5941, 4.8, 0)
  254.                 else
  255.                         v:Teleport(530, 2795, 5915, 4.1, 0)
  256.                 end
  257.                 v:SendBroadcastMessage("Mobareze Shuru Shod ,\nGO GO ")
  258.         end
  259. end
  260.  
  261. function MixTable()
  262.         local Copy = DublicateTable(Q_TBL)
  263.         Q_TBL = {}
  264.         while (true) do
  265.                 local k = math.random(1, #Copy)
  266.                 table.insert(Q_TBL, Copy[k])
  267.                 table.remove(Copy, k)
  268.                 if (#Copy == 0) then
  269.                         break;
  270.                 end
  271.         end
  272.         collectgarbage()
  273. end
  274.  
  275. function DublicateTable(O_TBL)
  276.         local N_TBL = {}
  277.         for _, v in pairs(O_TBL) do
  278.                 table.insert(N_TBL, v)
  279.         end
  280.         return N_TBL;
  281. end
  282.  
  283. function RemoveK_TBL(ROUND_ID)
  284.         for k, v in pairs(K_TBL) do
  285.                 if (v == ROUND_ID) then
  286.                         K_TBL[k] = nil;
  287.                 end
  288.         end
  289.         collectgarbage()
  290. end
  291.  
  292. function RA_ress(plr)
  293.         plr:ResurrectPlayer()
  294. end    
  295. ----------------------------------------
  296. function TEAM_RAMPAGE()
  297.         for _, v in pairs(GetActiveRounds()) do
  298.                 local A_PLR = 0
  299.                 local H_PLR = 0
  300.                 local A_AM, H_AM = ReturnTeamAmount(v)
  301.                 for _, _v in pairs(B_TBL[v]) do
  302.                         if (not _v:IsAlive()) then
  303.                                 if (_v:GetTeam() == 0) then
  304.                                         A_PLR = A_PLR + 1
  305.                                 else
  306.                                         H_PLR = H_PLR + 1
  307.                                 end
  308.                         end
  309.                         if (A_PLR == A_AM) or (H_PLR == H_AM) then
  310.                                 break;
  311.                         end    
  312.                 end    
  313.                 if (A_PLR == A_AM) then
  314.                         CreateLuaEvent(function() DisbandTeams(v); end, 4000, 1)
  315.                         for _, val in pairs(B_TBL[v]) do
  316.                                 val:SendBroadcastMessage("Horde Barande Bazi Shod!")
  317.                         end
  318.                 elseif (H_PLR == H_AM) then            
  319.                         CreateLuaEvent(function() DisbandTeams(v); end, 4000, 1)
  320.                         for _, val in pairs(B_TBL[v]) do
  321.                                 val:SendBroadcastMessage("Alliance Barande Bazi Shod!")
  322.                         end
  323.                 end
  324.         end
  325. end
  326.  
  327. function PLR_CHEAT(TBL)
  328.         for _, _v in pairs(GetActiveRounds()) do
  329.                 for k, v in pairs(TBL[_v]) do
  330.                         if (v:GetAreaId() ~= 3775) then
  331.                                 -- v:CastSpell(v, 5)
  332.                         end    
  333.                 end
  334.         end
  335. end
  336.  
  337. function GetActiveRounds()
  338.         local R_TBL = {}
  339.         for _, v in pairs(P_TBL) do
  340.                 if (v ~= 1) then
  341.                         if (not KillTbl(v)) then
  342.                                 table.insert(R_TBL, v)
  343.                         end    
  344.                 end
  345.         end
  346.         return R_TBL;
  347. end
  348.  
  349. function KillTbl(ROUND_ID)
  350.         for _, v in pairs(K_TBL) do
  351.                 if (v == ROUND_ID) then
  352.                         return true;
  353.                 end
  354.         end
  355.         return false;
  356. end
  357.  
  358. function ReturnTeamAmount(ROUND_ID)
  359.         local A_PLR = 0
  360.         local H_PLR = 0
  361.         for k, v in pairs(B_TBL[ROUND_ID]) do
  362.                 if (v:GetTeam() == 0) then
  363.                         A_PLR = A_PLR + 1
  364.                 else
  365.                         H_PLR = H_PLR + 1
  366.                 end
  367.         end
  368.         return A_PLR, H_PLR;
  369. end
  370. ----------------------------------------      
  371. function ReturnPhase()
  372.         local phase
  373.         for k in ipairs(P_TBL) do
  374.                 phase = k
  375.         end
  376.         return 2^phase;
  377. end
  378. ----------------------------------------
  379. function RA_ENTER_ARENA(event, plr)
  380.         if (plr:GetAreaId() == 3775) and (plr:GetPhaseMask() > 1) then
  381.                 if (not ReturnStatus(plr)) then
  382.                         plr:SetPhaseMask(1)
  383.                 end
  384.         end
  385. end
  386.  
  387. function RA_REPOP_ARENA(event, plr)
  388.         if (plr:GetAreaId() == 3775) and (plr:GetPhaseMask() > 1) then
  389.                 if (ReturnStatus(plr)) then
  390.                         return 0;
  391.                 end
  392.         end
  393. end
  394.  
  395. function RA_RESS_ARENA(event, plr)
  396.         if (plr:GetAreaId() == 3775) and (plr:GetPhaseMask() > 1) then
  397.                 if (ReturnStatus(plr)) then
  398.                         plr:SendBroadcastMessage("Shoma Dar In Mobareze Nemitavanid Ress Konid.")
  399.                         return 0;
  400.                 end
  401.         end
  402. end
  403.  
  404. function GetRounds()
  405.         local R_TBL = {}
  406.         for _, v in pairs(P_TBL) do
  407.                 if (v ~= 1) then
  408.                         table.insert(R_TBL, v)
  409.                 end
  410.         end
  411.         return R_TBL;
  412. end
  413.  
  414. function ReturnStatus(plr)
  415.         local found = false
  416.         for _, v in pairs(GetRounds()) do
  417.                 if (KillTbl(v)) then
  418.                         found = true;
  419.                         break;
  420.                 end    
  421.                 for _, _v in pairs(B_TBL[v]) do
  422.                         if (tostring(_v) == tostring(plr)) then
  423.                                 found = true
  424.                                 break;
  425.                         end    
  426.                 end    
  427.                 if (found) then
  428.                         break;
  429.                 end
  430.         end    
  431.         return found;
  432. end
  433.  
  434. RegisterServerHook(28, RA_ENTER_ARENA)
  435. RegisterServerHook(81, RA_REPOP_ARENA)
  436. RegisterServerHook(18, RA_MSG_HOOK)
  437. RegisterServerHook(80, RA_RESS_ARENA)
  438. CreateLuaEvent(TIMED_EVENTS, 5000, 0)
  439. CreateLuaEvent(TIMED_REGISTER, 30000, 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement