По нажатию лобой клавиши менять переменную Topic is solved

Помощь в написании скриптов для игр.
zimushka
Posts: 5
Joined: 27 Dec 2023, 13:19

По нажатию лобой клавиши менять переменную

27 Dec 2023, 17:18

Доброго времени суток! :wave:
Опишу вкратце, что мне нужно:
В игре предмет Рация достаётся на боковую кнопку мыши, общение по рации происходит по нажатию ЛКМ. Мне нужно, чтобы когда в руке рация, и нажата ЛКМ срабатывал мой скрипт (он просто отправляет клавишу F24, мне это нужно для коректной работы микрофона на трансляции), вот что у меня уже есть:

Code: Select all

radioInHand := true

Suspend, on
^RCtrl::suspend

~XButton2::
radioInHand = true
return

~LButton::
if (radioInHand) 
{
Send, {F24 down}
}
return

~LButton up::
Send, {F24 up}
return
Лично я вижу два пути:
1. Как гласит заголовок, мне нужно, чтобы по нажатию на кнопку рации мой скрипт работал, а при нажатии любой другой клавиши он переставал работать(клавиши W,A,S,D, ПКМ, очередное нажатие боковой клавиши, пробел и ещё некоторых исключений не должны учитываться в этом условии, т.к. они не убирают рация, а отвечают за управление персонажем).
2. (Когда-то видел AHK скрипт, который как-то интегрируется в игру GTA:SAMP, он мог узнавать координаты(на экране их нет) персонажа и выводить определённые сообщения относительно них, так вот...) если есть возможность интегрировать скрипт в игру, которая на Unity, чтобы абсолютно точно знать когда рация в руке, было бы прям идеально.

взгляд со стороны мне бы не помешал, может есть вариант куда проще, я немного писал на C#, но я абсолютный чайник в AHK, пусть он и похож некоторыми аспектами
заранее спасибо :oops:
vmech
Posts: 357
Joined: 25 Aug 2019, 13:03

Re: По нажатию лобой клавиши менять переменную

27 Dec 2023, 17:54

Стартовое значение переменной radioInHand наверное всё таки должно быть false.
Иначе просто теряется её смысл - она ВСЕГДА true. На вектор её значения НИЧТО в коде не влияет.
Соответственно, кнопка F24 активируется при КАЖДОМ нажатии и удержании кнопки LButton. Вообще без какого либо влияния контекста происходящего в игре.

Другими словами, в текущем коде, хоткей XButton2 - балласт. Не выполняющий никакой функции, кроме удержания одного ядра ЦП от выполнения любого другого кода, на пару-тройку сотен тактов.

Если бы ты добавил в код скрипта обработку хоткея, которым в игре рация убирается из рук, а в скрипте присваивалось бы значение переменной radioInHand := false, тогда всё это имело бы смысл.
Please post your script code inside [code] ... [/code] block. Thank you.
zimushka
Posts: 5
Joined: 27 Dec 2023, 13:19

Re: По нажатию лобой клавиши менять переменную

27 Dec 2023, 20:02

