#include <amxmodx>
#include <reapi>
#define SHIELD_LIMIT 1 // Количество Щитов на каждую команду
#define ACCESS_IMMUNITY ADMIN_RCON // Иммунитет к функциям плагина. Для отключения, пропишите: ADMIN_ALL
new g_iShieldCount[3];
new bool:g_bUseShield[33];
public plugin_init()
{
register_plugin("Shield Limitter", "1.5", "WILL BE");
new sPref[][] = {"awp_", "aim_", "35hp", "fy_"};
new map[32]; get_mapname(map, charsmax(map));
for(new i; i < sizeof sPref; i++)
{
if(containi(map, sPref[i]) != -1)
{
pause("ad");
return;
}
}
RegisterHookChain(RG_CBasePlayer_HasRestrictItem, "HasRestrictItem_Pre");
RegisterHookChain(RG_CSGameRules_RestartRound, "RestartRound_Pre");
register_event("DeathMsg", "eDeathMsg", "a");
}
public HasRestrictItem_Pre(id, ItemID:iItem, ItemRestType:iRestType)
{
if(iRestType != ITEM_TYPE_BUYING) return HC_CONTINUE;
new team = get_user_team(id);
if(iItem == ITEM_SHIELDGUN)
{
#if ACCESS_IMMUNITY != ADMIN_ALL
if(~get_user_flags(id) & ACCESS_IMMUNITY && g_iShieldCount[team] >= SHIELD_LIMIT)
#else
if(g_iShieldCount[team] >= SHIELD_LIMIT)
#endif
{
client_print_color(id, print_team_default, "[^4Shield Limit^1] Достигнуто ^3максимальное ^1количество ^4Щитов ^1на команду [^3%d^1/^3%d^1]", g_iShieldCount[team], SHIELD_LIMIT);
SetHookChainReturn(ATYPE_INTEGER, true);
return HC_SUPERCEDE;
}
else
{
g_iShieldCount[team]++;
g_bUseShield[id] = true;
}
}
else
{
if(g_iShieldCount[team])
g_iShieldCount[team]--;
g_bUseShield[id] = false;
}
return HC_CONTINUE;
}
public eDeathMsg()
FuncDiscDeath(read_data(2));
public client_disconnected(id)
FuncDiscDeath(id);
FuncDiscDeath(id)
{
if(!g_bUseShield[id]) return;
new team = get_user_team(id);
if(g_iShieldCount[team])
g_iShieldCount[team]--;
g_bUseShield[id] = false;
}
public RestartRound_Pre()
{
new players[32], pnum, i;
arrayset(g_iShieldCount, 0, 3);
get_players(players, pnum, "ae", "TERRORIST");
for(i = 0; i < pnum; i++)
{
if(get_member(players[i], m_bOwnsShield))
{
g_iShieldCount[1]++;
g_bUseShield[players[i]] = true;
} else g_bUseShield[players[i]] = false;
}
get_players(players, pnum, "ae", "CT");
for(i = 0; i < pnum; i++)
{
if(get_member(players[i], m_bOwnsShield))
{
g_iShieldCount[2]++;
g_bUseShield[players[i]] = true;
} else g_bUseShield[players[i]] = false;
}
}
Ну во-первых ватит лепить костыли на паузу плагинов методом перебора contain. Есть конфигурация плагинов для карт по префиксам и названии. Там и должно быть отключениеКод:new sPref[][] = {"awp_", "aim_", "35hp", "fy_"}; new map[32]; get_mapname(map, charsmax(map)); for(new i; i < sizeof sPref; i++) { if(containi(map, sPref[i]) != -1) { pause("ad"); return; } }
new bool:g_bUseShield[33];
-> new bool:g_bUseShield[MAX_PLAYERS + 1];
TeamNames:get_member(id, m_iTeam);
bind_pcvar_float( create_cvar("awplimit_limit_ratio", "0.3", .description = "Кол-во слотов на команду = (игроки_онлайн / 2) * awplimit_limit_ratio",
.has_min = true, .min_val = 0.01), Float:g_eCvar[CVAR__LIMIT_RATIO] );
switch(iRestType) {
case ITEM_TYPE_TOUCHED: {
if(get_member(id, m_bHasPrimary)) {
return HC_CONTINUE
}
if(g_fLastFailTime[id] && get_gametime() - g_fLastFailTime[id] < CACHE_TIME) {
SetHookChainReturn(ATYPE_INTEGER, true)
return HC_SUPERCEDE
}
}
case ITEM_TYPE_EQUIPPED: {
return HC_CONTINUE
}
}
switch(iRestType) {
case ITEM_TYPE_TOUCHED: {
if(get_member(id, m_bOwnsShield)) {
return HC_CONTINUE
}
if(g_fLastFailTime[id] && get_gametime() - g_fLastFailTime[id] < CACHE_TIME) {
SetHookChainReturn(ATYPE_INTEGER, true)
return HC_SUPERCEDE
}
}
case ITEM_TYPE_EQUIPPED: {
return HC_CONTINUE
}
}
там же описание есть, и оно как бы намекает. динамический просчёт кол-ва единиц предмета на команду. крутим значение в большую сторону - станет доступно больше при меньшем значении игроков. крутим в меньшую - наоборот. Форумула описана.я не понимаю для чего он
Ну так что мешает отпилить контроль минимального кол-ва игроков? Это квар awplimit_min_players и проверкатам просто не даст взять если игроков меньше указанного кол.-ва.
iRealCount < g_eCvar[CVAR__MIN_PLAYERS]
OnHasRestrictItem_Pre
if(type == ITEM_TYPE_BUYING)