Крашит клиент КС из-за плагина (оружие на ReAPI)

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
74
Реакции
61
Помог
1 раз(а)
Ошибка
Крашит CS (клиент) у некоторых людей из-за оружия написанного под ReAPI
ОС
Linux
Amx Mod X
1.9.0
Билд
ReHLDS: 3.11.0.767-dev
ReGamedll
ReGameDLL: 5.20.0.492-dev
Версия Metamod
Metamod-P (mm-p) v37
Список метамодулей
[ 1] Reunion          RUN   -    reunion_mm_i386.  v0.1.0.1  ini   Start Never
[ 2] Ultimate Unprec RUN - unprecacher_i386 vBeta 2. ini Chlvl Chlvl
[ 3] AMX Mod X RUN - amxmodx_mm_i386. v1.9.0.5 ini Start ANY
[ 4] ReSemiclip RUN - resemiclip_mm_i3 v2.3.9+M ini Chlvl ANY
[ 5] Rcon Access RUN - rcon_access_mm_i v1.0.2 ini Start Never
[ 6] VoiceTranscoder RUN - VoiceTranscoder. v2020MA2 ini ANY ANY
[ 7] FakeMeta RUN - fakemeta_amxx_i3 v1.9.0.5 pl3 ANY ANY
[ 8] ReAPI RUN - reapi_amxx_i386. v5.19.0. pl3 ANY Never
[ 9] Ham Sandwich RUN - hamsandwich_amxx v1.9.0.5 pl3 ANY ANY
[10] MySQL RUN - mysql_amxx_i386. v1.9.0.5 pl3 ANY ANY
[11] CStrike RUN - cstrike_amxx_i38 v1.9.0.5 pl3 ANY ANY
[12] Engine RUN - engine_amxx_i386 v1.9.0.5 pl3 ANY ANY
[13] CSX RUN - csx_amxx_i386.so v1.9.0.5 pl3 ANY ANY
[14] Fun RUN - fun_amxx_i386.so v1.9.0.5 pl3 ANY ANY
Список плагинов
Почти все написаны с нуля, ничего не даст
Автор плагина
g3cKpunTop
Версия плагина
1.0
Исходный код
#include amxmodx
#include hamsandwich
#include fakemeta
#include reapi
#include zombieplague
#include bm_buymenu

#define MAX_SHIELD_HP 100.0

#define IsCustomWeapon(%0) (get_entvar(%0, var_impulse) == gl_iAllocString_WeaponUID)

new const WEAPON_REFERENCE[] = "weapon_p90";
new const WEAPON_ANIMATION[] = "shotgun";

new const g_szSoundStrike[][] = {
"weapons/cbar_hitbod2.wav",
"weapons/cbar_hitbod3.wav",
"weapons/xbow_fire1.wav"
};

new const g_szModel[3][] = {
"models/weapons/v_shield1.mdl",
"models/weapons/p_shieldfix.mdl",
"models/weapons/w_shield.mdl"
};

new const g_szWeaponListHud[] = "sprites/640hud2_b2.spr";
new const g_szWeaponListName[] = "weapon_fshield"

enum eAnimList {
WEAPON_ANIM_IDLE = 0,
WEAPON_ANIM_DRAW
};

#define WEAPON_ANIM_IDLE_TIME 15/30.0
#define WEAPON_ANIM_DRAW_TIME 15/30.0

new gl_iAllocString_WeaponUID, gl_iMsgID_Weaponlist, g_iMsgId_ScreenShake, g_iItemId;

#define CSW_SHIELD CSW_P90

public plugin_precache() {
engfunc(EngFunc_PrecacheModel, g_szModel[0]);
engfunc(EngFunc_PrecacheModel, g_szModel[1]);
engfunc(EngFunc_PrecacheModel, g_szModel[2]);
engfunc(EngFunc_PrecacheModel, g_szWeaponListHud);

engfunc(EngFunc_PrecacheGeneric, fmt("sprites/%s.txt", g_szWeaponListName));

for(new iPos; iPos < sizeof g_szSoundStrike; iPos++) { engfunc(EngFunc_PrecacheSound, g_szSoundStrike[iPos]); }
}

