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

paradoks5312

Участник
Сообщения
34
Реакции
7
Здравствуйте, нужен плагин блокирующий CT (передвигаться и стрелять нельзя) на N секунд (грубо говоря mp_freezetime только для СT )
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Здравствуйте, нужен плагин блокирующий CT (передвигаться и стрелять нельзя) на N секунд (грубо говоря mp_freezetime только для СT )
Можно, конечно, через OnPlayerRunCmd, но я так хочу
C++:
#include <cstrike>

#define TIME 4.0

bool bStop;

public void OnPluginStart()
{
    HookEvent("round_start", Start);
    HookEvent("player_spawn", spawn, EventHookMode_Post);
    HookEvent("weapon_fire", fire, EventHookMode_Pre);
}

public void spawn(Event hEvent, const char[] sEvent, bool bdb)
{
    int user = GetClientOfUserId(hEvent.GetInt("userid"));
    if(bStop && IsCT(user))
        SetEntityMoveType((user), MOVETYPE_NONE);
}

public void Start(Event hEvent, const char[] sEvent, bool bdb)
{
    bStop = true;       
    CreateTimer(TIME, Stopper);
}

public Action fire(Event hEvent, const char[] sEvent, bool bdb)
{
    if(bStop && IsCT(GetClientOfUserId(hEvent.GetInt("userid"))))
        return Plugin_Handled;
    return Plugin_Continue;
}

public Action Stopper(Handle hTimer)
{
    bStop ^= true;
    for(int i = 1; i <= MaxClients; i++)
        if(IsCT(i) && GetEntityMoveType(i) == MOVETYPE_NONE)
            SetEntityMoveType(i, MOVETYPE_WALK);
       
    return Plugin_Continue;
}

stock bool IsCT(int cl)
{
    return (0 < cl <= MaxClients && IsClientInGame(cl) && IsPlayerAlive(cl) && GetClientTeam(cl) == CS_TEAM_CT)
}
 
Последнее редактирование:

paradoks5312

Участник
Сообщения
34
Реакции
7
Можно, конечно, через OnPlayerRunCmd, но я так хочу
C++:
#include <cstrike>

#define TIME 4.0

bool bStop;

public void OnPluginStart()
{
    HookEvent("round_start", Start);
    HookEvent("player_spawn", spawn, EventHookMode_Post);
    HookEvent("weapon_fire", fire, EventHookMode_Pre);
}

public void spawn(Event hEvent, const char[] sEvent, bool bdb)
{
    int user = GetClientOfUserId(hEvent.GetInt("userid"));
    if(bStop && IsCT(user))
        SetEntityMoveType((user), MOVETYPE_NONE);
}

public void Start(Event hEvent, const char[] sEvent, bool bdb)
{
    bStop = true;       
    CreateTimer(TIME, Stopper);
}

public Action fire(Event hEvent, const char[] sEvent, bool bdb)
{
    if(bStop && IsCT(GetClientOfUserId(hEvent.GetInt("userid"))))
        return Plugin_Handled;
    return Plugin_Continue;
}

public Action Stopper(Handle hTimer)
{
    bStop ^= false;
    for(int i = 1; i <= MaxClients; i++)
        if(IsCT(i) && GetEntityMoveType(i) == MOVETYPE_NONE)
            SetEntityMoveType(i, MOVETYPE_WALK);
       
    return Plugin_Continue;
}

stock bool IsCT(int cl)
{
    return (0 < cl <= MaxClients && IsClientInGame(cl) && IsPlayerAlive(cl) && GetClientTeam(cl) == CS_TEAM_CT)
}
Закомпилил без ошибок, но скрипт не работает(
p.s ксс 34 cm 1.11
 

paradoks5312

Участник
Сообщения
34
Реакции
7
Еррор лог смотри
ошибок нет вообще
Сообщения автоматически склеены:

на 36 строке замени false на true

И что именно не работает?
Заменил, ничего не изменилось.
Не работает - ct могут двигаться и стрелять со старта раунда - по идее не должны в течении n секунд .
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
C-подобный:
public Action fire(Event hEvent, const char[] sEvent, bool bdb)
{
    if(bStop && IsCT(GetClientOfUserId(hEvent.GetInt("userid"))))
        return Plugin_Handled;
    return Plugin_Continue;
}
вообще-то блокировка этого события никогда не блокировала стрельбу =)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@paradoks5312, попробуй вот так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_hooks>

static const float CT_FREEZE_TIME = 5.0;    // время блокировки передвижения и стрельбы CT

Handle hTimer;

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start, EventHookMode_PostNoCopy);
    HookEvent("round_freeze_end", Event_Start, EventHookMode_PostNoCopy);
}

