You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
graffiti-srp/graffiti-srp.lua

302 lines
11 KiB

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: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>' 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] == ' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\t'..ini.font.name then
ShowDialog(2, dialogTextToList[list + 1], input, true, 'font', 'name')
elseif dialogLine[list + 1] == ' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\t'..ini.font.size then
ShowDialog(2, dialogTextToList[list + 1], input, false, 'font', 'size')
elseif dialogLine[list + 1] == ' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\t'..ini.font.flag then
ShowDialog(2, dialogTextToList[list + 1], input, false, 'font', 'flag')
elseif dialogLine[list + 1] == '{59fc30}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\t' then
ShowDialog(3)
else
ShowDialog(1)
end
end
end
if caption == "Graffiti_SRP: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" 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: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" 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}> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\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}> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
dialogLine[#dialogLine + 1] = ' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\t'..ini.font.name
dialogTextToList[#dialogLine] = "{FFFFFF}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
dialogLine[#dialogLine + 1] = ' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\t'..ini.font.size
dialogTextToList[#dialogLine] = "{FFFFFF}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
dialogLine[#dialogLine + 1] = ' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\t'..ini.font.flag
dialogTextToList[#dialogLine] = "{FFFFFF}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 0\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 1\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) = 2\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 4\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 8\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 16\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 32\n\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 13"
dialogLine[#dialogLine + 1] = '{59fc30}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\t'
local text = ""
for k,v in pairs(dialogLine) do
text = text..v.."\n"
end
sampShowDialog(0, 'Graffiti_SRP: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', text, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 4)
end
if int == 2 then
d[7] = true
sampShowDialog(0, "Graffiti_SRP: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", dtext, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 1)
end
if int == 3 then
sampShowDialog(0, "Graffiti_SRP: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "{FFFFFF}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\t\n<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> Samp-Rp\tSerhiy_Rubin\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {4c75a3}VK{FFFFFF}\tvk.com/id353828351\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {4c75a3}VK{FFFFFF} <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\tvk.com/club161589495\n{10bef2}Skype{FFFFFF}\tserhiyrubin\n{7289da}Discord{FFFFFF}\tSerhiy_Rubin#3391", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", 5)
end
end
function samp.onServerMessage(color, message)
if message:find(' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (%d+):(%d+):(%d+)') then
if obj_beside ~= -1 then
local H, M, S = message:match(' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (%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 == ' <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>' 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