public plugin_init() {
register_plugin("[ZP] Weapon: Shield", "2.0", "g3cKpunTop / xUnicorn");

/* -> Fakemeta -> */
register_forward(FM_UpdateClientData, "FM_Hook_UpdateClientData_Post", true);

/* -> ReAPI -> */
RegisterHookChain(RG_CWeaponBox_SetModel, "CWeaponBox_SetModel_Pre", false);
//RegisterHookChain(RG_CSGameRules_CanHavePlayerItem, "CBasePlayer_CanHavePlayerItem", false);

/* -> HamSandwich -> */
RegisterHam(Ham_TraceAttack, "player", "CWeapon_TraceAttack_Player", false);
RegisterHam(Ham_Spawn, WEAPON_REFERENCE, "CWeapon_Spawn_Post", true);

RegisterHam(Ham_Item_Deploy, WEAPON_REFERENCE, "CWeapon_Deploy_Post", true);
RegisterHam(Ham_Item_Holster, WEAPON_REFERENCE, "CWeapon_Holster_Post", true);

RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_REFERENCE, "CWeapon_WeaponIdle_Pre", false);
RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_REFERENCE, "CWeapon_PrimaryAttack_Pre", false);
RegisterHam(Ham_Weapon_SecondaryAttack, WEAPON_REFERENCE, "CWeapon_PrimaryAttack_Pre", false);
RegisterHam(Ham_Item_ItemSlot, WEAPON_REFERENCE, "CWeapon_WeaponSlot_Pre", false);
RegisterHam(Ham_Item_AddToPlayer, WEAPON_REFERENCE, "CWeapon_AddToPlayer_Post", true);

/* -> Messages -> */
gl_iMsgID_Weaponlist = get_user_msgid("WeaponList");
g_iMsgId_ScreenShake = get_user_msgid("ScreenShake");

gl_iAllocString_WeaponUID = engfunc(EngFunc_AllocString, g_szWeaponListName);

//register_clcmd("say /shield", "Command_GiveWeapon");
register_clcmd(g_szWeaponListName, "Command_HookWeapon");
g_iItemId = BM_Register_Item("SHIELD", 3000);
}

public plugin_natives() {
register_native("zp_give_user_shield", "@zp_give_user_shield", 0);
register_native("zp_is_shield_active", "@zp_is_shield_active", 0);
}

bool:@zp_is_shield_active(iPlugin, iParams) {
if(iParams == 1) {
new pId = get_param(1);
if(is_user_alive(pId) && !zp_get_user_zombie(pId) && user_has_weapon(pId, CSW_SHIELD) && isShield(pId)) { return true; }
}
return false;
}

stock bool:isShield(pId) {
new iEntity = fm_find_ent_by_owner(-1, "weapon_p90", pId);//rg_find_weapon_bpack_by_name(pId, "weapon_p90");
if(!is_nullent(iEntity) && IsCustomWeapon(iEntity)) { return true; }
return false;
}

@zp_give_user_shield(iPlugin, iParams) {
if(iParams == 1) {
new pId = get_param(1);
if(is_user_alive(pId) && !zp_get_user_zombie(pId) && !user_has_weapon(pId, CSW_SHIELD)) { Command_GiveWeapon(pId); }
}
}

stock fm_find_ent_by_owner(index, const classname[], owner, jghgtype = 0) {
new strtype[11] = "classname", ent = index;
switch (jghgtype) {
case 1: strtype = "target";
case 2: strtype = "targetname";
}

while ((ent = engfunc(EngFunc_FindEntityByString, ent, strtype, classname)) && get_entvar(ent, var_owner) != owner && get_entvar(ent, var_impulse) != gl_iAllocString_WeaponUID) {}

return ent;
}
/*public CBasePlayer_CanHavePlayerItem(const pId, const iItemId) {
if(get_member(iItemId, m_iId) != CSW_P90 || !user_has_weapon(pId, CSW_P90)) { return HC_CONTINUE; }

new iWeaponUID = get_entvar(iItemId, var_impulse);
if(iWeaponUID != 0 && iWeaponUID != gl_iAllocString_WeaponUID) { return HC_CONTINUE; }

SetHookChainReturn(ATYPE_INTEGER, false);
return HC_SUPERCEDE;
}*/

