SA:MP Arizona [Вопрос] Как правильно эмулировать клавиши (ALT, W, SHIFT, SPACE) для Arizona RP?

Статус
В этой теме нельзя размещать новые ответы.

ArizonaM

Участник
Автор темы
33
15
Нормальная эмуляция клавиш под Аризону


Суть вопроса:
Здарова всем. Подскажите, через что сейчас лучше всего эмулировать нажатия (ALT, W, SHIFT, SPACE), чтобы админы в реконе видели это в своем кейборде?
На Аризоне куча способов, но какой из них самый беспалевный и рабочий на лаунчере?
Что обычно юзают:

  • [] setGameKeyState — стандартный метод Муна.
    [] setVirtualKeyDown — эмуляция на уровне системы.
  • Эмуляция через Sync — прямая отправка нажатых клавиш в пакет.


Что именно нужно:
Интересует, как заставить ALT (для ферм/заводов), W и SPACE/SHIFT отображаться у админов. Чтобы не было такого, что персонаж бежит или прыгает, а кнопки в админ-чере пустые.
Заранее от души за ответы.

 
Последнее редактирование:

labubu-zayka

Новичок
3
0

сервер считывает нажатия не всех кнопок. вот тебе список
Y = gunid + 64
F =keydata + 16
H = gunid + 192
C = keydata + 2
N = gunid + 128
LMB = keydata + 4
RMB = keydata + 128
TAB = keydata + 1
SPRINT = keydata +8
ALT = keydata + 1024
JUMP = keydata + 32
для нажатия можно использовал функцию фипа которая копирует синхру в таблицу

Lua:
if str:find('ALT') and dist < 5.0 then
    local data = samp_create_sync_data('player')
    data.keysData = data.keysData + 1024
    data.send()
end
не будут нажиматься кнопки клавиатуры. вот и всё в принципе.

Lua:
local keymap = {
    ["Y"] = 64,
    ["F"] = 16,
    ["H"] = 192,
    ["C"] = 2,
    ["N"] = 128,
    ["LMB"] = 4,
    ["RMB"] = 128,
    ["TAB"] = 1,
    ["SPRINT"] = 8,
    ["ALT"] = 1024,
    ["JUMP"] = 32
}

local keys = {}

function onSendPlayerSync(data)
    for key, mask in pairs(keymap) do
        if lastKeys[key] ~= (bit.band(data.keysData, mask) > 0) then
            lastKeys[key] = (bit.band(data.keysData, mask) > 0)
        end
    end
end
 
Последнее редактирование:

ArizonaM

Участник
Автор темы
33
15

сервер считывает нажатия не всех кнопок. вот тебе список
Y = gunid + 64
F =keydata + 16
H = gunid + 192
C = keydata + 2
N = gunid + 128
LMB = keydata + 4
RMB = keydata + 128
TAB = keydata + 1
SPRINT = keydata +8
ALT = keydata + 1024
JUMP = keydata + 32
для нажатия можно использовал функцию фипа которая копирует синхру в таблицу

Lua:
if str:find('ALT') and dist < 5.0 then
    local data = samp_create_sync_data('player')
    data.keysData = data.keysData + 1024
    data.send()
end
не будут нажиматься кнопки клавиатуры. вот и всё в принципе.

Lua:
local keymap = {
    ["Y"] = 64,
    ["F"] = 16,
    ["H"] = 192,
    ["C"] = 2,
    ["N"] = 128,
    ["LMB"] = 4,
    ["RMB"] = 128,
    ["TAB"] = 1,
    ["SPRINT"] = 8,
    ["ALT"] = 1024,
    ["JUMP"] = 32
}

local keys = {}

function onSendPlayerSync(data)
    for key, mask in pairs(keymap) do
        if lastKeys[key] ~= (bit.band(data.keysData, mask) > 0) then
            lastKeys[key] = (bit.band(data.keysData, mask) > 0)
        end
    end
end
Сетка это хорошо, но есть жирный минус: если слать только пакеты, у админа в реконе кнопки могут не загораться. Персонаж будет бежать или жать ALT, а в чекере пусто. Это палево.
Есть еще варианты?
 

moreveal

Известный
991
721
если ты заставил персонажа двигаться - ты уже это сделал каким-то способом, который косвенно влияет на keysData в синхре (все перечисленные тобой), сложнее было бы сделать чтобы не влиял, в чем вопрос собственно

p.s. если ты и видел где-то что игрок бежит, а в чекере не отображается - вопрос задетой в скрипте синхры, что-то он делает не так, затирает настоящую

легче сделать флажок меняющий клавишу и форснуть отправку онфут синхры чем тащить эту функцию длинную
 
Последнее редактирование:

ArizonaM

Участник
Автор темы
33
15
если ты заставил персонажа двигаться - ты уже это сделал каким-то способом, который косвенно влияет на keysData в синхре (все перечисленные тобой), сложнее было бы сделать чтобы не влиял, в чем вопрос собственно

p.s. если ты и видел где-то что игрок бежит, а в чекере не отображается - вопрос задетой в скрипте синхры, что-то он делает не так, затирает настоящую


легче сделать флажок меняющий клавишу и форснуть отправку онфут синхры чем тащить эту функцию длинную
Понял, спасибо за разъяснение.
Значит, если я правильно вшиваю keysData в OnSendPlayerSync, то админ-чекер (KeyBoard) в реконе 100% увидит нажатие?
moreveal написал(а):
легче сделать флажок меняющий клавишу и форснуть отправку онфут синхры чем тащить эту функцию длинную
Вопрос:
Есть пример, как грамотно сделать этот флажок и форснуть отправку синхры без функции Фипа?
 

flupiflufi

Активный
116
36
Значит, если я правильно вшиваю keysData в OnSendPlayerSync, то админ-чекер (KeyBoard) в реконе 100% увидит нажатие?
да я отвечаю, что увидят они 100 проц лично сам тахую херь юзаю через самп ивент
вот опра, а бот мой лесорубчик
 

moreveal

Известный
991
721
Есть пример, как грамотно сделать этот флажок и форснуть отправку синхры без функции Фипа?
Lua:
function send_samp_key(keyid)
    SAMP_KEY_ID = keyid
    sampForceOnfootSync()
end

function sampev.onSendPlayerSync(data)
    if SAMP_KEY_ID then
        data.keysData = SAMP_KEY_ID
        SAMP_KEY_ID = nil
    end
end

---
send_samp_key(1024) -- alt
 

paulohardy

Известный
Всефорумный модератор
2,001
1,343
[] setGameKeyState — стандартный метод Муна.
[] setVirtualKeyDown — эмуляция на уровне системы.
оба варианта приведут персонажа в действие и отобразятся у админа в интерфейсе
Эмуляция через Sync — прямая отправка нажатых клавиш в пакет.
это может быть актуально если движение сделано на игровых тасках
Сетка это хорошо, но есть жирный минус: если слать только пакеты, у админа в реконе кнопки могут не загораться. Персонаж будет бежать или жать ALT, а в чекере пусто. Это палево.
1772304719459.png


ответ на вопрос по работе кнопок дан в сообщениях выше, если интересует реализация бега - смотри готовые решения
 
  • Нравится
Реакции: ArizonaM и 2elnwndrer.
Статус
В этой теме нельзя размещать новые ответы.