Напишите простенький плагин

Lominad

Участник
Сообщения
195
Реакции
33
Привет всем, можете, пожалуйста, написать простенький плагин?
Его суть: Когда в какой-либо команде осталось в живых 2 и менее игроков выполнялась команда sv_alltalk 0, и после победы одной из команд сразу ставилось обратно sv_alltalk 1. При этом, чтобы была проверка на кол-во игроков на сервере. Если в общем меньше 10, плаг не срабатывал.
Заранее спасибо
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
Lominad, я понял, скинул как основу для тех кто будет делать. Немного изменить и будет то что нужно
 

DarklSide

Участник
Сообщения
931
Реакции
468
Lominad, не проверял:
PHP:
#include <sourcemod>
const int imaximum = 10;
const int ilife = 2;
Handle h_Cvar_Alltalk = INVALID_HANDLE;
bool binmin = false;
public void OnPluginStart()
{
    HookEvent("player_death", Event_OnPlayerDeath, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_OnRoundEnd, EventHookMode_PostNoCopy);
    h_Cvar_Alltalk = FindConVar("sv_alltalk");
}
public Action Event_OnPlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    if (!binmin)
    {
        checks();
    }
    return Plugin_Continue;
}
public void Event_OnRoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    if (!binmin)
    {
        SetConVarBool(h_Cvar_Alltalk, true);
        PrintToChatAll("Конец");
    }
	binmin = false;
}
public void OnClientDisconnect(int client)
{
    if (!binmin)
    {
        checks();
    }
}
stock void checks()
{
    int iplayer = 0, iteamt = 0, iteamct = 0;
    for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i))
        {
            iplayer++;
            if (IsPlayerAlive(i))
            {
                if (GetClientTeam(i) == 2)
                {
                    iteamt++;
                }
                else if (GetClientTeam(i) == 3)
                {
                    iteamct++;
                }
            }
        }
    }
    if (iplayer > imaximum)
    {
        if (iteamt <= ilife || iteamct <= ilife)
        {
            SetConVarBool(h_Cvar_Alltalk, false);
            PrintToChatAll("Talk = 0");
        }
    }
    else
    {
        binmin = true;
    }
}
 
Последнее редактирование:

Lominad

Участник
Сообщения
195
Реакции
33
DarklSide, Забыл упомянуть v34
C-подобный:
 SourceMod Version Information:
    SourceMod Version: 1.5.3
    SourcePawn Engine: SourcePawn 1.1, jit-x86 (build 1.5.3)
    SourcePawn API: v1 = 4, v2 = 4
    Compiled on: May 26 2014 13:53:29
    Build ID: 3946:238c41726d73
 

DarklSide

Участник
Сообщения
931
Реакции
468
Lominad, sm1.7.0-

PHP:
#include <sourcemod>
new const imaximum = 10;
new const ilife = 2;
new Handle:h_Cvar_Alltalk = INVALID_HANDLE;
new bool:binmin = false;
public OnPluginStart()
{
    HookEvent("player_death", Event_OnPlayerDeath, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_OnRoundEnd, EventHookMode_PostNoCopy);
    h_Cvar_Alltalk = FindConVar("sv_alltalk");
}
public Action:Event_OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    if (!binmin)
    {
        checks();
    }
    return Plugin_Continue;
}
public Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    if (!binmin)
    {
        SetConVarBool(h_Cvar_Alltalk, true);
        PrintToChatAll("Конец");
    }
	binmin = false;
}
public OnClientDisconnect(client)
{
    if (!binmin)
    {
        checks();
    }
}
stock checks()
{
    new iplayer = 0, iteamt = 0, iteamct = 0;
    for (new i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i))
        {
            iplayer++;
            if (IsPlayerAlive(i))
            {
                if (GetClientTeam(i) == 2)
                {
                    iteamt++;
                }
                else if (GetClientTeam(i) == 3)
                {
                    iteamct++;
                }
            }
        }
    }
    if (iplayer > imaximum)
    {
        if (iteamt <= ilife || iteamct <= ilife)
        {
            SetConVarBool(h_Cvar_Alltalk, false);
            PrintToChatAll("Talk = 0");
        }
    }
    else
    {
        binmin = true;
    }
}
 
Последнее редактирование:

Lominad

Участник
Сообщения
195
Реакции
33
DarklSide, поставил, работает без ошибок, но ничего не делает. На момент проверки на сервере 19 человек
При изменении sv_alltalk, в чате это отобразится?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #12
PHP:
public OnPluginStart()
{
	HookEvent("player_death", Event_OnPlayerDeath, EventHookMode_PostNoCopy);
	HookEvent("round_start", Event_OnRoundEnd, EventHookMode_PostNoCopy);
	h_Cvar_Alltalk = FindConVar("sv_alltalk");
	new iFlags = GetConVarFlags(h_Cvar_Alltalk)
	if(!(iFlags & FCVAR_NOTIFY))
	{
		iFlags |= FCVAR_NOTIFY
		SetConVarFlags(h_Cvar_Alltalk, iFlags);
	}
}
Так должно уведомлять в чат

up
 
Последнее редактирование:

Lominad

Участник
Сообщения
195
Реакции
33
DarklSide, Все работает, спасибо.

R1KO, "hndl" как неизвестная

Добавлено через 6 минут
DarklSide, А можно ли сделать, чтобы sv_alltalk 1 вкл сразу после смерти последнего игрока проигравшей команды, а не в сл. раунде после победы?
 
Последнее редактирование:

Lominad

Участник
Сообщения
195
Реакции
33
R1KO, уведомление не работает)
PrintTochat можете сделать? Чтобы свое вписать
 

DarklSide

Участник
Сообщения
931
Реакции
468
SetConVarBool, его 4-ый параметр - для его англ. уведомления.

После каждого (2) SetConVarBool ->
PrintToChatAll("Здесь что-то там");
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #18
Оффтоп
 

Lominad

Участник
Сообщения
195
Реакции
33
Грасиас ребят =)

Добавлено через 49 минут
DarklSide, cvar не возвращается после взрыва,обезвреживания бомбы(
 
Последнее редактирование:
Сверху Снизу