public BM_Item_Selected(pId, iItemId) {
if(iItemId != g_iItemId) { return PLUGIN_HANDLED; }
if(user_has_weapon(pId, CSW_SHIELD)) {
client_print_color(pId, pId, "^1[^4LastRain^1] У вас уже есть похожий предмет");
return BM_PLUGIN_HANDLED;
}
client_print_color(pId, pId, "^1[^4LastRain^1] Щит появится на кнопку^4 5");
Command_GiveWeapon(pId);
return PLUGIN_HANDLED;
}

public CWeapon_TraceAttack_Player(iVictim, iAttacker, Float:fDamage, Float:fDeriction[3], iTraceHandle, iBitDamage) {
if(!is_user_alive(iVictim) || !is_user_alive(iAttacker) || !zp_get_user_zombie(iAttacker)) { return HAM_IGNORED; }
static pActiveItem; pActiveItem = get_member(iVictim, m_pActiveItem);
if(is_nullent(pActiveItem) || !IsCustomWeapon(pActiveItem) || !FindClientInPVS(iVictim, iAttacker)) { return HAM_IGNORED; }
new Float:fHealth = Float:get_entvar(pActiveItem, var_max_health);
new Float:fTryDamage = fDamage;
if(fTryDamage > 45.0) { fTryDamage = 45.0; }
if((fHealth -= fTryDamage) < 0.0) {
rg_remove_items_by_slot(iVictim, C4_SLOT);
//ham_strip_weapon_name(iVictim, WEAPON_REFERENCE);
rh_emit_sound2(iVictim, 0, CHAN_WEAPON, g_szSoundStrike[sizeof g_szSoundStrike - 1]);
}
else {
set_entvar(pActiveItem, var_max_health, fHealth);
client_print(iVictim, print_center, "Щит: %.0f", fHealth);
UTIL_ScreenShake(iVictim, (1<<13), (1<<13), (1<<13));
rh_emit_sound2(iVictim, 0, CHAN_BODY, g_szSoundStrike[random_num(0, sizeof g_szSoundStrike - 2)]);
if(Float:get_entvar(pActiveItem, var_fuser1) < get_gametime()) {
set_entvar(pActiveItem, var_fuser1, (get_gametime() + 80.0));
set_entvar(pActiveItem, var_max_health, MAX_SHIELD_HP);
} else { set_entvar(pActiveItem, var_fuser1, (get_gametime() + 80.0)); }
}
return HAM_SUPERCEDE;
}

stock bool:FindClientInPVS(iOwner, iAttacker, iIgnore = 0) {
new Float:vecOrigin[3], Float:vecOriginVictim[3], Float:vecViewOfs[3], Float:vecAngle[3], iVictim = iIgnore;
get_entvar(iOwner, var_origin, vecOrigin);
vecOrigin[2] -= 20.0;
get_entvar(iOwner, var_view_ofs, vecViewOfs);
get_entvar(iOwner, var_angles, vecAngle);
vecViewOfs[0] += vecOrigin[0];
vecViewOfs[1] += vecOrigin[1];
vecViewOfs[2] += vecOrigin[2];
angle_vector(vecAngle, ANGLEVECTOR_FORWARD, vecAngle);
new Float:fFOV = floatcos(float(get_entvar(iOwner, var_fov) / 2), degrees) * 30.0;
while((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, vecOrigin, 160.0)) != 0) {
if(iVictim == iOwner || !is_user_alive(iVictim) || get_user_team(iOwner) == get_user_team(iVictim))
continue;

get_entvar(iVictim, var_origin, vecOriginVictim);
vecOriginVictim[0] -= vecViewOfs[0];
vecOriginVictim[1] -= vecViewOfs[1];
vecOriginVictim[2] -= vecViewOfs[2];
if((vecOriginVictim[0] * vecAngle[0] + vecOriginVictim[1] * vecAngle[1] + vecOriginVictim[2] * vecAngle[2]) < fFOV) continue;
if(iAttacker == iVictim) { return true; }
}
return false;
}

