Fatal error 100 cannot read from file reapi

пытаюсь компилировать плагин , скачал от сюда https://dev-cs.ru/resources/945/
#include <amxmodx>
#include <amxmisc>
#include <reapi>
#include <fakemeta>
#include <hamsandwich>

#include <auw>

new const PLUGIN_NAME[] = "Advanced Ultimate Weapons";
new const PLUGIN_VERSION[] = "0.1.0b";

enum _:eCvarsData
{
FLAG_ACCESS[5],
MENU_ACCESS_TYPE,
DISCOUNT,
Float: BUYTIME,
MENU_ROUND,
BUYZONE,
MENU_DAMAGE,
CMD_ACCESS[5],
GIVE_TYPE,
PICKUP_ACCESS_TYPE,
TRACE_TYPE
}; new g_pCvar[eCvarsData];

enum eHamHooks
{
HamHook: TRACEATTACK[5],
HamHook: TOUCH
}; new g_pHamHooks[eHamHooks];

enum eReapiHooks
{
HookChain: DEPLOY,
HookChain: SETMODEL,
}; new g_pReapiHooks[eReapiHooks];

#define var_weaponkey var_iuser4
#define var_modelview var_noise1
#define var_modelplayer var_noise2
#define var_modelworld var_message
#define var_weapontrace var_iuser2
#define var_weaponflags var_iuser1

#define getWeaponKey(%0) get_entvar(%0, var_weaponkey)
#define getWeaponModelView(%0,%1,%2) get_entvar(%0, var_modelview, %1, %2)
#define getWeaponModelPlayer(%0,%1,%2) get_entvar(%0, var_modelplayer, %1, %2)
#define getWeaponModelWorld(%0,%1,%2) get_entvar(%0, var_modelworld, %1, %2)
#define getWeaponTrace(%0) get_entvar(%0, var_weapontrace)
#define getWeaponFlags(%0) get_entvar(%0, var_weaponflags)

#define setWeaponKey(%0,%1) set_entvar(%0, var_iuser4, %1)
#define setWeaponModelView(%0,%1) set_entvar(%0, var_modelview, %1)
#define setWeaponModelPlayer(%0,%1) set_entvar(%0, var_modelplayer, %1)
#define setWeaponModelWorld(%0,%1) set_entvar(%0, var_modelworld, %1)
#define setWeaponTrace(%0,%1) set_entvar(%0, var_weapontrace, %1)
#define setWeaponFlags(%0,%1) set_entvar(%0, var_weaponflags, %1)

#define IsComment(%0) (%0[0] == EOS || %0[0] == 10 || %0[0] == 13 || %0[0] == ';' || %0[0] == '#' || (%0[0] == '/' && %0[1] == '/'))
#define rg_get_user_money(%0) get_member(%0, m_iAccount)
#define MAXWEAPONS 128

#define IsPlayer(%1) bool:(%1 && %1 <= MAX_PLAYERS)
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) (%1 |= (1 << (%2 & 31)))
#define reset_bit(%1,%2) (%1 &= ~(1 << (%2 & 31)))

new g_bClientConnected;
new Array: g_aWeaponData;
new Trie: g_tWeaponClcmd;
new g_iWeaponsCount;
new g_iLaserBeam;
new g_pCvarBuyTime;
new g_iClcmdIndex[MAXWEAPONS];
new Float: g_flTouchTime[MAX_PLAYERS + 1];
new const sFile[] = "ultimate_weapons.ini";

new g_iForwards[eAUWForwards];

public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, "steelzzz");

register_clcmd("say /ultimate", "Command_ShowUltimateMenu");
register_concmd("buyultimate", "Command_ShowUltimateMenu");
register_concmd("weapons_give", "Command_GiveWeapon");

g_pHamHooks[TRACEATTACK][0] = RegisterHam(Ham_TraceAttack, "player", "CWeapon_TraceAttack_Post", .Post = true);
g_pHamHooks[TRACEATTACK][1] = RegisterHam(Ham_TraceAttack, "info_target", "CWeapon_TraceAttack_Post", .Post = true);
g_pHamHooks[TRACEATTACK][2] = RegisterHam(Ham_TraceAttack, "func_breakable", "CWeapon_TraceAttack_Post", .Post = true);
g_pHamHooks[TRACEATTACK][3] = RegisterHam(Ham_TraceAttack, "hostage_entity", "CWeapon_TraceAttack_Post", .Post = true);
g_pHamHooks[TRACEATTACK][4] = RegisterHam(Ham_TraceAttack, "worldspawn", "CWeapon_TraceAttack_Post", .Post = true);
g_pHamHooks[TOUCH] = RegisterHam(Ham_Touch, "weaponbox", "CWeapon_Touch_Pre", .Post = false);

g_pReapiHooks[DEPLOY] = RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "CWeapon_DefaultDeploy_Pre", .post = false);
g_pReapiHooks[SETMODEL] = RegisterHookChain(RG_CWeaponBox_SetModel, "CWeapon_SetModel_Pre", .post = false);

stateHooks(true);

register_dictionary("auw.txt");

g_iForwards[eAUWForwards_OnGiveItemPre] = CreateMultiForward("auw_on_give_item_pre", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL, FP_CELL);
}

public plugin_cfg()
{
register_cvar("auw_version", PLUGIN_VERSION, FCVAR_SERVER | FCVAR_SPONLY);

bind_pcvar_string(create_cvar("weapons_flag", "t", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_FLAG")), g_pCvar[FLAG_ACCESS], sizeof(g_pCvar[FLAG_ACCESS]));
bind_pcvar_num(create_cvar("weapons_access", "2", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_ACCESS"), .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 2.0), g_pCvar[MENU_ACCESS_TYPE]);
bind_pcvar_num(create_cvar("weapons_disc", "30", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_DISC"), .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 100.0), g_pCvar[DISCOUNT]);
bind_pcvar_float(create_cvar("weapons_time", "2.0", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_TIME"), .has_min = true, .min_val = 0.0), g_pCvar[BUYTIME]);
bind_pcvar_num(create_cvar("weapons_firstround", "3", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_FIRSTROUND"), .has_min = true, .min_val = 0.0), g_pCvar[MENU_ROUND]);
bind_pcvar_num(create_cvar("weapons_zone", "1", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_ZONE"), .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0), g_pCvar[BUYZONE]);
bind_pcvar_num(create_cvar("weapons_menu_dmg", "0", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_MENU_DMG"), .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0), g_pCvar[MENU_DAMAGE]);
bind_pcvar_string(create_cvar("weapons_cmd_access", "t", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_CMD_ACCESS")), g_pCvar[CMD_ACCESS], sizeof(g_pCvar[CMD_ACCESS]));
bind_pcvar_num(create_cvar("weapons_give_type", "2", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_GIVE_TYPE"), .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 2.0), g_pCvar[GIVE_TYPE]);
bind_pcvar_num(create_cvar("weapons_pickup_access_type", "0", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_TOUCH"), .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0), g_pCvar[PICKUP_ACCESS_TYPE]);
bind_pcvar_num(create_cvar("weapons_trace_type", "0", .description = fmt("%L", LANG_SERVER, "CVAR_WEAPONS_TRACE_TYPE"), .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0), g_pCvar[TRACE_TYPE]);

g_pCvarBuyTime = get_cvar_pointer("mp_buytime");

AutoExecConfig(true, "auw");
}

public plugin_natives()
{
register_native(__auw__native_str__get_weapon_uid, "Native_GetWeaponUid", false);
register_native(__auw__native_str__give_weapon, "Native_GiveWeapon", false);
register_native(__auw__native_str__valid_weapon, "Native_ValidWeapon", false);
register_native(__auw__native_str__get_weapons_data, "Native_GetWeaponsData", false);
}

public Native_GetWeaponUid(iPlugin, iParams)
{
enum { arg_buyname = 1, arg_is_uid_with_offset };

new sWeaponName[32];
get_string(arg_buyname, sWeaponName, charsmax(sWeaponName));

new iWeaponId;

if(!TrieGetCell(g_tWeaponClcmd, sWeaponName, iWeaponId))
{
return -1;
}

if(!get_param(arg_is_uid_with_offset))
{
return iWeaponId;
}

return iWeaponId + AUW_IMPULSE_OFFSET;
}

public Native_GiveWeapon(iPlugin, iParams)
{
enum { arg_player = 1, arg_weaponname, arg_show_notification, arg_uid, arg_is_uid_with_offset, arg_buy };

static forceCheckUid; forceCheckUid = false;

new iPlayer = get_param(arg_player);

if(!is_user_connected(iPlayer))
{
return false;
}

new sWeaponName[32];
get_string(arg_weaponname, sWeaponName, charsmax(sWeaponName));

new iWeaponId;
new uId = get_param(arg_uid);

if(uId != -1)
{
forceCheckUid = true;
if(get_param(arg_is_uid_with_offset))
{
uId -= AUW_IMPULSE_OFFSET;
}
}

if(!forceCheckUid)
{
if(!TrieGetCell(g_tWeaponClcmd, sWeaponName, iWeaponId))
{
return false;
}
}
else
{
if(uId < 0 || uId >= ArraySize(g_aWeaponData))
{
return false;
}
iWeaponId = uId;
}

new bool: notification = true;

notification = bool: get_param(arg_show_notification);

new iBuy = get_param(arg_buy);

return giveItem(iPlayer, iWeaponId, iBuy ? 1 : 0, eAUWGiveItemTypes_Native, notification);
}

public Native_ValidWeapon(iPlugin, iParams)
{
enum { arg_item = 1, arg_uid, arg_is_uid_with_offset };

new iItem = get_param(arg_item);

if(is_nullent(iItem))
{
return false;
}

new iKey = get_param(arg_uid);

if(!get_param(arg_is_uid_with_offset))
{
iKey += AUW_IMPULSE_OFFSET;
}

return bool:(IsCustomWeapon(iItem, iKey));
}

public Native_GetWeaponsData(iPlugin, iParams)
{
enum { arg_uid = 1, arg_array, arg_is_uid_with_offset };

new iKey = get_param(arg_uid);

if(get_param(arg_is_uid_with_offset))
{
iKey -= AUW_IMPULSE_OFFSET;
}

if(!(0 <= iKey < g_iWeaponsCount))
{
return false;
}

new aData[eAUWData];
ArrayGetArray(g_aWeaponData, iKey, aData);

return set_array(arg_array, aData, eAUWData);
}

public client_putinserver(iPlayer)
{
if(is_user_hltv(iPlayer) || is_user_bot(iPlayer))
{
return;
}

set_bit(g_bClientConnected, iPlayer);
}

public client_disconnected(iPlayer)
{
reset_bit(g_bClientConnected, iPlayer);
g_flTouchTime[iPlayer] = 0.0;
}

getClcmdIndex(iIndex)
{
for(new i = 0; i < MAXWEAPONS; i++)
{
if(iIndex == g_iClcmdIndex[i])
{
return i;
}
}

return NULLENT;
}

public Command_GiveWeapon_EX(iPlayer, iAccess, iIndex)
{
new iWeaponId = getClcmdIndex(iIndex);

if(iWeaponId == NULLENT)
{
return PLUGIN_HANDLED;
}

if(g_pCvar[FLAG_ACCESS] && !(get_user_flags(iPlayer) & read_flags(g_pCvar[CMD_ACCESS])))
{
console_print(iPlayer, "%L", iPlayer, "CONSOLE_NO_ACCESS");
return PLUGIN_HANDLED;
}

giveItem(iPlayer, iWeaponId, 1, eAUWGiveItemTypes_PlayerCmd);

return PLUGIN_HANDLED;
}

public Command_GiveWeapon(iPlayer)
{
if(g_pCvar[FLAG_ACCESS] && !(get_user_flags(iPlayer) & read_flags(g_pCvar[CMD_ACCESS])))
{
console_print(iPlayer, "%L", iPlayer, "CONSOLE_NO_ACCESS");
return PLUGIN_HANDLED;
}

new sTarget[64];
new sArg[64];

read_argv(1, sTarget, charsmax(sTarget));
trim(sTarget);
remove_quotes(sTarget);

read_argv(2, sArg, charsmax(sArg));
trim(sArg);
remove_quotes(sArg);

if(sArg[0] == EOS || sTarget[0] == EOS)
{
console_print(iPlayer, "%L", iPlayer, "CONSOLE_USAGE");
return PLUGIN_HANDLED;
}

new iFindPlayer = cmd_target(iPlayer, sTarget, CMDTARGET_ALLOW_SELF)

if(!iFindPlayer)
{
return PLUGIN_HANDLED;
}

if(!get_bit(g_bClientConnected, iFindPlayer))
{
return PLUGIN_HANDLED;
}

new iWeaponId;

if(!TrieGetCell(g_tWeaponClcmd, sArg, iWeaponId))
{
console_print(iPlayer, "%L", iPlayer, "CONSOLE_WEAPONS_NOTFOUND");
return PLUGIN_HANDLED;
}

new aData[eAUWData];

ArrayGetArray(g_aWeaponData, iWeaponId, aData);

if(aData[eAUWData_MENU_WEAPON_ADD] == 0)
{
return PLUGIN_HANDLED;
}

giveItem(iFindPlayer, iWeaponId, 0, eAUWGiveItemTypes_AdminCmd);

return PLUGIN_HANDLED;
}

giveItem(iPlayer, iKey, iBuy, eAUWGiveItemTypes: eGiveItemType, bool: bChatNotification = true)
{
static ret;
ExecuteForward(g_iForwards[eAUWForwards_OnGiveItemPre], ret, eGiveItemType, iPlayer, iKey, iBuy);

if(ret)
{
return 0;
}

new aData[eAUWData];
new iCost;

static iMoney; iMoney = rg_get_user_money(iPlayer);

ArrayGetArray(g_aWeaponData, iKey, aData);

if(iBuy)
{
if(aData[eAUWData_WEAPON_ACCESS_FLAGS] && !(get_user_flags(iPlayer) & aData[eAUWData_WEAPON_ACCESS_FLAGS]))
{
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_NO_ACCESS");
return 0;
}

if(get_member_game(m_iTotalRoundsPlayed) + 1 < aData[eAUWData_WEAPON_ALLOW_ROUND])
{
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_ROUNDS", aData[eAUWData_WEAPON_ALLOW_ROUND]);
return 0;
}

new Float: flBuyTime = (get_pcvar_float(g_pCvarBuyTime) * 60) * g_pCvar[BUYTIME];

if(get_gametime() - Float: get_member_game(m_fRoundStartTime) > flBuyTime)
{
client_print(iPlayer, print_center, "%L", iPlayer, "CENTER_BUYTIME", floatround(flBuyTime));
return 0;
}

if(g_pCvar[BUYZONE])
{
if(!rg_get_user_buyzone(iPlayer))
{
client_print(iPlayer, print_center, "%L", iPlayer, "CENTER_NOT_IN_BUYZONE");
return 0;
}
}

if(aData[eAUWData_WEAPON_COST] > 0)
{
iCost = (g_pCvar[DISCOUNT] > 0) ? aData[eAUWData_WEAPON_COST] - getPercentNum(aData[eAUWData_WEAPON_COST], g_pCvar[DISCOUNT]) : aData[eAUWData_WEAPON_COST];

if(iMoney < iCost)
{
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "СHAT_NO_MONEY");
return 0;
}
}
}

new iWeapon = rg_create_entity(aData[eAUWData_WEAPON_REFERENCE]);

if(is_nullent(iWeapon))
{
return 0;
}

new Float: vecOrigin[3];

get_entvar(iPlayer, var_origin, vecOrigin);
set_entvar(iWeapon, var_origin, vecOrigin);
set_entvar(iWeapon, var_impulse, iKey + AUW_IMPULSE_OFFSET);
setWeaponKey(iWeapon, iKey + AUW_IMPULSE_OFFSET);
setWeaponModelView(iWeapon, aData[eAUWData_WEAPON_MODEL_VIEW]);
setWeaponModelPlayer(iWeapon, aData[eAUWData_WEAPON_MODEL_PLAYER]);
setWeaponModelWorld(iWeapon, aData[eAUWData_WEAPON_MODEL_WORLD]);
setWeaponTrace(iWeapon, aData[eAUWData_WEAPON_TRACE]);
setWeaponFlags(iWeapon, aData[eAUWData_WEAPON_ACCESS_FLAGS]);
set_entvar(iWeapon, var_spawnflags, SF_NORESPAWN);
dllfunc(DLLFunc_Spawn, iWeapon);

if(!aData[eAUWData_WEAPON_SLOT])
{
switch(rg_get_iteminfo(iWeapon, ItemInfo_iSlot))
{
case 0:
{
aData[eAUWData_WEAPON_SLOT] = PRIMARY_WEAPON_SLOT;
}
case 1:
{
aData[eAUWData_WEAPON_SLOT] = PISTOL_SLOT;
}
}

ArraySetArray(g_aWeaponData, iKey, aData);
}

if(aData[eAUWData_WEAPON_ID] != WEAPON_KNIFE)
{
dropWeapons(iPlayer, aData[eAUWData_WEAPON_SLOT]);
}
else
{
rg_remove_item(iPlayer, "weapon_knife");
}

dllfunc(DLLFunc_Touch, iWeapon, iPlayer);

static iOwner; iOwner = get_entvar(iWeapon, var_owner);

if(iOwner != iPlayer || is_nullent(iOwner))
{
if(!is_nullent(iWeapon))
{
engfunc(EngFunc_RemoveEntity, iWeapon);
}
return 0;
}

switch(aData[eAUWData_WEAPON_ID])
{
case WEAPON_KNIFE:
{
set_member(iWeapon, m_Knife_flStabBaseDamage, Float: get_member(iWeapon, m_Knife_flStabBaseDamage) * aData[eAUWData_WEAPON_DAMAGE]);
set_member(iWeapon, m_Knife_flSwingBaseDamage, Float: get_member(iWeapon, m_Knife_flSwingBaseDamage) * aData[eAUWData_WEAPON_DAMAGE]);
set_member(iWeapon, m_Knife_flSwingBaseDamage_Fast, Float: get_member(iWeapon, m_Knife_flSwingBaseDamage_Fast) * aData[eAUWData_WEAPON_DAMAGE]);
}
case WEAPON_M4A1:
{
set_member(iWeapon, m_M4A1_flBaseDamageSil, Float: get_member(iWeapon, m_M4A1_flBaseDamageSil) * aData[eAUWData_WEAPON_DAMAGE]);
}
case WEAPON_USP:
{
set_member(iWeapon, m_USP_flBaseDamageSil, Float: get_member(iWeapon, m_USP_flBaseDamageSil) * aData[eAUWData_WEAPON_DAMAGE]);
}
case WEAPON_FAMAS:
{
set_member(iWeapon, m_Famas_flBaseDamageBurst, Float: get_member(iWeapon, m_Famas_flBaseDamageBurst) * aData[eAUWData_WEAPON_DAMAGE]);
}
}

set_member(iWeapon, m_Weapon_flBaseDamage, Float: get_member(iWeapon, m_Weapon_flBaseDamage) * aData[eAUWData_WEAPON_DAMAGE]);

if(aData[eAUWData_WEAPON_ID] != WEAPON_KNIFE)
{
rg_set_user_ammo(iPlayer, aData[eAUWData_WEAPON_ID], aData[eAUWData_WEAPON_AMMO]);
rg_set_user_bpammo(iPlayer, aData[eAUWData_WEAPON_ID], aData[eAUWData_WEAPON_BPAMMO]);
rg_set_iteminfo(iWeapon, ItemInfo_iMaxClip, aData[eAUWData_WEAPON_AMMO]);
rg_set_iteminfo(iWeapon, ItemInfo_iMaxAmmo1, aData[eAUWData_WEAPON_BPAMMO]);
}

if(iBuy)
{
rg_add_account(iPlayer, iMoney - iCost, AS_SET);
if(bChatNotification)
{
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_WEAPON_BUY", aData[eAUWData_MENU_NAME_ITEM]);
}
}
else
{
if(bChatNotification)
{
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_WEAPON_GET", aData[eAUWData_MENU_NAME_ITEM]);
}
}
return 1;
}

public CWeapon_Touch_Pre(iEntity, iPlayer)
{
if(!g_pCvar[PICKUP_ACCESS_TYPE])
{
return HAM_IGNORED;
}

if(is_nullent(iEntity))
{
return HAM_IGNORED;
}

if(!IsPlayer(iPlayer) || !get_bit(g_bClientConnected, iPlayer))
{
return HAM_IGNORED;
}

if(IsCustomWeapon(iEntity, get_entvar(iEntity, var_impulse)))
{
if(getWeaponFlags(iEntity) && !(get_user_flags(iPlayer) & getWeaponFlags(iEntity)))
{
if(g_flTouchTime[iPlayer] > get_gametime())
{
return HAM_SUPERCEDE;
}

client_print(iPlayer, print_center, "%L", iPlayer, "CENTER_NO_ACCESS");
g_flTouchTime[iPlayer] = get_gametime() + 3.0;
return HAM_SUPERCEDE;
}
}

return HAM_IGNORED;
}

public CWeapon_DefaultDeploy_Pre(iItem, sViewModel[], sWeaponModel[], iAnim, sAnimExt[], iSkipLocal)
{
if(is_nullent(iItem))
{
return HC_CONTINUE;
}

if(IsCustomWeapon(iItem, getWeaponKey(iItem)))
{
static sView[64], sPlayer[64];

getWeaponModelView(iItem, sView, sizeof(sView));
getWeaponModelPlayer(iItem, sPlayer, sizeof(sPlayer));
SetHookChainArg(2, ATYPE_STRING, sView);
SetHookChainArg(3, ATYPE_STRING, sPlayer);
}

return HC_CONTINUE;
}

public CWeapon_SetModel_Pre(iEntity, sModel[])
{
if(is_nullent(iEntity))
{
return HC_CONTINUE;
}

new iWeapon = GetWeaponBox(iEntity);

if(is_nullent(iWeapon))
{
return HC_CONTINUE;
}

if(IsCustomWeapon(iWeapon, getWeaponKey(iWeapon)))
{
static sViewModel[64];
getWeaponModelWorld(iWeapon, sViewModel, sizeof(sViewModel));

if(sViewModel[0])
{
SetHookChainArg(2, ATYPE_STRING, sViewModel);
}

setWeaponFlags(iEntity, getWeaponFlags(iWeapon));
set_entvar(iEntity, var_impulse, getWeaponKey(iWeapon));
}

return HC_CONTINUE;
}

GetWeaponBox(iEntity)
{
for(new i = 0, iWeapon; i < MAX_ITEM_TYPES; i++)
{
iWeapon = get_member(iEntity, m_WeaponBox_rgpPlayerItems, i);

if(!is_nullent(iWeapon))
{
return iWeapon;
}
}

return NULLENT;
}

public CWeapon_TraceAttack_Post(iVictim, iAttacker, Float: flDamage, Float: vecDirection[3], iTrace, iBitsDamage)
{
if(!get_bit(g_bClientConnected, iAttacker))
{
return;
}

static iItem; iItem = get_member(iAttacker, m_pActiveItem);

if(is_nullent(iItem))
{
return;
}

new WeaponIdType: iId; iId = get_member(iItem, m_iId);

if(iId == WEAPON_KNIFE)
{
return;
}

if(!IsCustomWeapon(iItem, getWeaponKey(iItem)))
{
return;
}

new Float: vecEndPos[3];
get_tr2(iTrace, TR_vecEndPos, vecEndPos);

if(!getWeaponTrace(iItem))
{
return;
}

if(g_pCvar[TRACE_TYPE])
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BEAMENTPOINT);
write_short(iAttacker | 0x1000);
engfunc(EngFunc_WriteCoord, vecEndPos[0]);
engfunc(EngFunc_WriteCoord, vecEndPos[1]);
engfunc(EngFunc_WriteCoord, vecEndPos[2]);
write_short(g_iLaserBeam);
write_byte(0);
write_byte(0);
write_byte(1);
write_byte(10);
write_byte(0);
write_byte(255); // r
write_byte(215); // g
write_byte(0); //b
write_byte(200); // alpha
write_byte(255);
message_end();
}
else
{
new vecOrigin[3];
get_entvar(iAttacker, var_origin, vecOrigin);

message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_TRACER);
engfunc(EngFunc_WriteCoord, vecOrigin[0]);
engfunc(EngFunc_WriteCoord, vecOrigin[1]);
engfunc(EngFunc_WriteCoord, vecOrigin[2]);
engfunc(EngFunc_WriteCoord, vecEndPos[0]);
engfunc(EngFunc_WriteCoord, vecEndPos[1]);
engfunc(EngFunc_WriteCoord, vecEndPos[2]);
message_end();
}

return;
}

public Command_ShowUltimateMenu(iPlayer)
{
if(g_pCvar[MENU_ACCESS_TYPE] == 0)
{
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_BUY_DISABLE");
return PLUGIN_HANDLED;
}
else if(g_pCvar[MENU_ACCESS_TYPE] == 2)
{
if(g_pCvar[FLAG_ACCESS] && !(get_user_flags(iPlayer) & read_flags(g_pCvar[FLAG_ACCESS])))
{
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_NO_ACCESS");
return PLUGIN_HANDLED;
}
}

if(get_member_game(m_iTotalRoundsPlayed) + 1 < g_pCvar[MENU_ROUND])
{
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_ROUNDS", g_pCvar[MENU_ROUND]);
return PLUGIN_HANDLED;
}

new sText[128];
new sDiscount[30];
new aData[eAUWData];
new iCost;

formatex(sText, charsmax(sText), "%L", iPlayer, "MENU_TITLE");
new hMenu = menu_create(sText, "ShopMenuHandler");
// maybe add callback?

for(new i = 0; i < g_iWeaponsCount; i++)
{
ArrayGetArray(g_aWeaponData, i, aData);

if(aData[eAUWData_MENU_WEAPON_ADD] == 0 || aData[eAUWData_MENU_WEAPON_ADD] == 2)
{
continue;
}

if(aData[eAUWData_WEAPON_COST] < 0)
{
continue;
}

if(g_pCvar[DISCOUNT] > 0)
{
iCost = aData[eAUWData_WEAPON_COST] - getPercentNum(aData[eAUWData_WEAPON_COST], g_pCvar[DISCOUNT]);

if(getPercentNum(aData[eAUWData_WEAPON_COST], g_pCvar[DISCOUNT]) > 0)
{
formatex(sDiscount, charsmax(sDiscount), "%L", iPlayer, "MENU_DISCOUNT", g_pCvar[DISCOUNT]);
}
}
else
{
iCost = aData[eAUWData_WEAPON_COST];
}

if(g_pCvar[MENU_DAMAGE] > 0)
{
formatex(sText, charsmax(sText), "%s%s %L %s Ry%d", rg_get_user_money(iPlayer) >= iCost ? "w" : "d", aData[eAUWData_MENU_NAME_ITEM], iPlayer, "MENU_DAMAGE", floatround(aData[eAUWData_WEAPON_DAMAGE] * 100), sDiscount, iCost);
}
else
{
formatex(sText, charsmax(sText), "%s%sRy%d", rg_get_user_money(iPlayer) >= iCost ? "w" : "d", aData[eAUWData_MENU_NAME_ITEM], iCost);
}

menu_additem(hMenu, sText);
}

formatex(sText, charsmax(sText), "%L", iPlayer, "MENU_NEXT");
menu_setprop(hMenu, MPROP_NEXTNAME, sText);
formatex(sText, charsmax(sText), "%L", iPlayer, "MENU_BACK");
menu_setprop(hMenu, MPROP_BACKNAME, sText);
formatex(sText, charsmax(sText), "%L", iPlayer, "MENU_EXIT");
menu_setprop(hMenu, MPROP_EXITNAME, sText);

menu_display(iPlayer, hMenu, 0);

return PLUGIN_HANDLED;
}

public ShopMenuHandler(iPlayer, hMenu, iItem)
{
if(!is_user_alive(iPlayer) || iItem == MENU_EXIT)
{
menu_destroy(hMenu);
return PLUGIN_HANDLED;
}

new sData[6], sName[64], iAccess, iCallback;
menu_item_getinfo(hMenu, iItem, iAccess, sData, charsmax(sData), sName, charsmax(sName), iCallback);

menu_destroy(hMenu);

giveItem(iPlayer, iItem, 1, eAUWGiveItemTypes_ShopMenu);

return PLUGIN_HANDLED;
}

public plugin_precache()
{
g_iLaserBeam = precache_model("sprites/laserbeam.spr");

CFile_Load();
}

CFile_Load()
{
new sPath[128];

get_configsdir(sPath, charsmax(sPath));
format(sPath, charsmax(sPath), "%s/%s", sPath, sFile);

new iFile = fopen(sPath, "rt");

if(!iFile)
{
log_amx("[DEBUG]: No file found ^"%s^".", sPath);
set_fail_state("[DEBUG]: No file found ^"%s^".", sPath);
return;
}

g_iForwards[eAUWForwards_OnParseEnd] = CreateMultiForward("auw_on_parse_end", ET_CONTINUE, FP_CELL);

g_aWeaponData = ArrayCreate(eAUWData);
g_tWeaponClcmd = TrieCreate();

new sLine[512];

new aData[eAUWData];
new sWeaponClcmd[64];
new sWeaponCost[6];
new sWeaponAmmo[4];
new iWeaponBpAmmo[4];
new sWeaponDamage[5];
new sWeaponAllowRound[3];
new sWeaponTrace[3];
new sWeaponMenuAdd[3];
new sWeaponAccessFlag[10];

while(!feof(iFile))
{
fgets(iFile, sLine, charsmax(sLine));
replace(sLine, charsmax(sLine), "^n", "");

if(IsComment(sLine))
{
continue;
}

trim(sLine);

parse(sLine,
aData[eAUWData_WEAPON_REFERENCE], charsmax(aData[eAUWData_WEAPON_REFERENCE]),
sWeaponClcmd, charsmax(sWeaponClcmd),
aData[eAUWData_MENU_NAME_ITEM], charsmax(aData[eAUWData_MENU_NAME_ITEM]),
sWeaponCost, charsmax(sWeaponCost),
sWeaponAmmo, charsmax(sWeaponAmmo),
iWeaponBpAmmo, charsmax(iWeaponBpAmmo),
sWeaponDamage, charsmax(sWeaponDamage),
sWeaponAllowRound, charsmax(sWeaponAllowRound),
sWeaponTrace, charsmax(sWeaponTrace),
sWeaponMenuAdd, charsmax(sWeaponMenuAdd),
sWeaponAccessFlag, charsmax(sWeaponAccessFlag),
aData[eAUWData_WEAPON_MODEL_VIEW], charsmax(aData[eAUWData_WEAPON_MODEL_VIEW]),
aData[eAUWData_WEAPON_MODEL_PLAYER], charsmax(aData[eAUWData_WEAPON_MODEL_PLAYER]),
aData[eAUWData_WEAPON_MODEL_WORLD], charsmax(aData[eAUWData_WEAPON_MODEL_WORLD])
);

if(aData[eAUWData_WEAPON_MODEL_VIEW][0])
{
if(!file_exists(aData[eAUWData_WEAPON_MODEL_VIEW]))
{
set_fail_state("[Error] Model was not found (%s)", aData[eAUWData_WEAPON_MODEL_VIEW]);
}
else
{
precache_model(aData[eAUWData_WEAPON_MODEL_VIEW]);
}
}

if(aData[eAUWData_WEAPON_MODEL_PLAYER][0])
{
if(!file_exists(aData[eAUWData_WEAPON_MODEL_PLAYER]))
{
set_fail_state("[Error] Model was not found (%s)", aData[eAUWData_WEAPON_MODEL_PLAYER]);
}
else
{
precache_model(aData[eAUWData_WEAPON_MODEL_PLAYER]);
}
}

if(aData[eAUWData_WEAPON_MODEL_WORLD][0])
{
if(!file_exists(aData[eAUWData_WEAPON_MODEL_WORLD]))
{
set_fail_state("[Error] Model was not found (%s)", aData[eAUWData_WEAPON_MODEL_WORLD]);
}
else
{
precache_model(aData[eAUWData_WEAPON_MODEL_WORLD]);
}
}

if(!sWeaponAccessFlag[0] || sWeaponAccessFlag[0] == '0') // xd
{
aData[eAUWData_WEAPON_ACCESS_FLAGS] = 0;
}
else
{
aData[eAUWData_WEAPON_ACCESS_FLAGS] = read_flags(sWeaponAccessFlag);
}

aData[eAUWData_WEAPON_ID] = rg_get_weapon_info(aData[eAUWData_WEAPON_REFERENCE], WI_ID);

if(aData[eAUWData_WEAPON_ID] == WEAPON_NONE)
{
log_amx("[Error] Invalid weapon classname (%s)", aData[eAUWData_WEAPON_REFERENCE]);
continue;
}
aData[eAUWData_WEAPON_COST] = str_to_num(sWeaponCost);
aData[eAUWData_WEAPON_AMMO] = str_to_num(sWeaponAmmo);
aData[eAUWData_WEAPON_BPAMMO] = str_to_num(iWeaponBpAmmo);
aData[eAUWData_WEAPON_DAMAGE] = str_to_float(sWeaponDamage);
aData[eAUWData_WEAPON_ALLOW_ROUND] = str_to_num(sWeaponAllowRound);
aData[eAUWData_WEAPON_TRACE] = str_to_num(sWeaponTrace);
aData[eAUWData_MENU_WEAPON_ADD] = str_to_num(sWeaponMenuAdd);

TrieSetCell(g_tWeaponClcmd, sWeaponClcmd, ArrayPushArray(g_aWeaponData, aData));

g_iClcmdIndex[g_iWeaponsCount] = register_clcmd(sWeaponClcmd, "Command_GiveWeapon_EX");
g_iWeaponsCount++;
}

new ret;
ExecuteForward(g_iForwards[eAUWForwards_OnParseEnd], ret, g_iWeaponsCount);

fclose(iFile);
}

public plugin_end()
{
ArrayDestroy(g_aWeaponData);
TrieDestroy(g_tWeaponClcmd);
}

stock bool:rg_get_user_buyzone(const pIndex)
{
new iSignals[UnifiedSignals];

get_member(pIndex, m_signals, iSignals);

return bool:(SignalState:iSignals[US_State] & SIGNAL_BUY);
}

bool: IsCustomWeapon(iItem, iKey)
{
if(0 <= iKey - AUW_IMPULSE_OFFSET < g_iWeaponsCount)
{
if(get_entvar(iItem, var_impulse) == iKey)
{
return true;
}
}

return false;
}

getPercentNum(iNumber, iPercent)
{
return floatround(float(iNumber) * (float(iPercent) / 100.0)); // blya
}

enum
{
APPEND_SLOT = 0,
REMOVE_SLOT = 1,
DROP_SLOT = 2
};

dropWeapons(iPlayer, InventorySlotType: iSlot)
{
if(g_pCvar[GIVE_TYPE] == APPEND_SLOT)
{
return;
}

if(g_pCvar[GIVE_TYPE] == REMOVE_SLOT)
{
rg_remove_items_by_slot(iPlayer, iSlot);
return;
}

static iItem; iItem = get_member(iPlayer, m_rgpPlayerItems, iSlot);

if(is_nullent(iItem))
{
return;
}

static iNext;

do
{
if(!is_nullent(iItem))
{
iNext = get_member(iItem, m_pNext);

switch(g_pCvar[GIVE_TYPE])
{
case DROP_SLOT:
{
rg_drop_items_by_slot(iPlayer, iSlot);
}
}
}
}
while((iItem = iNext) > 0);
}

stateHooks(bool: bState)
{
if(bState)
{
for(new i = 0; i < sizeof(g_pHamHooks[TRACEATTACK]); i++)
{
EnableHamForward(g_pHamHooks[TRACEATTACK][i]);
}

EnableHamForward(g_pHamHooks[TOUCH]);

EnableHookChain(g_pReapiHooks[DEPLOY]);
EnableHookChain(g_pReapiHooks[SETMODEL]);
}
else
{
for(new i = 0; i < sizeof(g_pHamHooks[TRACEATTACK]); i++)
{
DisableHamForward(g_pHamHooks[TRACEATTACK][i]);
}

DisableHamForward(g_pHamHooks[TOUCH]);

DisableHookChain(g_pReapiHooks[DEPLOY]);
DisableHookChain(g_pReapiHooks[SETMODEL]);
}
}

#include <amxmodx>
#include <reapi>

#define WARMUPTIME     60    // Время вармапа
#define NUM_RR        1    // Кол-во рестартов
#define LATENCY        1    // Задержка между рестартами
#define DHUD_MESSAGE        // Показывать в dhud. Закомментируйте, чтобы был hud
#define GIVE_SHIELD    0    // 0 — выключить; 1 — Щит + deagle; 2 — щит + нож; 3 — щит и с диглом и ножом
#define STOP_PLUGS        // Отключать плагины на время вармапа
#define DM_MODE            // Бесконечный респавн на время вармапа
#define ThFiveHP_ON_KNIFE    // Выдает 35HP игрокам, если оружие — НОЖ

#if defined STOP_PLUGS
    new g_arPlugins[][] =    // Указывать название файлов, например test.amxx
    {
        «reapi_awp_limitter_182.amxx»,
        «amxx_vip_gold.amxx»,
        «weaponrest.amxx»,
        «crux_ansata.amxx»

            }
#endif
new g_szWeapon[32];
new g_iWp;
new HookChain:fwd_NewRound,
#if defined DM_MODE
    HookChain:fwd_Killed,
#endif
    HookChain:fwd_Spawn;
#if defined DHUD_MESSAGE
    #if AMXX_VERSION_NUM < 183
        #include <dhudmessage>
    #endif
#else
    new g_iHudSync;
#endif

public plugin_init()
{
    register_plugin(«Random Weapons WarmUP», «2.5.untested», «neugomon»);

    RegisterHookChain(RG_RoundEnd, «fwdRoundEnd», true);
    DisableHookChain((fwd_NewRound = RegisterHookChain(RG_CSGameRules_CheckMapConditions, «CSGameRules», true)));
    DisableHookChain((fwd_Spawn    = RegisterHookChain(RG_CBasePlayer_Spawn, «CBasePlayer_Spawn_Post», true)));
#if defined DM_MODE    
    DisableHookChain((fwd_Killed   = RegisterHookChain(RG_CBasePlayer_Killed, «CBasePlayer_Killed_Post», true)));

        register_clcmd(«joinclass», «clCmdJoinClass»);
    register_clcmd(«menuselect»,»clCmdJoinClass»);
#endif
#if !defined DHUD_MESSAGE
    g_iHudSync    = CreateHudSyncObj();
#endif
    state warmupOff;
}

public fwdRoundEnd(WinStatus:status, ScenarioEventEndRound:event, Float:tmDelay) <warmupOff>
    if(event == ROUND_GAME_COMMENCE)
        EnableHookChain(fwd_NewRound);

        public fwdRoundEnd(WinStatus:status, ScenarioEventEndRound:event, Float:tmDelay) <warmupOn>
    return;

public CSGameRules ()
{
    state warmupOn;

        set_member_game(m_bMapHasBuyZone, true);
    BuyZone_ToogleSolid(SOLID_NOT);

        DisableHookChain(fwd_NewRound);
    EnableHookChain(fwd_Spawn);
#if defined DM_MODE    
    EnableHookChain(fwd_Killed);
#endif    
#if defined STOP_PLUGS    
    PluginController(1);
#endif    
    switch((g_iWp = random(5)))
    {
        case 0: formatex(g_szWeapon, charsmax(g_szWeapon), «TMP»);
        case 1: formatex(g_szWeapon, charsmax(g_szWeapon), «UMP45»);
        case 2: formatex(g_szWeapon, charsmax(g_szWeapon), «Scout»);
        case 3: formatex(g_szWeapon, charsmax(g_szWeapon), «Grenade»);
        case 4: formatex(g_szWeapon, charsmax(g_szWeapon), «Knife»);
    }

            set_task(1.0, «ShowTimer», .flags = «a», .repeat = WARMUPTIME);
}
#if defined DM_MODE
public clCmdJoinClass(id) <warmupOff>
    return;

    public clCmdJoinClass(id) <warmupOn>
    if(get_member(id, m_iMenu) == Menu_ChooseAppearance)
        set_task(0.5, «SpawnPlayer», id);
#endif
public CBasePlayer_Spawn_Post(const id)
{
    if(!is_user_alive(id))
        return;

            rg_remove_all_items(id);

        switch(g_iWp)
    {
        case 0:
        {
            rg_give_item(id, «weapon_tmp»);
            rg_set_user_bpammo(id, WEAPON_TMP, 300);
        }
        case 1:
        {
            rg_give_item(id, «weapon_ump45»);
            rg_set_user_bpammo(id, WEAPON_UMP45, 300);
        }
        case 2:
        {
            rg_give_item(id, «weapon_scout»);
            rg_set_user_bpammo(id, WEAPON_SCOUT, 300);
        }
        case 3:
        {
            rg_give_item(id, «weapon_hegrenade»);
            rg_set_user_bpammo(id, WEAPON_HEGRENADE, 512);
        }
        case 4:
        {
        #if GIVE_SHIELD == 2 || GIVE_SHIELD == 3
            rg_give_item(id, «weapon_shield»);
        #endif
            rg_give_item(id, «weapon_knife»);
        #if defined ThFiveHP_ON_KNIFE
            set_entvar(id, var_health, 35.0);
        #endif    
        }    
    }    
}
#if defined DM_MODE
public CBasePlayer_Killed_Post(pVictim)
    set_task(1.0, «SpawnPlayer», pVictim);
#endif    
public ShowTimer()
{
    static timer = -1;
    if(timer == -1) timer = WARMUPTIME;

        switch(—timer)
    {
        case 0:
        {
            state warmupOff;

                        BuyZone_ToogleSolid(SOLID_TRIGGER);
            DisableHookChain(fwd_Spawn);
        #if defined DM_MODE    
            DisableHookChain(fwd_Killed);
        #endif
        #if defined STOP_PLUGS    
            PluginController(0);
        #endif    
        #if NUM_RR > 1        
            set_task(LATENCY, «SV_Restart», .flags = «a», .repeat = NUM_RR);
        #else
            SV_Restart();
        #endif
            timer = -1;
        }
        default:
        {
        #if defined DHUD_MESSAGE
            set_dhudmessage(.red = 135, .green = 206, .blue = 235, .x = -1.0, .y = 0.08, .holdtime = 0.9);
            show_dhudmessage(0, «Разминка на %s!^nРестарт через %d сек», g_szWeapon, timer);
        #else    
            set_hudmessage(135, 206, 235, .x = -1.0, .y = 0.9, .holdtime = 0.9, .channel = -1);
            ShowSyncHudMsg(0, g_iHudSync, «Разминка на %s!^nРестарт через %d сек», g_szWeapon, timer);
        #endif    
        }
    }
}

public SV_Restart()
    set_cvar_num(«sv_restart», 1);
#if defined DM_MODE    
public SpawnPlayer(id)
{
    if(is_user_alive(id))
        return;

            switch(get_member(id, m_iTeam))
    {
        case 1, 2: rg_round_respawn(id);
    }
}
#endif
stock PluginController(stop)
{
    for(new i; i < sizeof g_arPlugins; i++)
    {
        if(stop)pause  («ac», g_arPlugins[i]);
        else    unpause(«ac», g_arPlugins[i]);
    }    
}

stock BuyZone_ToogleSolid(const solid)
{
    new entityIndex = 0;
    while ((entityIndex = rg_find_ent_by_class(entityIndex, «func_buyzone»)))
        set_entvar(entityIndex, var_solid, solid);
}

demoleridon


Скрин ошибки.
Сам плагин:
random_weapons_warmup.sma ( 5.61 килобайт ) Кол-во скачиваний: 9

Прошу помощи! Компилировал тут:https://c-s.net.ua/compiler/

Сообщений: 3142
Благодарностей: 1418
Полезность: 482

Стаж: 3 года 1 месяц

Сообщений: 23
Благодарностей: 1
Полезность: 33

Стаж: 3 года 1 месяц

Сообщений: 23
Благодарностей: 1
Полезность: 33

Стаж: 3 года 1 месяц

Сообщений: 23
Благодарностей: 1
Полезность: 33

dehost, вот, что выходит с окна компилятора:
//AMXXPC compile.exe
// by the AMX Mod X Dev Team

//// random_weapons_warmup.sma
// C:Users12345DownloadsDOWNLOAD 2amxmodx-1.8.2-base-windowsaddonsamxmodx
scriptingrandom_weapons_warmup.sma(2) : fatal error 100: cannot read from file
: «reapi»
//
// Compilation aborted.
// 1 Error.
// Could not locate output file C:Users12345DownloadsDOWNLOAD 2amxmodx-1.8.
2-base-windowsaddonsamxmodxscriptingcompiledrandom_weapons_warmup.amx (comp
ile failed).
//
// Compilation Time: 0,03 sec
// —————————————-

Press enter to exit .

Стаж: 9 лет 7 месяцев

Сообщений: 2525
Благодарностей: 1648
Полезность: 816

Меценат

Стаж: 3 года 1 месяц

Сообщений: 23
Благодарностей: 1
Полезность: 33

Стаж: 2 года 11 месяцев
Город: Москва

Сообщений: 33
Благодарностей: 7
Полезность: 135

Стаж: 3 года 1 месяц

Сообщений: 23
Благодарностей: 1
Полезность: 33

Lana, сделал всё как вы сказали. вернулись обратно к началу.
вот, что выскакивает:
//AMXXPC compile.exe
// by the AMX Mod X Dev Team

//// random_weapons_warmup.sma
// C:Users12345DownloadsDOWNLOAD 2amxmodx-1.8.2-base-windowsaddonsamxmodx
scriptingrandom_weapons_warmup.sma(19) : error 001: expected token: «>», but f
ound «-string-«
// C:Users12345DownloadsDOWNLOAD 2amxmodx-1.8.2-base-windowsaddonsamxmodx
scriptingrandom_weapons_warmup.sma(21) : error 054: unmatched closing brace
// C:Users12345DownloadsDOWNLOAD 2amxmodx-1.8.2-base-windowsaddonsamxmodx
scriptingrandom_weapons_warmup.sma(64) : warning 200: symbol «CSGameRules_Chec
kMapConditions_» is truncated to 31 characters
//
// 2 Errors.
// Could not locate output file C:Users└їьхфDownloadsDOWNLOAD 2amxmodx-1.8.
2-base-windowsaddonsamxmodxscriptingcompiledrandom_weapons_warmup.amx (comp
ile failed).
//
// Compilation Time: 0,39 sec
// —————————————-

Press enter to exit .

Стаж: 9 лет 7 месяцев

Сообщений: 2525
Благодарностей: 1648
Полезность: 816

Меценат

Стаж: 6 лет 10 месяцев
Город: Иваново

Сообщений: 693
Благодарностей: 138
Полезность: 78

#define WARMUPTIME 60 // Время вармапа
#define NUM_RR 1 // Кол-во рестартов
#define LATENCY 1 // Задержка между рестартами
#define DHUD_MESSAGE // Показывать в dhud. Закомментируйте, чтобы был hud
#define GIVE_SHIELD 0 // 0 — выключить; 1 — Щит + deagle; 2 — щит + нож; 3 — щит и с диглом и ножом
#define STOP_PLUGS // Отключать плагины на время вармапа
#define DM_MODE // Бесконечный респавн на время вармапа
#define ThFiveHP_ON_KNIFE // Выдает 35HP игрокам, если оружие — НОЖ

#if defined STOP_PLUGS
new g_arPlugins[][] = // Указывать название файлов, например test.amxx
<
«reapi_awp_limitter_182.amxx»,
«amxx_vip_gold.amxx»,
«weaponrest.amxx»,
«crux_ansata.amxx»

>
#endif
new g_szWeapon[32];
new g_iWp;
new HookChain:fwd_NewRound,
#if defined DM_MODE
HookChain:fwd_Killed,
#endif
HookChain:fwd_Spawn;
#if defined DHUD_MESSAGE
#if AMXX_VERSION_NUM
#endif
#else
new g_iHudSync;
#endif

public plugin_init()
<
register_plugin(«Random Weapons WarmUP», «2.5.untested», «neugomon»);

RegisterHookChain(RG_RoundEnd, «fwdRoundEnd», true);
DisableHookChain((fwd_NewRound = RegisterHookChain(RG_CSGameRules_CheckMapConditions, «CSGameRules», true)));
DisableHookChain((fwd_Spawn = RegisterHookChain(RG_CBasePlayer_Spawn, «CBasePlayer_Spawn_Post», true)));
#if defined DM_MODE
DisableHookChain((fwd_Killed = RegisterHookChain(RG_CBasePlayer_Killed, «CBasePlayer_Killed_Post», true)));

register_clcmd(«joinclass», «clCmdJoinClass»);
register_clcmd(«menuselect»,»clCmdJoinClass»);
#endif
#if !defined DHUD_MESSAGE
g_iHudSync = CreateHudSyncObj();
#endif
state warmupOff;
>

public fwdRoundEnd(WinStatus:status, ScenarioEventEndRound:event, Float:tmDelay)
if(event == ROUND_GAME_COMMENCE)
EnableHookChain(fwd_NewRound);

public fwdRoundEnd(WinStatus:status, ScenarioEventEndRound:event, Float:tmDelay)
return;

public CSGameRules ()
<
state warmupOn;

set_member_game(m_bMapHasBuyZone, true);
BuyZone_ToogleSolid(SOLID_NOT);

DisableHookChain(fwd_NewRound);
EnableHookChain(fwd_Spawn);
#if defined DM_MODE
EnableHookChain(fwd_Killed);
#endif
#if defined STOP_PLUGS
PluginController(1);
#endif
switch((g_iWp = random(5)))
<
case 0: formatex(g_szWeapon, charsmax(g_szWeapon), «TMP»);
case 1: formatex(g_szWeapon, charsmax(g_szWeapon), «UMP45»);
case 2: formatex(g_szWeapon, charsmax(g_szWeapon), «Scout»);
case 3: formatex(g_szWeapon, charsmax(g_szWeapon), «Grenade»);
case 4: formatex(g_szWeapon, charsmax(g_szWeapon), «Knife»);
>

set_task(1.0, «ShowTimer», .flags = «a», .repeat = WARMUPTIME);
>
#if defined DM_MODE
public clCmdJoinClass(id)
return;

public clCmdJoinClass(id)
if(get_member(id, m_iMenu) == Menu_ChooseAppearance)
set_task(0.5, «SpawnPlayer», id);
#endif
public CBasePlayer_Spawn_Post(const id)
<
if(!is_user_alive(id))
return;

switch(g_iWp)
<
case 0:
<
rg_give_item(id, «weapon_tmp»);
rg_set_user_bpammo(id, WEAPON_TMP, 300);
>
case 1:
<
rg_give_item(id, «weapon_ump45»);
rg_set_user_bpammo(id, WEAPON_UMP45, 300);
>
case 2:
<
rg_give_item(id, «weapon_scout»);
rg_set_user_bpammo(id, WEAPON_SCOUT, 300);
>
case 3:
<
rg_give_item(id, «weapon_hegrenade»);
rg_set_user_bpammo(id, WEAPON_HEGRENADE, 512);
>
case 4:
<
#if GIVE_SHIELD == 2 || GIVE_SHIELD == 3
rg_give_item(id, «weapon_shield»);
#endif
rg_give_item(id, «weapon_knife»);
#if defined ThFiveHP_ON_KNIFE
set_entvar(id, var_health, 35.0);
#endif
>
>
>
#if defined DM_MODE
public CBasePlayer_Killed_Post(pVictim)
set_task(1.0, «SpawnPlayer», pVictim);
#endif
public ShowTimer()
<
static timer = -1;
if(timer == -1) timer = WARMUPTIME;

switch(—timer)
<
case 0:
<
state warmupOff;

BuyZone_ToogleSolid(SOLID_TRIGGER);
DisableHookChain(fwd_Spawn);
#if defined DM_MODE
DisableHookChain(fwd_Killed);
#endif
#if defined STOP_PLUGS
PluginController(0);
#endif
#if NUM_RR > 1
set_task(LATENCY, «SV_Restart», .flags = «a», .repeat = NUM_RR);
#else
SV_Restart();
#endif
timer = -1;
>
default:
<
#if defined DHUD_MESSAGE
set_dhudmessage(.red = 135, .green = 206, .blue = 235, .x = -1.0, .y = 0.08, .holdtime = 0.9);
show_dhudmessage(0, «Разминка на %s!^nРестарт через %d сек», g_szWeapon, timer);
#else
set_hudmessage(135, 206, 235, .x = -1.0, .y = 0.9, .holdtime = 0.9, .channel = -1);
ShowSyncHudMsg(0, g_iHudSync, «Разминка на %s!^nРестарт через %d сек», g_szWeapon, timer);
#endif
>
>
>

public SV_Restart()
set_cvar_num(«sv_restart», 1);
#if defined DM_MODE
public SpawnPlayer(id)
<
if(is_user_alive(id))
return;

switch(get_member(id, m_iTeam))
<
case 1, 2: rg_round_respawn(id);
>
>
#endif
stock PluginController(stop)
<
for(new i; i Прикрепленные файлы:

Источник

ReHLDS/ReAPI AWPoff

paffgame

D0L64E6

iOS , сразу как онлайн стал ниже, моменталкой отбирает авп?
Просто либо я дурак, либо такого вообще по сути происходить не должно.

АВП случаем не выкидывают из инвентаря и потом обратно подбирают?

iOS , сразу как онлайн стал ниже, моменталкой отбирает авп?
Просто либо я дурак, либо такого вообще по сути происходить не должно.

АВП случаем не выкидывают из инвентаря и потом обратно подбирают?

SuNKeePeRZ

//AMXXPC compile.exe
// by the AMX Mod X Dev Team

//// awp_off.sma
// C:UsersSuNKeePeRZDesktopcompilerawp_off.sma(2) : fatal error 100: cannot
read from file: «reapi»
//
// Compilation aborted.
// 1 Error.
// Could not locate output file compiledawp_off.amx (compile failed).
//
// Compilation Time: 3,38 sec
// —————————————-

Press enter to exit .

dR1Ve#pwnz

paffgame

D0L64E6

paffgame

D0L64E6

V.SHARSKIY

Ребятки, можете мне подсказать?)
Вот так выглядит у меня плагин
[HIDE=]
#include
#include

#define client_disconnected client_disconnect
#define MAX_PLAYERS 32
#endif

#define IsPlayer(%0) (0 gTeam[id] = get_member(id, m_iTeam);

#if defined ALLPLAYERS
if(!(TEAM_UNASSIGNED = get_pcvar_num(gCvar[CVAR_ONLINE]))
return PLUGIN_CONTINUE;

for(new i = 0; i AWP_NONE)
return HC_CONTINUE;

const COST_AWP = 4750;
new gMoney = get_member(id, m_iAccount);
if(gMoney AWP_NONE || !is_user_valid(id))
return HC_CONTINUE;

if(check_awp(id, false)) <
gAwp[id] = AWP_PICK_UP;
return HC_CONTINUE;
>

SetHookChainReturn(ATYPE_INTEGER, false);
return HC_SUPERCEDE;
>

//Native’s
public plugin_natives()
register_native(«awpoff_check», «check_native», true);

public check_native(id)
return check_awp(id, true);
//Native’s

bool: check_awp(id, check) <
if(gBlock[id] > gRound) <
new c = gBlock[id] — gRound;
client_print_color(id, false, MSG_ROUND, MSG_PREFIX, c, get_text(c));
>else if(gCount 1) ? AWP_NONE : AWP_DROP;

bool: is_user_valid(id) <
if(is_user_bot(id)) return false;
if(is_user_hltv(id)) return false;
return true;
>

get_text(tm) <
new ost = tm % 10, ost2 = tm % 100, buff[16];

if(ost2 >= 5 && ost2

Panzer

Одеть очки надо и прочитать описание дефайнов. спецально для слепых:

paffgame

D0L64E6

Обновил плагин, тестовой версии больше нет.
Все в шапке.

Актуальная версия 1.4.3

hyrik

paffgame

D0L64E6

paffgame

D0L64E6

perfectblood0

perfectblood0

public plugin_precache() <
register_plugin(«[ReAPI] AWPoff», «1.4.3», «PAffAEJIkA :3»);

#if defined AWP_ONLINE
gCvar[CVAR_ONLINE] = register_cvar(«awp_players_low», «10»); //Если онлайн ниже указнного в кваре, в конце раунда у всех отберет авп, и запретит ее. (Что бы отключить поставьте 0) [стандартно: при онлайне меньше 8]
#endif
#if defined AWP_LIMIT
gCvar[CVAR_LIMIT_AWP_STATUS] = register_cvar(«awp_limit», «1»); //Включить|Выключить лимит авп [Стандартно: включен]
gCvar[CVAR_LIMIT_MAX_AWP] = register_cvar(«awp_limit_max», «3»); //Сколько АВП разрешено при лимите [Стандартно по 2 авп на команду] | Если раскоментирован PERCENT_PLAYERS, то сюда вписывать нужный процент
gCvar[CVAR_LIMIT_IMMUN] = register_cvar(«awp_limit_immun», «1»); //Иммунитет для админов. [0 — Выкл | 1 — Иммунитет от лимита кол-ва АВП | 2 — Иммунитет от блока АВП по раундам | 3 — Имумунитет от 1 и 2]
#endif
#if defined AWP_ROUND_LIMIT
gCvar[CVAR_ROUNDS_LIMIT] = register_cvar(«awp_limit_round», «1»); //На сколько раундов блочить?
#endif
>

Блокирует на покупку всем игрокам не может купить только люди с имунитетом покупает авп ?

Источник

Adblock
detector

Ребятки, можете мне подсказать?)
Вот так выглядит у меня плагин
[HIDE=]
#include < amxmodx >
#include < reapi >

#if AMXX_VERSION_NUM < 183
#include < colorchat >

#define client_disconnected client_disconnect
#define MAX_PLAYERS 32
#endif

#define IsPlayer(%0) (0 < %0 < 33)

//■■■■■■■■■■■■■■■■■■■■■■■ CONFIG START ■■■■■■■■■■■■■■■■■■■■■■■//
// ^4 — зелёный | ^3 — цвет тимы (КТ — синий | Т — красный | SPEC — серый) | ^1 — жёлтый
#define MSG_PREFIX «^3[^4ДУШЕВНЫЙ СЕРВЕР ©^3]»
#define MSG_LOWONLINE «У вас^4 отобрано^3 AWP. Причина:^4 низкий онлайн.»
#define MSG_LIMIT «У вас^4 отобрано^3 AWP. Причина:^4 превышен лимит.»
#define MSG_ROUND «%s У вас^4 отобрано^3 AWP. Причина:^4 подождите %d %s»

//#define ALLPLAYERS
/*
Закоментируйте, чтобы для проверки на онлайн брались только КТ и ТТ(ботов, хлтв и спектаров считать не будет).

Пример:
Допустим на сервере 5 ботов и 2 человека 1 хлтв.
Дефайн закоментирован: Посчитает, что на сервере 2 из Максимально возможных игроков.
Дефайн раскоментирован: Посчитает, что на сервере 8 игроков из Максимально возможных игроков (5 ботов + 2 человека + 1 хлтв).

Отбирать авп будет ТОЛЬКО У ЛЮДЕЙ в любом случае.
*/

#define FLAG ADMIN_BAN //Флаг для иммунитета от лимита и блока на раунды

#define RETURN_MONEY //Возвращать деньги при отборе авп в конце раунда из-за низкого онлайна? (Закоментируйте, если не хотите, чтобы возвращало деньги)
#if defined RETURN_MONEY
#define MONEY_AWP 4750 //Сколько денег возвращать?
#endif

#define PERCENT_PLAYERS
/*
Разкоменитруйте, если хотите чтобы лимит зависил от процента игроков [I am chetko ob’yasnyat’]

Например: Онлайн = 10, Процент в кваре(awp_limit_max) = 20
10/100*20 = 2 авп на тиму (2 у терров и 2 у кт)
*/

//#define NOEND //Если разкоментировано, то не будет отбирать АВП в конце раунда из-за низкого онлайна. [Если онлайн ниже чем указан в кваре и человек сам дропнет авп или потеряет ее, то подобрать заного не сможет]
//■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG END ■■■■■■■■■■■■■■■■■■■■■■■■//

enum ECVARS {
CVAR_ONLINE = 0,
CVAR_LIMIT_AWP_STATUS,
CVAR_LIMIT_MAX_AWP,
CVAR_LIMIT_IMMUN,
CVAR_ROUNDS_LIMIT
};

enum {
AWP_DROP = 0,
AWP_NONE,
AWP_BUY,
AWP_PICK_UP
};

new sAwp[TeamName: TEAM_SPECTATOR], gCount, gCvar[ECVARS], gAwp[MAX_PLAYERS + 1], TeamName: gTeam[MAX_PLAYERS + 1];
new gRound, gBlock[MAX_PLAYERS + 1];

#if defined PERCENT_PLAYERS
new gLimit;
#endif

public plugin_precache(){
register_plugin(«[ReAPI] AWPoff», «1.4.2», «PAffAEJIkA :3»);

gCvar[CVAR_ONLINE] = register_cvar(«awp_players_low», «8»); //Если онлайн ниже указнного в кваре, в конце раунда у всех отберет авп, и запретит ее. (Что бы отключить поставьте 0) [стандартно: при онлайне меньше 8]
gCvar[CVAR_LIMIT_AWP_STATUS] = register_cvar(«awp_limit», «1»); //Включить|Выключить лимит авп [Стандартно: включен]
gCvar[CVAR_LIMIT_MAX_AWP] = register_cvar(«awp_limit_max», «2»); //Сколько АВП разрешено при лимите [Стандартно по 2 авп на команду] | Если раскоментирован PERCENT_PLAYERS, то сюда вписывать нужный процент
gCvar[CVAR_LIMIT_IMMUN] = register_cvar(«awp_limit_immun», «3»); //Иммунитет для админов. [0 — Выкл | 1 — Иммунитет от лимита кол-ва АВП | 2 — Иммунитет от блока АВП по раундам | 3 — Имумунитет от 1 и 2]
gCvar[CVAR_ROUNDS_LIMIT] = register_cvar(«awp_limit_round», «1»); //На сколько раундов блочить?
}

public plugin_init(){
new mapname[32];
get_mapname(mapname, charsmax(mapname));

static maps[][] = { «awp», «aim», «35hp» };
for(new i; i < sizeof maps; i++){
if(containi(mapname, maps) != -1){
pause(«ad»);
return;
}
}

RegisterHookChain(RG_CBasePlayer_AddPlayerItem, «AddItem»);
RegisterHookChain(RG_BuyWeaponByWeaponID, «BuyWeaponByWeaponID»);
RegisterHookChain(RG_CBasePlayer_RemovePlayerItem, «RemoveItem»);

register_event(«HLTV», «EventRoundStart», «a», «1=0», «2=0»);
register_logevent(«EventRestartRound», 2, «1&Restart_Round_»);
#if !defined NOEND
register_logevent(«EventRoundEnd», 2, «1=Round_End»);
#endif
}

#if AMXX_VERSION_NUM < 183
public plugin_cfg()
server_exec();
#endif

public client_disconnected(id) if(IsPlayer(id)) minus_awp(id);

public EventRoundStart(){
gRound ++;
gCount = 0;

new pl[32];
get_pl(pl, gCount);

#if defined PERCENT_PLAYERS
const MAX_PERCENT = 100;
gLimit = gCount * get_pcvar_num(gCvar[CVAR_LIMIT_MAX_AWP]) / MAX_PERCENT;
#endif

sAwp[TEAM_CT] = 0;
sAwp[TEAM_TERRORIST] = 0;

for(new i,id; i < gCount; i ++){
id = pl;
gTeam[id] = get_member(id, m_iTeam);

#if defined ALLPLAYERS
if(!(TEAM_UNASSIGNED < gTeam[id] < TEAM_SPECTATOR) || !is_user_valid(id))
continue;
#endif

switch(gAwp[id]){
case AWP_NONE: continue;
case AWP_DROP:{
gAwp[id] = AWP_NONE;
gBlock[id] = gRound + get_pcvar_num(gCvar[CVAR_ROUNDS_LIMIT]);
}
default: sAwp[gTeam[id]] ++;
}
}
}

public EventRestartRound(){
sAwp[TEAM_CT] = 0;
sAwp[TEAM_TERRORIST] = 0;
gRound = 0;
arrayset(gBlock, false, sizeof gBlock);
arrayset(gAwp, AWP_NONE, sizeof gAwp);
}

#if !defined NOEND
public EventRoundEnd(){
new players[32], count;
get_pl(players, count);

if(count >= get_pcvar_num(gCvar[CVAR_ONLINE]))
return PLUGIN_CONTINUE;

for(new i = 0; i < count; i ++){
#if defined ALLPLAYERS
if(!is_user_valid(players))
continue;
#endif

return_awp(players);
}
EventRestartRound();
return PLUGIN_CONTINUE;
}
#endif

stock get_pl(players[32], &count){
#if defined ALLPLAYERS
get_players(players, count);
#else
get_players(players, count, «ch»);
new players1[32], cnt = 0;
for(new i; i < count; i ++){
if(TEAM_UNASSIGNED < get_member(players, m_iTeam) < TEAM_SPECTATOR)
players1[cnt ++] = players;
}

players = players1;
count = cnt;
#endif
}

stock return_awp(id){
if(gAwp[id] <= AWP_NONE)
return;

rg_remove_item(id, «weapon_awp»);
#if defined RETURN_MONEY
if(gAwp[id] == AWP_BUY)
rg_add_account(id, MONEY_AWP);
#endif
client_print_color(id, false, «%s %s», MSG_PREFIX, MSG_LOWONLINE);
}

public BuyWeaponByWeaponID(id, WeaponIdType:weaponID){
if(weaponID != WEAPON_AWP || !is_user_valid(id) || gAwp[id] > AWP_NONE)
return HC_CONTINUE;

const COST_AWP = 4750;
new gMoney = get_member(id, m_iAccount);
if(gMoney < COST_AWP)
return HC_CONTINUE;

gAwp[id] = AWP_BUY;

if(check_awp(id, false))
return HC_CONTINUE;

gAwp[id] = AWP_NONE;

SetHookChainReturn(ATYPE_INTEGER, true);
return HC_SUPERCEDE;
}

public AddItem(id, pItem){
if(get_member(pItem, m_iId) != WEAPON_AWP || gAwp[id] > AWP_NONE || !is_user_valid(id))
return HC_CONTINUE;

if(check_awp(id, false)){
gAwp[id] = AWP_PICK_UP;
return HC_CONTINUE;
}

SetHookChainReturn(ATYPE_INTEGER, false);
return HC_SUPERCEDE;
}

//Native’s
public plugin_natives()
register_native(«awpoff_check», «check_native», true);

public check_native(id)
return check_awp(id, true);
//Native’s

bool: check_awp(id, check){
if(gBlock[id] > gRound){
new c = gBlock[id] — gRound;
client_print_color(id, false, MSG_ROUND, MSG_PREFIX, c, get_text(c));
}else if(gCount < get_pcvar_num(gCvar[CVAR_ONLINE]))
client_print_color(id, false, «%s %s», MSG_PREFIX, MSG_LOWONLINE);
else if(get_pcvar_num(gCvar[CVAR_LIMIT_AWP_STATUS])){

new cvar = get_pcvar_num(gCvar[CVAR_LIMIT_IMMUN]);
if(cvar && cvar != 2 && get_user_flags(id) & FLAG)
return true;

#if defined PERCENT_PLAYERS
if(sAwp[gTeam[id]] < gLimit)
#else
if(sAwp[gTeam[id]] < get_pcvar_num(gCvar[CVAR_LIMIT_MAX_AWP]))
#endif
{
if(!check)
sAwp[gTeam[id]] ++;
return true;
}else
client_print_color(id, false, «%s %s», MSG_PREFIX, MSG_LIMIT);
}else
return true;

return false;
}

public RemoveItem(id, pItem){
if(get_member(pItem, m_iId) == WEAPON_AWP)
minus_awp(id);
}

minus_awp(id){
if(!is_user_valid(id) || gAwp[id] <= AWP_NONE)
return;

new flag = get_user_flags(id) & FLAG, cvar = get_pcvar_num(gCvar[CVAR_LIMIT_IMMUN]);
gAwp[id] = (flag && cvar > 1) ? AWP_NONE : AWP_DROP;

if(!get_pcvar_num(gCvar[CVAR_LIMIT_AWP_STATUS]))
return;

if(cvar && cvar != 2 && flag)
return;

sAwp[gTeam[id]] —;
}

bool: is_user_valid(id){
if(is_user_bot(id)) return false;
if(is_user_hltv(id)) return false;
return true;
}

get_text(tm){
new ost = tm % 10, ost2 = tm % 100, buff[16];

if(ost2 >= 5 && ost2 <= 20)
format(buff, charsmax(buff), «раундов»);
else{
switch(ost){
case 1: format(buff, charsmax(buff), «раунд»);
case 2..4: format(buff, charsmax(buff), «раунда»);
case 0, 5..9: format(buff, charsmax(buff), «раундов»);
}
}
return buff;
}

[/HIDE]

Когда онлан на сервере 10 человек ,то ограничение на авп стоит и пишет,что лимит превышен, хотя никто авп взять не может вообще кроме админов… Как исправить,чтобы при онлайне 10 обычные игроки могли брать по 2 авп на команду?)))

/*

todo
Плагин АМХХ — GameCMS GagManager

нативы для снятия блока
нативы для временных блоков через trie

14.05.19
* изменение натива cmsgag_add_user_block
Добавлен параметр * @printChat Оповестить в чат об операции, false- нет, true- стандартное оповещение о блокировке/разблокировке
* соответствующие изменения в коде для правильной работы данного натива

*/

#include <amxmodx>
#include <amxmisc>
#include <sqlx>
#include <gamecms5>
#include <time>

new const PLUGIN[] = «GameCMS_GagManager»;
new const VERSION[] = «2.2.3»;
new const AUTHOR[] = «zhorzh78»;

#define REAPI

#if defined REAPI
#include <reapi>
#define VTC_OnClientStartSpeak(iSender) VTC_OnClientStartSpeak(const iSender)
#define VTC_OnClientStopSpeak(iSender) VTC_OnClientStopSpeak(const iSender)
#define FMRES_IGNORED HC_CONTINUE
#define FMRES_SUPERCEDE HC_SUPERCEDE
#else
#include <VtcApi>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
new const g_szSpamEntClassname[] = «SpamEntClassname»;
#endif

#define GetBit(%1,%2) ((%1) & (1 << (%2 & 31)))
#define SetBit(%1,%2) ((%1) |= (1 << (%2 & 31)))
#define ResetBit(%1,%2) ((%1) &= ~(1 << (%2 & 31)))
#define IsEnemy(%1,%2) (g_iPlayerTeam[%1] != g_iPlayerTeam[%2])
#define IsPlayerMuted(%1,%2) (GetBit(g_bitPlayerMuted[%1], %2))
#define MENU_DATA_LENGTH 8
#define MENU_ITEM_LENGTH 100
#define MAX_REASON_LENGTH 100
#define TIME_NOT_EXPIRING 0
#define TIME_MAP_END_EXPIRING -1
#define EMPTY_DATA -2
#define MENU_TIME ‘t’
#define MENU_REASON ‘r’
#define MENU_REASON_SELF ‘s’
#define MENU_TYPE ‘b’
#define MENU_PLAYERS ‘p’
#define MENU_ITEM_BLOCK_ADD ‘a’
#define MENU_ITEM_BLOCK_REMOVE ‘d’
#define MAX_CHAT_MSG_LENGTH 190
#define STATIC_ITEM_HANDLER -4
#define STATIC_ITEM_POSITION 6

#define MAX_IMMUNITY_LEVELS 5 //максимальное количество уровней доступа «cms_gag_immunity_lvl»
#define MAX_IMMUNITY_LEVEL_LEN 5 //максимальное количество флагов в одном уровне доступа
#define MAX_BLOCK_TYPES 3 //типов блокировки (все, чат, голос)

enum _:BlockInfo
{
GBid, //comms.GBid BanID
GBlockType, //comms.type
GExpired, //comms.GExpired
GAdminId, //comms.admin_id
GCreated, //comms.GCreated
GBlockTime, //comms.length
GAuthId[MAX_AUTHID_LENGTH], //comms.GAuthId
GName[MAX_NAME_LENGTH], //comms.GName
GBlockReason[MAX_REASON_LENGTH],//comms.reason
GAdminNick[MAX_NAME_LENGTH], //comms.admin_nick
GModifiedBy[MAX_NAME_LENGTH], //comms.modified_by
bool:GModifiedBlocked,
GTargetID
};

enum _:eReasonData
{
REASON_TEXT[MAX_REASON_LENGTH],
REASON_TIME,
REASON_TYPE
};

new const sqlTable[] = «comms»;
new const g_szSoundFilePath[] = «../valve/sound/buttons/blip2.wav»;
new Trie:g_trhWhiteListCmdArray, Trie:g_trhBlockedUsers;
new Array:g_arhBlockTime, Array:g_arhBlockReasons;
new Handle:g_hSqlHandle;

new szQuery[MAX_QUERY_SMALL_LEN*2], plBlockInfo[MAX_PLAYERS+1][BlockInfo], g_szPlayerMuteType[MAX_PLAYERS + 1];
new g_bitPlayerMuted[MAX_PLAYERS+1], CsTeams:g_iPlayerTeam[MAX_PLAYERS+1], bool:g_isAlivePlayer[MAX_PLAYERS+1], g_iImmunLevel[MAX_PLAYERS+1];
new g_szBlockType[MAX_BLOCK_TYPES][MAX_NAME_LENGTH], g_bitAccessLvl[MAX_IMMUNITY_LEVELS];
new g_iEntSpamChecker[MAX_PLAYERS+1], Float:g_flPlayerSpamTimer[MAX_PLAYERS+1];
new g_bitBlockedVoice, g_bitBlockedChat, g_bitBlockedFully, g_bitUseTeamVoice;
new g_iTimeMenu, g_iReasonMenuId, g_iTypeMenu, g_iStaticMenuCallback;
new g_iAddTime, g_iAddLastId, g_iMenuAccessNull, g_iImmunLevelsNum;
new g_bitApiAllow, g_iCmdGagMenu, g_iServerId, bool:g_bRoundEnd;

//cvars
new cpTime, cpImmunityLvl, cpWhiteCmds, cpDeadAdmTalk, cpAmxShowActivity, cpAllTalk, cpBlockVoiceSpam;
new cv_iDeadAdmTalk, cv_iAllTalk, cv_iBlockSpam, cv_iMuteTypeChoose, Float:cv_flBlockSpamTimer, Float:cv_flTimeForInfo;

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_cvar(«gamecms_gagmanager», VERSION, FCVAR_SERVER);

register_dictionary(«time.txt»);
register_dictionary(«common.txt»);
register_dictionary(«gamecms_gagmanager.txt»);

register_clcmd(«say /mute», «MuteMenu»);
register_clcmd(«say_team /mute», «MuteMenu»);
register_clcmd(«+teamvoice», «CmdTeamVoiceOn»);
register_clcmd(«-teamvoice», «CmdTeamVoiceOff»);
register_clcmd(«say», «HookSayChat»);
register_clcmd(«say_team», «HookSayChat»);

#if defined _reapi_included
RegisterHookChain(RG_CBasePlayer_Spawn, «CBasePlayerSpawn», true);
RegisterHookChain(RG_CBasePlayer_Killed, «CBasePlayerKilled», true);
RegisterHookChain(RG_CSGameRules_CanPlayerHearPlayer, «CanPlayerHearPlayer», false);
RegisterHookChain(RG_CSGameRules_RestartRound, «Rlog_Round_Start», true);
RegisterHookChain(RG_RoundEnd, «Rlog_Round_End», true);
#else
RegisterHam(Ham_Spawn, «player», «CBasePlayerSpawn», true);
RegisterHam(Ham_Killed, «player», «CBasePlayerKilled», true);
register_forward(FM_Voice_SetClientListening, «CanPlayerHearPlayer», false);
register_logevent(«Rlog_Round_End», 2, «1=Round_End»);
register_logevent(«Rlog_Round_Start», 2, «1=Round_Start»);
#endif

//квары
cpTime = register_cvar(«cms_gag_time», «-1, 10, 60, 1440, 0»);
cpImmunityLvl = register_cvar(«cms_gag_immunity_lvl», «a, b, c, d»);
cpWhiteCmds = register_cvar(«cms_gag_whitecmds», «»);
cpDeadAdmTalk = register_cvar(«cms_gag_deadadmtalk», «0»);
cpBlockVoiceSpam = register_cvar(«cms_gag_block_voice_spam», «1»);

new cpBlockSpamTimer = register_cvar(«cms_gag_block_spam_timer», «10.0»);
new cpMuteTypeChoose = register_cvar(«cms_gag_mute_type_choose», «0»);

cpAmxShowActivity = get_cvar_pointer(«amx_show_activity»);
cpAllTalk = get_cvar_pointer(«sv_alltalk»);
hook_cvar_change(cpAllTalk, «HookCvarChanged»);
bind_pcvar_float(register_cvar(«cms_gag_time_for_info», «0.0»), cv_flTimeForInfo);

g_trhBlockedUsers = TrieCreate();
g_trhWhiteListCmdArray = TrieCreate();
g_arhBlockTime = ArrayCreate();

//меню причин, чтобы загрузить их из конфига(ов)
FnReasonMenuCreate();

new configsFile[MAX_NAME_LENGTH*2];
get_configsdir(configsFile, charsmax(configsFile));
format(configsFile, charsmax(configsFile), «%s/gamecms/gamecms_gagmanager.cfg», configsFile);

server_cmd(«exec %s», configsFile);
server_exec();

cv_iMuteTypeChoose = get_pcvar_num(cpMuteTypeChoose);
cv_flBlockSpamTimer = get_pcvar_float(cpBlockSpamTimer);

if(cv_iMuteTypeChoose)
register_message(get_user_msgid(«SayText»), «MessageSayText»);

new tmpCvarStr[MAX_FMT_LENGTH];
if(get_pcvar_string(cpImmunityLvl, tmpCvarStr, charsmax(tmpCvarStr)))
{
new tmpOut[MAX_IMMUNITY_LEVELS][MAX_IMMUNITY_LEVEL_LEN];
g_iImmunLevelsNum = explode_string(tmpCvarStr, «,», tmpOut, sizeof(tmpOut), sizeof(tmpOut[]));

if(!g_iImmunLevelsNum)
return;
else if(g_iImmunLevelsNum > MAX_IMMUNITY_LEVELS)
g_iImmunLevelsNum = MAX_IMMUNITY_LEVELS;

for(new i; i < g_iImmunLevelsNum; i++)
{
trim(tmpOut);
g_bitAccessLvl = read_flags(tmpOut);
}

new iMenuFlag = g_bitAccessLvl[1];
g_iCmdGagMenu = register_clcmd(«amx_gagmenu», «AdminPlayersMenu», iMenuFlag, «», 1);
register_clcmd(«say /gag», «AdminPlayersMenu», iMenuFlag, «», 1);
}
}

public plugin_precache()
{
if(file_exists(g_szSoundFilePath))
precache_sound(g_szSoundFilePath);
}

public Rlog_Round_End()
{
g_bRoundEnd = true;
}

public Rlog_Round_Start()
{
g_bRoundEnd = false;
}

public OnConfigsExecuted()
{
new tmpCvarStr[512];
//время
if(get_pcvar_string(cpTime, tmpCvarStr, charsmax(tmpCvarStr)))
CvarsToArray(g_arhBlockTime, tmpCvarStr, ‘,’, «t»);

//разрешенные команды
if(get_pcvar_string(cpWhiteCmds, tmpCvarStr, charsmax(tmpCvarStr)))
CvarsToArray(g_trhWhiteListCmdArray, tmpCvarStr, ‘,’, «c»);

cv_iDeadAdmTalk = get_pcvar_num(cpDeadAdmTalk);
cv_iAllTalk = get_pcvar_num(cpAllTalk);
cv_iBlockSpam = get_pcvar_num(cpBlockVoiceSpam);

if(cv_iBlockSpam != BLOCK_STATUS_NONE && cv_flBlockSpamTimer > 0.0)
{
for(new iClient = 1; iClient <= MaxClients; iClient++)
{
#if defined _reapi_included
g_iEntSpamChecker[iClient] = rg_create_entity(«info_target», true);
}
#else
g_iEntSpamChecker[iClient] = create_entity(«info_target»);
if(g_iEntSpamChecker[iClient])
{
entity_set_string(g_iEntSpamChecker[iClient], EV_SZ_classname, g_szSpamEntClassname);
entity_set_edict(g_iEntSpamChecker[iClient], EV_ENT_owner, iClient);
}
}

register_think(g_szSpamEntClassname, «SpamEntThinkCallback»);
#endif
}

FnCreateStaticMenu();
}

FnReasonMenuCreate()
{
register_concmd(«cms_gag_reason», «CmdAddGagReason»);
g_arhBlockReasons = ArrayCreate(eReasonData);
g_iStaticMenuCallback = menu_makecallback(«StaticMenuCallback»);
g_iReasonMenuId = menu_create(fmt(«%L», LANG_PLAYER, «CMSGAG_MENU_REASON_HEADER»), «StaticMenuHandler»);
menu_additem(g_iReasonMenuId, fmt(«%L», LANG_PLAYER, «CMSGAG_MENU_REASON_CUSTOM»), «rs»);
menu_setprop(g_iReasonMenuId, MPROP_EXITNAME, fmt(«%L», LANG_PLAYER, «EXIT»));
}

public HookCvarChanged(pcvar, const old_value[], const new_value[])
{
if(pcvar == cpAllTalk)
cv_iAllTalk = str_to_num(new_value);
}

/*======== Загрузка причины =========*/
public CmdAddGagReason(id, level, cid)
{
if(!cmd_access(id, g_bitAccessLvl[1], cid, 0))
return PLUGIN_HANDLED;

new szReason[MENU_ITEM_LENGTH];
read_args(szReason, charsmax(szReason));

if(szReason[0])
{
new szReasonInfo[eReasonData];
if(!id)
{
new iItems, szTime[MENU_DATA_LENGTH], szType[MENU_DATA_LENGTH];
iItems = parse(szReason, szReasonInfo[REASON_TEXT], charsmax(szReasonInfo), szTime, charsmax(szTime), szType, charsmax(szType));

if(iItems > 1)
{
szReasonInfo[REASON_TIME] = szTime[0] ? str_to_num(szTime) : EMPTY_DATA;
switch(szType[0])
{
case ‘a’: szReasonInfo[REASON_TYPE] = BLOCK_STATUS_ALL;
case ‘c’: szReasonInfo[REASON_TYPE] = BLOCK_STATUS_CHAT;
case ‘v’: szReasonInfo[REASON_TYPE] = BLOCK_STATUS_VOICE;
default: szReasonInfo[REASON_TYPE] = EMPTY_DATA;
}
}
else
szReasonInfo[REASON_TIME] = szReasonInfo[REASON_TYPE] = EMPTY_DATA;

ArrayPushArray(g_arhBlockReasons, szReasonInfo, sizeof(szReasonInfo));
}
else
{
remove_quotes(szReason);
trim(szReason);
copy(plBlockInfo[id][GBlockReason], charsmax(plBlockInfo[]), szReason);
return plBlockInfo[id][GCreated] ? GagInfoMenu(id) : menu_display(id, g_iTimeMenu, 0);
}
}
else
menu_display(id, g_iReasonMenuId, 0);

return PLUGIN_HANDLED;
}

/*======== Ловим соединение с БД от API =========*/
public OnAPIPluginLoaded(Handle:sqlTuple)
{
g_hSqlHandle = sqlTuple;
g_bitApiAllow |= UseGameCms;
g_iServerId = cmsapi_get_server_id();

SQL_SetCharset(g_hSqlHandle, «utf8»);

if(get_playersnum()) //Если игроки зашли ДО соединения с БД
{
new szAuthid[MAX_AUTHID_LENGTH];
for(new i = 1; i <= MaxClients; i++)
{
if(!is_user_connected(i))
continue;

get_user_authid(i, szAuthid, charsmax(szAuthid));
FnClientConnected(i, szAuthid);
}
}
}

public OnAPIAdminsLoaded()
g_bitApiAllow |= UseGameCmsAdmins;

/*======== Статические меню (время, тип) =========*/

public FnCreateStaticMenu()
{
new iSize = ArraySize(g_arhBlockReasons);
new szReasonInfo[eReasonData];
for(new i; i < iSize; i++)
{
ArrayGetArray(g_arhBlockReasons, i, szReasonInfo, sizeof(szReasonInfo));

if(szReasonInfo[REASON_TIME] != EMPTY_DATA)
format(szReasonInfo[REASON_TEXT], charsmax(szReasonInfo[REASON_TEXT]), «%s y[%s]», szReasonInfo[REASON_TEXT],
FormatBlockTime(szReasonInfo[REASON_TIME], 1, timeunit_minutes));

if(szReasonInfo[REASON_TYPE] != EMPTY_DATA)
format(szReasonInfo[REASON_TEXT], charsmax(szReasonInfo[REASON_TEXT]), «%s y[%L]», szReasonInfo[REASON_TEXT],
LANG_PLAYER, fmt(«CMSGAG_BLOCK_TYPE_%d», szReasonInfo[REASON_TYPE]));

menu_additem(g_iReasonMenuId, szReasonInfo[REASON_TEXT], «r», 0, g_iStaticMenuCallback);
}

/* =========== Меню выбора времени*/
g_iTimeMenu = menu_create(fmt(«%L», LANG_PLAYER, «CMSGAG_MENU_TIME_HEADER»), «StaticMenuHandler», 1);
iSize = ArraySize(g_arhBlockTime);
for (new i = 0; i < iSize; ++i)
menu_additem(g_iTimeMenu, FormatBlockTime(ArrayGetCell(g_arhBlockTime, i), 1, timeunit_minutes), «t», 0, g_iStaticMenuCallback);

menu_setprop(g_iTimeMenu, MPROP_EXITNAME, fmt(«%L», LANG_PLAYER, «EXIT»));

/* =========== Меню выбора типа блокировки */

g_iTypeMenu = menu_create(fmt(«%L», LANG_PLAYER, «CMSGAG_MENU_TYPE_HEADER»), «StaticMenuHandler», 1);
for (new i = 0; i < MAX_BLOCK_TYPES; ++i)
{
formatex(g_szBlockType, charsmax(g_szBlockType[]), «%L», LANG_PLAYER, fmt(«CMSGAG_BLOCK_TYPE_%d», i));
menu_additem(g_iTypeMenu, g_szBlockType, «b», 0, g_iStaticMenuCallback);
}

menu_setprop(g_iTypeMenu, MPROP_EXITNAME, fmt(«%L», LANG_PLAYER, «EXIT»));
}

public StaticMenuCallback(id, menu, item)
{
new szData[MENU_DATA_LENGTH], szName[MENU_ITEM_LENGTH];
menu_item_getinfo(menu, item, g_iMenuAccessNull, szData, charsmax(szData), szName, charsmax(szName));

new itemStatus;
switch(szData[0])
{
case MENU_TIME:
{
new iTime = ArrayGetCell(g_arhBlockTime, item);
///?????? get_timeleft на ксдм
itemStatus = (iTime == plBlockInfo[id][GBlockTime] && plBlockInfo[id][GCreated]) ||
!g_bitApiAllow && (iTime > get_timeleft()/60 || iTime == TIME_NOT_EXPIRING) ? ITEM_DISABLED : ITEM_IGNORE;
}
case MENU_REASON: itemStatus = strcmp(szName, plBlockInfo[id][GBlockReason]) == 0 ? ITEM_DISABLED : ITEM_IGNORE;
case MENU_TYPE: itemStatus = item == plBlockInfo[id][GBlockType] && plBlockInfo[id][GCreated] ? ITEM_DISABLED : ITEM_IGNORE;
}

return itemStatus;
}

public StaticMenuHandler(id, menu, item)
{
if(item == MENU_EXIT)
{
if(plBlockInfo[id][GCreated])
GagInfoMenu(id);
else
arrayset(plBlockInfo[id], 0, BlockInfo);
return PLUGIN_HANDLED;
}

new szData[MENU_DATA_LENGTH], szName[MENU_ITEM_LENGTH];
menu_item_getinfo(menu, item, g_iMenuAccessNull, szData, charsmax(szData), szName, charsmax(szName));

switch(szData[0])
{
case MENU_TIME: //time
{
plBlockInfo[id][GBlockTime] = ArrayGetCell(g_arhBlockTime, item);
if(plBlockInfo[id][GCreated])
{
GagInfoMenu(id);
return PLUGIN_HANDLED;
}

if(plBlockInfo[id][GBlockType] == EMPTY_DATA)
menu_display(id, g_iTypeMenu, 0);
else
GagInfoMenu(id);
}
case MENU_REASON: //reason
{
switch(szData[1])
{
case MENU_REASON_SELF:
{
client_cmd(id,»messagemode cms_gag_reason»);
return PLUGIN_HANDLED;
}
default:
{
new szReasonInfo[eReasonData];
ArrayGetArray(g_arhBlockReasons, item — 1, szReasonInfo, sizeof(szReasonInfo));

copy(plBlockInfo[id][GBlockReason], charsmax(plBlockInfo[]), szReasonInfo[REASON_TEXT]);

if(plBlockInfo[id][GCreated])
{
GagInfoMenu(id);
return PLUGIN_HANDLED;
}
plBlockInfo[id][GBlockTime] = szReasonInfo[REASON_TIME];
plBlockInfo[id][GBlockType] = szReasonInfo[REASON_TYPE];

if(plBlockInfo[id][GBlockTime] == EMPTY_DATA)
menu_display(id, g_iTimeMenu, 0);
else if(plBlockInfo[id][GBlockType] == EMPTY_DATA)
menu_display(id, g_iTypeMenu, 0);
else
GagInfoMenu(id);
}
}
}
case MENU_TYPE: //type
{
plBlockInfo[id][GBlockType] = item;
GagInfoMenu(id);
}
}

return PLUGIN_HANDLED;
}

/*======== Меню игроков (админ) =========*/
public AdminPlayersMenu(id)
{
if(!cmd_access(id, g_bitAccessLvl[1], g_iCmdGagMenu, 0))
return PLUGIN_HANDLED;

arrayset(plBlockInfo[id], 0, BlockInfo);

static iAdminMenuCallback;
if(!iAdminMenuCallback)
iAdminMenuCallback = menu_makecallback(«AdminPlayersMenuCallback»);
new iPlayersMenu = menu_create(fmt(«%L», LANG_PLAYER, «CMSGAG_MENU_BLOCK_HEADER»), «AdminPlayersMenuHandler»);

new iTargetClient, szFmtName[MENU_ITEM_LENGTH], szPlayersIds[MAX_PLAYERS], iPlayersCount;
get_players_ex(szPlayersIds, iPlayersCount, (GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV));

for (new i; i < iPlayersCount; i++)
{
iTargetClient = szPlayersIds;
if(id == iTargetClient)
continue;

if(cmsgag_is_user_blocked(iTargetClient) != BLOCK_STATUS_NONE)
formatex(szFmtName, charsmax(szFmtName), «w%n %L», iTargetClient, LANG_PLAYER, «CMSGAG_ITEM_PLAYER_BLOCKED»);
else
formatex(szFmtName, charsmax(szFmtName), «w%n», iTargetClient);

menu_additem(iPlayersMenu, szFmtName, fmt(«%d», iTargetClient), 0, iAdminMenuCallback);
}

menu_setprop(iPlayersMenu, MPROP_BACKNAME, fmt(«%L», LANG_PLAYER, «BACK»));
menu_setprop(iPlayersMenu, MPROP_NEXTNAME, fmt(«%L», LANG_PLAYER, «MORE»));
menu_setprop(iPlayersMenu, MPROP_EXITNAME, fmt(«%L», LANG_PLAYER, «EXIT»));

menu_display(id, iPlayersMenu, 0);

return PLUGIN_HANDLED;
}

public AdminPlayersMenuCallback(id, menu, item)
{
new szPlayerId[MENU_DATA_LENGTH];
menu_item_getinfo(menu, item, g_iMenuAccessNull, szPlayerId, charsmax(szPlayerId));

return FnAboveImmunity(id, str_to_num(szPlayerId)) ? ITEM_ENABLED : ITEM_DISABLED;
}

public AdminPlayersMenuHandler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}

new szPlayerId[MENU_DATA_LENGTH];
menu_item_getinfo(menu, item, g_iMenuAccessNull, szPlayerId, charsmax(szPlayerId));
plBlockInfo[id][GTargetID] = str_to_num(szPlayerId);

menu_destroy(menu);

get_user_name(plBlockInfo[id][GTargetID], plBlockInfo[id][GName], charsmax(plBlockInfo[]));
get_user_authid(plBlockInfo[id][GTargetID], plBlockInfo[id][GAuthId], charsmax(plBlockInfo[]));

new iBlockOwner;
if(g_bitApiAllow & UseGameCmsAdmins)
iBlockOwner = cmsapi_get_admin_ident(id);

if(!TrieGetArray(g_trhBlockedUsers, plBlockInfo[id][GAuthId], plBlockInfo[id], charsmax(plBlockInfo[])))
{
plBlockInfo[id][GAdminId] = iBlockOwner;

menu_display(id, g_iReasonMenuId, 0);
return PLUGIN_HANDLED;
}

//если игрок заблокирован, найдем админа
if(g_bitApiAllow & UseGameCmsAdmins)
{
#if !defined API54
new iAdminId = plBlockInfo[id][GAdminId];
if(iAdminId != iBlockOwner)
{
new Trie:trhAdminInfo = cmsapi_get_admin_info(iAdminId);
if(trhAdminInfo)
{
new adminData[AdminInfo];
TrieGetArray(trhAdminInfo, fmt(«%d», iAdminId), adminData, sizeof adminData);
plBlockInfo[id][GModifiedBlocked] = FnAboveImmunity(get_user_flags(id), read_flags(adminData[AdminServiceFlags]), true) ? false : true;
//TrieDestroy(trhAdminInfo);
}
}
#else
if(plBlockInfo[id][GAdminId] != iBlockOwner)
{
new adminData[AdminInfo];
if(cmsapi_get_info_by_admin_id(plBlockInfo[id][GAdminId], adminData))
plBlockInfo[id][GModifiedBlocked] = FnAboveImmunity(get_user_flags(id), read_flags(adminData[AdminServiceFlags]), true) ? false : true;
}
#endif
}

GagInfoMenu(id);

return PLUGIN_HANDLED;
}

/*======== Меню сохранения / удаления блока =========*/
public GagInfoMenu(id)
{
new tmpName[MENU_ITEM_LENGTH];
new tmpTypeNum = plBlockInfo[id][GBlockType];
new iGagInfoMenu = menu_create(fmt(«%L», LANG_PLAYER, «CMSGAG_MENU_INFO_HEADER»), «GagInfoMenuHandler»);
static iGagInfoMenuCallback;
if(!iGagInfoMenuCallback)
iGagInfoMenuCallback = menu_makecallback(«GagInfoMenuCallback»);
new bool:existKey = TrieKeyExists(g_trhBlockedUsers, plBlockInfo[id][GAuthId]);

/*if(!plBlockInfo[id][GCreated])
plBlockInfo[id][GCreated] = get_systime();
*/
if(existKey)
formatex(tmpName, charsmax(tmpName), «%L %s %L», LANG_PLAYER,»CMSGAG_ITEM_PLAYER_INFO_NAME», plBlockInfo[id][GName], LANG_PLAYER,»CMSGAG_ITEM_PLAYER_BLOCKED»);
else
formatex(tmpName, charsmax(tmpName), «%L %s», LANG_PLAYER,»CMSGAG_ITEM_PLAYER_INFO_NAME», plBlockInfo[id][GName]);
menu_additem(iGagInfoMenu, tmpName, «p», 0);

formatex(tmpName, charsmax(tmpName), «%L %s», LANG_PLAYER, «CMSGAG_ITEM_PLAYER_INFO_TIME», FormatBlockTime(plBlockInfo[id][GBlockTime], 1, timeunit_minutes));
menu_additem(iGagInfoMenu, tmpName, «t», 0, iGagInfoMenuCallback);

formatex(tmpName, charsmax(tmpName), «%L %s», LANG_PLAYER, «CMSGAG_ITEM_PLAYER_INFO_REASON», plBlockInfo[id][GBlockReason]);
menu_additem(iGagInfoMenu, tmpName, «r», 0, iGagInfoMenuCallback);

formatex(tmpName, charsmax(tmpName), «%L %s», LANG_PLAYER, «CMSGAG_ITEM_PLAYER_INFO_TYPE», g_szBlockType[tmpTypeNum]);
menu_additem(iGagInfoMenu, tmpName, «b», 0, iGagInfoMenuCallback);

if(existKey)
{
static iTime;
iTime = plBlockInfo[id][GExpired] > 0 ? (plBlockInfo[id][GExpired] — get_systime())/60 : plBlockInfo[id][GExpired];
formatex(tmpName, charsmax(tmpName), «%L %s», LANG_PLAYER, «CMSGAG_ITEM_PLAYER_INFO_EXPIRED», FormatBlockTime(iTime, 2, timeunit_minutes));
menu_addtext(iGagInfoMenu, tmpName, 0);
}
if(strlen(plBlockInfo[id][GAdminNick]))
{
formatex(tmpName, charsmax(tmpName), «%L %s», LANG_PLAYER, «CMSGAG_ITEM_PLAYER_INFO_ADMIN_1», plBlockInfo[id][GAdminNick]);
menu_addtext(iGagInfoMenu, tmpName, 0);
}
if(strlen(plBlockInfo[id][GModifiedBy]))
{
formatex(tmpName, charsmax(tmpName), «%L %s», LANG_PLAYER, «CMSGAG_ITEM_PLAYER_INFO_ADMIN_2», plBlockInfo[id][GModifiedBy]);
menu_addtext(iGagInfoMenu, tmpName, 0);
}

menu_addblank2(iGagInfoMenu);

menu_additem(iGagInfoMenu, fmt(«%L», LANG_PLAYER, existKey ? «CMSGAG_ITEM_PLAYER_INFO_SAVE» : «CMSGAG_ITEM_PLAYER_INFO_SET»), «a», 0, iGagInfoMenuCallback);

if(existKey)
menu_additem(iGagInfoMenu, fmt(«%L», LANG_PLAYER, «CMSGAG_ITEM_PLAYER_INFO_REMOVE»), «d», 0, iGagInfoMenuCallback);

menu_setprop(iGagInfoMenu, MPROP_EXITNAME, fmt(«%L», LANG_PLAYER, «EXIT»));
menu_setprop(iGagInfoMenu, MPROP_EXIT, MEXIT_ALL);
menu_display(id, iGagInfoMenu, 0);

return PLUGIN_HANDLED;
}

public GagInfoMenuCallback(id, menu, item)
{
return (plBlockInfo[id][GModifiedBlocked]/* || cmsgag_is_user_blocked(id) != BLOCK_STATUS_NONE*/) ? ITEM_DISABLED : ITEM_ENABLED;
}

public GagInfoMenuHandler(id, menu, item)
{
if(item == MENU_EXIT)
{
arrayset(plBlockInfo[id], 0, BlockInfo);
}
else
{
if(!plBlockInfo[id][GCreated])
plBlockInfo[id][GCreated] = get_systime();

new szData[MENU_DATA_LENGTH];
menu_item_getinfo(menu, item, g_iMenuAccessNull, szData, charsmax(szData));

switch(szData[0])
{
case MENU_TIME: menu_display(id, g_iTimeMenu, 0); //time
case MENU_REASON: menu_display(id, g_iReasonMenuId, 0); //reason
case MENU_TYPE: menu_display(id, g_iTypeMenu, 0); //type
case MENU_PLAYERS: AdminPlayersMenu(id); //szPlayersIds menu
case MENU_ITEM_BLOCK_ADD: BlockQueryFunc(id, BLOCK_FUNC_ADD); //add/ save block
case MENU_ITEM_BLOCK_REMOVE: BlockQueryFunc(id, BLOCK_FUNC_REMOVE); //remove block
}
}

menu_destroy(menu);
return PLUGIN_HANDLED;
}

/*======== Меню игроков (игрок) =========*/
public MuteMenu(id)
{
static g_iMuteMenuCB;
if(!g_iMuteMenuCB)
g_iMuteMenuCB = menu_makecallback(«MuteMenuCallback»);
new iMuteMenu = menu_create(fmt(«%L», LANG_PLAYER, «CMSGAG_MENU_MUTE_HEADER»), «MuteMenuHandler», 1);

new szPlayersIds[MAX_PLAYERS], iPlayersCount;
get_players_ex(szPlayersIds, iPlayersCount, (GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV));

for(new i; i < iPlayersCount; i++)
{
if(cv_iMuteTypeChoose)
menu_additem_static(iMuteMenu, «», fmt(«%d», szPlayersIds), i, iPlayersCount-1, true, 0, g_iMuteMenuCB);
else
menu_additem(iMuteMenu, «», fmt(«%d», szPlayersIds), 0, g_iMuteMenuCB);
}

menu_setprop(iMuteMenu, MPROP_BACKNAME, fmt(«%L», LANG_PLAYER, «BACK»));
menu_setprop(iMuteMenu, MPROP_NEXTNAME, fmt(«%L», LANG_PLAYER, «MORE»));
menu_setprop(iMuteMenu, MPROP_EXITNAME, fmt(«%L», LANG_PLAYER, «EXIT»));

menu_display(id, iMuteMenu, 0);
return PLUGIN_HANDLED;
}

stock menu_additem_static(iMenu, itemName[], itemInfo[], index, lastItemPos, bool:shift = true, paccess = 0, iMenuCallback = -1)
{
new staticItem = index % STATIC_ITEM_POSITION;
menu_additem(iMenu, itemName, itemInfo, paccess, iMenuCallback);

if(index == lastItemPos)
{
if(shift)
{
new addBlank = STATIC_ITEM_POSITION — staticItem — 1;
for(new i; i < addBlank; i++)
menu_addblank2(iMenu);
}

staticItem = STATIC_ITEM_POSITION — 1;
}

if(staticItem == STATIC_ITEM_POSITION — 1)
{
if(shift)
menu_addblank(iMenu, 0);

menu_additem(iMenu, «», fmt(«%d», STATIC_ITEM_HANDLER), paccess, iMenuCallback);
}
}

public MuteMenuCallback(id, menu, item)
{
new szPlayerId[MENU_DATA_LENGTH], iTargetClient, szFmtName[MAX_NAME_LENGTH*2];
menu_item_getinfo(menu, item, g_iMenuAccessNull, szPlayerId, charsmax(szPlayerId));

static iItemStatus;
iItemStatus = ITEM_IGNORE;
iTargetClient = str_to_num(szPlayerId);

if(iTargetClient != STATIC_ITEM_HANDLER && is_user_connected(iTargetClient))
{
formatex(szFmtName, charsmax(szFmtName), «w%n», iTargetClient);
if(iTargetClient == id)
iItemStatus = ITEM_DISABLED;
else if(GetBit(g_bitBlockedFully, iTargetClient))
{
format(szFmtName, charsmax(szFmtName), «%s %L», szFmtName, LANG_PLAYER, «CMSGAG_ITEM_BLOCKED_BY_ADMIN»);
iItemStatus = ITEM_DISABLED;
}
else if(IsPlayerMuted(id, iTargetClient))
format(szFmtName, charsmax(szFmtName), «%s %L», szFmtName, LANG_PLAYER, «CMSGAG_ITEM_PLAYER_MUTED»);
}
else
{
formatex(szFmtName, charsmax(szFmtName), «%L %L», LANG_PLAYER, «CMSGAG_ITEM_PLAYER_INFO_TYPE»,
LANG_PLAYER, fmt(«CMSGAG_BLOCK_TYPE_%d», g_szPlayerMuteType[id]));
}

menu_item_setname(menu, item, szFmtName);
return iItemStatus;
}

public MuteMenuHandler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}

new szPlayerId[MENU_DATA_LENGTH];
menu_item_getinfo(menu, item, g_iMenuAccessNull, szPlayerId, charsmax(szPlayerId));

new iTargetClient = str_to_num(szPlayerId);

if(iTargetClient != STATIC_ITEM_HANDLER)
{
if(!is_user_connected(iTargetClient))
{
client_print_color(id, iTargetClient, «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX», LANG_PLAYER, «CMSGAG_CHAT_NOPLAYER»);
menu_destroy(menu);
return PLUGIN_HANDLED;
}

if(!IsPlayerMuted(id, iTargetClient))
{
if(GetBit(g_bitBlockedFully, iTargetClient))
{
client_print_color(id, iTargetClient, «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX», LANG_PLAYER, «CMSGAG_CHAT_ALREADY_BLOCKED»);
menu_destroy(menu);
return PLUGIN_HANDLED;
}

FnMutePlayer(id, iTargetClient, true);
client_print_color(id, iTargetClient, «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX», LANG_PLAYER, «CMSGAG_CHAT_SET_MUTE», iTargetClient);
}
else
{
FnMutePlayer(id, iTargetClient, false);
client_print_color(id, iTargetClient, «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX», LANG_PLAYER, «CMSGAG_CHAT_RESET_MUTE», iTargetClient);
}
}
else
{
if(++g_szPlayerMuteType[id] > BLOCK_STATUS_VOICE)
g_szPlayerMuteType[id] = BLOCK_STATUS_ALL;
}

new imenu, newmenu, menupage;
player_menu_info(id, imenu, newmenu, menupage);

menu_display(id, menu, menupage);
return PLUGIN_HANDLED;
}

FnMutePlayer(id, iTargetClient, setMute)
{
if(setMute)
SetBit(g_bitPlayerMuted[id], iTargetClient);
else
ResetBit(g_bitPlayerMuted[id], iTargetClient);
}

public client_authorized(id, const authid[])
{
FnClientConnected(id, authid);
}

FnClientConnected(id, const authid[])
{
if(is_user_bot(id) || is_user_hltv(id))
return;

g_bitPlayerMuted[id] = 0;
g_szPlayerMuteType[id] = 0;
g_isAlivePlayer[id] = false;
g_iImmunLevel[id] = FnImmunityLevel(get_user_flags(id));

FnSpamTimerReset(id);

ResetBit(g_bitUseTeamVoice, id);
FnCheckBlockAvailability(id, authid);
}

public OnAPIAdminConnected(id, const szName[], adminID, Flags)
{
g_iImmunLevel[id] = FnImmunityLevel(Flags);
}

public client_disconnected(id)
{
FnResetBlock(id);

for(new i = 1; i < MaxClients; i++)
FnMutePlayer(i, id, false);
}

/*======== Получение данных из БД =========*/
public FnCheckBlockAvailability(id, const szAuthid[])
{
if(TrieGetArray(g_trhBlockedUsers, szAuthid, plBlockInfo[id], charsmax(plBlockInfo[])))
{
FnChangeBlock(id, plBlockInfo[id][GBlockType]);
return;
}

if(!g_bitApiAllow || !g_hSqlHandle)
return;

formatex(szQuery, charsmax(szQuery), «SELECT * FROM `%s` WHERE `server_id` = ‘%d’ AND `authid` = ‘%s’
AND ((`expired` > UNIX_TIMESTAMP(NOW()) OR `expired` = ‘0’ ) AND `length` != ‘-1’ AND `expired` != ‘-1’) LIMIT 1;»,
sqlTable, g_iServerId, szAuthid);

static Data[2];
Data[0] = id;
SQL_ThreadQuery(g_hSqlHandle, «FnCheckBlockAvailability_post», szQuery, Data, sizeof(Data));
}

public FnCheckBlockAvailability_post(failstate, Handle:query, const error[], errornum, const postData[], DataSize)
{
if(SQL_Error(error, errornum, failstate))
return;

if(!SQL_NumResults(query))
return;

static id;
id = postData[0];

plBlockInfo[id][GBid] = SQL_ReadResult(query, SQL_FieldNameToNum(query, «bid»));
plBlockInfo[id][GBlockType] = SQL_ReadResult(query, SQL_FieldNameToNum(query, «type»));
plBlockInfo[id][GExpired] = SQL_ReadResult(query, SQL_FieldNameToNum(query, «expired»));
//plBlockInfo[id][GCreated] = SQL_ReadResult(query, SQL_FieldNameToNum(query, «created»));
plBlockInfo[id][GBlockTime] = SQL_ReadResult(query, SQL_FieldNameToNum(query, «length»));
plBlockInfo[id][GAdminId] = SQL_ReadResult(query, SQL_FieldNameToNum(query, «admin_id»));

SQL_ReadResult(query, SQL_FieldNameToNum(query, «authid»), plBlockInfo[id][GAuthId], charsmax(plBlockInfo[][GAuthId]));
SQL_ReadResult(query, SQL_FieldNameToNum(query, «name»), plBlockInfo[id][GName], charsmax(plBlockInfo[][GName]));
SQL_ReadResult(query, SQL_FieldNameToNum(query, «reason»), plBlockInfo[id][GBlockReason], charsmax(plBlockInfo[][GBlockReason]));
SQL_ReadResult(query, SQL_FieldNameToNum(query, «admin_nick»), plBlockInfo[id][GAdminNick], charsmax(plBlockInfo[][GAdminNick]));
SQL_ReadResult(query, SQL_FieldNameToNum(query, «modified_by»), plBlockInfo[id][GModifiedBy], charsmax(plBlockInfo[][GModifiedBy]));

mysql_escape_string(plBlockInfo[id][GName], charsmax(plBlockInfo[][GName])*2);
mysql_escape_string(plBlockInfo[id][GBlockReason], charsmax(plBlockInfo[][GBlockReason]));
mysql_escape_string(plBlockInfo[id][GAdminNick], charsmax(plBlockInfo[][GAdminNick])*2);
mysql_escape_string(plBlockInfo[id][GModifiedBy], charsmax(plBlockInfo[][GModifiedBy])*2);

if(TrieSetArray(g_trhBlockedUsers, plBlockInfo[id][GAuthId], plBlockInfo[id], sizeof(plBlockInfo[])))
FnChangeBlock(id, plBlockInfo[id][GBlockType]);
}

/*======== Запрос на сохранение блока =========*/
/*
id- client index
iFuncType — тип операции блокировки(1- создание, 2- удаление)
iBlockType — тип блока (чат / голос)
szBlockReason — причина
iTime — время

iTargetClient — target index

*/

BlockQueryFunc(id, iFuncType, iBlockType = BLOCK_STATUS_NONE, szBlockReason[] = «», iTime = 0, bool:printChat = true)
{
new iTargetClient = plBlockInfo[id][GTargetID];
if(!iTargetClient)
iTargetClient = id;

new iSystime = get_systime(), iTimeleft = get_timeleft() / 60;
if(g_iAddLastId == iTargetClient && iSystime < g_iAddTime + 20)
{
client_print_color(id, 0, «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX», LANG_PLAYER, «CMSGAG_CHAT_EDIT_ERROR»);
return PLUGIN_CONTINUE;
}

get_user_authid(iTargetClient, plBlockInfo[id][GAuthId], charsmax(plBlockInfo[][GAuthId]));

if(!TrieKeyExists(g_trhBlockedUsers, plBlockInfo[id][GAuthId]))
{
if(iTargetClient == id)
plBlockInfo[id][GAdminNick] = «Server»;
else
get_user_name(id, plBlockInfo[id][GAdminNick], charsmax(plBlockInfo[][GAdminNick]));
}
else
{
get_user_name(id, plBlockInfo[id][GModifiedBy], charsmax(plBlockInfo[][GModifiedBy]));
}

new iBlockTime;

if(iFuncType == BLOCK_FUNC_REMOVE)
{
plBlockInfo[id][GExpired] = TIME_MAP_END_EXPIRING;
}
else
{
if(!strlen(plBlockInfo[id][GName]))
get_user_name(iTargetClient, plBlockInfo[id][GName], charsmax(plBlockInfo[][GName]));

if(!strlen(plBlockInfo[id][GBlockReason]))
copy(plBlockInfo[id][GBlockReason], charsmax(plBlockInfo[][GBlockReason]), szBlockReason);

if(plBlockInfo[id][GBlockType] == BLOCK_STATUS_NONE)
plBlockInfo[id][GBlockType] = iBlockType;

if(plBlockInfo[id][GBlockTime] == TIME_NOT_EXPIRING)
plBlockInfo[id][GBlockTime] = iTime;

iBlockTime = plBlockInfo[id][GBlockTime];
plBlockInfo[id][GCreated] = iSystime;

if(iBlockTime <= TIME_NOT_EXPIRING)
plBlockInfo[id][GExpired] = iBlockTime;
else
plBlockInfo[id][GExpired] = plBlockInfo[id][GCreated] + iBlockTime * 60;
}

if(g_bitApiAllow & (UseGameCmsAdmins | UseGameCms)) //Запись в бд, если она доступна
{
mysql_insert_string(plBlockInfo[id][GName], charsmax(plBlockInfo[][GName])*2);
mysql_insert_string(plBlockInfo[id][GBlockReason], charsmax(plBlockInfo[][GBlockReason]));
mysql_insert_string(plBlockInfo[id][GAdminNick], charsmax(plBlockInfo[][GAdminNick])*2);
mysql_insert_string(plBlockInfo[id][GModifiedBy], charsmax(plBlockInfo[][GModifiedBy])*2);

if(plBlockInfo[id][GBid])
{
if(iFuncType == BLOCK_FUNC_CHANGE)
formatex(szQuery, charsmax(szQuery), «UPDATE `%s` SET expired=’%d’, length=’%d’, reason=’%s’, modified_by=’%s’,type=’%d’ WHERE `bid` = ‘%d’;»,
sqlTable, plBlockInfo[id][GExpired], plBlockInfo[id][GBlockTime], plBlockInfo[id][GBlockReason],
plBlockInfo[id][GModifiedBy], plBlockInfo[id][GBlockType], plBlockInfo[id][GBid]);
else if(iFuncType == BLOCK_FUNC_REMOVE)
formatex(szQuery, charsmax(szQuery), «UPDATE `%s` SET expired=’%d’, modified_by=’%s’ WHERE `bid` = ‘%d’;»,
sqlTable, plBlockInfo[id][GExpired], plBlockInfo[id][GModifiedBy], plBlockInfo[id][GBid]);
}
else
{
if(iFuncType != BLOCK_FUNC_ADD || iBlockTime == TIME_MAP_END_EXPIRING)
return ASD_BlockFunc(id, iFuncType, iTargetClient, printChat);

if(!iTimeleft || (iTimeleft && iTimeleft < iBlockTime) || iBlockTime == TIME_NOT_EXPIRING) //Запись в бд, если время блока больше времени карты или Навсегда
{
formatex(szQuery, charsmax(szQuery),
«INSERT INTO `%s` (bid, authId, name, created, expired, length, reason, admin_id, admin_nick, server_id, modified_by, type)
values (‘%d’, ‘%s’, ‘%s’, ‘%d’, ‘%d’, ‘%d’, ‘%s’, ‘%d’, ‘%s’, ‘%d’, ‘%s’, ‘%d’);»,
sqlTable, plBlockInfo[id][GBid], plBlockInfo[id][GAuthId], plBlockInfo[id][GName], plBlockInfo[id][GCreated],
plBlockInfo[id][GExpired], plBlockInfo[id][GBlockTime], plBlockInfo[id][GBlockReason],
plBlockInfo[id][GAdminId], plBlockInfo[id][GAdminNick], g_iServerId, plBlockInfo[id][GModifiedBy], plBlockInfo[id][GBlockType]);
}
else
return ASD_BlockFunc(id, iFuncType, iTargetClient, printChat);
}

static Data[4];
Data[0] = id;
Data[1] = iFuncType;
Data[2] = iTargetClient;

SQL_ThreadQuery(g_hSqlHandle, «BlockQueryFunc_post», szQuery, Data, sizeof(Data));
return PLUGIN_HANDLED;
}

if(plBlockInfo[id][GExpired]- iSystime < iTimeleft)
plBlockInfo[id][GExpired] = TIME_MAP_END_EXPIRING;

return ASD_BlockFunc(id, iFuncType, iTargetClient, printChat);
}

public BlockQueryFunc_post(failstate, Handle:query, const error[], errornum, const postData[], DataSize)
{
new id, iTargetClient, iFuncType;
id = postData[0];
iFuncType = postData[1];
iTargetClient = postData[2];

if(SQL_Error(error, errornum, failstate))
plBlockInfo[id][GBlockTime] = TIME_MAP_END_EXPIRING;
else if(iFuncType == BLOCK_FUNC_ADD)
plBlockInfo[id][GBid] = SQL_GetInsertId(query);

return ASD_BlockFunc(id, iFuncType, iTargetClient);
}

public CBasePlayerSpawn(id)
{
#if defined _reapi_included
g_iPlayerTeam[id] = get_member(id, m_iTeam);
#else
g_iPlayerTeam[id] = CsTeams:get_user_team(id);
#endif

if(is_user_alive(id))
g_isAlivePlayer[id] = true;
}

public CBasePlayerKilled(id)
{
if(cv_iAllTalk == 0 || cv_iAllTalk == 4)
{
if(g_bRoundEnd)
return;

if(cv_flTimeForInfo > 0.0)
set_task(cv_flTimeForInfo, «FnBlockChatForInfo», id);
else
FnBlockChatForInfo(id);
}
else
g_isAlivePlayer[id] = false;
}

public FnBlockChatForInfo(id)
{
g_isAlivePlayer[id] = false;

set_hudmessage(255, 150, 0, -1.0, 0.63, 0, _, 5.0);
show_hudmessage(id, «%L», LANG_PLAYER, «CMSGAG_HUD_INFO_TIME»);
}

public CmdTeamVoiceOn(id)
{
SetBit(g_bitUseTeamVoice, id);
client_cmd(id, «+voicerecord»);
return PLUGIN_HANDLED;
}

public CmdTeamVoiceOff(id)
{
ResetBit(g_bitUseTeamVoice, id);
client_cmd(id, «-voicerecord»);
return PLUGIN_HANDLED;
}

public VTC_OnClientStartSpeak(iSender)
{
if(VTC_IsClientMuted(iSender))
{
if(g_flPlayerSpamTimer[iSender] > cv_flBlockSpamTimer)
{
//log_to_file(«gag.log», «VTC_OnClientStartSpeak muted %d | %n», iSender, iSender)
client_print_color(iSender, 0, «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX», LANG_PLAYER, «CMSGAG_CHAT_SOON_BE_UNBLOCKED»,
FormatBlockTime(floatround(g_flPlayerSpamTimer[iSender] — get_gametime()), 1, timeunit_seconds));
return PLUGIN_HANDLED;
}

return FnCheckBlockStatus(iSender, BLOCK_STATUS_VOICE);
}

if(g_iEntSpamChecker[iSender])
{
g_flPlayerSpamTimer[iSender] = cv_flBlockSpamTimer;
#if defined _reapi_included
#define MAX_ID_LEN 2
set_entvar(g_iEntSpamChecker[iSender], var_nextthink, get_gametime() + 1.0);
SetThink(g_iEntSpamChecker[iSender], «SpamEntThinkCallback», fmt(«%d», iSender), MAX_ID_LEN);
#else
entity_set_float(g_iEntSpamChecker[iSender], EV_FL_nextthink, get_gametime() + 1.0);
#endif
//log_to_file(«gag.log», «VTC_OnClientStartSpeak start timer %d | %n», iSender, iSender)
}

return PLUGIN_CONTINUE;
}

FnSpamTimerReset(iSender)
{
g_flPlayerSpamTimer[iSender] = 0.0;
#if defined _reapi_included
set_entvar(g_iEntSpamChecker[iSender], var_nextthink, 0.0);
SetThink(g_iEntSpamChecker[iSender], «»);
#else
entity_set_float(g_iEntSpamChecker[iSender], EV_FL_nextthink, 0.0);
#endif
}

#if defined _reapi_included
public SpamEntThinkCallback(iEntity, data[], len)
#else
public SpamEntThinkCallback(iEntity)
#endif
{
static iClient, Float:flTime;
#if defined _reapi_included
iClient = str_to_num(data);
#else
iClient = entity_get_edict(iEntity, EV_ENT_owner);
#endif

if(iClient)
{
if(g_flPlayerSpamTimer[iClient] <= 0.0)
{
flTime = cv_flBlockSpamTimer * 30.0;
g_flPlayerSpamTimer[iClient] = get_gametime() + flTime;

VTC_MuteClient(iClient);
client_print(iClient, print_center, «%L», LANG_PLAYER, «CMSGAG_CHAT_BLOCKED», FormatBlockTime(floatround(flTime), 1, timeunit_seconds));
//log_to_file(«gag.log», «SpamEntThinkCallback blocked %d (%.0f) | %n», iClient, g_flPlayerSpamTimer[iClient], iClient)
}
else if(g_flPlayerSpamTimer[iClient] <= cv_flBlockSpamTimer)
{
flTime = 1.0;
if(g_flPlayerSpamTimer[iClient] < 6.0)
client_print(iClient, print_center, «%L», LANG_PLAYER, «CMSGAG_CHAT_WILL_BE_BLOCKED», g_flPlayerSpamTimer[iClient]);
g_flPlayerSpamTimer[iClient]—;

//log_to_file(«gag.log», «SpamEntThinkCallback will be blocked %d (%.0f) | %n», iClient, g_flPlayerSpamTimer[iClient], iClient)
}
else
{
flTime = 1.0;

g_flPlayerSpamTimer[iClient] = cv_flBlockSpamTimer;
VTC_UnmuteClient(iClient);
client_print(iClient, print_center, «%L», LANG_PLAYER, «CMSGAG_CHAT_UNBLOCKED»);
//log_to_file(«gag.log», «SpamEntThinkCallback unblocked %d (%.0f) | %n», iClient, g_flPlayerSpamTimer[iClient], iClient)
}
}
//else
//log_to_file(«gag.log», «Not a client»)

#if defined _reapi_included
set_entvar(iEntity, var_nextthink, get_gametime() + flTime);
#else
entity_set_float(iEntity, EV_FL_nextthink, get_gametime() + flTime);
#endif
}

public VTC_OnClientStopSpeak(iSender)
{
if(!g_iEntSpamChecker[iSender])
return PLUGIN_CONTINUE;

if(g_flPlayerSpamTimer[iSender] <= cv_flBlockSpamTimer)
FnSpamTimerReset(iSender);

return PLUGIN_CONTINUE;
}

public CanPlayerHearPlayer(Receiver, Sender, bool:Listen)
{
if(Receiver == Sender)
return FMRES_IGNORED;

//Мертвого админа слышат все, если он говорит в командный чат или включен параметр cms_gag_deadadmtalk
if(!g_isAlivePlayer[Sender] && g_iImmunLevel[Sender] > 1 && (GetBit(g_bitUseTeamVoice, Sender) || cv_iDeadAdmTalk))
return FnCanHearSender(Receiver, Sender, true);

if(IsPlayerMuted(Receiver, Sender) && g_szPlayerMuteType[Receiver] != BLOCK_STATUS_CHAT)
return FnCanHearSender(Receiver, Sender, false);

//если регейм, то учесть время на инфу
#if defined _reapi_included
if(GetBit(g_bitUseTeamVoice, Sender))
{
if(IsEnemy(Receiver, Sender))
return FnCanHearSender(Receiver, Sender, false);
}

if(cv_flTimeForInfo > 0.0)
{
if(g_isAlivePlayer[Sender] && g_isAlivePlayer[Receiver])
return FnCanHearSender(Receiver, Sender, true);
}

return FMRES_IGNORED;
#else

if(cv_iAllTalk == 1) //все со всеми
{
if(GetBit(g_bitUseTeamVoice, Sender))
{
if(/*g_iPlayerTeam[Receiver] != g_iPlayerTeam[Sender]*/IsEnemy(Receiver, Sender))
return FnCanHearSender(Receiver, Sender, false);
}

//return FMRES_IGNORED;
return FnCanHearSender(Receiver, Sender, true);
}

if(g_iPlayerTeam[Receiver] == CS_TEAM_SPECTATOR)
{
if(cv_iAllTalk == 0 || cv_iAllTalk == 2)
{
if(g_iPlayerTeam[Sender] != CS_TEAM_SPECTATOR)
return FnCanHearSender(Receiver, Sender, false);
}

return FMRES_IGNORED;
}

if(g_isAlivePlayer[Sender])
{
if(cv_iAllTalk == 4)
{
if(GetBit(g_bitUseTeamVoice, Sender))
{
if(/*g_iPlayerTeam[Receiver] != g_iPlayerTeam[Sender]*/IsEnemy(Receiver, Sender))
return FnCanHearSender(Receiver, Sender, false);
}

return FMRES_IGNORED;
}

if(/*g_iPlayerTeam[Receiver] == g_iPlayerTeam[Sender]*/!IsEnemy(Receiver, Sender))
return FMRES_IGNORED;
}
else //мертвый говорун
{
if(!g_isAlivePlayer[Receiver])
return FMRES_IGNORED;

if(/*g_iPlayerTeam[Receiver] != g_iPlayerTeam[Sender]*/IsEnemy(Receiver, Sender))
return FnCanHearSender(Receiver, Sender, false);

if(cv_iAllTalk != 0 && cv_iAllTalk != 4)
return FMRES_IGNORED;
}

return FnCanHearSender(Receiver, Sender, false);
#endif
}

FnCanHearSender(Receiver, Sender, bool:status)
{
#if defined _reapi_included
#pragma unused Receiver, Sender
// SetHookChainReturn(ATYPE_BOOL, status);
SetHookChainReturn(ATYPE_BOOL, status);
#else
engfunc(EngFunc_SetClientListening, Receiver, Sender, status);
forward_return(FMV_CELL, status);
#endif

return FMRES_SUPERCEDE;
}

public HookSayChat(id)
{
new szMsg[MAX_CHAT_MSG_LENGTH];
read_args(szMsg, charsmax(szMsg));
remove_quotes(szMsg);

if(TrieKeyExists(g_trhWhiteListCmdArray, szMsg))
return PLUGIN_CONTINUE;

if(BLOCK_STATUS_NONE < cmsgag_is_user_blocked(id) < BLOCK_STATUS_VOICE)
return FnCheckBlockStatus(id, BLOCK_STATUS_CHAT);

return PLUGIN_CONTINUE;
}

stock FnCheckBlockStatus(id, iBlockType)
{
new szAuthId[MAX_AUTHID_LENGTH];
get_user_authid(id, szAuthId, charsmax(szAuthId));
if(TrieGetArray(g_trhBlockedUsers, szAuthId, plBlockInfo[id], charsmax(plBlockInfo[])))
{
if(plBlockInfo[id][GExpired] > get_systime() || plBlockInfo[id][GExpired] <= TIME_NOT_EXPIRING)
{
client_print_color(id, 0, «%L %L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX»,
LANG_PLAYER, iBlockType == BLOCK_STATUS_CHAT ? «CMSGAG_CHAT_BLOCK_VOICE» : «CMSGAG_CHAT_BLOCK_CHAT»,
FormatBlockTime(plBlockInfo[id][GBlockTime], 1, timeunit_minutes), LANG_PLAYER, «CMSGAG_CHAT_BLOCK_REASON», plBlockInfo[id][GBlockReason]);

client_cmd(id, «play %s», g_szSoundFilePath);
return PLUGIN_HANDLED;
}
else
return FnRemoveBlockStatus(id);
}

return PLUGIN_CONTINUE;
}

public MessageSayText(MsgID, MsgDEST, MsgRecipient)
{
if(MsgDEST != MSG_ONE)
return PLUGIN_CONTINUE;

if(IsPlayerMuted(MsgRecipient, get_msg_arg_int(1)) && g_szPlayerMuteType[MsgRecipient] != BLOCK_STATUS_VOICE)
//if(cmsgag_is_user_muted_by(MsgRecipient, get_msg_arg_int(1)))
return PLUGIN_HANDLED;

return PLUGIN_CONTINUE;
}

/*======== Создание/Сохранение/Удаление блока =========*/
stock ASD_BlockFunc(id, iFuncType, iTargetClient, printChat = true)
{
if(iFuncType == BLOCK_FUNC_REMOVE)
return FnRemoveBlockStatus(id, printChat);

if(TrieSetArray(g_trhBlockedUsers, plBlockInfo[id][GAuthId], plBlockInfo[id], sizeof(plBlockInfo[])))
{
new iBlockType = plBlockInfo[id][GBlockType];
new szTime[MAX_STRING_LEN];
copy(szTime, charsmax(szTime), FormatBlockTime(plBlockInfo[id][GBlockTime], 1, timeunit_minutes));

new szAdmName[MAX_NAME_LENGTH];
new szMessage[MAX_CHAT_MSG_LENGTH];
if(iFuncType == BLOCK_FUNC_ADD)
{
if(get_pcvar_num(cpAmxShowActivity) == 2)
{
get_user_name(id, szAdmName, charsmax(szAdmName));
formatex(szMessage, charsmax(szMessage), «%L %L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX»,
LANG_PLAYER, «CMSGAG_CHAT_BLOCK_ADMIN_ACT», szAdmName, g_szBlockType[iBlockType], plBlockInfo[id][GName], szTime,
LANG_PLAYER, «CMSGAG_CHAT_BLOCK_REASON», plBlockInfo[id][GBlockReason]);
if(printChat)
client_print_color(0, 0, szMessage);
FnClearText(szMessage);
log_amx(szMessage);
}
else
{
formatex(szMessage, charsmax(szMessage), «%L %L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX»,
LANG_PLAYER, «CMSGAG_CHAT_BLOCK_ADMIN», plBlockInfo[id][GName], g_szBlockType[iBlockType], szTime,
LANG_PLAYER, «CMSGAG_CHAT_BLOCK_REASON», plBlockInfo[id][GBlockReason]);
if(printChat)
client_print_color(0, 0, szMessage);
FnClearText(szMessage);
log_amx(szMessage);
}
}
else
{
if(get_pcvar_num(cpAmxShowActivity) == 2)
{
get_user_name(id, szAdmName, charsmax(szAdmName));
formatex(szMessage, charsmax(szMessage), «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX», LANG_PLAYER, «CMSGAG_CHAT_BLOCK_EDIT_ADMIN»,
szAdmName, plBlockInfo[id][GName], g_szBlockType[iBlockType], szTime);
if(printChat)
client_print_color(0, 0, szMessage);
FnClearText(szMessage);
log_amx(szMessage);
}
else
{
formatex(szMessage, charsmax(szMessage), «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX», LANG_PLAYER, «CMSGAG_CHAT_BLOCK_EDIT»,
plBlockInfo[id][GName], g_szBlockType[iBlockType], szTime);
if(printChat)
client_print_color(0, 0, szMessage);
FnClearText(szMessage);
log_amx(szMessage);
}
}

if(is_user_connected(iTargetClient))
FnChangeBlock(iTargetClient, iBlockType);

g_iAddTime = plBlockInfo[id][GCreated];
g_iAddLastId = iTargetClient;

}
else
log_amx(«ASD_BlockFunc: Error»);

arrayset(plBlockInfo[id], 0, BlockInfo);
return PLUGIN_HANDLED;
}

/*======== Сброс блока =========*/
stock FnResetBlock(iTargetClient)
{
ResetBit(g_bitBlockedFully, iTargetClient);
ResetBit(g_bitBlockedChat, iTargetClient);
ResetBit(g_bitBlockedVoice, iTargetClient);

VTC_UnmuteClient(iTargetClient);
}

/*======== Изменение блока =========*/
stock FnChangeBlock(iTargetClient, Type)
{
FnResetBlock(iTargetClient);

switch(Type)
{
case 0:
{
SetBit(g_bitBlockedFully, iTargetClient);
VTC_MuteClient(iTargetClient);
}
case 1: SetBit(g_bitBlockedChat, iTargetClient);
case 2:
{
SetBit(g_bitBlockedVoice, iTargetClient);
VTC_MuteClient(iTargetClient);
}
}
}

/*======== Удаление блока =========*/
stock FnRemoveBlockStatus(id, printChat = true)
{
new iClient = find_player(«c», plBlockInfo[id][GAuthId]);
if(TrieDeleteKey(g_trhBlockedUsers, plBlockInfo[id][GAuthId]))
{
new type[MAX_NAME_LENGTH];
copy(type, charsmax(type), g_szBlockType[plBlockInfo[id][GBlockType]]);

new szMessage[MAX_CHAT_MSG_LENGTH];
if(get_pcvar_num(cpAmxShowActivity) == 2 && (id != iClient))
{
new szAdmName[MAX_NAME_LENGTH];
get_user_name(id, szAdmName, charsmax(szAdmName));
formatex(szMessage, charsmax(szMessage), «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX»,
LANG_PLAYER, «CMSGAG_CHAT_BLOCK_REMOVE_ADMIN», szAdmName, type, plBlockInfo[id][GName]);

if(printChat)
client_print_color(0, 0, szMessage);

FnClearText(szMessage);
log_amx(szMessage);
}
else
{
formatex(szMessage, charsmax(szMessage), «%L %L», LANG_PLAYER, «CMSGAG_CHAT_PREFIX»,
LANG_PLAYER, «CMSGAG_CHAT_BLOCK_REMOVE», plBlockInfo[id][GName], type);

if(printChat)
client_print_color(0, 0, szMessage);

FnClearText(szMessage);
log_amx(szMessage);
}

arrayset(plBlockInfo[id], 0, BlockInfo);
FnResetBlock(iClient);
VTC_UnmuteClient(iClient);

return PLUGIN_HANDLED;
}
else
log_amx(«FnRemoveBlockStatus: Error»);

return PLUGIN_CONTINUE;
}

/*======== Стоки / нативы =========*/
stock bool:FnAboveImmunity(requester, target, bool:byFlags = false)
{
if(byFlags)
return (FnImmunityLevel(requester) > FnImmunityLevel(target));

return (g_iImmunLevel[requester] == g_iImmunLevelsNum || g_iImmunLevel[requester] > g_iImmunLevel[target]);
}

stock FnImmunityLevel(flags)
{
static i;
i = g_iImmunLevelsNum;
while(i > 0)
{
i—;
if(flags & g_bitAccessLvl)
break;
}

return i+1;
}

stock FormatBlockTime(iTime, type, unitType)
{
new szTime[MAX_STRING_LEN];
switch(iTime)
{
case TIME_MAP_END_EXPIRING: formatex(szTime, charsmax(szTime), «%L», LANG_PLAYER, type == 1 ? «CMSGAG_TIME_LENGTH_1» : «CMSGAG_TIME_LENGTH_2»);
case TIME_NOT_EXPIRING: formatex(szTime, charsmax(szTime), «%L», LANG_PLAYER, type == 1 ? «CMSGAG_TIME_NON_EXPIRED_1» : «CMSGAG_TIME_NON_EXPIRED_2»);
default: get_time_length(0, iTime, unitType, szTime, charsmax(szTime));
}

return szTime;
}

FnClearText(langText[])
{
replace_all(langText, MAX_CHAT_MSG_LENGTH, «^4», «»);
replace_all(langText, MAX_CHAT_MSG_LENGTH, «^1», «»);
replace_all(langText, MAX_CHAT_MSG_LENGTH, «^3», «»);
}

public plugin_end()
{
if(g_arhBlockTime)
ArrayDestroy(g_arhBlockTime);
if(g_arhBlockReasons)
ArrayDestroy(g_arhBlockReasons);
}

public plugin_natives()
{
set_native_filter(«native_filter»);
register_native(«cmsgag_is_user_blocked», «native_cmsgag_is_user_blocked»);
register_native(«cmsgag_is_user_muted_by», «native_cmsgag_is_user_muted_by»);
register_native(«cmsgag_add_user_block», «native_cmsgag_add_user_block»);
}

public native_filter(const GName[], index, trap)
return !trap ? PLUGIN_HANDLED : PLUGIN_CONTINUE;

/*
Проверка текущего блока от Админа
@index — индекс игрока
0- voice + chat
1- chat
2- voice
-1- not blocked
*/
public native_cmsgag_is_user_blocked()
{
new id = get_param(1);
return GetBit(g_bitBlockedFully, id) ?
BLOCK_STATUS_ALL : GetBit(g_bitBlockedChat, id) ?
BLOCK_STATUS_CHAT : GetBit(g_bitBlockedVoice, id) ?
BLOCK_STATUS_VOICE : BLOCK_STATUS_NONE;
}

/*
Проверка текущего блока от игрока
@iSender — индекс отправителя
@receiver — индекс получателя
*/
public native_cmsgag_is_user_muted_by()
{
static iClient;
iClient = get_param(1);

if(IsPlayerMuted(iClient, get_param(2)))

Introduction:
I have seen MANY people that complain about a VERY SIMPLE mistake. ‘Cannot read from file’

Even though they have the file in the correct place, it will spit out that error because they tend to conflict if you have more than 1 pawno in your pc.

How to fix it?
Very simple, follow this steps below:

1. Open pawno.exe ( Make sure you open the same pawno that contains all your stuff )
2. Click: File > Open > YOURSCRIPT ( The one that is showing errors )
3. Compile.

Some topics that i seen having this errors:

Code:

C:DOCUME~1CHRIST~1DesktopDEV'SM~1FILTER~1GarHouse.pwn(28) : fatal error 100: cannot read from file: "streamer"

Code:

C:Documents and SettingsVladoDesktopsa-mpfilterscriptsMace.pwn(2) : fatal error 100: cannot read from file: "Dini"

Code:

I was trying to compile several scripts but I got the same error everytime ''Fatal error 100: cannot read from file  ''a_samp''. I even downloaded a whole new server from sa-mp.com and compiled a blanc script and I still got the same error, anyone knows what I should do?

Code:

Hi when i compile my gm it says : fatal error 100: cannot read from file: "Foreach" plz help i dont wanna ruin my 41k line

Code:

C:UsersWilliamDownloadsTITropical Island ServerfilterscriptsAdminscript.pwn(2) : fatal error 100: cannot read from file: "lethaldudb2"

Code:

C:Documents and SettingsVladoDesktopsa-mpgamemodesMace.pwn(2) : fatal error 100: cannot read from file: "Dini"

Code:

C:UsersBradDesktopVortexRoleplay.pwn(20) : fatal error 100: cannot read from file: "streamer"

Code:

C:UsersUserDesktop.3bGamemodesSATDM_v9.pwn( 46) : fatal error 100: cannot read from file: "Ldudb"

Code:

I have WIndow's XP ,

: fatal error 100: cannot read from file: "xadmin/Xtremeadmin.inc"

I dont know what to do!!!

Please help

I have all .inc files
And all the things are good ... but then in get this.....
My other filterscripts works verry goood
Please help me!

—————
Anyways, i don’t want to go through all the topics. And I think there is two of the same errors above ^ and that is because that same person made two topics about the same thing.
—————
Again, this is only for the people that have the correct files were they are supposed to be, but its giving this error!

And sorry for this small tut, but its too easy to fix, just teaching people what and how the problem is caused. And how to fix it

Posts: 92
Threads: 30
Joined: Sep 2008

Reputation:

0

Great, helped me thanks.

As you mentioned, this happens when people have more than one pawno on their computer and they click the pwn file to open it rather than opening pawno, then File>Open>Compile, which loads the correct dll’s etc.

Posts: 15
Threads: 0
Joined: Aug 2010

Reputation:

0

Very simple, but good lesson

Posts: 1,341
Threads: 17
Joined: Aug 2009

Reputation:

0

Nice Tutorial

Posts: 360
Threads: 32
Joined: Jul 2010

Reputation:

0

Posts: 3,793
Threads: 196
Joined: Jan 2010

Reputation:

0

Great info to those starters mate, should reduce some spam of bullshit around here :P

Posts: 1,170
Threads: 19
Joined: May 2010

Reputation:

0

Quote:

Originally Posted by Lorenc_
View Post

Great info to those starters mate, should reduce some spam of bullshit around here :P

no tutorial reduces spam, 50% of topics can be solved by searching, which some users do not do. They don’t read tutorials, because there are still threads on the EXACT topics tutorials are trying to teach. Then there is that small percentage that searches, and this will help them :P

KK


Little Clucker
**

Posts: 14
Threads: 1
Joined: Jul 2010

Reputation:

0

OK, some people may say this didn’t work too. You have to close pawno, then go to the «pawno» folder and open pawno manually, after doing so, choose «open», select your file, open it, then ONLY press «compile».

Posts: 127
Threads: 22
Joined: Aug 2010

Reputation:

0

Just to add Why this happens:

It is Usual by people with more than one Server Package. PAWNO is Programmed to Configure registry so that Every .pwn file is executed with RecentOpenedSAMPServerPackagepawnopawn.exe
So basically then you goto the other Package you are scripting for and open a .pwn file And That isnt the Pawno from the package you are working from then Another one. So we need to re-accosiate pawno….

Oh sorry Guys that was SUPER not Understandable here il simple it out

Basically:

Code:

You open Server2pawnopawn.exe. Server2pawnopawn.exe makes all pawn files open with it.
You open Server1filterscriptsgamemode.pwn. gamemode.pwn Opens with Server2pawnopawn.exe
Server2pawnopawn.exe Loads all Server2pawnoinclude Includes.
And we need the includes from Server1

So, we open Server1pawnopawn.exe pawn.exe of Server1 makes all .pwn files open with it.
All Needed includes are loaded.

You succeded.

Posts: 2,268
Threads: 89
Joined: Apr 2009

Reputation:

0

Yeah, KK and DeadAhead thanks for making things clearer.

Posts: 57
Threads: 21
Joined: Sep 2010

Reputation:

0

Posts: 98
Threads: 17
Joined: Feb 2011

Reputation:

0

23.02.2011, 19:34

(

Last edited by dahley5; 23/02/2011 at 08:05 PM.

)

i did what KK said but it still didn’t work 0,0

Code:

C:UsersGebruikerDesktopSAMP servert3gamemodesonzeserver.pwn(2) : fatal error 100: cannot read from file: "aHouse"

still appears :S
i just can’t get it done i’ve tried everything that appeared in my brainsz!

Posts: 1,152
Threads: 11
Joined: Feb 2010

Reputation:

0

Did you open the right pawno? If you click on the .pwn to open pawno it might have opened the wrong one, wich is not linked to «aHouse.inc»

Posts: 508
Threads: 34
Joined: Feb 2011

Reputation:

0

some more info.

1) Put your plugins properly
2) Update your .Net Framework

Posts: 213
Threads: 8
Joined: Jan 2011

Reputation:

0

Good And I Have my TuT Too
it’s Simple like this,, anyway!
Thank u!

Posts: 757
Threads: 94
Joined: Feb 2011

Reputation:

0

thank you very much thats helped me XD

Posts: 305
Threads: 28
Joined: Apr 2011

Reputation:

0

Very simple, but very good

Posts: 139
Threads: 29
Joined: Aug 2010

Reputation:

0

This does not work to me? It still keeps giving the error for some reason.

Posts: 1,564
Threads: 98
Joined: Apr 2011

Reputation:

0

Quote:

Originally Posted by Alphos
View Post

This does not work to me? It still keeps giving the error for some reason.

Open the pawno, where you’ve putted the includes in the include folder. Do NOT open your GM/FS with a double-click. Then open the game mode with ctrl+o, and try it again

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Fatal error 100 cannot read from file pawnbots
  • Fatal error 100 cannot read from file pawn raknet
  • Fatal error 100 cannot read from file pawn cmd
  • Fatal error 100 cannot read from file other
  • Fatal error 100 cannot read from file nex ac

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии