Гранаты после реса

umbRel1a

Участник
Сообщения
24
Реакции
4
Нужен плагин.
На дм сервер. Что бы при каждом возрождении появлялась граната в инвентаре и после каждого 4 убийства тоже давалась грена.
Друзья хелпаните пожалуйста!
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
а как убийства считаются?
от начала раунда или от спавна игрока?
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Нужен плагин.
На дм сервер. Что бы при каждом возрождении появлялась граната в инвентаре и после каждого 4 убийства тоже давалась грена.
Друзья хелпаните пожалуйста!
C-подобный:
#include <sdktools_functions>

int Kills[MAXPLAYERS +1];

public OnMapStart()
{
    HookEvent("player_spawn", player_spawn);
    HookEvent("player_death", player_death);
}

public Action player_spawn(Event event, const char[] name, bool dontBroadcast)
{
    int iClient = GetClientOfUserId(GetEventInt(event, "userid"));
    if(GetPlayerWeaponSlot(iClient, 3) == -1)
    {
        GivePlayerItem(iClient, "weapon_hegrenade");
        Kills[iClient] = 0;

    }
}

public Action player_death(Event event, const char[] name, bool dontBroadcast)
{
    int iAttacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    if(iAttacker > 0 && GetClientTeam(iAttacker) != GetClientTeam(GetClientOfUserId(GetEventInt(event, "userid"))))
    {
        ++Kills[iAttacker];
        if(Kills[iAttacker] == 4)
        {
            GivePlayerItem(iAttacker, "weapon_hegrenade");
            Kills[iAttacker] = 0;
        }
        else if(Kills[iAttacker] > 4)
        {
            Kills[iAttacker] = 0;
        }
    }
}

public void OnClientPostAdminCheck(int iClient)
{
    Kills[iClient] = 0;
}
 

umbRel1a

Участник
Сообщения
24
Реакции
4
C-подобный:
#include <sdktools_functions>

int Kills[MAXPLAYERS +1];

public OnMapStart()
{
    HookEvent("player_spawn", player_spawn);
    HookEvent("player_death", player_death);
}

public Action player_spawn(Event event, const char[] name, bool dontBroadcast)
{
    int iClient = GetClientOfUserId(GetEventInt(event, "userid"));
    if(GetPlayerWeaponSlot(iClient, 3) == -1)
    {
        GivePlayerItem(iClient, "weapon_hegrenade");
        Kills[iClient] = 0;

    }
}

public Action player_death(Event event, const char[] name, bool dontBroadcast)
{
    int iAttacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    if(iAttacker > 0 && GetClientTeam(iAttacker) != GetClientTeam(GetClientOfUserId(GetEventInt(event, "userid"))))
    {
        ++Kills[iAttacker];
        if(Kills[iAttacker] == 4)
        {
            GivePlayerItem(iAttacker, "weapon_hegrenade");
            Kills[iAttacker] = 0;
        }
        else if(Kills[iAttacker] > 4)
        {
            Kills[iAttacker] = 0;
        }
    }
}

public void OnClientPostAdminCheck(int iClient)
{
    Kills[iClient] = 0;
}
Братанчик спасибо огромное.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@KiKiEEKi, я бы чуть иначе сделал (кроме того я бы на твоём месте не создавал хуки при каждом старте карт ^_^):
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>

int
    iNadesMax,
    iFrags[MAXPLAYERS+1];

public void OnPluginStart()
{
    if(GetEngineVersion() != Engine_CSS) ThrowError("Plugin for CS:S OB only!");

    ConVar cvar = FindConVar("ammo_hegrenade_max");    // максимальное количество гранат у игрока
    if(cvar)
    {
        cvar.AddChangeHook(HEMaxChanged);
        iNadesMax = cvar.IntValue;
    }

    HookEvent("player_spawn", Event_Spawn);
    HookEvent("player_death", Event_Death);
}

public void HEMaxChanged(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    iNadesMax = cvar.IntValue;
}

public void Event_Spawn(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    iFrags[client] = 0;
    GiveHEGrenade(client);
}

public void Event_Death(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("attacker")), t;
    if(!client || (t = GetClientTeam(client)) < 2 || !IsPlayerAlive(client))    // нам нужны только живые
        return;

    int victim = GetClientOfUserId(event.GetInt("userid"));
    if(!victim || t == GetClientTeam(victim))    // тимкилл игнорируем
        return;

    iFrags[client]++;
    GiveHEGrenade(client);
}

