Spróbujemy to ugryźć inaczej ![]()
guard_max_weapons "20" - maksymalna ilość broni na mapie // 20 - NS // 25 - Maksymalne dla stabilności // 30 - ryzyko crasha guard_weapon_life "10.0" - czas "życia" broni na ziemi // 10.0 - agresywne usuwanie // 15.0 - optymalne / stabline // 30.0 - długie, możliwy crash guard_max_edicts "900" - maksymalna ilośc encji na serwerze // 850 - bezpieczen / stabilne // 900 - optymalne / stabilne // 1000 - ryzykowne przy NS guard_safe_margin "100" - buffor bezpieczeństwa, plugin nie czeka az osiągniesz wartość z guard_max_edicts tylko reaguje odpowiednio wcześniej // 50 - pozna reakcja, możliwe ryzyko crasha // 100 - optymalne / stabilne // 150 - bezpieczne / stabilne // // dokładnie działa to tak [ guard_max_edicts - guard_safe_margin ] guard_debug "0" - debuger // 0 - off // 1 - on // loguje do konsoli co robi plugin oraz dodatkowo co spamuje enitami z innych pluginów
#include <amxmodx>
#include <reapi>
#define PLUGIN "Entity & Drop Fix"
#define VERSION "1.1"
#define AUTHOR "Misiaczek ;c / Err0r"
new g_pMaxWeapons;
new g_pWeaponLife;
new g_pMaxEdicts;
new g_pSafeMargin;
new g_pDebug;
new g_iWeaponCount;
new g_iEdictCount;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
g_pMaxWeapons = register_cvar("guard_max_weapons", "25");
g_pWeaponLife = register_cvar("guard_weapon_life", "15.0");
g_pMaxEdicts = register_cvar("guard_max_edicts", "900");
g_pSafeMargin = register_cvar("guard_safe_margin", "50");
g_pDebug = register_cvar("guard_debug", "0");
RegisterHookChain(RG_CBasePlayer_DropPlayerItem, "OnDrop", false);
RegisterHookChain(RG_CreateEntity, "OnEntityCreate", false);
RegisterHookChain(RG_RemoveEntity, "OnEntityRemove", true);
RegisterHookChain(RG_RoundEnd, "OnRoundEnd", true);
set_task(1.0, "CleanupWeapons", _, _, _, "b");
set_task(3.0, "FullSync", _, _, _, "b");
}
public plugin_cfg()
{
FullSync();
}
public OnDrop(const id, const char[] item)
{
if (!is_user_alive(id))
return HC_CONTINUE;
new max = get_pcvar_num(g_pMaxWeapons);
if (g_iWeaponCount >= max)
{
if (get_pcvar_num(g_pDebug))
client_print(id, print_center, "[GUARD] Limit broni!");
return HC_SUPERCEDE;
}
return HC_CONTINUE;
}
public OnEntityCreate(const ent, const char[] classname[])
{
if (!ent)
return HC_CONTINUE;
new maxEdicts = get_pcvar_num(g_pMaxEdicts);
new margin = get_pcvar_num(g_pSafeMargin);
if (g_iEdictCount >= (maxEdicts - margin))
{
if (IsRemovable(classname))
{
if (get_pcvar_num(g_pDebug))
server_print("[GUARD] BLOCK ENTITY: %s", classname);
return HC_SUPERCEDE;
}
}
if (equal(classname, "weaponbox"))
{
new maxWeapons = get_pcvar_num(g_pMaxWeapons);
if (g_iWeaponCount >= maxWeapons)
{
if (get_pcvar_num(g_pDebug))
server_print("[GUARD] BLOCK WEAPONBOX");
return HC_SUPERCEDE;
}
g_iWeaponCount++;
}
g_iEdictCount++;
return HC_CONTINUE;
}
public OnEntityRemove(const ent)
{
if (!is_entity(ent))
return HC_CONTINUE;
static classname[32];
get_entvar(ent, var_classname, classname, charsmax(classname));
if (equal(classname, "weaponbox"))
{
if (g_iWeaponCount > 0)
g_iWeaponCount--;
}
if (g_iEdictCount > 0)
g_iEdictCount--;
return HC_CONTINUE;
}
public CleanupWeapons()
{
new ent = -1;
new Float:time = get_gametime();
new Float:lifetime = get_pcvar_float(g_pWeaponLife);
while ((ent = rg_find_ent_by_class(ent, "weaponbox")))
{
if (!is_entity(ent))
continue;
if (IsC4(ent))
continue;
new Float:spawn;
get_entvar(ent, var_fuser1, spawn);
if (spawn == 0.0)
{
set_entvar(ent, var_fuser1, time);
continue;
}
if ((time - spawn) > lifetime)
{
rg_remove_entity(ent);
}
}
}
public FullSync()
{
new ent = -1;
g_iWeaponCount = 0;
g_iEdictCount = 0;
while ((ent = rg_find_ent_by_class(ent, "*")))
{
if (!is_entity(ent))
continue;
g_iEdictCount++;
static classname[32];
get_entvar(ent, var_classname, classname, charsmax(classname));
if (equal(classname, "weaponbox") && !IsC4(ent))
{
g_iWeaponCount++;
}
}
if (get_pcvar_num(g_pDebug))
{
server_print("[GUARD] Edicts: %d | Weapons: %d", g_iEdictCount, g_iWeaponCount);
}
}
public OnRoundEnd()
{
g_iWeaponCount = 0;
}
stock bool:IsRemovable(const classname[])
{
if (equal(classname, "weaponbox")) return true;
if (equal(classname, "armoury_entity")) return true;
if (equal(classname, "grenade")) return true;
return false;
}
stock bool:IsC4(ent)
{
static model[64];
get_entvar(ent, var_model, model, charsmax(model));
return containi(model, "c4") != -1;
}


Dodatki SourceMod




Moja zawartość
Mężczyzna






afkbombtransfer.amxx