public void OnMapStart()
{
    hTimer = null;
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    if(hTimer)
    {
        CloseHandle(hTimer);
        hTimer = null;
    }

    if(name[6] == 'f') hTimer = CreateTimer(CT_FREEZE_TIME, Timer_Unfreeze, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Unfreeze(Handle timer)
{
    hTimer = null;
    return Plugin_Stop;
}

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
{
    if(hTimer && IsClientInGame(client) && GetClientTeam(client) == 3 && IsPlayerAlive(client))
    {
        buttons = 0;
        return Plugin_Changed;
    }

    return Plugin_Continue;
}
По идее должны блочиться любые действия игрока после окончания фризтайма на выставленное время. Время заморозки выставляется в выделенной строке.

Возможны баги, т.к. я не проверял вариант блокировки абсолютно всего. Обычно плагинами только нажатие кнопок блочится.
 
Последнее редактирование:

paradoks5312

Участник
Сообщения
34
Реакции
7
@paradoks5312, попробуй вот так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_hooks>

static const float CT_FREEZE_TIME = 5.0;    // время блокировки передвижения и стрельбы CT

Handle hTimer;

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start, EventHookMode_PostNoCopy);
    HookEvent("round_freeze_end", Event_Start, EventHookMode_PostNoCopy);
}

public void OnMapStart()
{
    hTimer = null;
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    if(hTimer) CloseHandle(hTimer);

    if(name[6] == 'f') hTimer = CreateTimer(CT_FREEZE_TIME, Timer_Unfreeze, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Unfreeze(Handle timer)
{
    hTimer = null;
    return Plugin_Stop;
}

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
{
    return hTimer && IsClientInGame(client) && GetClientTeam(client) == 3 && IsPlayerAlive(client) ? Plugin_Handled : Plugin_Continue;
}
По идее должны блочиться любые действия игрока после окончания фризтайма на выставленное время. Время заморозки выставляется в выделенной строке.

Возможны баги, т.к. я не проверял вариант блокировки абсолютно всего. Обычно плагинами только нажатие кнопок блочится.
Передвижение заблочено, стрелять можно , таймер не работает(проходит 5 сек и блок не спадает)
error:
L 10/03/2023 - 20:00:16: [SM] Blaming: freezCT.smx
L 10/03/2023 - 20:00:16: [SM] Call stack trace:
L 10/03/2023 - 20:00:16: [SM]   [0] CloseHandle
L 10/03/2023 - 20:00:16: [SM]   [1] Line 23, C:\addons\sourcemod\scripting_privat\freezCT.sp::Event_Start
L 10/03/2023 - 20:00:16: [SM] Exception reported: Handle 30501f2 is invalid (error 1)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@paradoks5312, исправил код выше (забыл обнулить хэндл после убийства таймера). Проверяй.
Сообщения автоматически склеены:

значит будем блочить другим способом
Сообщения автоматически склеены:

Если и это не поможет, то придётся вешать хуки на смену оружия игроком и на само оружие.
 
Последнее редактирование:

paradoks5312

Участник
Сообщения
34
Реакции
7
@paradoks5312, исправил код выше (забыл обнулить хэндл после убийства таймера). Проверяй.
Сообщения автоматически склеены:


значит будем блочить другим способом
Сообщения автоматически склеены:

Если и это не поможет, то придётся вешать хуки на смену оружия игроком и на само оружие.
Error при компиле
при компиляции:
//// freezCT.sp
//
// C:\addons\sourcemod\scripting\freezCT.sp(44) : error 001: expected token: ";", but found "}"
//
// 1 Error.
//
// Compilation Time: 0,06 sec
// ----------------------------------------
 

paradoks5312

Участник
Сообщения
34
Реакции
7
В конце 43-й строки нужно ; поставить: return Plugin_Changed;
Почти замечательно, блочит прыжок, приседание, стрельбу - осталось заблочить бег/ходьбу (прикрутить бы туда sm_speed 0 и все - а так все норм)
ероров нет.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@paradoks5312, с утра подумаю что можно сделать.
Хотя вроде ходить ирок не должен был тоже. Какими кнопками передвигаешься?
 

paradoks5312

Участник
Сообщения
34
Реакции
7
@paradoks5312, с утра подумаю что можно сделать.
Хотя вроде ходить ирок не должен был тоже. Какими кнопками передвигаешься?
Обычно wasd, но кто на какие биндит - разные могут быть.
Я попытался через "sm_speed @ct 0" - бегать ct не могут пока не убьют.
 
Сверху Снизу