vmech wrote:
27 Dec 2023, 17:54
Стартовое значение переменной radioInHand наверное всё таки должно быть false.
Иначе просто теряется её смысл - она ВСЕГДА true. На вектор её значения НИЧТО в коде не влияет.
Соответственно, кнопка F24 активируется при КАЖДОМ нажатии и удержании кнопки LButton. Вообще без какого либо влияния контекста происходящего в игре.
это я понимаю
я временно поменял на true, чтобы скрипт работал всегда, на время, пока я не могу решить задачу, как задумал(
сорян, неудобно получилось :crazy:
vmech wrote:
27 Dec 2023, 17:54
Другими словами, в текущем коде, хоткей XButton2 - балласт. Не выполняющий никакой функции, кроме удержания одного ядра ЦП от выполнения любого другого кода, на пару-тройку сотен тактов.
изначально переменная у меня была со значением false, а хоткей XButton2(на которую в игре достаётся рация) присваивал значение true, за счёт чего работал хоткей LButton

но это не решало мою проблему, потому что один раз достав рацию, переменная уже всегда будет true
vmech wrote:
27 Dec 2023, 17:54
Если бы ты добавил в код скрипта обработку хоткея, которым в игре рация убирается из рук, а в скрипте присваивалось бы значение переменной radioInHand := false, тогда всё это имело бы смысл.
проблема в том, что рация не убирается на одну конкретную кнопку, а убирается при смене на другой предмет, а то есть это может быть любой внутриигровой хоткей от 0 до 9, а так же ~(тильда), -, =, F1, F2, F3, цифры NumPad'а и ещё несколько возможных случаев, например, смерть персонажа
при этом кнопка рации строго назначенна на одну клавишу в настройках самой игры

поэтому я подумал, что лёгким путём будет включать скрипт при нажатии на эту самую клавишу рации,
а выключение скрипта на любую другую клавишу(желательно исключая W,A,S,D и т.п. клавиши), или конкретно на клавиши перечисленные выше
под каждую такую клавишу писать хоткей мне показалось глупой затеей
а другого решения самостоятельно я найти не смог(
vmech
Posts: 357
Joined: 25 Aug 2019, 13:03

Re: По нажатию лобой клавиши менять переменную

27 Dec 2023, 22:54

zimushka wrote:
27 Dec 2023, 20:02
поэтому я подумал, что лёгким путём будет включать скрипт при нажатии на эту самую клавишу рации,
а выключение скрипта на любую другую клавишу(желательно исключая W,A,S,D и т.п. клавиши), или конкретно на клавиши перечисленные выше
под каждую такую клавишу писать хоткей мне показалось глупой затеей
а другого решения самостоятельно я найти не смог(
Попробуй подумать в таком направлении:
Повторное нажатие XButton2 симулирует нажатие какой то другой игровой кнопки. Это может быть как весьма значимая кнопка (функция в игре), так и абсолютно незначительная. Кнопок в игре много - я думаю приемлемые варианты подобрать возможно.
Please post your script code inside [code] ... [/code] block. Thank you.
zimushka
Posts: 5
Joined: 27 Dec 2023, 13:19

Re: По нажатию лобой клавиши менять переменную  Topic is solved

28 Dec 2023, 08:16

vmech wrote:
27 Dec 2023, 22:54
Попробуй подумать в таком направлении:
Повторное нажатие XButton2 симулирует нажатие какой то другой игровой кнопки. Это может быть как весьма значимая кнопка (функция в игре), так и абсолютно незначительная. Кнопок в игре много - я думаю приемлемые варианты подобрать возможно.
о, кстати, хороший вариант, немного не то, что я хотел, но меня устраивает
в целом, думаю даже не объязательно, чтобы менялась рация, но это дело одной строчки

получилось что-то такое:

Code: Select all

radioInHand := false

Suspend, on
^RCtrl::suspend

~XButton2::
if (radioInHand) {
radioInHand := false
SetScrollLockState, Off
Send, {SC029} ; Клавиша "~"
}
else {
radioInHand := true
SetScrollLockState, On
}
Sleep, 100
return

~LButton::
if (radioInHand) {
Send, {F24 down}
}
return

~LButton up::
Send, {F24 up}
return
ещё получилось сделать так, чтобы ScrollLock индицировал работает скрипт или нет, так что вообще кайф)
не знаю на сколько полезно использовать Sleep, , но всё же добавил
спасибо за наводку, я доволен)
:dance: :dance: :dance: :dance: :dance:
vmech
Posts: 357
Joined: 25 Aug 2019, 13:03

Re: По нажатию лобой клавиши менять переменную

28 Dec 2023, 08:51

zimushka wrote:
28 Dec 2023, 08:16
в целом, думаю даже не объязательно, чтобы менялась рация, но это дело одной строчки
получилось что-то такое
ещё получилось сделать так, чтобы ScrollLock индицировал работает скрипт или нет, так что вообще кайф)
не знаю на сколько полезно использовать Sleep, , но всё же добавил
спасибо за наводку, я доволен)
:dance: :dance: :dance: :dance: :dance:
Раз теперь есть ещё и индикатор, и состояние рация в руке получает «размытые перспективы», тогда вместо тильды можно разово отсылать ту же F24, без суффиксов up или down. Никто в голосовом канале даже не заметит, что ты по ней разок «топнул скриптом». Но это неточно :lol:

ЗЫ. И да, лампочка Scroll Lock показывает не состояние скрипта, но состояние скриптовой рации. Индикаторы будут показывать состояние скрипта (спит/работает), если ты прикрутишь управление ими к функции Suspend. Но это уже совсем другая история ;)

Вобщем всё в твоих руках, дерзай.
Please post your script code inside [code] ... [/code] block. Thank you.
zimushka
Posts: 5
Joined: 27 Dec 2023, 13:19

Re: По нажатию лобой клавиши менять переменную

28 Dec 2023, 12:00

немного дополнил скрипт, теперь он практически полноценно работает

Code: Select all

; #InstallKeybdHook ; Чтобы узнать код клавиши
#IfWinActive, ahk_exe Intruder.exe ; Чтобы скрипт работал только в игре
radioInHand := false ; Переменная указывает находится ли рация в руке

; Блок из хоткеев, перенаправляющие на функцию radioOutHand
Hotkey, ~*SC03B, radioOutHand
Hotkey, ~*SC03C, radioOutHand
Hotkey, ~*SC03D, radioOutHand
Hotkey, ~*SC029, radioOutHand
Hotkey, ~*1, radioOutHand
Hotkey, ~*2, radioOutHand
Hotkey, ~*3, radioOutHand
Hotkey, ~*4, radioOutHand
Hotkey, ~*5, radioOutHand
Hotkey, ~*6, radioOutHand
Hotkey, ~*7, radioOutHand
Hotkey, ~*8, radioOutHand
Hotkey, ~*9, radioOutHand
Hotkey, ~*0, radioOutHand
Hotkey, ~*SC00D, radioOutHand
Hotkey, ~*Numpad1, radioOutHand
Hotkey, ~*Numpad2, radioOutHand
Hotkey, ~*Numpad3, radioOutHand

Suspend, off
^RCtrl::suspend

radioOutHand: 
    radioInHand := false ; Рации в руке нет 
    SetScrollLockState, Off ; Выключает индикатор ScrollLock 
return

~*XButton2::
    if (radioInHand) {
    radioInHand := false ; Рации в руке нет 
    SetScrollLockState, Off ; Выключает индикатор ScrollLock 
    Sleep, 50 ; Небольшая задержка 
    Send, {SC029} ; Клавиша "`" (~) 
    }
    else {
    radioInHand := true ; Рация в руке есть
    SetScrollLockState, On ; Включает индикатор ScrollLock 
    }
    Sleep, 250
return

~*LButton::
    if (radioInHand) {
    Send, {F24 down}
    }
return

~*LButton up::
    Send, {F24 up}
return
в целом работает так как я и хотел

Return to “Скрипты для Игр”

Who is online

Users browsing this forum: No registered users and 72 guests