Написание плагинов

Someone

Участник
Сообщения
1,933
Реакции
1,653
тут понятие растяжимое, можно поконкретнее
Где-то на форуме. Правда это было под более старую версию и там всего-лишь ограничена команда и сам функционал плагина.

В принципе, если не сильно заморачиваться, то не трудно сделать.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Если чисто команду ограничить, и она регнута как консольная, можно заюзать Custom Features.
 

alexmy

Участник
Сообщения
284
Реакции
13
Всем привет, ребят подскажите а чем ошибка, проверки какой то не хватает?
C-подобный:
L 09/27/2017 - 09:58:03: SourceMod error session started
L 09/27/2017 - 09:58:03: Info (map "l4d_hospital05_rooftop") (file "errors_20170927.log")
L 09/27/2017 - 09:58:03: [SM] Native "GetEntProp" reported: Property "m_humanSpectatorUserID" not found (entity 5/player)
L 09/27/2017 - 09:58:03: [SM] Displaying call stack trace for plugin "bebop.smx":
L 09/27/2017 - 09:58:03: [SM]   [0]  Line 236, /home/groups/sourcemod/upload_tmp/phpcJUy0x.sp::HasIdlePlayer()
L 09/27/2017 - 09:58:03: [SM]   [1]  Line 164, /home/groups/sourcemod/upload_tmp/phpcJUy0x.sp::Timer_KickNoMoreNeededBot()
L 09/27/2017 - 09:59:47: [SM] Native "GetEntProp" reported: Property "m_humanSpectatorUserID" not found (entity 6/player)
L 09/27/2017 - 09:59:47: [SM] Displaying call stack trace for plugin "bebop.smx":
L 09/27/2017 - 09:59:47: [SM]   [0]  Line 236, /home/groups/sourcemod/upload_tmp/phpcJUy0x.sp::HasIdlePlayer()
L 09/27/2017 - 09:59:47: [SM]   [1]  Line 164, /home/groups/sourcemod/upload_tmp/phpcJUy0x.sp::Timer_KickNoMoreNeededBot()
L 09/27/2017 - 10:22:35: Error log file session closed.

PHP:
stock bool:HasIdlePlayer(bot)
{
    if(IsValidEntity(bot) && IsValidEdict(bot))
    {
        if(GetEntProp(bot, Prop_Send, "m_humanSpectatorUserID") == 0)
        {
            return true;
        }
        else return false;
    }
    return false;
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@alexmy, проперти не существует у энтити.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@alexmy, m_humanSpectatorUserID не существует у типа энтити игроков.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Grey83, это не КС. Очевидно же. В логах прямо пишет имя карты, которая есть только в L4D.
Оффтоп
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
хм, у меня дампы только для L4D2 имеются
 

alexmy

Участник
Сообщения
284
Реакции
13
Всем привет, ребята что за... Почему если сменить карту таймер уже не с 25 начинает отсчитывать а где то примерно с 15.
PHP:
pragma semicolon 1
#include <sourcemod>
#pragma newdecls required

bool lock, lock_timer;
int  unlock;

public void OnPluginStart()
{
    HookEvent("player_spawn", Event_PlayerSpawn, EventHookMode_Post);
    HookEvent("round_start",  EventRoundStart,   EventHookMode_Post);
}

public void EventRoundStart(Event event, const char[]name, bool dontBroadcast)
{
    lock = false, lock_timer = false;
}

public void Event_PlayerSpawn(Event event, const char[]name, bool dontBroadcast)
{
    if(lock)return;
    {
        int client = GetClientOfUserId(event.GetInt("userid"));
        if (IsClientInGame(client) && GetClientTeam(client) == 2) SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 0.0);
        {
            if(lock_timer)return;
            {
                unlock = 25;
                CreateTimer(1.0, timer_unlock, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
                lock_timer = true;
            }
        }
    }
}

public Action timer_unlock(Handle timer)
{
    unlock --;
    if(unlock > 0)
    {
        PrintHintTextToAll("Жди не суетись :D %d", unlock);
        return Plugin_Continue;
    }
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && GetClientTeam(i) == 2) SetEntPropFloat(i, Prop_Data, "m_flLaggedMovementValue", 1.0);
    }
    lock = true;
    return Plugin_Stop;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
что за хрень?
PHP:
    if(lock)return;
    {
PHP:
    if(lock_timer)return;
    {
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
попробуй вот так:
PHP:
#pragma semicolon 1
#pragma newdecls required

bool lock, lock_timer;
float StartTime;

public void OnPluginStart()
{
    HookEvent("round_start",  Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_spawn", Event_PlayerSpawn);
}

public void Event_RoundStart(Event event, const char[]name, bool dontBroadcast)
{
    lock = lock_timer = false;
}

public void Event_PlayerSpawn(Event event, const char[]name, bool dontBroadcast)
{
    if(lock) return;

    int client = GetClientOfUserId(event.GetInt("userid"));
    if(IsClientInGame(client) && GetClientTeam(client) == 2)
        SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 0.0);

    if(lock_timer) return;

    CreateTimer(1.0, timer_unlock, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
    StartTime = 25 + GetGameTime();
    lock_timer = true;
}

public Action timer_unlock(Handle timer)
{
    static int t;
    if((t = RoundToNearest(FloatSub(StartTime, GetGameTime()))) > 0)
    {
        PrintHintTextToAll("Жди, не суетись :D %d", t);
        return Plugin_Continue;
    }

    lock = true;

    for(int i = 1; i <= MaxClients; i++)
        if(IsClientInGame(i) && GetClientTeam(i) == 2)
            SetEntPropFloat(i, Prop_Data, "m_flLaggedMovementValue", 1.0);

    return Plugin_Stop;
}
--- Добавлено позже ---
Блокирую код после после возвращение true
Я про лишние фигурные скобки и лишние отступы
--- Добавлено позже ---
а вообще у меня в NMRiH для одного игрока событие спавна ловится ровно 3 раза (при одном-то возрождении) после начала раунда (только не скажу для первого игрока только или для всех)
 
Последнее редактирование:

alexmy

Участник
Сообщения
284
Реакции
13
попробуй вот так:
PHP:
#pragma semicolon 1
#pragma newdecls required

bool lock, lock_timer;
float StartTime;

public void OnPluginStart()
{
    HookEvent("round_start",  Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_spawn", Event_PlayerSpawn);
}

public void Event_RoundStart(Event event, const char[]name, bool dontBroadcast)
{
    lock = lock_timer = false;
}

public void Event_PlayerSpawn(Event event, const char[]name, bool dontBroadcast)
{
    if(lock) return;

    int client = GetClientOfUserId(event.GetInt("userid"));
    if(IsClientInGame(client) && GetClientTeam(client) == 2)
        SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 0.0);

    if(lock_timer) return;

    CreateTimer(1.0, timer_unlock, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
    StartTime = 25 + GetGameTime();
    lock_timer = true;
}

public Action timer_unlock(Handle timer)
{
    static int t;
    if((t = RoundToNearest(FloatSub(StartTime, GetGameTime()))) > 0)
    {
        PrintHintTextToAll("Жди, не суетись :D %d", t);
        return Plugin_Continue;
    }

    lock = true;

    for(int i = 1; i <= MaxClients; i++)
        if(IsClientInGame(i) && GetClientTeam(i) == 2)
            SetEntPropFloat(i, Prop_Data, "m_flLaggedMovementValue", 1.0);

    return Plugin_Stop;
}
--- Добавлено позже ---
Я про лишние фигурные скобки и лишние отступы
--- Добавлено позже ---
а вообще у меня в NMRiH для одного игрока событие спавна ловится ровно 3 раза (при одном-то возрождении) после начала раунда (только не скажу для первого игрока только или для всех)
Красиво что сказать=), но тоже самое что и у меня :D. Также с 15 вроде.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@alexmy, значит нужно отлавливать другое событие
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, значит нужно отлавливать другое событие
Ну я кстати уже задумывался об этом слишком рановато событие происходит. Может кто подкинет событие которое попозже срабатывает или какую нибудь функцию на подобие OnClientPostAdminCheck
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Ну я кстати уже задумывался об этом слишком рановато событие происходит. Может кто подкинет событие которое попозже срабатывает или какую нибудь функцию на подобие OnClientPostAdminCheck
Цель своего кода назови.
 

alexmy

Участник
Сообщения
284
Реакции
13
Цель своего кода назови.
Да надо первых игроков хоть на время притормозить, пока другие подключаются. Есть как бы другой вариант одним таймером отсрочить на пару секунд и потом запускать с обратный отсчетом, не люблю я использовать таймера, не хило слотовый сервер прогибает :D. Специально использовал EventHookMode_Post чтоб хоть на чуток позже сделать.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Специально использовал EventHookMode_Post чтоб хоть на чуток позже сделать.
Они по стандарту Post.

Вариант проще:
PHP:
#include <cstrike>

#pragma semicolon 1
#pragma newdecls required

g_iTimer;

public void OnMapStart()
{
    RequestFrame(FrameTimer); // Чтобы не убивался из-за TIMER_FLAG_NO_MAPCHANGE
}

void FrameTimer(bool bNothing)
{
    g_iTimer = 25.0;
    CreateTimer(1.0, HintTimer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}

public Action HintTimer(Handle hTimer)
{
    PrintHintTextToAll("Перезапуск игры через %d секунд.", g_iTimer);
   
    if(--g_iTimer == 0)
    {
        PrintHintTextToAll("Игра началась!");
        CS_TerminateRound(0.0, CSRoundEnd_Draw, true);
        return Plugin_Stop;
    }
   
    return Plugin_Continue;
}
 

alexmy

Участник
Сообщения
284
Реакции
13
Они по стандарту Post.

Вариант проще:
PHP:
#include <cstrike>

#pragma semicolon 1
#pragma newdecls required

g_iTimer;

public void OnMapStart()
{
    RequestFrame(FrameTimer); // Чтобы не убивался из-за TIMER_FLAG_NO_MAPCHANGE
}

void FrameTimer(bool bNothing)
{
    g_iTimer = 25.0;
    CreateTimer(1.0, HintTimer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}

public Action HintTimer(Handle hTimer)
{
    PrintHintTextToAll("Перезапуск игры через %d секунд.", g_iTimer);
  
    if(--g_iTimer == 0)
    {
        PrintHintTextToAll("Игра началась!");
        CS_TerminateRound(0.0, CSRoundEnd_Draw, true);
        return Plugin_Stop;
    }
  
    return Plugin_Continue;
}
Спс конеш, но игра не та, не будет работать=)
 
Сверху Снизу