Guest User

Код скрипта ExtraSU

a guest
Jun 3rd, 2021
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.34 KB | None | 0 0
  1. script_name("[A-RP] extraSU")
  2.  
  3. script_description([[
  4. Улучшение команды /su для проекта Advance-RP. Функции:
  5. 1. Если преступник далеко от вас, звезды выдадутся как только Вы к нему подьедете
  6. 2. Если вы пытаетесь дать больше звезд, чем может взять на себя преступник, скрипт сам рассчитает максимум
  7. 3. Отыгровка /su в одну строку
  8.  
  9. История изменений:
  10. 27.03.2019 - релиз
  11. 28.03.2019 - исправлена работоспособность выдачи розыска при приближении, добавлена однострочная РП-отыгровка
  12. ]])
  13. script_version("28.03.2019")
  14. script_author("AppleThe | vk.com/moonloader")
  15.  
  16. local hook = require 'samp.events'
  17. local wanted, wanted_id, far_distance = false
  18.  
  19. function main()
  20. sampRegisterChatCommand('su', function(param) far_distance = 10; lua_thread.create(suspect, param) end)
  21. wait(-1)
  22. end
  23.  
  24. function suspect(param)
  25. local id, level, reason = param:match('(%d+)%s+(%d+)%s+(.+)') -- получение введенных айди, уровня розыска, и причины
  26. if not id then sampAddChatMessage('Используйте /su [id игрока] [уровень розыска] [причина]', 0xFFCCCCCC); return end -- проверка на правильность ввода
  27. if tonumber(level) < 1 then sampAddChatMessage('Уровень розыска должен быть положительным числом', 0xFFCCCCCC); return end -- проверка на правильный уровень розыска
  28.  
  29. local stream, vPed = sampGetCharHandleBySampPlayerId(id)
  30. local _, myId = sampGetPlayerIdByCharHandle(playerPed)
  31. if tonumber(id) == myId then sampSendChat('/su ' .. param); return end -- отключение дальнейший работы потока, если игрок ставит жучок на себя
  32. if not stream then sampAddChatMessage('Преступник вне зоны стрима', 0xFFCCCCCC); return else -- проверка на нахождение преступника в зоне стрима
  33.  
  34. -- <ОЖИДАНИЕ ПОКА ПОДЬЕДЕМ БЛИЖЕ К ПРЕСТУПНИКУ, ЕСЛИ ОН СЛИШКОМ ДАЛЕКО> --
  35. local distance = getDistanceToChar(vPed)
  36. if distance > 65 then
  37. sampAddChatMessage('Преступник слишком далеко, розыск выдастся сразу же, как будет возможность', 0xFFCCCCCC)
  38. while distance > 65 do
  39. wait(0)
  40. local stream, vPed = sampGetCharHandleBySampPlayerId(id)
  41. if not stream then sampAddChatMessage('Преступник пропал из зоны видимости', 0xFFCCCCCC); return else
  42. distance = getDistanceToChar(vPed)
  43. end
  44. end
  45. end
  46. local old_distance = far_distance -- </>
  47.  
  48. -- <ПРОВЕРКА НАЛИЧИЯ ЗВЕЗД У ПРЕСТУПНИКА>
  49. wanted, wanted_level = id, 0; sampSendChat('/wanted')
  50. while wanted do wait(0) end -- </>
  51.  
  52. -- <ПОДСЧЕТ НУЖНОЙ ВЫДАЧИ ЗВЕЗД, ЕСЛИ У ПРЕСТУПНИКА ОНИ УЖЕ ЕСТЬ>
  53. if (6 - wanted_level) < tonumber(level) then level = 6 - wanted_level end
  54. sampSendChat('/su ' .. id .. ' ' .. level .. ' ' .. reason) -- </>
  55.  
  56. -- <КОСТЫЛЬ ИСПРАВЛЯЮЩИЙ МЕДЛЕННОЕ ОБНОВЛЕНИЕ ДИСТАНЦИИ МЕЖДУ ИГРОКАМИ НА АДВАНСЕ>
  57. while far_distance == old_distance do wait(0) end
  58. if far_distance ~= 0 then wait(2000); lua_thread.create(suspect, param) end -- </>
  59. end
  60. end
  61.  
  62. function hook.onShowDialog(id, style, title, button1, button2, text) -- функция проверки наличия звезд у преступника
  63. if wanted then
  64. if text:find('%(id ' .. wanted .. '%)') then
  65. wanted_level = text:match('%(id ' .. wanted .. '%)%s+(%d+)')
  66. end
  67. if button2 == 'Закрыть' then wanted = false; return false else sampSendDialogResponse(id, 0, 0, 1); return false end
  68. end
  69. end
  70.  
  71. function getDistanceToChar(vPed) -- функция вычисления дистанции между игроками
  72. local vX, vY, vZ = getCharCoordinates(vPed)
  73. local myX, myY, myZ = getCharCoordinates(playerPed)
  74. return getDistanceBetweenCoords3d(vX, vY, vZ, myX, myY, myZ)
  75. end
  76.  
  77. function hook.onServerMessage(color, text)
  78. if text:find("в розыск") and color == 865730559 then -- РП-отыгровка команды
  79. far_distance = 0
  80. math.randomseed(os.time())
  81. local num = math.random(1, 3)
  82.  
  83. if num == 1 then lua_thread.create(function(t) wait(1000); sampSendChat(t) end, "/ME нажал на тангенту рации, после чего описал преступника и его нарушения")
  84. elseif num == 2 then lua_thread.create(function(t) wait(1000); sampSendChat(t) end, "/ME нажав тангенту на рации, описал приметы преступника диспетчеру")
  85. elseif num == 3 then lua_thread.create(function(t) wait(1000); sampSendChat(t) end, "/ME сообщил о нарушении диспетчеру, предварительно нажав тангенту на рации")
  86. end
  87. elseif color == -825307393 and text == 'Игрок слишком далеко' and far_distance > 0 then -- костыль с медленным обновлением дистанции на АРП
  88. far_distance = far_distance - 1
  89. return false
  90. end
  91. end
  92.  
  93. function onSystemInitialized() -- проверка на наличие новых версий
  94. lua_thread.create(function()
  95. local encoding = require 'encoding'
  96. encoding.default = 'CP1251'
  97. while not isSampAvailable() do wait(100) end
  98. local dlstatus = require('moonloader').download_status
  99. local json = getWorkingDirectory() .. '\\'..thisScript().name..'-version.json'
  100. if doesFileExist(json) then os.remove(json) end
  101. downloadUrlToFile('https://api.jsonbin.io/b/5c9c64b41bdf051e853daa13/latest', json,
  102. function(id, status, p1, p2)
  103. if status == dlstatus.STATUSEX_ENDDOWNLOAD then
  104. if doesFileExist(json) then
  105. local f = io.open(json, 'r')
  106. if f then
  107. local info = decodeJson(f:read('*a'))
  108. f:close()
  109. os.remove(json)
  110. if info.latest ~= thisScript().version then
  111. info.changelog = info.changelog:gsub('%[', '{00d659}'); info.changelog = info.changelog:gsub('%]', '{ffffff}')
  112. math.randomseed(os.time())
  113. local command = 'info' .. math.random(100, 999)
  114. local dialog = '{ffffff}Новая версия скрипта: {00b84d}' .. info.latest .. '{ffffff}, текущая: {00b84d}' .. thisScript().version .. '{ffffff}\n\n' .. encoding.UTF8:decode(info.changelog) .. '\n\n{b8e0c9}Ссылка на новую версию скопирована в буфер обмена'
  115. setClipboardText(info.scripturl)
  116. sampAddChatMessage('{00d659}[' .. thisScript().name .. ']{ffffff} Обнаружено обновление скрипта. Введите {00d659}/' .. command .. '{ffffff} чтобы увидеть подробности', -1)
  117. sampRegisterChatCommand(command, function() sampShowDialog(math.random(800), thisScript().name, dialog, 'Закрыть', '', 0) end)
  118. end
  119. end
  120. end
  121. end
  122. end)
  123. end)
  124. end
Add Comment
Please, Sign In to add comment