stock void GiveHEGrenade(int client)
{
    if(iFrags[client] % 4) return;    // выдаём гранату только за каждый 4-й фраг

    static int ammo, num;
    if(ammo < 45) ammo = FindSendPropInfo("CCSPlayer", "m_iAmmo") + 44;    // 11 * 4
    if((num = GetEntData(client, ammo)) < 1) GivePlayerItem(client, "weapon_hegrenade");
    else if(++num <= iNadesMax) SetEntData(client, ammo, num, 4, true);
}
У тебя как минимум нескольких проверок не хватает: плагин может попытаться выдать гранату мёртвому игроку (можно убить гранатой после своей смерти) или самоубийце.
И обнулять количество фрагов каждые 4 фрага не нужно: у int в знаковом виде максимальное значение чуть больше 2 миллиардов. Не думаю, что за одну жизнь игрок может получить столько фрагов. =)
Вообще нужно бы учитывать наличие гранат у игрока и значения кваров, ограничивающих их количество у игрока (гранаты будут выпадать при превышении этого количества, емнип).
 

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
@KiKiEEKi, я бы чуть иначе сделал (кроме того я бы на твоём месте не создавал хуки при каждом старте карт ^_^):
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>

int
    iNadesMax,
    iFrags[MAXPLAYERS+1];

public void OnPluginStart()
{
    if(GetEngineVersion() != Engine_CSS) ThrowError("Plugin for CS:S OB only!");

    ConVar cvar = FindConVar("ammo_hegrenade_max");    // максимальное количество гранат у игрока
    if(cvar)
    {
        cvar.AddChangeHook(HEMaxChanged);
        iNadesMax = cvar.IntValue;
    }

    HookEvent("player_spawn", Event_Spawn);
    HookEvent("player_death", Event_Death);
}

public void HEMaxChanged(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    iNadesMax = cvar.IntValue;
}

public void Event_Spawn(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    iFrags[client] = 0;
    GiveHEGrenade(client);
}

public void Event_Death(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("attacker")), t;
    if(!client || (t = GetClientTeam(client)) < 2 || !IsPlayerAlive(client))    // нам нужны только живые
        return;

    int victim = GetClientOfUserId(event.GetInt("userid"));
    if(!victim || t == GetClientTeam(victim))    // тимкилл игнорируем
        return;

    iFrags[client]++;
    GiveHEGrenade(client);
}

stock void GiveHEGrenade(int client)
{
    if(iFrags[client] % 4) return;    // выдаём гранату только за каждый 4-й фраг

    static int ammo, num;
    if(ammo < 45) ammo = FindSendPropInfo("CCSPlayer", "m_iAmmo") + 44;    // 11 * 4
    if((num = GetEntData(client, ammo)) < 1) GivePlayerItem(client, "weapon_hegrenade");
    else if(++num <= iNadesMax) SetEntData(client, ammo, num, 4, true);
}
У тебя как минимум нескольких проверок не хватает: плагин может попытаться выдать гранату мёртвому игроку (можно убить гранатой после своей смерти) или самоубийце.
И обнулять количество фрагов каждые 4 фрага не нужно: у int в знаковом виде максимальное значение чуть больше 2 миллиардов. Не думаю, что за одну жизнь игрок может получить столько фрагов. =)
Вообще нужно бы учитывать наличие гранат у игрока и значения кваров, ограничивающих их количество у игрока (гранаты будут выпадать при превышении этого количества, емнип).
А чтоб 2-3 гранаты выдать,то как сделать?
Заранее благодарю!
Версия игры 34
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@-=|УЧЕНИК|=-, значеник квара тогда нужно менять в игре. Тогда плагин даст и 3, и больше.


P.S. Если нужно чтобы выдавалось больше 1 гранаты за раз, то нужно переписать часть кода на строке 58 (если нужно сделать чтобы количество можно было изменять кваром, то понадобится ещё кое-где добавлять код).

Вот этот вариаент быдет выдавать количество гранат, устанавливаемое кваром sm_henade_give (плагин создаст конфиг с именем henade_give), но не больше, чем прописано в значении квара ammo_hegrenade_max.
 

Вложения

  • sm_henade_give 11.05.2024.sp
    2.8 КБ · Просмотры: 4
Последнее редактирование:
Сверху Снизу