public Command_GiveWeapon(const pPlayer) {
if(user_has_weapon(pPlayer, CSW_SHIELD)) { return 0; }
new pItem = rg_give_custom_item(pPlayer, WEAPON_REFERENCE, GT_APPEND, gl_iAllocString_WeaponUID);
if(is_nullent(pItem)) return NULLENT;
set_member(pItem, m_Weapon_iSecondaryAmmoType, -1);
rg_set_iteminfo(pItem, ItemInfo_iMaxAmmo2, -1);
set_entvar(pItem, var_max_health, MAX_SHIELD_HP);
set_entvar(pItem, var_fuser1, (get_gametime() + 80.0));
set_member(pPlayer, m_rgAmmo, 0, 0);
UTIL_WeaponList(pPlayer, pItem);
UTIL_SendPlayerAnim(pPlayer, WEAPON_ANIMATION);
return pItem;
}

public CWeapon_WeaponSlot_Pre(pItem) {
if(is_nullent(pItem) || !IsCustomWeapon(pItem)) { return PLUGIN_HANDLED; }
SetHamReturnInteger(rg_get_iteminfo(pItem, ItemInfo_iSlot) + 1);
return HAM_SUPERCEDE;
}

public Command_HookWeapon(const pPlayer) {
engclient_cmd(pPlayer, WEAPON_REFERENCE);
return PLUGIN_HANDLED;
}

public FM_Hook_UpdateClientData_Post(const pPlayer, const iSendWeapons, const CD_Handle) {
if(!is_user_alive(pPlayer)) return;
static pActiveItem; pActiveItem = get_member(pPlayer, m_pActiveItem);
if(is_nullent(pActiveItem) || !IsCustomWeapon(pActiveItem)) { return; }
set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001);
}
public CWeaponBox_SetModel_Pre(const pWeaponBox) {
if(is_nullent(pWeaponBox)) { return HC_CONTINUE; }
new pItem = UTIL_GetWeaponBoxItem(pWeaponBox);
if(is_nullent(pItem) || !IsCustomWeapon(pItem)) { return HC_CONTINUE; }
SetHookChainArg(2, ATYPE_STRING, g_szModel[2]);
return HC_CONTINUE;
}
public CWeapon_Spawn_Post(const pItem) {
if(is_nullent(pItem) || !IsCustomWeapon(pItem)) { return; }
set_member(pItem, m_Weapon_iClip, -1);
set_member(pItem, m_Weapon_iDefaultAmmo, -1);
set_member(pItem, m_Weapon_bHasSecondaryAttack, false);
rg_set_iteminfo(pItem, ItemInfo_pszName, g_szWeaponListName);
rg_set_iteminfo(pItem, ItemInfo_iMaxClip, -1);
rg_set_iteminfo(pItem, ItemInfo_iMaxAmmo1, -1);
rg_set_iteminfo(pItem, ItemInfo_iSlot, 4);
rg_set_iteminfo(pItem, ItemInfo_iPosition, 1);
rg_set_iteminfo(pItem, ItemInfo_iId, CSW_SHIELD);
rg_set_iteminfo(pItem, ItemInfo_iFlags, ITEM_FLAG_NOAUTORELOAD);
set_member(pItem, m_iId, CSW_SHIELD);
}
public CWeapon_Deploy_Post(const pItem) {
static pPlayer;
if(!CheckItem(pItem, pPlayer)) { return; }

set_entvar(pPlayer, var_viewmodel, g_szModel[0]);
set_entvar(pPlayer, var_weaponmodel, g_szModel[1]);

UTIL_SendWeaponAnim(pPlayer, WEAPON_ANIM_DRAW);

set_member(pItem, m_Weapon_flAccuracy, 0);
set_member(pItem, m_Weapon_flTimeWeaponIdle, WEAPON_ANIM_DRAW_TIME);
//set_member(pPlayer, m_szAnimExtention, WEAPON_ANIMATION);
UTIL_SendPlayerAnim(pPlayer, WEAPON_ANIMATION);
set_member(pPlayer, m_flNextAttack, 1.0);
set_member(pPlayer, m_rgAmmo, 0, 0);
}
public CWeapon_Holster_Post(const pItem) {
static pPlayer;
if(!CheckItem(pItem, pPlayer)) { return; }
set_member(pItem, m_Weapon_flTimeWeaponIdle, 1.0);
set_member(pPlayer, m_flNextAttack, 1.0);
}
public CWeapon_AddToPlayer_Post(const pItem, const pPlayer) {
new iWeaponUID = get_entvar(pItem, var_impulse);
if(iWeaponUID != 0 && iWeaponUID != gl_iAllocString_WeaponUID) { return; }
UTIL_WeaponList(pPlayer, pItem);
}
public CWeapon_WeaponIdle_Pre(const pItem) {
static pPlayer;
if(!CheckItem(pItem, pPlayer)) { return HAM_IGNORED; }
if(get_member(pItem, m_Weapon_flTimeWeaponIdle) > 0.0) return HAM_IGNORED;
UTIL_SendWeaponAnim(pPlayer, WEAPON_ANIM_IDLE);
set_member(pItem, m_Weapon_flTimeWeaponIdle, WEAPON_ANIM_IDLE_TIME);
return HAM_SUPERCEDE;
}
public CWeapon_PrimaryAttack_Pre(const pItem) {
static pPlayer;
if(!CheckItem(pItem, pPlayer)) return HAM_IGNORED;
return HAM_SUPERCEDE;
}

bool: CheckItem(const pItem, &pPlayer)
{
if(is_nullent(pItem) || !IsCustomWeapon(pItem)) return false;

pPlayer = get_member(pItem, m_pPlayer);
if(is_nullent(pPlayer) || !is_user_connected(pPlayer)) return false;

return true;
}

stock UTIL_SendWeaponAnim(const pPlayer, const iAnim) {
set_entvar(pPlayer, var_weaponanim, iAnim);

message_begin(MSG_ONE, SVC_WEAPONANIM, .player = pPlayer);
write_byte(iAnim);
write_byte(0);
message_end();
}

stock UTIL_PlayerAnimation(const pPlayer, const szAnim[]) {
new iAnimDesired, Float: flFrameRate, Float: flGroundSpeed, bool: bLoops;
if((iAnimDesired = lookup_sequence(pPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
iAnimDesired = 0;

set_entvar(pPlayer, var_frame, 0.0);
set_entvar(pPlayer, var_framerate, 1.0);
set_entvar(pPlayer, var_animtime, get_gametime());
set_entvar(pPlayer, var_sequence, iAnimDesired);

set_member(pPlayer, m_fSequenceLoops, bLoops);
set_member(pPlayer, m_fSequenceFinished, 0);
set_member(pPlayer, m_flFrameRate, flFrameRate);
set_member(pPlayer, m_flGroundSpeed, flGroundSpeed);
set_member(pPlayer, m_flLastEventCheck, get_gametime());
set_member(pPlayer, m_Activity, ACT_RANGE_ATTACK1);
set_member(pPlayer, m_IdealActivity, ACT_RANGE_ATTACK1);
set_member(pPlayer, m_flLastFired, get_gametime());
}

stock UTIL_SendPlayerAnim(const pPlayer, const szAnim[]) {
static szAnimation[64];
formatex(szAnimation, charsmax(szAnimation), get_entvar(pPlayer, var_flags) & FL_DUCKING ? "crouch_aim_%s" : "ref_aim_%s", szAnim);
UTIL_PlayerAnimation(pPlayer, szAnimation);
}

stock UTIL_WeaponList(const pPlayer, const pItem) {
new szWeaponName[32]; rg_get_iteminfo(pItem, ItemInfo_pszName, szWeaponName, charsmax(szWeaponName));
message_begin(MSG_ONE, gl_iMsgID_Weaponlist, .player = pPlayer);
write_string(szWeaponName);
write_byte(get_member(pItem, m_Weapon_iPrimaryAmmoType));
write_byte(rg_get_iteminfo(pItem, ItemInfo_iMaxAmmo1));
write_byte(get_member(pItem, m_Weapon_iSecondaryAmmoType));
write_byte(rg_get_iteminfo(pItem, ItemInfo_iMaxAmmo2));
write_byte(rg_get_iteminfo(pItem, ItemInfo_iSlot));
write_byte(rg_get_iteminfo(pItem, ItemInfo_iPosition));
write_byte(rg_get_iteminfo(pItem, ItemInfo_iId));
write_byte(rg_get_iteminfo(pItem, ItemInfo_iFlags));
message_end();
}

stock UTIL_GetWeaponBoxItem(const pWeaponBox) {
new pItem;
for(new iSlot = 0; iSlot < MAX_ITEM_TYPES; iSlot++)
{
pItem = get_member(pWeaponBox, m_WeaponBox_rgpPlayerItems, iSlot);
if(!is_nullent(pItem))
return pItem;
}

return 0;
}

/*stock ham_strip_weapon_name(pPlayer, const szWeaponName[]) {
new iEntity = rg_find_weapon_bpack_by_name(pPlayer, szWeaponName);
//while((iEntity = engfunc(EngFunc_FindEntityByString, iEntity, "classname", szWeaponName)) && get_entvar(iEntity, var_owner) != pPlayer) {}
if(!iEntity) return 0;
new iWeaponId = get_weaponid(szWeaponName);
if(get_user_weapon(pPlayer) == iWeaponId) ExecuteHamB(Ham_Weapon_RetireWeapon, iEntity);
if(!ExecuteHamB(Ham_RemovePlayerItem, pPlayer, iEntity)) return 0;
ExecuteHamB(Ham_Item_Kill, iEntity);
set_entvar(pPlayer, var_weapons, get_entvar(pPlayer, var_weapons) & ~(1<<iWeaponId));
return 1;
}*/

stock UTIL_ScreenShake(pPlayer, iAmplitude, iDuration, iFrequency) {
engfunc(EngFunc_MessageBegin, MSG_ONE, g_iMsgId_ScreenShake, {0.0, 0.0, 0.0}, pPlayer);
write_short(iAmplitude);
write_short(iDuration);
write_short(iFrequency);
message_end();
}
Всем привет. Не подскажите, ибо я что-то понять не могу. Сервер -- зомби. Из-за щита у некоторых людей при броске гранаты крашит кс (а конкретней, у тех кто сам щит взял). Проверил, дело конкретно из-за щита. Не знаю почему конкретно это идет на гранаты, но проблема имеется. Я так понял, это может быть из-за WeaponList? С написанием оружия на ReAPI работал первый раз, так что мог где-то косянуть. Буду очень благодарен если подскажите, где мог накосячить. Еще один момент, так как в многих КСО моделях нет анимации щита, я из p_ модели убрал привязку к костям и оставил только root (может из-за этого? хотя звучит бредово).

Суть плагина проста: когда ты держишь его в руках,урон от зомби блокируется, так же блокируется эффект от JUMP гранаты.

[!] Конфликта с гранатми по сути нет, самая стандартная реализация Zp4.3
Так же видел на аленях, что проблемы со сменой слота имеются, это как-то можно поправить? Поройщит лежит в 1м слоте и в 5. В 1м слоте он неактивен
 
В этой теме было размещено решение! Перейти к решению.
Сообщения
74
Реакции
61
Помог
1 раз(а)
Ребят, может хотя бы догадки есть у кого?
 
Сообщения
74
Реакции
61
Помог
1 раз(а)
В общем, как я понял, похоже дело в самом GSClient, потому что крашит на сервере КС лишь у процентов 10% людей, переспросил, все юзают GSClient у кого крашгило. У других всё было вроде как нормально, но это лишь предположение, могу ошибаться. Были проблемы конкретно еще с strip (тоже крашило). Ну в общем, это я написал для тех у кого похожая проблема будет

Не знаю с чем связано
 
Сообщения
845
Реакции
521
Помог
13 раз(а)
Так же видел на аленях, что проблемы со сменой слота имеются, это как-то можно поправить? Поройщит лежит в 1м слоте и в 5. В 1м слоте он неактивен
C#:
public plugin_precache()
{
    #if WEAPON_NEW_ID != WEAPON_GLOCK
        MsgIdWeaponList = get_user_msgid("WeaponList");
        if (MsgIdWeaponList) {
            MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");
        } else {
            FwdRegUserMsg = register_forward(FM_RegUserMsg, "RegUserMsg_Post", true);
        }
    #endif
}

public plugin_init()
{
    #if WEAPON_NEW_ID == WEAPON_GLOCK
        MsgIdWeaponList = get_user_msgid("WeaponList");
        UTIL_WeapoList(
            MSG_INIT, 0,
            WEAPON_NEW_NAME,
            AMMO_ID, 1,
            -1, -1, GRENADE_SLOT, 4, WEAPON_NEW_ID,
            ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE
        );
    #else
        if (FwdRegUserMsg) {
            unregister_forward(FM_RegUserMsg, FwdRegUserMsg, true);
        }
        unregister_message(MsgIdWeaponList, MsgHookWeaponList);
    #endif
}

#if WEAPON_NEW_ID != WEAPON_GLOCK
public RegUserMsg_Post(const name[]) {
    if (strcmp(name, "WeaponList") == 0) {
        MsgIdWeaponList = get_orig_retval();
        MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");
    }
}

public HookWeaponList(const msg_id, const msg_dest, const msg_entity) {
    enum {
        arg_name = 1,
        arg_ammo1,
        arg_ammo1_max,
        arg_ammo2,
        arg_ammo2_max,
        arg_slot,
        arg_position,
        arg_id,
        arg_flags,
    };

    if (msg_dest != MSG_INIT || WeaponIdType:get_msg_arg_int(arg_id) != WEAPON_NEW_ID) {
        return PLUGIN_CONTINUE;
    }

    set_msg_arg_string(arg_name,WEAPON_NEW_NAME);
    set_msg_arg_int(arg_ammo1, ARG_BYTE, AMMO_ID);
    set_msg_arg_int(arg_ammo1_max, ARG_BYTE, 1);
    set_msg_arg_int(arg_ammo2, ARG_BYTE, -1);
    set_msg_arg_int(arg_ammo2_max, ARG_BYTE, -1);
    set_msg_arg_int(arg_slot, ARG_BYTE, _:GRENADE_SLOT - 1);
    set_msg_arg_int(arg_position, ARG_BYTE, 4);
    set_msg_arg_int(arg_flags, ARG_BYTE, ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE);

    return PLUGIN_CONTINUE;
}
#endif

stock UTIL_WeapoList(
    const type,
    const player,
    const name[],
    const ammo1,
    const maxAmmo1,
    const ammo2,
    const maxammo2,
    const InventorySlotType:slot,
    const position,
    const WeaponIdType:id,
    const flags
) {
    message_begin(type, MsgIdWeaponList, .player = player);
    write_string(name);
    write_byte(ammo1);
    write_byte(maxAmmo1);
    write_byte(ammo2);
    write_byte(maxammo2);
    write_byte(_:slot - 1);
    write_byte(position);
    write_byte(_:id);
    write_byte(flags);
    message_end();
}

насчет краша не факт


Скрытое содержимое для пользователей:
 
Сообщения
74
Реакции
61
Помог
1 раз(а)
BalbuR, спасибо, вроде перестало кикать и багаться слот :good2:
 
Сообщения
74
Реакции
61
Помог
1 раз(а)
@steelzzz,так просто добавил код что предоставил BalbuR и чуть отредачил, нечего добавлять)
Как я понял чето там клиенту не нравилось со сменой слота, вот кс и крашилась
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу