commit
1521752ff5
@ -0,0 +1,7 @@ |
||||
|
||||
# **LUA Durak Speed Edition - скрипт слива карт в игре 'дурак' для SAMP-RP** |
||||
[](durak_speed_edition.lua) |
||||
# [**Cкачать**](durak_speed_edition.lua) |
||||
|
||||
## **Описание** |
||||
- *Команда активации: /durak* |
||||
@ -0,0 +1,184 @@ |
||||
script_name("durak_speed_edition") |
||||
script_author("rubin") |
||||
script_version("27.07.2026") |
||||
|
||||
require('sampfuncs') |
||||
local clicker = false |
||||
|
||||
function main() |
||||
while not isSampfuncsLoaded() do wait(100) end |
||||
repeat wait(0) until isSampAvailable() |
||||
|
||||
sampRegisterChatCommand("durak", function(param) |
||||
clicker = not clicker |
||||
sampAddChatMessage((clicker and "ON" or "OFF"), -1) |
||||
end) |
||||
while true do wait(0) |
||||
if clicker then |
||||
-- Îïðåäåëèòü êàêàÿ êíîïêà àêòèâíà |
||||
local result, id = find_textdraw_by_text("beat", 400) |
||||
if result then |
||||
-- Êëèêíóòü íà êàðòó ñ Y íèæå ÷åì 300 |
||||
local result2, id2 = find_card() |
||||
if result2 then |
||||
sampSendClickTextdraw(id2) |
||||
wait(100) |
||||
sampSendClickTextdraw(id) |
||||
wait(100) |
||||
end |
||||
end |
||||
local result, id = find_textdraw_by_text("take", 400) |
||||
if result then |
||||
wait(100) |
||||
sampSendClickTextdraw(id) |
||||
end |
||||
-- àâòîâõîä â ñòîë |
||||
local result, id = find_textdraw_by_text("TO START PLAYING THE FOO", 0) |
||||
if result then |
||||
local data = samp_create_sync_data('player') |
||||
data.keysData = 16 |
||||
data.send() |
||||
wait(1000) |
||||
end |
||||
if sampIsDialogActive() and sampGetDialogCaption():find("Ïðèíÿòü ó÷àñòèå") then |
||||
sampCloseCurrentDialogWithButton(1) |
||||
wait(1000) |
||||
end |
||||
-- àâòîñòàðò èãðû |
||||
local line1, line2 = find_lines() |
||||
if line1 ~= "" and line2 ~= "" then |
||||
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) |
||||
local name = sampGetPlayerNickname(id) |
||||
local arr1 = split(line1, "~n~") |
||||
local arr2 = split(line2, "~n~") |
||||
for k,v in pairs(arr1) do |
||||
if v == name then |
||||
if arr2[k]:find("X") then |
||||
local result, id = find_textdraw_by_text("ready", 0) |
||||
if result then |
||||
sampSendClickTextdraw(id) |
||||
wait(1500) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
function find_textdraw_by_text(text, yf) |
||||
local result, id = false, -1 |
||||
for a = 0, 2304 do |
||||
if sampTextdrawIsExists(a) then |
||||
local texts = sampTextdrawGetString(a) |
||||
local x, y = sampTextdrawGetPos(a) |
||||
if texts:lower():find(text:lower()) and y > yf then |
||||
result = true |
||||
id = a |
||||
break |
||||
end |
||||
end |
||||
end |
||||
return result, id |
||||
end |
||||
|
||||
function find_card() |
||||
local text = "white" |
||||
local result, id = false, -1 |
||||
for a = 0, 2304 do |
||||
if sampTextdrawIsExists(a) then |
||||
local texts = sampTextdrawGetString(a) |
||||
local x, y = sampTextdrawGetPos(a) |
||||
if texts:lower():find(text:lower()) and y == 340 then |
||||
-- sampAddChatMessage(string.format("%0.2f, %0.2f", x, y)) |
||||
result = true |
||||
id = a |
||||
break |
||||
end |
||||
end |
||||
end |
||||
return result, id |
||||
end |
||||
|
||||
function samp_create_sync_data(sync_type, copy_from_player) |
||||
local ffi = require 'ffi' |
||||
local sampfuncs = require 'sampfuncs' |
||||
-- from SAMP.Lua |
||||
local raknet = require 'samp.raknet' |
||||
require 'samp.synchronization' |
||||
|
||||
copy_from_player = copy_from_player or true |
||||
local sync_traits = { |
||||
player = {'PlayerSyncData', raknet.PACKET.PLAYER_SYNC, sampStorePlayerOnfootData}, |
||||
vehicle = {'VehicleSyncData', raknet.PACKET.VEHICLE_SYNC, sampStorePlayerIncarData}, |
||||
passenger = {'PassengerSyncData', raknet.PACKET.PASSENGER_SYNC, sampStorePlayerPassengerData}, |
||||
aim = {'AimSyncData', raknet.PACKET.AIM_SYNC, sampStorePlayerAimData}, |
||||
trailer = {'TrailerSyncData', raknet.PACKET.TRAILER_SYNC, sampStorePlayerTrailerData}, |
||||
unoccupied = {'UnoccupiedSyncData', raknet.PACKET.UNOCCUPIED_SYNC, nil}, |
||||
bullet = {'BulletSyncData', raknet.PACKET.BULLET_SYNC, nil}, |
||||
spectator = {'SpectatorSyncData', raknet.PACKET.SPECTATOR_SYNC, nil} |
||||
} |
||||
local sync_info = sync_traits[sync_type] |
||||
local data_type = 'struct ' .. sync_info[1] |
||||
local data = ffi.new(data_type, {}) |
||||
local raw_data_ptr = tonumber(ffi.cast('uintptr_t', ffi.new(data_type .. '*', data))) |
||||
-- copy player's sync data to the allocated memory |
||||
if copy_from_player then |
||||
local copy_func = sync_info[3] |
||||
if copy_func then |
||||
local _, player_id |
||||
if copy_from_player == true then |
||||
_, player_id = sampGetPlayerIdByCharHandle(PLAYER_PED) |
||||
else |
||||
player_id = tonumber(copy_from_player) |
||||
end |
||||
copy_func(player_id, raw_data_ptr) |
||||
end |
||||
end |
||||
-- function to send packet |
||||
local func_send = function() |
||||
local bs = raknetNewBitStream() |
||||
raknetBitStreamWriteInt8(bs, sync_info[2]) |
||||
raknetBitStreamWriteBuffer(bs, raw_data_ptr, ffi.sizeof(data)) |
||||
raknetSendBitStreamEx(bs, sampfuncs.HIGH_PRIORITY, sampfuncs.UNRELIABLE_SEQUENCED, 1) |
||||
raknetDeleteBitStream(bs) |
||||
end |
||||
-- metatable to access sync data and 'send' function |
||||
local mt = { |
||||
__index = function(t, index) |
||||
return data[index] |
||||
end, |
||||
__newindex = function(t, index, value) |
||||
data[index] = value |
||||
end |
||||
} |
||||
return setmetatable({send = func_send}, mt) |
||||
end |
||||
function find_lines() |
||||
local line1, line2 = "", "" |
||||
for a = 0, 2304 do |
||||
if sampTextdrawIsExists(a) then |
||||
local texts = sampTextdrawGetString(a) |
||||
local x, y = sampTextdrawGetPos(a) |
||||
if x == 530 and y == 198 then |
||||
line1 = texts |
||||
|
||||
end |
||||
if x == 599 and y == 198 then |
||||
line2 = texts |
||||
end |
||||
end |
||||
end |
||||
return line1, line2 |
||||
end |
||||
|
||||
function split(str, delim, plain) |
||||
local tokens, pos, plain = {}, 1, not (plain == false) --[[ delimiter is plain text by default ]] |
||||
repeat |
||||
local npos, epos = string.find(str, delim, pos, plain) |
||||
table.insert(tokens, string.sub(str, pos, npos and npos - 1)) |
||||
pos = epos and epos + 1 |
||||
until not pos |
||||
return tokens |
||||
end |
||||
|
After Width: | Height: | Size: 5.4 KiB |
Loading…
Reference in new issue