Advertisement
Guest User

Realistic bugs system by Nexus

a guest
Dec 7th, 2015
597
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.44 KB | None | 0 0
  1. local BUG_CHECKBUG_RADIUS = 1.1;
  2. local BUG_CAPTUREVOICE_RADIUS = 4.0;
  3.  
  4. tbFrequencies = {};
  5. tbBugs = {};
  6.  
  7. addEventHandler("onScriptInit", function()
  8.     print("Bug script activated - By Nexus");
  9. end)
  10.  
  11. addEventHandler("onDialogResponse", function(playerid, dialogid, response, listitem, inputtext)
  12.     if (dialogid == 3) then
  13.         if (response == 1) then
  14.             -- Notify players in the frequency that the bug has been removed
  15.             for n=0, getPlayerPoolSize() do
  16.                 for fn=1, 3 do
  17.                     if (Player[n]["DetectiveFrequency"..fn] == tbBugs[nRemoveBugID].Frequency) then
  18.                         sendClientMessage(n, -1, "{00ad17}[Frequency: "..tbBugs[nRemoveBugID].Frequency.."] Bug #"..tbBugs[nRemoveBugID].ID.." removed by "..Player[playerid].Name..".")
  19.                     end
  20.                 end
  21.             end
  22.             table.remove(tbBugs, nRemoveBugID);
  23.         end
  24.     end
  25. end)
  26.  
  27. addEventHandler("onPlayerText", function(playerid, text)
  28.     pInt = getPlayerInterior(playerid);
  29.     pWorld = getPlayerVirtualWorld(playerid);
  30.     for i=1, #tbBugs do
  31.         if (tbBugs[i].Active == true) then
  32.             local playerDistanceFromBug = getPlayerDistanceFromPoint(playerid,tbBugs[i].X,tbBugs[i].Y,tbBugs[i].Z);
  33.             if (pInt == tbBugs[i].Interior) and (pWorld == tbBugs[i].World) then
  34.                 if (playerDistanceFromBug <= BUG_CAPTUREVOICE_RADIUS) then
  35.                     -- Send the text to whoever is connected to the frequency.
  36.                     for n=0, getPlayerPoolSize() do
  37.                         for fn=1, 3 do
  38.                             if (Player[n]["DetectiveFrequency"..fn] == tbBugs[i].Frequency) then
  39.                                 sendClientMessage(n, -1, "{00ad17}[BUG F: "..tbBugs[i].Frequency.."; #"..tbBugs[i].ID.."] "..getPlayerName(playerid).." says: "..text)
  40.                             end
  41.                         end
  42.                     end
  43.                 end
  44.             end
  45.         end
  46.     end
  47. end)
  48.  
  49.  
  50. addCommandHandler("placebug", function(playerid, frequency, ...)
  51.     if (Player[playerid].Job ~= 1) then
  52.         return sendClientMessage(playerid, -1, "{ff573d}You are not a detective.")
  53.     else
  54.         if (Player[playerid].Rank ~= 10) then
  55.             return sendClientMessage(playerid, -1, "{ff573d}You are not a state detective.")
  56.         end
  57.     end
  58.     if (not frequency) then
  59.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /placebug [frequency] [reference text]");
  60.     end
  61.     local reference = table.concat({ ... }, " ", 1);
  62.     if (reference == "") then
  63.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /placebug [frequency] [reference text]");
  64.     end
  65.     if (tonumber(frequency) == nil) then
  66.         return sendClientMessage(playerid, -1, "{ff573d}[ERROR] Frequency must be a number.");
  67.     end
  68.    
  69.     frequency = tonumber(frequency);
  70.     isFreqFound = false;
  71.    
  72.     for i=1, 3 do
  73.         if (Player[playerid]["DetectiveFrequency"..i] == frequency) then
  74.             isFreqFound = true;
  75.             break;
  76.         end
  77.     end
  78.    
  79.     if (isFreqFound == false) then
  80.         return sendClientMessage(playerid, -1, "{ff573d}You are not in this frequency. Use /joinfrequency before trying again.")
  81.     end
  82.    
  83.     isFreqFound = nil;
  84.    
  85.     --[[if (export['lvdm'].CheckPlayer(playerid, "Frequency") ~= tonumber(frequency)) then
  86.         return sendClientMessage(playerid, -1, "{ff573d}You are not in this frequency. Use /joinfrequency before trying again.")
  87.     end]]
  88.    
  89.     if (getPlayerState(playerid) == 2) or (getPlayerState(playerid) == 3) then
  90.         return sendClientMessage(playerid, -1, "{ff573d}ERROR: Can't place a bug while in a vehicle.");
  91.     end
  92.     if (#tbBugs == 0) then
  93.         nFreeID = 1;
  94.     else
  95.         nFreeID = tbBugs[#tbBugs].ID+1;
  96.     end
  97.    
  98.     local px,py,pz = getPlayerPos(playerid);
  99.     local vworld = getPlayerVirtualWorld(playerid);
  100.     local int = getPlayerInterior(playerid);
  101.    
  102.     -- Prevents from spamming the players with multiple bugs in the same location (only for the same frequency)
  103.     anotherBugInRadius = false;
  104.     for i=1, #tbBugs do
  105.         if (tbBugs[i].Frequency == tonumber(frequency)) then
  106.             if (getPlayerDistanceFromPoint(playerid,tbBugs[i].X,tbBugs[i].Y,tbBugs[i].Z) <= BUG_CAPTUREVOICE_RADIUS) then
  107.                 anotherBugInRadius = true;
  108.                 break;
  109.             end
  110.         end
  111.     end
  112.     if (anotherBugInRadius) then
  113.         return sendClientMessage(playerid, -1, "{ff573d}ERROR: There's another bug in the listening radius.");
  114.     end
  115.    
  116.     tbBugs[#tbBugs+1] = {ID=nFreeID, Reference=reference, Active=true, World=vworld, Interior=int, X=px, Y=py, Z=pz, Detective=Player[playerid].Name, Frequency=tonumber(frequency)};
  117.    
  118.     -- Notify players in the frequency that the bug has been placed
  119.     for n=0, getPlayerPoolSize() do
  120.         for fn=1, 3 do
  121.             if (Player[n]["DetectiveFrequency"..fn] == frequency) then
  122.                 sendClientMessage(n, -1, "{00ad17}[Frequency: "..frequency.."] Bug #"..nFreeID.." placed by "..Player[playerid].Name..".")
  123.             end
  124.         end
  125.     end
  126. end)
  127.  
  128. addCommandHandler("checkbug", function(playerid)
  129.     if (Player[playerid].Job ~= 1) then
  130.         return sendClientMessage(playerid, -1, "{ff573d}You are not a detective.")
  131.     end
  132.    
  133.     for i=1, #tbBugs do
  134.         if (tbBugs[i].Active == true) then
  135.             if (getPlayerDistanceFromPoint(playerid,tbBugs[i].X,tbBugs[i].Y,tbBugs[i].Z) <= BUG_CHECKBUG_RADIUS) then
  136.                 return sendClientMessage(playerid, -1, "{00ad17}There's a bug nearby. (ID: "..tbBugs[i].ID..")")
  137.             end
  138.         end
  139.     end
  140.     sendClientMessage(playerid, -1, "{ff573d}No bugs found nearby.")
  141. end)
  142.  
  143. addCommandHandler("removebug", function(playerid, nFrequency, nBugID)
  144.     if (Player[playerid].Job ~= 1) then
  145.         return sendClientMessage(playerid, -1, "{ff573d}You are not a detective.")
  146.     else
  147.         if (Player[playerid].Rank ~= 10) then
  148.             return sendClientMessage(playerid, -1, "{ff573d}You are not a state detective.")
  149.         end
  150.     end
  151.     if (not nFrequency) then
  152.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /removebug [frequency] [bug id]");
  153.     end
  154.     if (not nBugID) then
  155.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /removebug [frequency] [bug id]");
  156.     end
  157.     if (tonumber(nFrequency) == nil) then
  158.         return sendClientMessage(playerid, -1, "{ff573d}[ERROR] Frequency must be a number.");
  159.     end
  160.     if (tonumber(nBugID) == nil) then
  161.         return sendClientMessage(playerid, -1, "{ff573d}[ERROR] Bug ID must be a number.");
  162.     end
  163.     nFrequency = tonumber(nFrequency);
  164.     nBugID = tonumber(nBugID);
  165.     isFreqFound = false;
  166.     for i=1, 3 do
  167.         if (Player[playerid]["DetectiveFrequency"..i] == nFrequency) then
  168.             isFreqFound = true;
  169.             break;
  170.         end
  171.     end
  172.     if (isFreqFound == false) then
  173.         return sendClientMessage(playerid, -1, "{ff573d}You are not in this frequency. Use /joinfrequency before trying again.")
  174.     end
  175.     isFreqFound = nil;
  176.    
  177.     for i=1, #tbBugs do
  178.         if (tbBugs[i].Frequency == nFrequency) and (tbBugs[i].ID == nBugID) then
  179.             nRemoveBugID = i;
  180.             showPlayerDialog(playerid, 3, 0, "Frequency "..nFrequency, "You're about to remove bug ID "..nBugID..".\nAre you sure?", "Yes", "No")
  181.             return false;
  182.         end
  183.     end
  184.     return sendClientMessage(playerid, -1, "{ff573d}Bug with that ID doesn't exist.")
  185. end)
  186.  
  187. addCommandHandler("listbugs", function(playerid, nFrequency)
  188.     if (Player[playerid].Job ~= 1) then
  189.         return sendClientMessage(playerid, -1, "{ff573d}You are not a detective.")
  190.     else
  191.         if (Player[playerid].Rank ~= 10) then
  192.             return sendClientMessage(playerid, -1, "{ff573d}You are not a state detective.")
  193.         end
  194.     end
  195.     if (not nFrequency) then
  196.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /listbugs [frequency]");
  197.     end
  198.     if (tonumber(nFrequency) == nil) then
  199.         return sendClientMessage(playerid, -1, "{ff573d}[ERROR] Frequency must be a number.");
  200.     end
  201.     nFrequency = tonumber(nFrequency);
  202.     isFreqFound = false;
  203.     for i=1, 3 do
  204.         if (Player[playerid]["DetectiveFrequency"..i] == nFrequency) then
  205.             isFreqFound = true;
  206.             break;
  207.         end
  208.     end
  209.     if (isFreqFound == false) then
  210.         return sendClientMessage(playerid, -1, "{ff573d}You are not in this frequency. Use /joinfrequency before trying again.")
  211.     end
  212.     isFreqFound = nil;
  213.    
  214.     sBugsTable = "";
  215.     for i=1, #tbBugs do
  216.         if (tbBugs[i].Frequency == nFrequency) then
  217.             sBugsTable = sBugsTable.."\n"..tbBugs[i].ID.."\t"..tbBugs[i].Reference;
  218.         end
  219.     end
  220.     showPlayerDialog(playerid, 2, 5, "Frequency "..nFrequency, "ID\tReference"..sBugsTable, "Close", "")
  221. end)
  222.  
  223. addCommandHandler("joinfrequency", function(playerid, nFrequency, sPassword)
  224.     if (not nFrequency) then
  225.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /joinfrequency [frequency] [password]");
  226.     end
  227.     if (not sPassword) then
  228.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /joinfrequency [frequency] [password]");
  229.     end
  230.     if (tonumber(nFrequency == nil)) then
  231.         return sendClientMessage(playerid, -1, "{ff573d}[ERROR] Frequency must be a number.");
  232.     end
  233.    
  234.     nFrequency = tonumber(nFrequency);
  235.     foundFreq = false;
  236.     wrongPassFreq = false;
  237.     noFreeSlotsFreq = false;
  238.    
  239.     if (Player[playerid].DetectiveFrequency1 == nFrequency) or (Player[playerid].DetectiveFrequency2 == nFrequency) or (Player[playerid].DetectiveFrequency3 == nFrequency) then
  240.         return sendClientMessage(playerid, -1, "{00ad17}You are already in this frequency.")
  241.     end
  242.    
  243.     for i=1, #tbFrequencies do
  244.         if (tbFrequencies[i].ID == nFrequency) then
  245.             -- Find available slot
  246.             if (Player[playerid].DetectiveFrequency1 == 0) then
  247.                 if (tbFrequencies[i].Password == sPassword) then
  248.                     Player[playerid].DetectiveFrequency1 = nFrequency;
  249.                 else
  250.                     wrongPassFreq = true;
  251.                 end
  252.                 foundFreq = true;
  253.                 break;
  254.             end
  255.             if (Player[playerid].DetectiveFrequency2 == 0) then
  256.                 if (tbFrequencies[i].Password == sPassword) then
  257.                     Player[playerid].DetectiveFrequency2 = nFrequency;
  258.                 else
  259.                     wrongPassFreq = true;
  260.                 end
  261.                 foundFreq = true;
  262.                 break;
  263.             end
  264.             if (Player[playerid].DetectiveFrequency3 == 0) then
  265.                 if (tbFrequencies[i].Password == sPassword) then
  266.                     Player[playerid].DetectiveFrequency3 = nFrequency;
  267.                 else
  268.                     wrongPassFreq = true;
  269.                 end
  270.                 foundFreq = true;
  271.                 break;
  272.             end
  273.             noFreeSlotsFreq = true;
  274.             break;
  275.         end
  276.     end
  277.     if (noFreeSlotsFreq) then
  278.         return sendClientMessage(playerid, -1, "{00ad17}All frequency slots taken.");
  279.     end
  280.     if (wrongPassFreq) then
  281.         return sendClientMessage(playerid, -1, "{00ad17}Wrong password.");
  282.     end
  283.     if (foundFreq) then
  284.         sendClientMessage(playerid, -1, "{00ad17}Joined frequency successfully.")
  285.     else
  286.         sendClientMessage(playerid, -1, "{00ad17}Frequency not found.")
  287.     end
  288. end)
  289.  
  290. addCommandHandler("leavefrequency", function(playerid, nFrequency)
  291.     if (not nFrequency) then
  292.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /leavefrequency [frequency]");
  293.     end
  294.     if (tonumber(nFrequency == nil)) then
  295.         return sendClientMessage(playerid, -1, "{ff573d}[ERROR] Frequency must be a number.");
  296.     end
  297.    
  298.     nFrequency = tonumber(nFrequency);
  299.    
  300.     if (Player[playerid].DetectiveFrequency1 == nFrequency) then
  301.         Player[playerid].DetectiveFrequency1 = 0;
  302.         return sendClientMessage(playerid, -1, "{00ad17}Frequency left successfully.")
  303.     elseif (Player[playerid].DetectiveFrequency2 == nFrequency) then
  304.         Player[playerid].DetectiveFrequency2 = 0;
  305.         return sendClientMessage(playerid, -1, "{00ad17}Frequency left successfully.")
  306.     elseif (Player[playerid].DetectiveFrequency3 == nFrequency) then
  307.         Player[playerid].DetectiveFrequency3 = 0;
  308.         return sendClientMessage(playerid, -1, "{00ad17}Frequency left successfully.")
  309.     end
  310.     return sendClientMessage(playerid, -1, "{ff573d}You're not in that frequency.")
  311. end)
  312.  
  313. addCommandHandler("listfrequencies", function(playerid)
  314.     sendClientMessage(playerid, -1, "Frequencies: S1: "..Player[playerid].DetectiveFrequency1.." | S2: "..Player[playerid].DetectiveFrequency2.." | S3: "..Player[playerid].DetectiveFrequency3..".")
  315. end)
  316.  
  317. addCommandHandler("createfrequency", function(playerid, nFrequency, sPassword)
  318.     if (not nFrequency) then
  319.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /createfrequency [frequency] [password]");
  320.     end
  321.     if (not sPassword) then
  322.         return sendClientMessage(playerid, -1, "{ff573d}[USAGE] /createfrequency [frequency] [password]");
  323.     end
  324.     if (tonumber(nFrequency == nil)) then
  325.         return sendClientMessage(playerid, -1, "{ff573d}ERROR: Frequency must be a number.");
  326.     end
  327.    
  328.     nFrequency = tonumber(nFrequency);
  329.     freqAlreadyExists = false;
  330.    
  331.     for i=1, #tbFrequencies do
  332.         if (tbFrequencies[i].ID == nFrequency) then
  333.             -- Frequency already exists
  334.             freqAlreadyExists = true;
  335.             break;
  336.         end
  337.     end
  338.     if (freqAlreadyExists) then
  339.         return sendClientMessage(playerid, -1, "{ff573d}ERROR: Frequency already exists.");
  340.     end
  341.     if (getPlayerMoney(playerid) < 5000) then
  342.         return sendClientMessage(playerid, -1, "{ff573d}ERROR: Ordering a frequency costs $5,000. You can't afford it.");
  343.     end
  344.     givePlayerMoney(playerid, -5000);
  345.     table.insert(tbFrequencies, {ID=nFrequency, Password=sPassword, Owner=Player[playerid].Name});
  346.     sendClientMessage(playerid, -1, "{00ad17}Purchased the frequency successfully. Don't forget to join it.")
  347. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement