1

Тема: AHK: способ заменить функцию "pause"

Всем привет! Столкнуться с такой проблемой: необходимо использовать функцию pause в скрипте, но тогда это влияет на другие важные функции, тем самым воспрепятствует в работе. Другими словами, поставишь на паузу - скрипт полностью остановится, и важная функция работать не будет, а нужно так: чтобы одна часть функции в скрипте работала, другая же ставилась на паузу.

В заблуждении решил обратиться за помощью разработчикам и опытным людям. Прошу, помогите пожалуйста!

Ниже привожу пример необходимого.

global TazerOut:=0
global WeaponDrawn:=0

;НЕОБХОДИМО СДЕЛАТЬ СЛЕДУЮЩЕЕ:
;ЧТОБЫ ПО НАЖАТИЮ F1 - МЕТКА "UnloadGun" и "TakeGun" НЕ РАБОТАЛИ
;А ПРИ ОЧЕРЕДНОМ НАЖАТИИ НА F1 НАЧАЛИ ФУНКЦИОНИРОВАТЬ

;И ТАК ПО КАЖДОМУ НАЖАТИЮ

UnloadGun:
isRegWeaponActive := (GUISys.isRegWeaponActive)
if (isRegWeaponActive)
{
if (WeaponDrawn = 1)
{
    if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "1") and (TazerOut = 2) 
    {
        SendChat("/me поставил пистолет «Desert Eagle» на предохранитель, после чего вставил в кобуру")
        WeaponDrawn:=0
        TazerOut:=0
    }
    if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "2") and (TazerOut = 2) 
    {
        SendChat("/me поставила пистолет «Desert Eagle» на предохранитель, после чего вставила в кобуру")
        WeaponDrawn:=0
        TazerOut:=0
    }
    Sleep, 2500
    goto, UnloadGun
}
else
{
    goto, TakeGun
}
}
return

TakeGun:
#Desert_Eagle_1=%#Desert_Eagle_1%
#Desert_Eagle_2=%#Desert_Eagle_2%
isRegWeaponActive := (GUISys.isRegWeaponActive)
if (isRegWeaponActive)
{
if (WeaponDrawn = 0)
{
    if (getPlayerWeaponId() = 24)  and (TazerOut != 2)
    {
        Random, randu, 1, 4
        if (randu = 1) {
            SendChat("" #Desert_Eagle_1 "")
        }
        if (randu = 2) {
            SendChat("" #Desert_Eagle_2 "")
        }
        TazerOut:=2
        WeaponDrawn:=1
    }
    Sleep, 2500
    goto, TakeGun
}
else
{
    goto, UnloadGun
}
}
Return

Заранее большое спасибо и здоровья!

2

Re: AHK: способ заменить функцию "pause"

Честно говоря, не очень понятно, как это работает, если это полный пример, так как GUISys.isRegWeaponActive всегда пустое.

Используйте переключатель состояний для этого поведения, где "true" - использовать, "false" - нет и на F1 меняйте его состояние на противоположное, а сам переключатель поместите сразу после меток и проверяйте, например:


toggle := true
return
F1:: toggle := !toggle

F2::
	GoSub, UnloadGun
	GoSub, TakeGun
return

UnloadGun:
	if (!toggle)
		return

	MsgBox,,Title,From UnloadGun
return

TakeGun:
	if (!toggle)
		return

	MsgBox,,Title,From TakeGun
return

3

Re: AHK: способ заменить функцию "pause"

Тогда уж так:


toggle := true

F1:: toggle := !toggle

#if toggle
F2::
	GoSub, UnloadGun
	GoSub, TakeGun
	return
#if

UnloadGun: 
	MsgBox,,Title,From UnloadGun
	return

TakeGun: 
	MsgBox,,Title,From TakeGun
	return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: способ заменить функцию "pause"

serzh82saratov, нажимаю на F2 - запускается, затем нажимаю F1 - ничего не происходит, метки работают, хотя должны быть остановлены по нажатию.

Может что-то не так ставлю, либо пример не такой ясный для меня. Можно конкретнее пример?

Вот как я расставил:

toggle := true

F1:: toggle := !toggle

#if toggle
F2::
	GoSub, UnloadGun
	GoSub, TakeGun
	return
#if

global TazerOut:=0
global WeaponDrawn:=0

UnloadGun:
if (WeaponDrawn = 1)
{
    if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "1") and (TazerOut = 2) 
    {
        SendChat("/me поставил пистолет «Desert Eagle» на предохранитель, после чего вставил в кобуру")
        WeaponDrawn:=0
        TazerOut:=0
    }
    if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "2") and (TazerOut = 2) 
    {
        SendChat("/me поставила пистолет «Desert Eagle» на предохранитель, после чего вставила в кобуру")
        WeaponDrawn:=0
        TazerOut:=0
    }
    Sleep, 2500
    goto, UnloadGun
}
else
{
    goto, TakeGun
}
}
return

TakeGun:
#Desert_Eagle_1=%#Desert_Eagle_1%
#Desert_Eagle_2=%#Desert_Eagle_2%
if (WeaponDrawn = 0)
{
    if (getPlayerWeaponId() = 24)  and (TazerOut != 2)
    {
        Random, randu, 1, 4
        if (randu = 1) {
            SendChat("" #Desert_Eagle_1 "")
        }
        if (randu = 2) {
            SendChat("" #Desert_Eagle_2 "")
        }
        TazerOut:=2
        WeaponDrawn:=1
    }
    Sleep, 2500
    goto, TakeGun
}
else
{
    goto, UnloadGun
}
}
Return

5

Re: AHK: способ заменить функцию "pause"

Попробуйте пример выше. У Вас так же в каждой подпрограмме, перед завершающим return стоит лишняя, закрывающая, фигурная скобка.

6

Re: AHK: способ заменить функцию "pause"

KusochekDobra я так и не понял сам пример там. У вас пример не соответствует написанному, что и вводит меня в заблуждения. "сам переключатель поместите сразу после меток и проверяйте" у вас же стоит все перед метками. Напишите понятный пример, пожалуйста.

7

Re: AHK: способ заменить функцию "pause"

Обычно, книгу читают сверху вниз - слева направо. Так же организуется сценарий. Если Вы следуете этим правилам, то у меня написано так, как об этом заявлено, в противном случае Вы используете синтаксис не подходящий для AHK, а так же закончите читать это сообщение на том слове, с которого я его начал. Лучший способ убедиться в работоспособности примера - запустить его и пожмякать кнопки. Если всё ещё не понятно, будьте конкретнее, я сильно затрудняюсь в попытке быть ещё более наглядным чем уже сказано.

8

Re: AHK: способ заменить функцию "pause"

KusochekDobra, так будет правильно? Если нет, то напишите на на аналогичном примере как будет правильнее. Спасибо.

F2::
	GoSub, UnloadGun
	GoSub, TakeGun
return

global TazerOut:=0
global WeaponDrawn:=0

UnloadGun:
if (!toggle)
return

if (WeaponDrawn = 1)
{
    if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "1") and (TazerOut = 2) 
    {
        SendChat("/me поставил пистолет «Desert Eagle» на предохранитель, после чего вставил в кобуру")
        WeaponDrawn:=0
        TazerOut:=0
    }
    if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "2") and (TazerOut = 2) 
    {
        SendChat("/me поставила пистолет «Desert Eagle» на предохранитель, после чего вставила в кобуру")
        WeaponDrawn:=0
        TazerOut:=0
    }
    Sleep, 2500
    goto, UnloadGun
}
else
{
    goto, TakeGun
}
return

TakeGun:
if (!toggle)
return

#Desert_Eagle_1=%#Desert_Eagle_1%
#Desert_Eagle_2=%#Desert_Eagle_2%
if (WeaponDrawn = 0)
{
    if (getPlayerWeaponId() = 24)  and (TazerOut != 2)
    {
        Random, randu, 1, 4
        if (randu = 1) {
            SendChat("" #Desert_Eagle_1 "")
        }
        if (randu = 2) {
            SendChat("" #Desert_Eagle_2 "")
        }
        TazerOut:=2
        WeaponDrawn:=1
    }
    Sleep, 2500
    goto, TakeGun
}
else
{
    goto, UnloadGun
}
Return

toggle := true
return

F1:: toggle := !toggle

9 (изменено: mtc_err, 2018-04-30 21:51:25)

Re: AHK: способ заменить функцию "pause"

Удалено.

10

Re: AHK: способ заменить функцию "pause"

Пожалуй, напомню, что сценарий читается сверху вниз.

Вы присваиваете своему переключателю значение за пределами секции автовыполнения, что делает это бессмысленным. Если обратите внимание на примеры выше, то там это происходит в первых строках.

Аналогичный пример того, как будет правильно, в сообщении номер 2.

Коммерческие предложения публикуйте в специальном разделе форума.

11

Re: AHK: способ заменить функцию "pause"

KusochekDobra, -____-. Что мешает расставить это в коде в качестве полноценного примера для ясности?

toggle := true 

global TazerOut:=0 
global WeaponDrawn:=0 

UnloadGun: 
if (WeaponDrawn = 1) 
{ 
if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "1") and (TazerOut = 2) 
{ 
SendChat("/me поставил пистолет «Desert Eagle» на предохранитель, после чего вставил в кобуру") 
WeaponDrawn:=0 
TazerOut:=0 
} 
if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "2") and (TazerOut = 2) 
{ 
SendChat("/me поставила пистолет «Desert Eagle» на предохранитель, после чего вставила в кобуру") 
WeaponDrawn:=0 
TazerOut:=0 
} 
Sleep, 2500 
goto, UnloadGun 
} 
else 
{ 
goto, TakeGun 
} 
return 

TakeGun: 
#Desert_Eagle_1=%#Desert_Eagle_1% 
#Desert_Eagle_2=%#Desert_Eagle_2% 
if (WeaponDrawn = 0) 
{ 
if (getPlayerWeaponId() = 24) and (TazerOut != 2) 
{ 
Random, randu, 1, 4 
if (randu = 1) { 
SendChat("" #Desert_Eagle_1 "") 
} 
if (randu = 2) { 
SendChat("" #Desert_Eagle_2 "") 
} 
TazerOut:=2 
WeaponDrawn:=1 
} 
Sleep, 2500 
goto, TakeGun 
} 
else 
{ 
goto, UnloadGun 
} 
Return

Где именно должны вписываться требуемые функции?

12

Re: AHK: способ заменить функцию "pause"

Чувствуется Ваше желание, думать, что Вас троллят. Это не так.
Вопрос из первого сообщения состоял в том, как осуществить изоляцию конкретных подпрограмм, не останавливая работу в целом. Поправьте пожалуйста, если ошибаюсь. Следующие после него сообщения наглядно демонстрируют эту механику. Вам остаётся лишь перенести выбранный вариант в свою поделку, соблюдая ту же последовательность. Просьба сделать это за Вас, звучит как издёвка, потому как проще, чем скопипастить принцип - быть не может. Особенно, такой банальный и использующий совершенно тот же алгоритм, что и приведённая Вами часть кода. Если Вам и это не понятно, ищите подсказки в справочных материалах. Ответ на поставленную задачу был дан. Если хотите получить другое решение, сформулируйте вопрос иначе, в другой теме.

Если по существу более нечего добавить, считаю свою попытку засчитанной и умываю руки.

13 (изменено: mtc_err, 2018-04-30 21:32:50)

Re: AHK: способ заменить функцию "pause"

KusochekDobra, прошу прощения, но Вы заключаете абсурдные выводы, ибо Вы меня сами бдительно поставили в заблуждения сообщением следующих фраз: "F1 меняйте его состояние на противоположное, а сам переключатель поместите сразу после меток и проверяйте". Тут я и не понял: как может быть после меток, если у Вас в примере наглядно написано другим образом, а по существу Вы аргументируете совсем иначе. Вот поэтому я и уточняю.

В любом случае, спасибо Вам за столь усердную частичку помощи!

14

Re: AHK: способ заменить функцию "pause"


UnloadGun:
	if (!toggle)
		return
return

В этом участке, сразу после метки "UnloadGun" помещён переключатель "toggle", над которым выполняется проверка. Трактовать это иначе, можно лишь читая задом на перёд.

15 (изменено: mtc_err, 2018-04-30 21:47:00)

Re: AHK: способ заменить функцию "pause"

KusochekDobra пишет:

UnloadGun:
	if (!toggle)
		return
return

В этом участке, сразу после метки "UnloadGun" помещён переключатель "toggle", над которым выполняется проверка. Трактовать это иначе, можно лишь читая задом на перёд.

Смешно однако.

Изначально подумал, что это является переключателем:

F1:: toggle := !toggle

Боже..

16 (изменено: stealzy, 2018-05-01 11:36:43)

Re: AHK: способ заменить функцию "pause"

global TazerOut:=0, WeaponDrawn:=0
toggle := true
Return

F1::toggle := !toggle
#if toggle
F2::
	GoSub UnloadGun
	GoSub TakeGun
	Return
#if

UnloadGun:
	if (WeaponDrawn = 1)
	{
		if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "1") and (TazerOut = 2) 
		{
			SendChat("/me поставил пистолет «Desert Eagle» на предохранитель, после чего вставил в кобуру")
			WeaponDrawn:=0, TazerOut:=0
		}
		if not (getPlayerWeaponId() = 24) and (getsexbyskin(getPlayerSkinId()) = "2") and (TazerOut = 2) 
		{
			SendChat("/me поставила пистолет «Desert Eagle» на предохранитель, после чего вставила в кобуру")
			WeaponDrawn:=0, TazerOut:=0
		}
		Sleep 2500
		goto UnloadGun
	}
	else
		goto TakeGun
Return

TakeGun:
	; следующие две строки выглядят ненужными. Зачем присватвать переменным их собственное значение?
	; #Desert_Eagle_1=%#Desert_Eagle_1%
	; #Desert_Eagle_2=%#Desert_Eagle_2%
	if (WeaponDrawn = 0)
	{
		if ((getPlayerWeaponId() = 24) and (TazerOut != 2))
		{
			Random, randu, 1, 4
			if (randu = 1) {
				SendChat(#Desert_Eagle_1)
			}
			else if (randu = 2) {
				SendChat(#Desert_Eagle_2)
			}
			TazerOut:=2
			WeaponDrawn:=1
		}
		Sleep 2500
		goto TakeGun
	}
	else
		goto UnloadGun
Return

150р перечислять сюда http://forum.script-coding.com/viewtopi … 41#p109241. Жду.
Upd:
mtc_err решил что проще стереть свое сообщение, чем выполнять обещанное.

17 (изменено: mtc_err, 2018-05-01 10:45:21)

Re: AHK: способ заменить функцию "pause"

stealzy, эм, было бы раньше - отправил. Увы, не в то время ответили.

(изменено: mtc_err, Вчера 20:51:25)

Вчера 21:01:23 (изменено: stealzy, Вчера 23:41:38)

А теперь посмотрите на разницу времени изменения. Вы не правы в таком аргументе. К тому же, мне ничего не помогло. F2 - запускается отыгровка, а остановить F1 не получается.

Удачи Вам.

18

Re: AHK: способ заменить функцию "pause"

Действительно 10 минут, приношу извинения.

mtc_err пишет:

а остановить F1 не получается

А вот это уже совсем другое пожелание, из ваших сообщений выше предполагалось, что после нажатия F1 отыгровка по F2 не должна запускаться, про остановку запущенной не было ни слова.