[SourcePawn] Урок 6 - Таймеры

suremiur

♂ overlay master ♂
Сообщения
537
Реакции
585
@MrChester, эта функция как раз так и работает, если ты именно команды имеешь ввиду, а не отлов любого слова из чата.
PHP:
public void OnPluginStart()
{
    RegConsoleCmd("sm_timer", Название функции);
}

public Action название функции (int iClient, int args)
{
    код
}
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
@MrChester, эта функция как раз так и работает, если ты именно команды имеешь ввиду, а не отлов любого слова из чата.
PHP:
public void OnPluginStart()
{
    RegConsoleCmd("sm_timer", Название функции);
}

public Action название функции (int iClient, int args)
{
    код
}

Так это работает в консоле, а мне надо чтобы любой человек написал кастомную фразу в чат и ему что - то написало.
Я так думаю что это надо Евент отлавливать, но не нашел такого
 

Tonki_Ton

Script kiddie
Сообщения
614
Реакции
375
Так это работает в консоле, а мне надо чтобы любой человек написал кастомную фразу в чат и ему что - то написало.
Я так думаю что это надо Евент отлавливать, но не нашел такого
Это работает и в чате, через триггер ! без sm_
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
@Tonki_Ton, @Tonki_Ton,

Вот, спасибо. То что я и искал, а как можно сделать, чтобы если человек писал в чат что - нибудь через триггер !, то проверялось бы через if подходит ли одна из команд - если нет, то делает чтобы в чат ничего не писалось?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #27
@MrChester, проверять первый символ:
PHP:
if(sArgs[0] == '!')
{
// Первый символ !
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #28
@R1KO, на некоторых редакциях OB движка (TF2, например) первым и последним символом в строке являются двойные кавычки. Клиент зачем-то оборачивает сообщение в них.
Так что имеет смысл сначала избавиться от них, и только потом работать со строкой.
PHP:
char szBuffer[256];
strcopy(szBuffer, sizeof(szBuffer), sArgs);
if (szBuffer[0] == '"') szBuffer[0] = ' ';
int iLastSymbol = strlen(szBuffer)-1;
if (szBuffer[iLastSymbol] == '"') szBuffer[iLastSymbol] = 0;
TrimString(szBuffer);

// подготовленная для работы строка - szBuffer, с нею и работаем
if (szBuffer[0] = '!') {
  // do some logic
}
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
@R1IKO, а как я могу за тестить свой плагин не покупаю хостинг или сервер?
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
@Kr1kuzya, пытаюсь - пытаюсь, запускаю батник и он сразу выключается. Не поможете с проблемой?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #32
@MrChester, это Вам уже в другую ветку на форуме. Но батник должен быть такого вида:
PHP:
srcds.exe -game tf2 -console +maxplayers 32 +map cp_dustbowl
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #33
@Kr1kuzya, уточнил бы, что ключ -game менять нужно в зависимости от игры.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #34
@Rabb1t, я думаю, что он сам догадается. Или надеюсь.
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #36
@MrChester, ну, значит это будет полезной информацией на будущее для других, кто знать не будет и случайно (или нет) увидит это.
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
Здравствуйте, снова встретился с проблемами. Компилятор ругается и видит ошибки в коде. Укажите на них пожалуйста, так как не понимаю, что не так.

PHP:
#include <cstrike>
#include <sourcemod>

bool g_bRespawn;

public void OnMapStart()
{
   RegConsoleCmd("sm_stopspawn", StopSpawn);
 
   HookEvent("player_death", Event_PlayerDeath);
}

public void OnRoundStart()
{
   for(int i = 1; i <= MaxClients; ++i)
   {
       if(IsClientInGame(i))
       {
           PrintToChat(i, "Если вы умрете, вы будете возрождены в течении 30 секунд после начала раунда");
       }
   }
   g_bRespawn = true;
   CreateTimer(30.0, Timer_Spawn, 0, TIMER_FLAG_NO_MAPCHANGE);
}

public Action StopSpawn(iClient)
{
   g_bRespawn = false;
   for(int i = 1; i <= MaxClients; ++i)
   {
       if(IsClientInGame(i))
       {
           PrintToChat(i, "Возрождение окончено, человеком по индексом %i", iClient);
       }
   }
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
   int iUserId = hEvent.GetInt("userid");
   int iClient = GetClientOfUserId(iUserId);
 
   if(iClient && g_bRespawn == true)
   {
       CS_RespawnPlayer(iClient);
   }
}

public Action Timer_Spawn(Handle hTimer)
{
   g_bRespawn = false;
   for(int i = 1; i <= MaxClients; ++i)
   {
       if(IsClientInGame(i))
       {
           PrintToChat(i, "Возрождение окончено по истечению времени");
       }
   }
}

Ошибки: Строка 8: error 100: function prototypes do not match
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #38
@MrChester, у функции StopSpawn должен быть еще один аргумент типа int. Туда записываются кол-во аргументов.
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
@MrChester, у функции StopSpawn должен быть еще один аргумент типа int. Туда записываются кол-во аргументов.

Спасибо! Работает
--- Добавлено позже ---
Все работает, но есть проблема. Возрождение то ли не работает, то ли кривое. Когда меня убивают я появляюсь у себя на спавне, не могу двигаться, стрелять и прыгать.
Игра: CS:GO
Что делать в таком случае?
Функция: CS_RespawnPlayer(iClient);
 
Последнее редактирование:

MAGNAT2645

Участник
Сообщения
63
Реакции
7
Как лучше следует работать с таймерами, которые хранятся глобально, они повторяющиеся и должны обновлять HUD игроков (именно каждый таймер отдельно, в виде массива) ?

Проблема в том, что перед отображением HUD-текста, я проверяю на наличие нажатой IN_SCORE. Логи ошибок постоянно спамят что-то типа:
Entity 1 (1) is invalid (функция GetClientButtons)

Я так понимаю, это из-за того, что игрок "не в игре".
При создании таймера я добавляю индекс клиента как data в каллбэк, и удаляю таймер при отключении игрока. Как такая ошибка может возникать?
 
Сверху Снизу