Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- script_name("[A-RP] extraSU")
- script_description([[
- Улучшение команды /su для проекта Advance-RP. Функции:
- 1. Если преступник далеко от вас, звезды выдадутся как только Вы к нему подьедете
- 2. Если вы пытаетесь дать больше звезд, чем может взять на себя преступник, скрипт сам рассчитает максимум
- 3. Отыгровка /su в одну строку
- История изменений:
- 27.03.2019 - релиз
- 28.03.2019 - исправлена работоспособность выдачи розыска при приближении, добавлена однострочная РП-отыгровка
- ]])
- script_version("28.03.2019")
- script_author("AppleThe | vk.com/moonloader")
- local hook = require 'samp.events'
- local wanted, wanted_id, far_distance = false
- function main()
- sampRegisterChatCommand('su', function(param) far_distance = 10; lua_thread.create(suspect, param) end)
- wait(-1)
- end
- function suspect(param)
- local id, level, reason = param:match('(%d+)%s+(%d+)%s+(.+)') -- получение введенных айди, уровня розыска, и причины
- if not id then sampAddChatMessage('Используйте /su [id игрока] [уровень розыска] [причина]', 0xFFCCCCCC); return end -- проверка на правильность ввода
- if tonumber(level) < 1 then sampAddChatMessage('Уровень розыска должен быть положительным числом', 0xFFCCCCCC); return end -- проверка на правильный уровень розыска
- local stream, vPed = sampGetCharHandleBySampPlayerId(id)
- local _, myId = sampGetPlayerIdByCharHandle(playerPed)
- if tonumber(id) == myId then sampSendChat('/su ' .. param); return end -- отключение дальнейший работы потока, если игрок ставит жучок на себя
- if not stream then sampAddChatMessage('Преступник вне зоны стрима', 0xFFCCCCCC); return else -- проверка на нахождение преступника в зоне стрима
- -- <ОЖИДАНИЕ ПОКА ПОДЬЕДЕМ БЛИЖЕ К ПРЕСТУПНИКУ, ЕСЛИ ОН СЛИШКОМ ДАЛЕКО> --
- local distance = getDistanceToChar(vPed)
- if distance > 65 then
- sampAddChatMessage('Преступник слишком далеко, розыск выдастся сразу же, как будет возможность', 0xFFCCCCCC)
- while distance > 65 do
- wait(0)
- local stream, vPed = sampGetCharHandleBySampPlayerId(id)
- if not stream then sampAddChatMessage('Преступник пропал из зоны видимости', 0xFFCCCCCC); return else
- distance = getDistanceToChar(vPed)
- end
- end
- end
- local old_distance = far_distance -- </>
- -- <ПРОВЕРКА НАЛИЧИЯ ЗВЕЗД У ПРЕСТУПНИКА>
- wanted, wanted_level = id, 0; sampSendChat('/wanted')
- while wanted do wait(0) end -- </>
- -- <ПОДСЧЕТ НУЖНОЙ ВЫДАЧИ ЗВЕЗД, ЕСЛИ У ПРЕСТУПНИКА ОНИ УЖЕ ЕСТЬ>
- if (6 - wanted_level) < tonumber(level) then level = 6 - wanted_level end
- sampSendChat('/su ' .. id .. ' ' .. level .. ' ' .. reason) -- </>
- -- <КОСТЫЛЬ ИСПРАВЛЯЮЩИЙ МЕДЛЕННОЕ ОБНОВЛЕНИЕ ДИСТАНЦИИ МЕЖДУ ИГРОКАМИ НА АДВАНСЕ>
- while far_distance == old_distance do wait(0) end
- if far_distance ~= 0 then wait(2000); lua_thread.create(suspect, param) end -- </>
- end
- end
- function hook.onShowDialog(id, style, title, button1, button2, text) -- функция проверки наличия звезд у преступника
- if wanted then
- if text:find('%(id ' .. wanted .. '%)') then
- wanted_level = text:match('%(id ' .. wanted .. '%)%s+(%d+)')
- end
- if button2 == 'Закрыть' then wanted = false; return false else sampSendDialogResponse(id, 0, 0, 1); return false end
- end
- end
- function getDistanceToChar(vPed) -- функция вычисления дистанции между игроками
- local vX, vY, vZ = getCharCoordinates(vPed)
- local myX, myY, myZ = getCharCoordinates(playerPed)
- return getDistanceBetweenCoords3d(vX, vY, vZ, myX, myY, myZ)
- end
- function hook.onServerMessage(color, text)
- if text:find("в розыск") and color == 865730559 then -- РП-отыгровка команды
- far_distance = 0
- math.randomseed(os.time())
- local num = math.random(1, 3)
- if num == 1 then lua_thread.create(function(t) wait(1000); sampSendChat(t) end, "/ME нажал на тангенту рации, после чего описал преступника и его нарушения")
- elseif num == 2 then lua_thread.create(function(t) wait(1000); sampSendChat(t) end, "/ME нажав тангенту на рации, описал приметы преступника диспетчеру")
- elseif num == 3 then lua_thread.create(function(t) wait(1000); sampSendChat(t) end, "/ME сообщил о нарушении диспетчеру, предварительно нажав тангенту на рации")
- end
- elseif color == -825307393 and text == 'Игрок слишком далеко' and far_distance > 0 then -- костыль с медленным обновлением дистанции на АРП
- far_distance = far_distance - 1
- return false
- end
- end
- function onSystemInitialized() -- проверка на наличие новых версий
- lua_thread.create(function()
- local encoding = require 'encoding'
- encoding.default = 'CP1251'
- while not isSampAvailable() do wait(100) end
- local dlstatus = require('moonloader').download_status
- local json = getWorkingDirectory() .. '\\'..thisScript().name..'-version.json'
- if doesFileExist(json) then os.remove(json) end
- downloadUrlToFile('https://api.jsonbin.io/b/5c9c64b41bdf051e853daa13/latest', json,
- function(id, status, p1, p2)
- if status == dlstatus.STATUSEX_ENDDOWNLOAD then
- if doesFileExist(json) then
- local f = io.open(json, 'r')
- if f then
- local info = decodeJson(f:read('*a'))
- f:close()
- os.remove(json)
- if info.latest ~= thisScript().version then
- info.changelog = info.changelog:gsub('%[', '{00d659}'); info.changelog = info.changelog:gsub('%]', '{ffffff}')
- math.randomseed(os.time())
- local command = 'info' .. math.random(100, 999)
- local dialog = '{ffffff}Новая версия скрипта: {00b84d}' .. info.latest .. '{ffffff}, текущая: {00b84d}' .. thisScript().version .. '{ffffff}\n\n' .. encoding.UTF8:decode(info.changelog) .. '\n\n{b8e0c9}Ссылка на новую версию скопирована в буфер обмена'
- setClipboardText(info.scripturl)
- sampAddChatMessage('{00d659}[' .. thisScript().name .. ']{ffffff} Обнаружено обновление скрипта. Введите {00d659}/' .. command .. '{ffffff} чтобы увидеть подробности', -1)
- sampRegisterChatCommand(command, function() sampShowDialog(math.random(800), thisScript().name, dialog, 'Закрыть', '', 0) end)
- end
- end
- end
- end
- end)
- end)
- end
Add Comment
Please, Sign In to add comment