commit
9e4576396f
@ -0,0 +1,302 @@ |
||||
script_name('graffiti-srp') |
||||
script_author("Serhiy_Rubin") |
||||
script_properties("work-in-pause") |
||||
local inicfg = require 'inicfg' |
||||
local samp = require 'samp.events' |
||||
local gang_color = { [18663] = 782269354, [18665] = -2218838, [18661] = 233701290, [18659] = 161743018, [18664] = -988414038 } |
||||
local gang_names = { [18663] = '{2EA07B}Rifa', [18665] = '{FFDE24}Vagos', [18661] = '{0DEDFF}Aztec', [18659] = '{09A400}Grove', [18664] = '{C515FF}Ballas' } |
||||
local OBJECT, time, obj_beside = {}, os.time(), -1 |
||||
|
||||
function main() |
||||
if not isSampLoaded() or not isSampfuncsLoaded() then return end |
||||
while not isSampAvailable() do wait(0) end |
||||
repeat wait(0) until sampGetCurrentServerName() ~= 'SA-MP' |
||||
local _, my_id = sampGetPlayerIdByCharHandle(PLAYER_PED) |
||||
my_name = sampGetPlayerNickname(my_id) |
||||
server = sampGetCurrentServerName( ) |
||||
server = |
||||
(server:find("02") and "Two" or |
||||
(server:find("Revo") and "Revolution" or |
||||
(server:find("Legacy") and "Legacy" or (server:find("Classic") and "Classic" or |
||||
(server:find("Two") and "Two" or |
||||
(server:find("TEST") and "TEST" or |
||||
(server:find("Underground") and "Underground" or "" ))))))) |
||||
iniKey = string.format('%s-%s', server, my_name ) |
||||
ini = inicfg.load({ |
||||
[iniKey] = { |
||||
render = false, |
||||
map = false, |
||||
bot = false |
||||
}, |
||||
font = { |
||||
name = 'Segoe UI', |
||||
size = 10, |
||||
flag = 13 |
||||
} |
||||
}, 'Graffiti-SRP') |
||||
inicfg.save(ini, 'Graffiti-SRP') |
||||
DIR = string.format('%s\\moonloader\\config\\%s-Graffiti', getGameDirectory(), server) |
||||
local t = table_read(DIR) |
||||
if t ~= nil then OBJECT = t end |
||||
font = renderCreateFont(ini.font.name, ini.font.size, ini.font.flag) |
||||
sampRegisterChatCommand('graffiti', function() |
||||
ShowDialog(1) |
||||
end) |
||||
while true do |
||||
wait(0) |
||||
local objects = getAllObjects() |
||||
local object_search = {} |
||||
if isKeyDown(119) or isKeyDown(154) then time = os.time() end |
||||
local clear_scr = (os.time() - time > 5 and true or false) |
||||
local obj_b = -1 |
||||
for k, i in ipairs(objects) do |
||||
if doesObjectExist(i) then |
||||
local result, x, y, z = getObjectCoordinates(i) |
||||
if result then |
||||
local model = getObjectModel(i) |
||||
local dist = math.floor(getDistanceBetweenCoords3d(x, y, z, getCharCoordinates(playerPed))) |
||||
for k,v in pairs(gang_color) do |
||||
if k == model then |
||||
object_search[string.format('%d%d%d', x, y, z)] = true |
||||
local find = findObject(OBJECT, x, y) |
||||
local key = ( find ~= false and find or #OBJECT + 1 ) |
||||
if not OBJECT[key] then OBJECT[key] = {} end |
||||
if OBJECT[key].color == nil or OBJECT[key].color ~= gang_color[model] then save_time = os.time() end |
||||
OBJECT[key].x, OBJECT[key].y, OBJECT[key].z, OBJECT[key].color = x, y, z, gang_color[model] |
||||
local posX, posY = convert3DCoordsToScreen(x, y, z) |
||||
if isObjectOnScreen(i) and ini[iniKey].render and not isPauseMenuActive() and clear_scr then |
||||
renderFontDrawText(font, string.format(' %s\nDist: %d m', gang_names[model], dist), posX, posY, -1) |
||||
end |
||||
if OBJECT[key].handle ~= nil then |
||||
removeBlip(OBJECT[key].handle) |
||||
OBJECT[key].handle = nil |
||||
end |
||||
if dist <= 3 then |
||||
obj_b = key |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
||||
obj_beside = ( obj_b ~= -1 and obj_b or obj_beside) |
||||
for k,v in pairs(OBJECT) do |
||||
local dist = math.ceil(getDistanceBetweenCoords3d(v.x, v.y, v.z, getCharCoordinates(playerPed))) |
||||
local int = (getActiveInterior() == 0 and true or false) |
||||
if v.handle == nil then |
||||
local color = (v.color ~= nil and v.color or 0xFFFFFFFF ) |
||||
local size = 1 |
||||
if v.time ~= nil then |
||||
if (v.time - os.time()) > 0 then |
||||
size = 2 |
||||
end |
||||
end |
||||
if isPauseMenuActive() then |
||||
if ini[iniKey].map and clear_scr then |
||||
v.handle = addBlipForCoord(v.x, v.y, v.z) |
||||
changeBlipScale(v.handle, size) |
||||
changeBlipColour(v.handle, color) |
||||
end |
||||
else |
||||
if dist < 250 and int and ini[iniKey].map then |
||||
if object_search[string.format('%d%d%d', v.x, v.y, v.z)] == nil and not isCharDead(PLAYER_PED) then |
||||
OBJECT[k] = nil |
||||
save_time = os.time() |
||||
end |
||||
if OBJECT[k] ~= nil and clear_scr then |
||||
v.handle = addBlipForCoord(v.x, v.y, v.z) |
||||
changeBlipScale(v.handle, size) |
||||
changeBlipColour(v.handle, color) |
||||
end |
||||
end |
||||
end |
||||
else |
||||
if not isPauseMenuActive() then |
||||
if dist > 250 or not ini[iniKey].map or int or not clear_scr then |
||||
removeBlip(v.handle) |
||||
v.handle = nil |
||||
end |
||||
end |
||||
end |
||||
end |
||||
if save_time ~= nil and (os.time() - save_time) > 3 then |
||||
table_write(DIR, OBJECT) |
||||
save_time = nil |
||||
end |
||||
local caption = sampGetDialogCaption() |
||||
local result, button, list, input = sampHasDialogRespond(0) |
||||
if caption == 'Graffiti_SRP: Íàñòðîéêè' then |
||||
if result and button == 1 then |
||||
if dialogLine[list + 1] == ' Graffiti-WH\t'..(ini[iniKey].render and '{06940f}ON' or '{d10000}OFF') then |
||||
ini[iniKey].render = not ini[iniKey].render |
||||
inicfg.save(ini, 'Graffiti-SRP') |
||||
ShowDialog(1) |
||||
elseif dialogLine[list + 1] == ' Graffiti-MAP\t'..(ini[iniKey].map and '{06940f}ON' or '{d10000}OFF') then |
||||
ini[iniKey].map = not ini[iniKey].map |
||||
inicfg.save(ini, 'Graffiti-SRP') |
||||
ShowDialog(1) |
||||
elseif dialogLine[list + 1] == ' Graffiti-BOT\t'..(ini[iniKey].bot and '{06940f}ON' or '{d10000}OFF') then |
||||
ini[iniKey].bot = not ini[iniKey].bot |
||||
inicfg.save(ini, 'Graffiti-SRP') |
||||
ShowDialog(1) |
||||
elseif dialogLine[list + 1] == ' Øðèôò\t'..ini.font.name then |
||||
ShowDialog(2, dialogTextToList[list + 1], input, true, 'font', 'name') |
||||
elseif dialogLine[list + 1] == ' Ðàçìåð\t'..ini.font.size then |
||||
ShowDialog(2, dialogTextToList[list + 1], input, false, 'font', 'size') |
||||
elseif dialogLine[list + 1] == ' Ñòèëü\t'..ini.font.flag then |
||||
ShowDialog(2, dialogTextToList[list + 1], input, false, 'font', 'flag') |
||||
elseif dialogLine[list + 1] == '{59fc30}Êîíòàêòû àâòîðà\t' then |
||||
ShowDialog(3) |
||||
else |
||||
ShowDialog(1) |
||||
end |
||||
end |
||||
end |
||||
if caption == "Graffiti_SRP: Èçìåíåíèå ïàðàìåòðîâ" then |
||||
if d[7] then |
||||
d[7] = false |
||||
sampSetCurrentDialogEditboxText(ini[d[5]][d[6]]) |
||||
end |
||||
if result then |
||||
if button == 1 then |
||||
local gou = ( d[4] and (#input > 0 and true or false) or (input:find("^%d+$") and true or false)) |
||||
if gou then |
||||
d[3] = (d[4] and tostring(input) or tonumber(input)) |
||||
ini[d[5]][d[6]] = d[3] |
||||
inicfg.save(ini, 'Graffiti-SRP') |
||||
if d[5]:find('font') then |
||||
renderReleaseFont(font) |
||||
font = renderCreateFont(ini.font.name, ini.font.size, ini.font.flag) |
||||
end |
||||
ShowDialog(1) |
||||
else |
||||
ShowDialog(d[1], d[2], d[3], d[4], d[5], d[6]) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
if caption == "Graffiti_SRP: Êîíòàêòû àâòîðà" then |
||||
if result then |
||||
if button == 1 then |
||||
if list == 0 then setClipboardText("Serhiy_Rubin") end |
||||
if list == 1 then setClipboardText("https://vk.com/id353828351") end |
||||
if list == 2 then setClipboardText("https://vk.com/club161589495") end |
||||
if list == 3 then setClipboardText("serhiyrubin") end |
||||
if list == 4 then setClipboardText("Serhiy_Rubin#3391") end |
||||
ShowDialog(3) |
||||
else |
||||
ShowDialog(1) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
function findObject(table, x, y) |
||||
for i, v in pairs(table) do |
||||
if string.format('%.8f', x) == string.format('%.8f', v.x) and string.format('%.8f', y) == string.format('%.8f', v.y) then |
||||
return i |
||||
end |
||||
end |
||||
return false |
||||
end |
||||
|
||||
function table_read(adress) |
||||
local f = io.open(adress, 'r') |
||||
if f then |
||||
local func = load(f:read('*a')) |
||||
local data = select(2, pcall(func)) |
||||
f:close() |
||||
return data |
||||
else |
||||
data = {} |
||||
return data |
||||
end |
||||
end |
||||
|
||||
function table_write(adress, table) |
||||
local text = 'return {\n'; |
||||
for i, v in ipairs(table) do |
||||
text = text .. '{' |
||||
for k, v in pairs(v) do |
||||
if k ~= 'handle' then |
||||
text = text .. k .. ' = ' .. v ..';' |
||||
end |
||||
end |
||||
text = text .. '};\n' |
||||
end |
||||
text = text .. '}' |
||||
local filese = io.open(adress, 'w') |
||||
filese:write(text) |
||||
filese:flush() |
||||
io.close(filese) |
||||
end |
||||
|
||||
function ShowDialog(int, dtext, dinput, string_or_number, ini1, ini2) |
||||
d = {} |
||||
d[1], d[2], d[3], d[4], d[5], d[6] = int, dtext, dinput, string_or_number, ini1, ini2 |
||||
if int == 1 then |
||||
dialogLine, dialogTextToList = {}, {} |
||||
dialogLine[#dialogLine + 1] = '{59fc30}> Íàñòðîéêè\t'..iniKey |
||||
dialogLine[#dialogLine + 1] = ' Graffiti-WH\t'..(ini[iniKey].render and '{06940f}ON' or '{d10000}OFF') |
||||
dialogLine[#dialogLine + 1] = ' Graffiti-BOT\t'..(ini[iniKey].bot and '{06940f}ON' or '{d10000}OFF') |
||||
dialogLine[#dialogLine + 1] = ' Graffiti-MAP\t'..(ini[iniKey].map and '{06940f}ON' or '{d10000}OFF') |
||||
dialogLine[#dialogLine + 1] = '{59fc30}> Íàñòðîéêè ðåíäåðà' |
||||
dialogLine[#dialogLine + 1] = ' Øðèôò\t'..ini.font.name |
||||
dialogTextToList[#dialogLine] = "{FFFFFF}Ââåäèòå íàçâàíèå øðèôòà" |
||||
dialogLine[#dialogLine + 1] = ' Ðàçìåð\t'..ini.font.size |
||||
dialogTextToList[#dialogLine] = "{FFFFFF}Ââåäèòå ðàçìåð øðèôòà" |
||||
dialogLine[#dialogLine + 1] = ' Ñòèëü\t'..ini.font.flag |
||||
dialogTextToList[#dialogLine] = "{FFFFFF}Óñòàíàâëèâàéòå ñòèëü ïóòåì ñëîæåíèÿ.\n\nÒåêñò áåç îñîáåííîñòåé = 0\nÆèðíûé òåêñò = 1\nÍàêëîííîñòü(Êóðñèâ) = 2\nÎáâîäêà òåêñòà = 4\nÒåíü òåêñòà = 8\nÏîä÷åðêíóòûé òåêñò = 16\nÇà÷åðêíóòûé òåêñò = 32\n\nÑòàíäàðò: 13" |
||||
dialogLine[#dialogLine + 1] = '{59fc30}Êîíòàêòû àâòîðà\t' |
||||
local text = "" |
||||
for k,v in pairs(dialogLine) do |
||||
text = text..v.."\n" |
||||
end |
||||
sampShowDialog(0, 'Graffiti_SRP: Íàñòðîéêè', text, "Âûáðàòü", "Çàêðûòü", 4) |
||||
end |
||||
if int == 2 then |
||||
d[7] = true |
||||
sampShowDialog(0, "Graffiti_SRP: Èçìåíåíèå ïàðàìåòðîâ", dtext, "Âûáðàòü", "Íàçàä", 1) |
||||
end |
||||
if int == 3 then |
||||
sampShowDialog(0, "Graffiti_SRP: Êîíòàêòû àâòîðà", "{FFFFFF}Âûáåðè ÷òî ñêîïèðîâàòü\t\nÍèê íà Samp-Rp\tSerhiy_Rubin\nÑòðàíè÷êà {4c75a3}VK{FFFFFF}\tvk.com/id353828351\nÃðóïïà {4c75a3}VK{FFFFFF} ñ ìîäàìè\tvk.com/club161589495\n{10bef2}Skype{FFFFFF}\tserhiyrubin\n{7289da}Discord{FFFFFF}\tSerhiy_Rubin#3391", "Êîïèðîâàòü", "Íàçàä", 5) |
||||
end |
||||
end |
||||
|
||||
function samp.onServerMessage(color, message) |
||||
if message:find(' Ãðàôôèòè ìîæíî áóäåò èçìåíèòü ÷åðåç (%d+):(%d+):(%d+)') then |
||||
if obj_beside ~= -1 then |
||||
local H, M, S = message:match(' Ãðàôôèòè ìîæíî áóäåò èçìåíèòü ÷åðåç (%d+):(%d+):(%d+)') |
||||
local time = os.time() + (tonumber(H) * 3600) + (tonumber(M) * 60) + tonumber(S) |
||||
OBJECT[obj_beside].time = time |
||||
save_time = os.time() |
||||
if OBJECT[obj_beside].handle ~= nil then |
||||
removeBlip(OBJECT[obj_beside].handle) |
||||
OBJECT[obj_beside].handle = nil |
||||
end |
||||
end |
||||
end |
||||
if message == ' Âû ïåðåêðàñèëè ãðàôôèòè' then |
||||
if obj_beside ~= -1 then |
||||
local time = os.time() + 3600 |
||||
OBJECT[obj_beside].time = time |
||||
save_time = os.time() |
||||
if OBJECT[obj_beside].handle ~= nil then |
||||
removeBlip(OBJECT[obj_beside].handle) |
||||
OBJECT[obj_beside].handle = nil |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
function samp.onShowTextDraw(id, data) |
||||
if data.modelId == 365 then |
||||
if ini[iniKey].bot then |
||||
lua_thread.create(function(id) |
||||
wait(math.random(400, 1000)) |
||||
sampSendClickTextdraw(id) |
||||
end, id) |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue