Блокировка и разблокировка кнопки от эвента.
| |
Sunday
|
Дата: Четверг, 21.02.2013, 14:28:25 | Сообщение # 1 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Скрипт запускает таймер если игрок нажал кнопку по координатам и проверяет каждую секунду жив или нет игрок, если он жив то продолжает проверку если игрок мертв то должен выполнить скрипт: Поиск кнопки по координатам (origin = -7612.000000 -9615.000000 62.000000), активировать нажатие, что бы деактивировать дверь. Как это сделать???
Код #pragma semicolon 1
#include <sourcemod> #include <sdktools>
new Handle:h_Timer[MAXPLAYERS+1];
public OnPluginStart() { HookEntityOutput("func_button" , "OnPressed", Lock); }
public OnClientDisconnect(client) { if (h_Timer[client] != INVALID_HANDLE) { KillTimer(h_Timer[client]); h_Timer[client] = INVALID_HANDLE; } }
public Lock(const String:output[], caller, client, Float:delay) { new Float:pos[3]; GetEntPropVector(caller, Prop_Send, "m_vecOrigin", pos);
if (pos[0] == -7596.000000 && pos[1] == -9615.000000 && pos[2] == 62.000000) { if(IsClientInGame(client)) { h_Timer[client] = CreateTimer(1.0, UnLockButton, client, TIMER_REPEAT); } } }
public Action:UnLockButton(Handle:timer, any:client) { PrintToChat(client, "Life"); if(!IsPlayerAlive(client)) { if(IsClientInGame(client)) { PrintToChat(client, "Death"); // КАК НАЙТИ КНОПКУ ПО КООРДИНАТАМ НИЖЕ И НАЖАТЬ ЕЕ ЧТО БЫ ОНА ДЕАКТИВИРОВАЛА ДВЕРЬ, ЕСЛИ ИГРОК УМЕР?????? // origin = -7612.000000 -9615.000000 62.000000 } return Plugin_Stop; } return Plugin_Continue; }
Прилагаю скрины и информацию о кнопке которую нужно нажать.
button_unlock: classname = 'func_button' index = '289', targetname = '' origin = -7612.000000 -9615.000000 62.000000
Гости не могут скачивать файлы
|
Сообщение отредактировал Sunday - Пятница, 22.02.2013, 12:21:37 |
|
| |
dron216
|
Дата: Четверг, 21.02.2013, 15:53:57 | Сообщение # 2 |
|
Сообщений: 151
Репутация: 18 [ +/- ]
|
|
Так если есть исходник карты сделай следующее: Дай кнопке на раз блокировку название unlock в бункере поставь trigger_multiple и в Outputs добавь: My output named OnEndTouchAll Targets entities named unlock Via this input Press
Перекопилируй мапу и все... Можно и плагином, но чем меньше плагинов тем лучше. В данном случай и без плагина обойтись можно.
Сообщение отредактировал dron216 - Четверг, 21.02.2013, 15:54:33 |
|
| |
Sunday
|
Дата: Пятница, 22.02.2013, 12:23:22 | Сообщение # 3 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Цитата (dron216) Так если есть исходник карты сделай следующее: Дай кнопке на раз блокировку название unlock в бункере поставь trigger_multiple и в Outputs добавь: My output named OnEndTouchAll Targets entities named unlock Via this input Press
Перекопилируй мапу и все... Можно и плагином, но чем меньше плагинов тем лучше. В данном случай и без плагина обойтись можно.
Давно бы так сделал, в мапинге я довольно таки не плохо разбираюсь, у меня по рунету более 30 карт ходят, если кому интересно, некоторые есть сдесь http://gamebanana.com/members/1269323 но с этой картой есть одно но, слишком большая карта, если сравнивать например по размеру с de_dust то эта карта примерно как 30-40 дедастов по размеру а может и больше, при декомпилировании ее пересобрать в хамере очень нуторно, ей уже лет 10 и там мороки на месяц минимум из за таких мелочей которые можно было бы плагином поправить, я исправил плагином многое, там 4 бункера в которых хотелось бы это осуществить а то народ вечно просит админов открыть бункер, приходитьяс свчитс и ноклип и лететь открывать бункер, когда нет админа то становится не играбельной карта(... вот в чем вся беда.
Добавлено (22.02.2013, 12:23:22) --------------------------------------------- Как найти кнопку по этим координатам координатам (origin = -7612.000000 -9615.000000 62.000000) и нажать ее с помощью скрипта?
Сообщение отредактировал Sunday - Пятница, 22.02.2013, 12:25:54 |
|
| |
TEIN
|
Дата: Пятница, 22.02.2013, 13:20:59 | Сообщение # 4 |
|
Сообщений: 563
Репутация: 78 [ +/- ]
|
|
пробуй, совершенно не уверен в том что работает, правда. )
Гости не могут скачивать файлы
|
|
|
| |
Sunday
|
Дата: Пятница, 22.02.2013, 19:00:09 | Сообщение # 5 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Цитата (DoK_1997) пробуй, совершенно не уверен в том что работает, правда. )
Прикрепления: test.sp(1Kb)
DoK_1997 Спасибо, сейчас проверю!Добавлено (22.02.2013, 19:00:09) --------------------------------------------- DoK_1997 Низкий поклон Вам! Вы мне очень помогли, все прекрасно работает! Еще раз Спасибо, клик на репутацию!
|
|
| |
Sunday
|
Дата: Суббота, 23.02.2013, 02:45:32 | Сообщение # 6 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
С этой кнопкой все замечательно работает, без ошибок. Спасибо DoK_1997 еще раз!
Еще вопрос, делаю на другую кнопку, она во втором бункере и блокирование двери и разблокирование производиться нажатием на нее одну, скрипт хорошо работает и отжимает кнопку но после того как игрок нажавший на эту кнопку умирает, выдает ошибку: Код [SM] Line 18, desert_unlock_buttons.sp::Lock()
Информация и скриншот ниже: classname = 'func_button' index = '458', targetname = '' origin = -5341.000000 4933.000000 45.740001
Код #pragma semicolon 1
#include <sourcemod> #include <sdktools>
new Handle:h_Timer[MAXPLAYERS+1];
public OnPluginStart() { HookEntityOutput("func_button" , "OnPressed", Lock); }
public OnClientDisconnect(client) { FunctionKillTimer(client); }
public Lock(const String:output[], caller, client, Float:delay) { decl Float:pos[3]; GetEntPropVector(caller, Prop_Send, "m_vecOrigin", pos);
if (pos2[0] == -5341.000000 && pos2[1] == 4933.000000 && pos2[2] == 45.740001) { h_Timer[client] = CreateTimer(1.0, UnLockButton, client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); } }
public Action:UnLockButton(Handle:timer, any:client) { if(!IsPlayerAlive(client)) { AcceptEntityInput(458, "Press", -1, -1); FunctionKillTimer(client); } return Plugin_Continue; }
stock FunctionKillTimer(client) { if (h_Timer[client] != INVALID_HANDLE) { KillTimer(h_Timer[client]); h_Timer[client] = INVALID_HANDLE; } }
В чем может быть проблема?
Добавлено (22.02.2013, 20:54:59) --------------------------------------------- Возможно другое условие должно быть? для той кнопки используется Lock и UnLock для двери а для этой Trigger. То есть получается так, 3 кнопки, одна основная, которая блокирует другие две одним нажатием и так же разблок.
Добавлено (23.02.2013, 02:45:32) --------------------------------------------- Начал гадать как можно упростить скприпт и сделать в одной стези, а так же избавиться от таймеров и прочей калабурды и вот что получилось. В таком варианте на удивление работает со всеми кнопками без ошибки, может кому пригодиться, пример с двумя кнопками, одна активирует дверь (288) другая деактивирует (289), подробное описание внутри кода:
Код #pragma semicolon 1
#include <sourcemod> #include <sdktools>
new h_Trigger;
public OnPluginStart() { HookEvent("player_death", player_death); }
public OnClientPutInServer(client) { new index = -1;
while ((index = FindEntityByClassname(index, "func_button")) != INVALID_ENT_REFERENCE) { if (index == 288) { HookSingleEntityOutput(index, "OnPressed", EntityOutput:s_Trigger_Lock, false); }
if (index == 289) { HookSingleEntityOutput(index, "OnPressed", EntityOutput:s_Trigger_UnLock, false); } } }
public OnClientDisconnect(client) { if (h_Trigger == 1) // Проверяется, если игрок вышел с сервера и в этот момент дверь была заблокирована, то дверь деактивируется. { AcceptEntityInput(289, "Press", -1, -1); } }
public Action:s_Trigger_Lock(client, args) { if (h_Trigger == 0) // Проверяется, если игрок уже нажал на кнопку то функция не будет повторно выполнена, поскольку уже имеет значение глобальной переменной = 1. { h_Trigger = 1; } }
public Action:s_Trigger_UnLock(client, args) { if (h_Trigger == 1) // Проверяется, если игрок умер и глобальная переменная не равняется 1 (то есть если игрок не нажимал активацию) то функция не будет повторно выполнена s_Trigger_UnLock из за команды при смерти AcceptEntityInput(289, "Press", -1, -1); { h_Trigger = 0; // Если игрок нажал дективировать кнопку то глобальной переменной присваивается значение = 1, тогда при смерти игрока не будет выполнен скрипт повторной деактивации кнопки. } }
public player_death(Handle:event, const String:name[], bool:dontBroadcast) { if (h_Trigger == 1) // Проверяется, если игрок умер и глобальная переменная не равняется 1 то функция не будет выполнена. (Означает что игрок не нажимал вообще кнопку) { h_Trigger = 0; AcceptEntityInput(289, "Press", -1, -1); } }
Еще, если кому интересно, вот тут есть возможные параметры для Inputs и Outputs у func_button.
@BaseClass = Button [ Inputs input Lock(void) : "Lock the button, preventing it from functioning." input Unlock(void) : "Unlock the button, allowing it to function." input Press(void) : "Activate the button as if it was pressed." input PressIn(void) : "Activate the button as if it was pressed, sending it to the bottom position." input PressOut(void) : "Unpress the button, sending it to the top position."
Outputs output OnDamaged(void) : "Fired when the button is damaged." output OnPressed(void) : "Fired when the button is pressed." output OnUseLocked(void) : "Fired when the button is used while locked." output OnIn(void) : "Fired when the button reaches the in/pressed position." output OnOut(void) : "Fired when the button reaches the out/released position." ]
Еще хотелось бы понять как сделать так, если первый игрок нажал а после него деактивировал (289) то другому или остальным кто нажимал, привелось значение h_Trigger = 0; для того что бы повторно оно не выполнялось при смерте и при нажатии блокировки скрипт возобновился..?
Гости не могут скачивать файлы
|
Сообщение отредактировал Sunday - Суббота, 23.02.2013, 03:26:09 |
|
| |
TEIN
|
Дата: Суббота, 23.02.2013, 05:40:37 | Сообщение # 7 |
|
Сообщений: 563
Репутация: 78 [ +/- ]
|
|
Кинь все логи
Добавлено (23.02.2013, 05:40:37) --------------------------------------------- Это попробуй, на случай, если игрок 1 нажал и умер, а после него сразу нажал второй игрок
Гости не могут скачивать файлы
|
Сообщение отредактировал DoK_1997 - Суббота, 23.02.2013, 05:40:55 |
|
| |
Sunday
|
Дата: Суббота, 23.02.2013, 20:07:38 | Сообщение # 8 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Док, твой первый пример хорошо работает, еще раз спасибо, если бы не ты, я бы ни за что не догадался что можно было бы сделать так AcceptEntityInput(289, "Press", -1, -1);, исходя из твоей подсказки решил сделать все по индексам, без таймеров, из за которых бывают разные неприятные приколы и через глобальные переменные. Пример, две кнопки, одна блокирует дверь другая разблокирывает:
Код #pragma semicolon 1
#include <sourcemod> #include <sdktools>
new h_Trigger;
public OnPluginStart() { HookEvent("player_death", player_death); HookEvent("player_spawn", player_spawn); // не обязательный но что бы подстраховаться. }
public OnClientPutInServer(client) { new index = -1;
while ((index = FindEntityByClassname(index, "func_button")) != INVALID_ENT_REFERENCE) { if (index == 288) { HookSingleEntityOutput(index, "OnPressed", EntityOutput:s_Trigger_Lock, false); } if (index == 289) { HookSingleEntityOutput(index, "OnPressed", EntityOutput:s_Trigger_UnLock, false); } } }
public OnClientDisconnect(client) { if (h_Trigger == 1) // Проверяется, если игрок вышел с сервера и в этот момент дверь была заблокирована, то дверь деактивируется. { AcceptEntityInput(289, "Press", -1, -1); } }
public player_spawn(Handle:event, const String:name[], bool:dontBroadcast) { h_Trigger = 0; }
public player_death(Handle:event, const String:name[], bool:dontBroadcast) { if (h_Trigger == 1) // Проверяется, если игрок умер и глобальная переменная не равняется 1 то функция не будет выполнена. (Означает что игрок не нажимал вообще кнопку) { h_Trigger = 0; AcceptEntityInput(289, "Press", -1, -1); } }
public Action:s_Trigger_Lock(client, args) { if (h_Trigger == 0) // Проверяется, если игрок уже нажал на кнопку то функция не будет повторно выполнена, поскольку уже имеет значение глобальной переменной = 1. { h_Trigger = 1; } }
public Action:s_Trigger_UnLock(client, args) { if (h_Trigger == 1) // Проверяется, если игрок умер и глобальная переменная не равняется 1 (то есть если игрок не нажимал активацию) то функция не будет повторно выполнена s_Trigger_UnLock из за команды при смерти AcceptEntityInput(289, "Press", -1, -1); { h_Trigger = 0; // Если игрок нажал дективировать кнопку то глобальной переменной присваивается значение = 1, тогда при смерти игрока не будет выполнен скрипт повторной деактивации кнопки. } }
ВТОРОЙ ПРИМЕР С ОДНОЙ КНОПКОЙ, одна дверь, одна кнопка блок и унблок двери: Код #pragma semicolon 1
#include <sourcemod> #include <sdktools>
new h_TriggerB15;
public OnPluginStart() { HookEvent("player_death", player_death); HookEvent("player_spawn", player_spawn); }
public OnClientPutInServer(client) { new index = -1;
while ((index = FindEntityByClassname(index, "func_button")) != INVALID_ENT_REFERENCE) { if (index == 1744) { HookSingleEntityOutput(index, "OnPressed", EntityOutput:s_Trigger_LockB15, false); } } }
public OnClientDisconnect(client) { if (h_TriggerB15 == 1) { AcceptEntityInput(1744, "Press", -1, -1); } }
public player_spawn(Handle:event, const String:name[], bool:dontBroadcast) { h_TriggerB15 = 0; }
public player_death(Handle:event, const String:name[], bool:dontBroadcast) { if (h_TriggerB15 == 1) { AcceptEntityInput(1744, "Press", -1, -1); } h_TriggerB15 = 0; }
public Action:s_Trigger_LockB15(client, args) { if (h_TriggerB15 == 1) { h_TriggerB15 = 0; return; } if (h_TriggerB15 == 0) { h_TriggerB15 = 1; } }
Второй день на сервере тестирую и вроде бы как все хорошо. Кроме второго примера с одной кнопкой...
Добавлено (23.02.2013, 20:07:38) --------------------------------------------- нет, все таки два последних примера плохо работают, при больщем кол-ве игроков, полезди косяки. Постоянно то дверь остается закрытой то игрок который уйдет с бункера и в этот момент придет другой и нажмет на кнопку блок а тот первый умрет который нажимал до этого то опять разблокируется бункер(
Сообщение отредактировал Sunday - Суббота, 23.02.2013, 20:31:29 |
|
| |
TEIN
|
Дата: Воскресенье, 24.02.2013, 06:11:00 | Сообщение # 9 |
|
Сообщений: 563
Репутация: 78 [ +/- ]
|
|
Сомневаюсь в том, что будет работать. Ведь у тебя установлено, если дверь открыта и игрок (любой) умер
|
|
| |
TEIN
|
Дата: Воскресенье, 24.02.2013, 06:51:28 | Сообщение # 10 |
|
Сообщений: 563
Репутация: 78 [ +/- ]
|
|
так, вроде окончательный вариант... Попробовал сделать так, если кнопка была нажата 1 раз или нажата/нажата/нажата .. То есть активирована.. Только в том случае работает плаг (как я думаю)
Гости не могут скачивать файлы
|
|
|
| |
Sunday
|
Дата: Воскресенье, 24.02.2013, 17:08:34 | Сообщение # 11 |
|
Сообщений: 186
Репутация: 24 [ +/- ]
|
|
Спасибо DoK_1997!
|
|
| |
|