Контакты Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Блокировка и разблокировка кнопки от эвента.
Блокировка и разблокировка кнопки от эвента.
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

Прикрепления: 7791456.jpg(458.9 Kb)


Сообщение отредактировал 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 бункера в которых хотелось бы это осуществить а то народ вечно просит админов открыть бункер, приходитьяс свчитс и ноклип и лететь открывать бункер, когда нет админа то становится не играбельной карта(... вот в чем вся беда. pipec

Добавлено (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
Сообщений: 568
Репутация: 78 [ +/- ]
пробуй, совершенно не уверен в том что работает, правда. )

Прикрепления: test.sp(1.0 Kb)
 
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 Низкий поклон Вам! Вы мне очень помогли, все прекрасно работает! klas Еще раз Спасибо, клик на репутацию! ulibka

 
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; для того что бы повторно оно не выполнялось при смерте и при нажатии блокировки скрипт возобновился..?

Прикрепления: 8377861.jpg(136.3 Kb)


Сообщение отредактировал Sunday - Суббота, 23.02.2013, 03:26:09
 
TEIN Дата: Суббота, 23.02.2013, 05:40:37 | Сообщение # 7
Сообщений: 568
Репутация: 78 [ +/- ]
Кинь все логи

Добавлено (23.02.2013, 05:40:37)
---------------------------------------------
Это попробуй, на случай, если игрок 1 нажал и умер, а после него сразу нажал второй игрок

Прикрепления: test-3-.sp(1.1 Kb)


Сообщение отредактировал 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
Сообщений: 568
Репутация: 78 [ +/- ]
Сомневаюсь в том, что будет работать. Ведь у тебя установлено, если дверь открыта и игрок (любой) умер
 
TEIN Дата: Воскресенье, 24.02.2013, 06:51:28 | Сообщение # 10
Сообщений: 568
Репутация: 78 [ +/- ]
так, вроде окончательный вариант...
Попробовал сделать так, если кнопка была нажата 1 раз или нажата/нажата/нажата .. То есть активирована.. Только в том случае работает плаг (как я думаю)

Прикрепления: ccwS.sp(1.1 Kb)
 
Sunday Дата: Воскресенье, 24.02.2013, 17:08:34 | Сообщение # 11
Сообщений: 186
Репутация: 24 [ +/- ]
Спасибо DoK_1997!
 
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Блокировка и разблокировка кнопки от эвента.
  • Страница 1 из 1
  • 1
Поиск: