после каждого спавна игрока.а как убийства считаются?
от начала раунда или от спавна игрока?
Нужен плагин.
На дм сервер. Что бы при каждом возрождении появлялась граната в инвентаре и после каждого 4 убийства тоже давалась грена.
Друзья хелпаните пожалуйста!
#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;
}
Братанчик спасибо огромное.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; }
#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);
}
А чтоб 2-3 гранаты выдать,то как сделать?@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 миллиардов. Не думаю, что за одну жизнь игрок может получить столько фрагов. =)
Вообще нужно бы учитывать наличие гранат у игрока и значения кваров, ограничивающих их количество у игрока (гранаты будут выпадать при превышении этого количества, емнип).
sm_henade_give
(плагин создаст конфиг с именем henade_give), но не больше, чем прописано в значении квара ammo_hegrenade_max
.