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.
pro100_binder/pro100_binder.lua

725 lines
18 KiB

script_name('pro100_binder')
script_author("RuBin")
vkeys = require "lib.vkeys"
sampev = require 'lib.samp.events'
DIALOG_ID = 7761
DIALOG_ID_NO_LIST = 7762
local ffi = require "ffi"
ffi.cdef[[
void keybd_event(int keycode, int scancode, int flags, int extra);
]]
function EmulateKey(key, isDown)
if not isDown then
ffi.C.keybd_event(key, 0, 2, 0)
else
ffi.C.keybd_event(key, 0, 0, 0)
end
end
function sampev.onServerMessage(color, message)
if message:find('SMS: .+Îòïðàâèòåëü: .+%[(%d+)%]') then
replace["{id_in_sms}"] = message:match('SMS: .+Îòïðàâèòåëü: .+%[(%d+)%]')
end
if message:find('SMS: .+Ïîëó÷àòåëü: .+%[(%d+)%]') then
replace["{id_out_sms}"] = message:match('SMS: .+Ïîëó÷àòåëü: .+%[(%d+)%]')
end
end
function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end
settings_load()
command_show_dialog()
replace = {
["{target_id}"] = "0",
["{target_rp_name}"] = " ",
["{target_name}"] = " ",
["{id_in_sms}"] = "0",
["{id_out_sms}"] = "0"
}
key_press = {}
key_press_counter = 0
is_key_press = false
is_block_gamekeys = false
while true do
wait(0)
while_target_check()
while_key_check()
while_show_dialog()
end
end
function settings_load()
AdressConfig = string.format("%s\\moonloader\\config ", getGameDirectory())
AdressJson = string.format("%s\\moonloader\\config\\pro100_binder.json", getGameDirectory())
local table_std = {
{ cmd = {'/mm'}, enter = true, key = {'VK_M'} }
}
if not doesFileExist(AdressJson) then
local file, error = io.open(AdressJson, "w")
if file ~= nil then
file:write(encodeJson(table_std))
file:flush()
io.close(file)
else
sampAddChatMessage(error, -1)
end
end
try(
function()
local file, error = io.open(AdressJson, "r")
if file then
settings = decodeJson(file:read("*a"))
io.close(file)
end
end,
function(e)
sampAddChatMessage("[pro100_binder] Îøèáêà ÷òåíèÿ êîíôèãà! Ñáðàñûâàþ êîíôèã!", 0xff0000)
local file, error = io.open(AdressJson, "w")
if file ~= nil then
file:write(encodeJson(table_std))
file:flush()
io.close(file)
end
end
)
if settings ~= nil then
if error_ini ~= nil then
sampAddChatMessage("[pro100_binder] Êîíôèã áûë óñïåøíî çàãðóæåí!", 0xff0000)
error_ini = nil
end
for k,v in pairs(table_std) do
if settings[k] == nil then
settings[k] = v
end
for i, s in pairs(v) do
if settings[k][i] == nil then
settings[k][i] = s
end
end
end
settings_save()
else
error_ini = true
sampAddChatMessage("[pro100_binder] Îøèáêà ÷òåíèÿ êîíôèãà! Ïðîáóþ åù¸ ðàç ïðî÷åñòü", 0xff0000)
settings_load()
end
end
function settings_save()
local file, error = io.open(AdressJson, "w")
if file ~= nil then
file:write(encodeJson(settings))
file:flush()
io.close(file)
else
sampAddChatMessage(error, -1)
end
end
function try(f, catch_f)
local status, exception = pcall(f)
if not status then
catch_f(exception)
end
end
function while_target_check()
local result, handle = getCharPlayerIsTargeting(PLAYER_HANDLE)
if result then
local result2, id = sampGetPlayerIdByCharHandle(handle)
if result2 then
local name = sampGetPlayerNickname(id)
replace["{target_id}"] = id
replace["{target_rp_name}"] = name:gsub("_", " ")
replace["{target_name}"] = name
end
end
end
function while_key_check()
local editDialogActive = false
if sampIsDialogActive() and sampGetCurrentDialogType() == 1 then
editDialogActive = true
end
if not sampIsScoreboardOpen() and not sampIsChatInputActive() and not isSampfuncsConsoleActive() and not editDialogActive then
if isKeyDown(vkeys["VK_MENU"]) then
if not is_block_gamekeys then
is_block_gamekeys = true
setPlayerDuckButton(PLAYER_HANDLE, false)
setPlayerEnterCarButton(PLAYER_HANDLE, false)
end
else
if is_block_gamekeys then
is_block_gamekeys = false
setPlayerDuckButton(PLAYER_HANDLE, true)
setPlayerEnterCarButton(PLAYER_HANDLE, true)
end
end
local isPress = false
local isMenu = false
for k, v in pairs(vkeys) do
if isKeyDown(v) and k ~= "VK_ESCAPE" and k ~= "VK_RETURN" and k ~= "VK_LBUTTON" and k ~= "VK_W" and k ~= "VK_S" and k ~= "VK_A" and k ~= "VK_D" then
isPress = true
if key_press[k] == nil then
if k:find("MENU") then
local enter_press = false
for k,v in pairs(key_press) do
if k:find("MENU") then
enter_press = true
end
end
if not enter_press then
key_press["VK_MENU"] = "VK_MENU"
key_press_counter = key_press_counter + 1
end
else
key_press[k] = v
key_press_counter = key_press_counter + 1
end
end
end
end
if isPress ~= is_key_press and not isPress then
for i = 1, #settings do
local down_counter = 0
local alt = false
for k = 1, #settings[i].key do
if settings[i].key[k]:find("MENU") then
alt = true
end
if key_press[settings[i].key[k]] ~= nil then
down_counter = down_counter + 1
end
end
if down_counter == #settings[i].key and key_press_counter == #settings[i].key then
while_send_array(alt, settings[i].enter, settings[i].cmd)
repeat wait(0) until not isKeyDown(vkeys[settings[i].key[#settings[i].key]])
end
end
key_press = {}
key_press_counter = 0
end
is_key_press = isPress
end
end
function check_stop_bind()
if isKeyDown(vkeys["VK_N"]) then
return true
end
end
function while_send_array(alt, enter, copy)
local array = {}
local command = 0
for i = 1, #copy do
array[i] = copy[i]
if array[i]:find("wait (%d+)") then
local ms = array[i]:match("wait (%d+)")
if #("wait "..ms) ~= #array[i] then
command = command + 1
end
else
command = command + 1
end
end
local command_count = 0
repeat
wait(0)
local text = array[1]
local wait_time = -1
if text:find("wait (%d+)") then
local ms = text:match("wait (%d+)")
if #("wait "..ms) == #text then
wait_time = tonumber(ms)
end
end
if wait_time ~= -1 then
local sleep = os.clock() * 1000
repeat
wait(0)
until os.clock() * 1000 - sleep > wait_time or check_stop_bind() or not enter
if check_stop_bind() then
break
end
table.remove(array, 1)
else
for k,v in pairs(replace) do
if text:find(k) then
text = text:gsub(k, v)
end
end
if alt and enter then
sampSendChat(text)
command_count = command_count + 1
else
local chattext = sampGetChatInputText()
sampSetChatInputText(text)
sampSetChatInputEnabled(true)
if enter then
repeat
wait(0)
until sampIsChatInputActive()
EmulateKey(13, true)
EmulateKey(13, false)
end
command_count = command_count + 1
end
repeat
wait(0)
until not sampIsChatInputActive()
if command > 1 then
printStringNow(string.format("BIND COUNT: %s/%s~n~Press N to stop", command_count, command), 1000)
if check_stop_bind() then
break
end
end
table.remove(array, 1)
end
until #array <= 0
end
function command_show_dialog()
sampRegisterChatCommand('binder',function()
show_dialog("main")
end)
end
function show_dialog(param)
if param == "main" then
show_main_dialog()
end
end
function get_text_keys_array(i)
local key_name = ""
for s = 1, #settings[i].key do
if (settings[i].key[s]:find("MENU") and not key_name:find("ALT")) or not settings[i].key[s]:find("MENU") then
key_name = key_name..settings[i].key[s]:gsub("VK_",""):gsub("MENU", "ALT")..(settings[i].key[s + 1] ~= nil and " + " or "")
end
end
return key_name
end
function show_main_dialog()
dialogArray = {}
dialogArray[#dialogArray + 1] = {
text = "Ñîçäàòü áèíä\t \t ",
func = function(button, list, input)
if button == 1 then
show_create_dialog()
end
end
}
for i = 1, #settings do
local key_name = get_text_keys_array(i)
dialogArray[#dialogArray + 1] = {
text = " ["..i.."] "..key_name.."\t"..(settings[i].cmd[1] ~= nil and settings[i].cmd[1] or "nil").." ["..#settings[i].cmd.."]\t"..(settings[i].enter and "ENTER" or " "),
func = function(button, list, input)
if button == 1 then
show_bind_dialog(i, key_name)
return
end
end
}
end
local text = ""
for k,v in pairs(dialogArray) do
text = text..v.text.."\n"
end
sampShowDialog(DIALOG_ID,"PRO100_BINDER",text,"Âûáðàòü","Çàêðûòü",4)
end
function show_bind_dialog(bind_id, key_name)
if settings[bind_id] == nil then return end
local reset = function(button, list, input)
if button == 1 then
show_bind_dialog(bind_id, key_name)
else
show_main_dialog()
end
end
dialogArray = {}
dialogArray[#dialogArray + 1] = {
text = "Àêòèâàöèÿ: "..key_name,
func = reset
}
dialogArray[#dialogArray + 1] = {
text = "Àâòî-îòïðàâêà: "..(settings[bind_id].enter and "ON" or "OFF"),
func = reset
}
dialogArray[#dialogArray + 1] = {
text = " ",
func = reset
}
dialogArray[#dialogArray + 1] = {
text = "[1] Óäàëèòü",
func = function(button, list, input)
if button == 1 then
table.remove(settings, bind_id)
settings_save()
end
show_main_dialog()
end
}
dialogArray[#dialogArray + 1] = {
text = "[2] Ðåäàêòèðîâàòü",
func = function(button, list, input)
if button == 1 then
show_create_dialog(bind_id)
end
end
}
dialogArray[#dialogArray + 1] = {
text = "\nÂâîä: \n"..get_text_array(settings[bind_id].cmd),
func = reset
}
local text = ""
for k,v in pairs(dialogArray) do
text = text..v.text.."\n"
end
sampShowDialog(DIALOG_ID,"PRO100_BINDER",text,"Âûáðàòü","Çàêðûòü",4)
end
function get_text_keys(keys)
local text_keys = ""
for i = 1, #keys do
if (keys[i]:find("MENU") and not text_keys:find("ALT")) or not keys[i]:find("MENU") then
text_keys = text_keys..keys[i]:gsub("VK_", ""):gsub("MENU", "ALT")..(keys[i+1] ~= nil and " + " or "")
end
end
return text_keys
end
function get_text_array(array)
local text= ""
for i = 1, #array do
text = text..array[i].."\n"
end
return text
end
function show_create_dialog(param)
edit_key = param
dialogArray = {}
local keys = {}
if edit_key ~= nil and settings[edit_key] ~= nil then
keys = settings[edit_key].key
end
local timer_show_dialog = os.time()
local result, button = false, 0
local refresh = true
local global_isPress = false
repeat
wait(0)
local isPress = false
for k, v in pairs(vkeys) do
if isKeyDown(v) and k ~= "VK_ESCAPE" and k ~= "VK_RETURN" and k ~= "VK_LBUTTON" then
isPress = true
if k:find("MENU") then
local result_search = true
for i = 1, #keys do
if keys[i]:find("MENU") then
result_search = false
end
end
if result_search then
keys[#keys + 1] = "VK_MENU"
refresh = true
end
else
local result_search = false
for i = 1, #keys do
if keys[i] == k then
result_search = true
end
end
if not result_search then
keys[#keys + 1] = k
refresh = true
end
end
end
end
if isPress ~= global_isPress and isPress then
keys = {}
end
global_isPress = isPress
if os.time() - timer_show_dialog > 0 or refresh then
refresh = false
timer_show_dialog = os.time()
local text_keys = get_text_keys(keys)
local text = string.format("{FFFFFF}Íàæìèòå êëàâèøó èëè ñî÷èòàíèå êëàâèø\nÈñïîëüçóåòñÿ: %s", text_keys)
sampShowDialog(DIALOG_ID,"PRO100_BINDER",text,"Äàëåå","Íàçàä",0)
end
local res, button, list, input = sampHasDialogRespond(DIALOG_ID)
if res then
if button == 1 then
if #keys > 0 then
local array = {}
if edit_key ~= nil and settings[edit_key] ~= nil then
array = settings[edit_key].cmd
end
show_create2_dialog(keys, array)
break
else
show_create_dialog(param)
break
end
else
show_main_dialog()
break
end
end
until result
end
function show_create2_dialog(keys, array)
dialogArray = {}
dialogArray[#dialogArray + 1] = {
text = "Àêòèâàöèÿ: "..get_text_keys(keys),
func = function(button, list, input)
show_create_dialog(edit_key)
end
}
dialogArray[#dialogArray + 1] = {
text = " ",
func = function(button, list, input)
show_create_dialog(edit_key)
end
}
dialogArray[#dialogArray + 1] = {
text = " [1] Äîáàâèòü ñòðîêó",
func = function(button, list, input)
if button == 1 then
show_edit("Äîáàâèòü ñòðîêó", keys, array)
else
show_create_dialog(edit_key)
end
end
}
dialogArray[#dialogArray + 1] = {
text = " [2] Äîáàâèòü çàäåðæêó (ms)",
func = function(button, list, input)
if button == 1 then
show_edit("Äîáàâèòü çàäåðæêó (ms)", keys, array)
else
show_create_dialog(edit_key)
end
end
}
dialogArray[#dialogArray + 1] = {
text = " [3] Äàëåå",
func = function(button, list, input)
if button == 1 then
show_create3_dialog(keys, array)
else
show_create_dialog(edit_key)
end
end
}
dialogArray[#dialogArray + 1] = {
text = " [4] Îòìåíà",
func = function(button, list, input)
show_create_dialog(edit_key)
end
}
dialogArray[#dialogArray + 1] = {
text = " ",
func = function(button, list, input)
show_create_dialog(edit_key)
end
}
if #array > 0 then
dialogArray[#dialogArray + 1] = {
text = "Ñïèñîê òåêñòà (click to del)",
func = function(button, list, input)
show_create_dialog(edit_key)
end
}
end
for i = 1, #array do
dialogArray[#dialogArray + 1] = {
text = " "..array[i],
func = function(button, list, input)
if button == 1 then
table.remove(array, i)
end
show_create2_dialog(keys, array)
end
}
end
dialogArray[#dialogArray + 1] = {
text = " ",
func = function(button, list, input)
show_create_dialog(edit_key)
end
}
local text = ""
for i = 1, #dialogArray do
text = text..dialogArray[i].text.."\n"
end
sampShowDialog(DIALOG_ID,"PRO100_BINDER",text,"Äàëåå","Îòìåíà",2)
end
function show_edit(text, keys, array)
dialogArray = {}
if text == "Äîáàâèòü ñòðîêó" then
text = string.format("%s\nÏîääåðæèâàþòñÿ âñòðîåííûå ïåðåìåííûå!\n\n Òàðãåò - ýòî êîãäà âû ïðèöåëèëèñü â ÷åëîâåêà (Çåëåíûé òðåóãîëüíèê íàä ãîëîâîé)\n Òîãäà ñêðèïò çàïîìèíàåò äàííûå ýòîãî èãðîêà è âû ìîæåòå èõ èñïîëüçîâàòü!\n\t{target_id} - ID èãðîêà\n\t{target_rp_name} - RP íèê èãðîêà\n\t{target_name} - Íèê èãðîêà", text)
local server_name = sampGetCurrentServerName()
if server_name:find("SRP") or server_name:find("Samp%-Rp") then
text = string.format("%s\n\nÏîääåðæèâàþòñÿ ïåðåìåííûå äëÿ Samp-Rp!\n\t{id_in_sms} - ID èãðîêà ñ ïîñëåäíåãî âõîäÿùåãî ÑÌÑ\n\t{id_out_sms} - ID èãðîêà ñ ïîñëåäíåãî îòïðàâëåííîãî Âàìè ÑÌÑ", text)
end
dialogArray[1] = {
text = " [1] Äîáàâèòü ñòðîêó",
func = function(button, list, input)
if button == 1 then
if #input > 0 then
array[#array + 1] = input
end
show_create2_dialog(keys, array)
end
show_create2_dialog(keys, array)
end
}
end
if text == "Äîáàâèòü çàäåðæêó (ms)" then
dialogArray[1] = {
text = " [2] Äîáàâèòü çàäåðæêó (ms)",
func = function(button, list, input)
if button == 1 then
if input:find("%d+") then
local ms = input:match("(%d+)")
if #ms == #input then
array[#array + 1] = "wait "..input:match("(%d+)")
end
end
end
show_create2_dialog(keys, array)
end
}
end
sampShowDialog(DIALOG_ID_NO_LIST,"PRO100_BINDER",text,"Îòïðàâèòü","Îòìåíà",1)
end
function show_create3_dialog(keys, array)
local text_keys = get_text_keys(keys)
local text_command = get_text_array(array)
local text = string.format("{FFFFFF}Àêòèâàöèÿ: %s\nÂâîä: %s\n\n Îòïðàâëÿòü àâòîìàòè÷åñêè?\n\n (Èíà÷å âñòàâêà â ÷àò)", text_keys, text_command)
dialogArray = {}
dialogArray[1] = {
text = "",
func = function(button, list, input)
if button == 1 then
show_create4_dialog(keys, array, true)
else
show_create4_dialog(keys, array, false)
end
end
}
sampShowDialog(DIALOG_ID_NO_LIST,"PRO100_BINDER",text,"Äà","Íåò",0)
end
function show_create4_dialog(keys, array, enter)
local text_keys = get_text_keys(keys)
local text_command = get_text_array(array)
local text = string.format("{FFFFFF}Àêòèâàöèÿ: %s\nÂâîä: %s\nÀâòî-îòïðàâêà: %s\n\n Ñîõðàíèòü?", text_keys, text_command, (enter and "ON" or "OFF"))
dialogArray = {}
dialogArray[1] = {
text = "",
func = function(button, list, input)
if button == 1 then
if edit_key ~= nil and settings[edit_key] ~= nil then
settings[edit_key] = { cmd = array, enter = enter, key = keys }
else
settings[#settings + 1] = { cmd = array, enter = enter, key = keys }
end
settings_save()
end
show_main_dialog()
end
}
sampShowDialog(DIALOG_ID_NO_LIST,"PRO100_BINDER",text,"YES","NO",0)
end
function while_show_dialog()
local result, button, list, input = sampHasDialogRespond(DIALOG_ID)
if result and dialogArray ~= nil and dialogArray[list + 1] then
dialogArray[list + 1].func(button, list, input)
end
local result, button, list, input = sampHasDialogRespond(DIALOG_ID_NO_LIST)
if result and dialogArray ~= nil and dialogArray[1] then
dialogArray[1].func(button, list, input)
end
end