new const PLUGIN_NAME[] = "Advanced Ultimate Weapons";
new const PLUGIN_VERSION[] = "0.1.0b";
}; new g_pCvar[eCvarsData];
}; new g_pHamHooks[eHamHooks];
}; new g_pReapiHooks[eReapiHooks];
new Array: g_aWeaponData;
new Trie: g_tWeaponClcmd;
new g_iClcmdIndex[MAXWEAPONS];
new Float: g_flTouchTime[MAX_PLAYERS + 1];
new const sFile[] = "ultimate_weapons.ini";
new g_iForwards[eAUWForwards];
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);
register_dictionary("auw.txt");
g_iForwards[eAUWForwards_OnGiveItemPre] = CreateMultiForward("auw_on_give_item_pre", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL, FP_CELL);
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");
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 };
get_string(arg_buyname, sWeaponName, charsmax(sWeaponName));
if(!TrieGetCell(g_tWeaponClcmd, sWeaponName, iWeaponId))
if(!get_param(arg_is_uid_with_offset))
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))
get_string(arg_weaponname, sWeaponName, charsmax(sWeaponName));
new uId = get_param(arg_uid);
if(get_param(arg_is_uid_with_offset))
uId -= AUW_IMPULSE_OFFSET;
if(!TrieGetCell(g_tWeaponClcmd, sWeaponName, iWeaponId))
if(uId < 0 || uId >= ArraySize(g_aWeaponData))
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);
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))
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))
set_bit(g_bClientConnected, iPlayer);
public client_disconnected(iPlayer)
reset_bit(g_bClientConnected, iPlayer);
g_flTouchTime[iPlayer] = 0.0;
for(new i = 0; i < MAXWEAPONS; i++)
if(iIndex == g_iClcmdIndex[i])
public Command_GiveWeapon_EX(iPlayer, iAccess, iIndex)
new iWeaponId = getClcmdIndex(iIndex);
if(g_pCvar[FLAG_ACCESS] && !(get_user_flags(iPlayer) & read_flags(g_pCvar[CMD_ACCESS])))
console_print(iPlayer, "%L", iPlayer, "CONSOLE_NO_ACCESS");
giveItem(iPlayer, iWeaponId, 1, eAUWGiveItemTypes_PlayerCmd);
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");
read_argv(1, sTarget, charsmax(sTarget));
read_argv(2, sArg, charsmax(sArg));
if(sArg[0] == EOS || sTarget[0] == EOS)
console_print(iPlayer, "%L", iPlayer, "CONSOLE_USAGE");
new iFindPlayer = cmd_target(iPlayer, sTarget, CMDTARGET_ALLOW_SELF)
if(!get_bit(g_bClientConnected, iFindPlayer))
if(!TrieGetCell(g_tWeaponClcmd, sArg, iWeaponId))
console_print(iPlayer, "%L", iPlayer, "CONSOLE_WEAPONS_NOTFOUND");
ArrayGetArray(g_aWeaponData, iWeaponId, aData);
if(aData[eAUWData_MENU_WEAPON_ADD] == 0)
giveItem(iFindPlayer, iWeaponId, 0, eAUWGiveItemTypes_AdminCmd);
giveItem(iPlayer, iKey, iBuy, eAUWGiveItemTypes: eGiveItemType, bool: bChatNotification = true)
ExecuteForward(g_iForwards[eAUWForwards_OnGiveItemPre], ret, eGiveItemType, iPlayer, iKey, iBuy);
static iMoney; iMoney = rg_get_user_money(iPlayer);
ArrayGetArray(g_aWeaponData, iKey, aData);
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");
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]);
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));
if(!rg_get_user_buyzone(iPlayer))
client_print(iPlayer, print_center, "%L", iPlayer, "CENTER_NOT_IN_BUYZONE");
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];
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "СHAT_NO_MONEY");
new iWeapon = rg_create_entity(aData[eAUWData_WEAPON_REFERENCE]);
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))
aData[eAUWData_WEAPON_SLOT] = PRIMARY_WEAPON_SLOT;
aData[eAUWData_WEAPON_SLOT] = PISTOL_SLOT;
ArraySetArray(g_aWeaponData, iKey, aData);
if(aData[eAUWData_WEAPON_ID] != WEAPON_KNIFE)
dropWeapons(iPlayer, aData[eAUWData_WEAPON_SLOT]);
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))
engfunc(EngFunc_RemoveEntity, iWeapon);
switch(aData[eAUWData_WEAPON_ID])
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]);
set_member(iWeapon, m_M4A1_flBaseDamageSil, Float: get_member(iWeapon, m_M4A1_flBaseDamageSil) * aData[eAUWData_WEAPON_DAMAGE]);
set_member(iWeapon, m_USP_flBaseDamageSil, Float: get_member(iWeapon, m_USP_flBaseDamageSil) * aData[eAUWData_WEAPON_DAMAGE]);
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]);
rg_add_account(iPlayer, iMoney - iCost, AS_SET);
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_WEAPON_BUY", aData[eAUWData_MENU_NAME_ITEM]);
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_WEAPON_GET", aData[eAUWData_MENU_NAME_ITEM]);
public CWeapon_Touch_Pre(iEntity, iPlayer)
if(!g_pCvar[PICKUP_ACCESS_TYPE])
if(!IsPlayer(iPlayer) || !get_bit(g_bClientConnected, iPlayer))
if(IsCustomWeapon(iEntity, get_entvar(iEntity, var_impulse)))
if(getWeaponFlags(iEntity) && !(get_user_flags(iPlayer) & getWeaponFlags(iEntity)))
if(g_flTouchTime[iPlayer] > get_gametime())
client_print(iPlayer, print_center, "%L", iPlayer, "CENTER_NO_ACCESS");
g_flTouchTime[iPlayer] = get_gametime() + 3.0;
public CWeapon_DefaultDeploy_Pre(iItem, sViewModel[], sWeaponModel[], iAnim, sAnimExt[], iSkipLocal)
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);
public CWeapon_SetModel_Pre(iEntity, sModel[])
new iWeapon = GetWeaponBox(iEntity);
if(IsCustomWeapon(iWeapon, getWeaponKey(iWeapon)))
getWeaponModelWorld(iWeapon, sViewModel, sizeof(sViewModel));
SetHookChainArg(2, ATYPE_STRING, sViewModel);
setWeaponFlags(iEntity, getWeaponFlags(iWeapon));
set_entvar(iEntity, var_impulse, getWeaponKey(iWeapon));
for(new i = 0, iWeapon; i < MAX_ITEM_TYPES; i++)
iWeapon = get_member(iEntity, m_WeaponBox_rgpPlayerItems, i);
public CWeapon_TraceAttack_Post(iVictim, iAttacker, Float: flDamage, Float: vecDirection[3], iTrace, iBitsDamage)
if(!get_bit(g_bClientConnected, iAttacker))
static iItem; iItem = get_member(iAttacker, m_pActiveItem);
new WeaponIdType: iId; iId = get_member(iItem, m_iId);
if(!IsCustomWeapon(iItem, getWeaponKey(iItem)))
get_tr2(iTrace, TR_vecEndPos, vecEndPos);
if(!getWeaponTrace(iItem))
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(200); // alpha
get_entvar(iAttacker, var_origin, vecOrigin);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
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]);
public Command_ShowUltimateMenu(iPlayer)
if(g_pCvar[MENU_ACCESS_TYPE] == 0)
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "CHAT_BUY_DISABLE");
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");
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]);
formatex(sText, charsmax(sText), "%L", iPlayer, "MENU_TITLE");
new hMenu = menu_create(sText, "ShopMenuHandler");
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)
if(aData[eAUWData_WEAPON_COST] < 0)
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]);
iCost = aData[eAUWData_WEAPON_COST];
if(g_pCvar[MENU_DAMAGE] > 0)
formatex(sText, charsmax(sText), "%s%s %L %s \R\y%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);
formatex(sText, charsmax(sText), "%s%s\R\y%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);
public ShopMenuHandler(iPlayer, hMenu, iItem)
if(!is_user_alive(iPlayer) || iItem == MENU_EXIT)
new sData[6], sName[64], iAccess, iCallback;
menu_item_getinfo(hMenu, iItem, iAccess, sData, charsmax(sData), sName, charsmax(sName), iCallback);
giveItem(iPlayer, iItem, 1, eAUWGiveItemTypes_ShopMenu);
g_iLaserBeam = precache_model("sprites/laserbeam.spr");
get_configsdir(sPath, charsmax(sPath));
format(sPath, charsmax(sPath), "%s/%s", sPath, sFile);
new iFile = fopen(sPath, "rt");
log_amx("[DEBUG]: No file found ^"%s^".", sPath);
set_fail_state("[DEBUG]: No file found ^"%s^".", sPath);
g_iForwards[eAUWForwards_OnParseEnd] = CreateMultiForward("auw_on_parse_end", ET_CONTINUE, FP_CELL);
g_aWeaponData = ArrayCreate(eAUWData);
g_tWeaponClcmd = TrieCreate();
new sWeaponAllowRound[3];
new sWeaponAccessFlag[10];
fgets(iFile, sLine, charsmax(sLine));
replace(sLine, charsmax(sLine), "^n", "");
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]);
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]);
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]);
precache_model(aData[eAUWData_WEAPON_MODEL_WORLD]);
if(!sWeaponAccessFlag[0] || sWeaponAccessFlag[0] == '0') // xd
aData[eAUWData_WEAPON_ACCESS_FLAGS] = 0;
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]);
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");
ExecuteForward(g_iForwards[eAUWForwards_OnParseEnd], ret, g_iWeaponsCount);
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)
getPercentNum(iNumber, iPercent)
return floatround(float(iNumber) * (float(iPercent) / 100.0)); // blya
dropWeapons(iPlayer, InventorySlotType: iSlot)
if(g_pCvar[GIVE_TYPE] == APPEND_SLOT)
if(g_pCvar[GIVE_TYPE] == REMOVE_SLOT)
rg_remove_items_by_slot(iPlayer, iSlot);
static iItem; iItem = get_member(iPlayer, m_rgpPlayerItems, iSlot);
iNext = get_member(iItem, m_pNext);
switch(g_pCvar[GIVE_TYPE])
rg_drop_items_by_slot(iPlayer, iSlot);
while((iItem = iNext) > 0);
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]);
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]);