Код
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <bmm>
#define PLUGIN "[Z]Weapon:Mauser C96"
#define VERSION "0.1"
#define AUTHOR "Batcon"
#define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
// CWeaponBox
#define m_rgpPlayerItems_CWeaponBox 34
// CBasePlayerItem
#define m_pPlayer 41
#define m_pNext 42
#define m_iId 43
// CBasePlayerWeapon
#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47
#define m_flTimeWeaponIdle 48
#define m_iPrimaryAmmoType 49
#define m_iClip 51
#define m_fInReload 54
#define m_iShell 57
#define m_iShotsFired 64
// CBaseMonster
#define m_flNextAttack 83
// CBasePlayer
#define m_flEjectBrass 111
#define m_rpgPlayerItems 367
#define m_pActiveItem 373
#define m_rgAmmo 376
#define WEAPON_KEY 208
#define WEAPON_OLD "weapon_glock18"
#define WEAPON_NEW "b_weapon_mauser96"
#define WEAPON_MODEL_V "models/b_zm/v_mauser96.mdl"
#define WEAPON_MODEL_P "models/b_zm/p_mauser96.mdl"
#define WEAPON_MODEL_W "models/b_zm/w_mauser96.mdl"
#define WEAPON_MODEL_S "models/pshell.mdl"
#define WEAPON_SOUND_S "weapons/mauser96-1.wav"
#define WEAPON_CLIP 10
#define WEAPON_AMMO 120
#define WEAPON_RATE 0.20
#define WEAPON_RATE2 0.18
#define WEAPON_DAMAGE 1.3
/*https://wiki.alliedmods.net/CS_WeaponList_Message_Dump*/
#define LIST_OLD_1 10
#define LIST_OLD_2 120
#define LIST_OLD_3 -1
#define LIST_OLD_4 -1
#define LIST_OLD_5 1
#define LIST_OLD_6 2
#define LIST_OLD_7 17
#define LIST_OLD_8 0
#define LIST_NEW_1 10
#define LIST_NEW_2 WEAPON_AMMO
#define LIST_NEW_3 -1
#define LIST_NEW_4 -1
#define LIST_NEW_5 1
#define LIST_NEW_6 2
#define LIST_NEW_7 17
#define LIST_NEW_8 0
new g_AllocString_V, g_AllocString_P, g_AllocString_E, g_ModelIndexShell
new g_msg_WeaponList, g_item
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
RegisterHam(Ham_Item_Deploy, WEAPON_OLD, "fw_Item_Deploy_Post", 1);
RegisterHam(Ham_Item_PostFrame, WEAPON_OLD, "fw_Item_PostFrame");
RegisterHam(Ham_Item_AddToPlayer, WEAPON_OLD, "fw_Item_AddToPlayer_Post", 1);
RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_OLD, "fw_Weapon_PrimaryAttack");
RegisterHam(Ham_Weapon_Reload, WEAPON_OLD, "fw_Weapon_Reload");
RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_OLD, "fw_Weapon_WeaponIdle");
RegisterHam(Ham_Weapon_SecondaryAttack, WEAPON_OLD, "fw_Weapon_SecondaryAttack");
RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack");
RegisterHam(Ham_TraceAttack, "hostage_entity", "fw_TraceAttack");
RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack");
RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack");
register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1);
register_forward(FM_PlaybackEvent, "fw_PlaybackEvent");
register_forward(FM_SetModel, "fw_SetModel");
g_msg_WeaponList = get_user_msgid("WeaponList");
register_clcmd(WEAPON_NEW, "hook_weapon");
g_item = bmm_add_item("MAUSER", 0, BMM_TEAM_ALL, BMM_PISTOLS);
}
public plugin_precache() {
engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_V);
engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_P);
engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_W);
g_ModelIndexShell = engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_S);
engfunc(EngFunc_PrecacheSound, WEAPON_SOUND_S);
engfunc(EngFunc_PrecacheGeneric, "sprites/zb/640hud109.spr");
engfunc(EngFunc_PrecacheSound, "weapons/mauser96_clipin.wav");
engfunc(EngFunc_PrecacheSound, "weapons/mauser96_clipout.wav");
engfunc(EngFunc_PrecacheSound, "weapons/mauser96_draw.wav");
engfunc(EngFunc_PrecacheSound, "weapons/mauser96_boltpull.wav");
engfunc(EngFunc_PrecacheSound, "weapons/mauser96_empty_boltpull.wav");
new buffer[64]; formatex(buffer, charsmax(buffer), "sprites/%s.txt", WEAPON_NEW);
engfunc(EngFunc_PrecacheGeneric, buffer);
g_AllocString_V = engfunc(EngFunc_AllocString, WEAPON_MODEL_V);
g_AllocString_P = engfunc(EngFunc_AllocString, WEAPON_MODEL_P);
g_AllocString_E = engfunc(EngFunc_AllocString, WEAPON_OLD);
}
public bmm_item_selected(id, item) if(item == g_item) give_mauser(id);
public hook_weapon(id) { engclient_cmd(id, WEAPON_OLD); return PLUGIN_HANDLED; }
public give_mauser(id) {
UTIL_DropWeapon(id, 2);
static weapon; weapon = give_weapon(id);
if(!weapon) return;
emit_sound(id, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
ExecuteHamB(Ham_GiveAmmo, id, WEAPON_AMMO, "9mm", WEAPON_AMMO);
}
public give_weapon(id) {
static ent; ent = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E);
if(ent <= 0) return 0;
set_pev(ent, pev_spawnflags, SF_NORESPAWN);
set_pev(ent, pev_impulse, WEAPON_KEY);
ExecuteHam(Ham_Spawn, ent);
if(!ExecuteHamB(Ham_AddPlayerItem, id, ent)) {
engfunc(EngFunc_RemoveEntity, ent);
return 0;
}
ExecuteHamB(Ham_Item_AttachToPlayer, ent, id);
set_pdata_int(ent, m_iClip, WEAPON_CLIP, 4);
set_pdata_int(ent, m_iShell, g_ModelIndexShell, 4);
return ent;
}
public fw_Item_Deploy_Post(ent) {
if(!CustomItem(ent)) return HAM_IGNORED;
static id; id = get_pdata_cbase(ent, m_pPlayer, 4);
set_pev_string(id, pev_viewmodel2, g_AllocString_V);
set_pev_string(id, pev_weaponmodel2, g_AllocString_P);
set_pdata_float(id, m_flNextAttack, 1.2, 5);
set_pdata_float(ent, m_flTimeWeaponIdle, 1.3, 4);
UTIL_SendWeaponAnim(id, get_pdata_int(ent, m_iClip, 4) ? 6 : 7);
return HAM_IGNORED;
}
public fw_Item_PostFrame(ent) {
if(!CustomItem(ent)) return HAM_IGNORED;
if(get_pdata_int(ent, m_fInReload, 4)) {
static id; id = get_pdata_cbase(ent, m_pPlayer, 4);
static clip; clip = get_pdata_int(ent, m_iClip, 4);
static ammotype; ammotype = m_rgAmmo + get_pdata_int(ent, m_iPrimaryAmmoType, 4);
static ammo; ammo = get_pdata_int(id, ammotype, 5);
static j; j = min(WEAPON_CLIP - clip, ammo);
set_pdata_int(ent, m_iClip, clip+j, 4);
set_pdata_int(id, ammotype, ammo-j, 5);
set_pdata_int(ent, m_fInReload, 0, 4);
}
return HAM_IGNORED;
}
public fw_Item_AddToPlayer_Post(ent, id) {
switch(pev(ent, pev_impulse)) {
case 0: Weaponlist(id, 0);
case WEAPON_KEY: Weaponlist(id, 1);
}
}
public fw_Weapon_PrimaryAttack(ent) {
if(!CustomItem(ent)) return HAM_IGNORED;
if(get_pdata_int(ent, m_iShotsFired, 4)) return HAM_SUPERCEDE;
static clip; clip = get_pdata_int(ent, m_iClip, 4);
if(!clip) {
ExecuteHamB(Ham_Weapon_PlayEmptySound, ent);
set_pdata_float(ent, m_flNextPrimaryAttack, 0.2, 4);
set_pdata_float(ent, m_flNextSecondaryAttack, 0.2, 4);
return HAM_SUPERCEDE;
}
state FireBullets: Enabled;
ExecuteHam(Ham_Weapon_PrimaryAttack, ent);
state FireBullets: Disabled;
static id; id = get_pdata_cbase(ent, m_pPlayer, 4);
emit_sound(id, CHAN_WEAPON, WEAPON_SOUND_S, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
UTIL_SendWeaponAnim(id, clip == 1 ? 3 : 2);
set_pdata_float(ent, m_flNextPrimaryAttack, WEAPON_RATE, 4);
set_pdata_float(ent, m_flNextSecondaryAttack, WEAPON_RATE, 4);
set_pdata_float(ent, m_flTimeWeaponIdle, 1.1, 4);
set_pdata_float(id, m_flEjectBrass, get_gametime(), 5);
return HAM_SUPERCEDE;
}
public fw_Weapon_Reload(ent) {
if(!CustomItem(ent)) return HAM_IGNORED;
static clip; clip = get_pdata_int(ent, m_iClip, 4);
if(clip == WEAPON_CLIP) return HAM_SUPERCEDE;
static id; id = get_pdata_cbase(ent, m_pPlayer, 4);
if(!get_pdata_int(id, m_rgAmmo + get_pdata_int(ent, m_iPrimaryAmmoType, 4), 5)) return HAM_IGNORED;
set_pdata_int(ent, m_iClip, 0, 4);
ExecuteHam(Ham_Weapon_Reload, ent);
set_pdata_int(ent, m_iClip, clip, 4);
set_pdata_float(id, m_flNextAttack, 2.2, 5);
set_pdata_float(ent, m_flTimeWeaponIdle, 2.2, 4);
set_pdata_int(ent, m_fInReload, 1, 4);
UTIL_SendWeaponAnim(id, clip ? 4 : 5);
return HAM_SUPERCEDE;
}
public fw_Weapon_WeaponIdle(ent) {
if(!CustomItem(ent) || get_pdata_float(ent, m_flTimeWeaponIdle, 4) > 0.0) return HAM_IGNORED;
UTIL_SendWeaponAnim(get_pdata_cbase(ent, m_pPlayer, 4), get_pdata_int(ent, m_iClip, 4) ? 0 : 1);
set_pdata_float(ent, m_flTimeWeaponIdle, 1.6, 4);
return HAM_SUPERCEDE;
}
public fw_Weapon_SecondaryAttack(ent) {
if(!CustomItem(ent)) return HAM_IGNORED;
static clip; clip = get_pdata_int(ent, m_iClip, 4)
if(!clip) {
ExecuteHamB(Ham_Weapon_PlayEmptySound, ent);
set_pdata_float(ent, m_flNextPrimaryAttack, 0.2, 4);
set_pdata_float(ent, m_flNextSecondaryAttack, 0.2, 4);
return HAM_SUPERCEDE;
}
set_pdata_int(ent, m_iShotsFired, 0, 4);
static id; id = get_pdata_cbase(ent, m_pPlayer, 4);
static Float:Punchangle[3]; pev(id, pev_punchangle, Punchangle);
state FireBullets: Enabled;
ExecuteHam(Ham_Weapon_PrimaryAttack, ent);
state FireBullets: Disabled;
Punchangle[0] = random_float(1.0, 2.0);
Punchangle[1] = random_float(-1.0, 1.0);
emit_sound(id, CHAN_WEAPON, WEAPON_SOUND_S, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
UTIL_SendWeaponAnim(id, clip == 1 ? 3 : 2);
set_pdata_float(ent, m_flNextPrimaryAttack, WEAPON_RATE2, 4);
set_pdata_float(ent, m_flNextSecondaryAttack, WEAPON_RATE2, 4);
set_pdata_float(ent, m_flTimeWeaponIdle, 1.1, 4);
set_pdata_float(id, m_flEjectBrass, get_gametime(), 5);
set_pev(id, pev_punchangle, Punchangle);
set_pev(id, pev_button, pev(id, pev_button) & ~IN_ATTACK);
return HAM_SUPERCEDE;
}
public fw_TraceAttack_Post(victim, attacker, Float:damage, Float:fDir[3], ptr, damagetype) <FireBullets: Enabled>
{
if(!is_user_connected(attacker)) return HAM_IGNORED;
static item; item = get_pdata_cbase(attacker, m_pActiveItem, 5);
if(item <= 0 || !CustomItem(item)) return HAM_IGNORED;
static Float:vecEnd[3]; get_tr2(ptr, TR_vecEndPos, vecEnd);
engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0);
write_byte(TE_GUNSHOTDECAL);
engfunc(EngFunc_WriteCoord, vecEnd[0]);
engfunc(EngFunc_WriteCoord, vecEnd[1]);
engfunc(EngFunc_WriteCoord, vecEnd[2]);
write_short(victim);
write_byte(random_num(41, 45));
message_end();
return HAM_IGNORED;
}
public fw_TraceAttack(victim, attacker, Float:damage) <FireBullets: Enabled>
{
if(!is_user_connected(attacker)) return HAM_IGNORED;
static item; item = get_pdata_cbase(attacker, m_pActiveItem, 5);
if(item <= 0 || !CustomItem(item)) return HAM_IGNORED;
SetHamParamFloat(3, damage * WEAPON_DAMAGE);
return HAM_IGNORED;
}
public fw_SetModel(ent) {
if(!pev_valid(ent)) return FMRES_IGNORED;
static i, classname[32], item; pev(ent, pev_classname, classname, 31);
if(!equal(classname, "weaponbox")) return FMRES_IGNORED;
for(i = 0; i < 6; i++) {
item = get_pdata_cbase(ent, m_rgpPlayerItems_CWeaponBox + i, 4);
if(item > 0 && CustomItem(item)) {
engfunc(EngFunc_SetModel, ent, WEAPON_MODEL_W);
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}
public fw_UpdateClientData_Post(id, SendWeapons, CD_Handle) {
if(get_cd(CD_Handle, CD_DeadFlag) != DEAD_NO) return;
static item; item = get_pdata_cbase(id, m_pActiveItem, 5);
if(item <= 0 || !CustomItem(item)) return;
set_cd(CD_Handle, CD_flNextAttack, 999999.0);
}
public fw_PlaybackEvent() <FireBullets: Enabled> { return FMRES_SUPERCEDE; }
public fw_PlaybackEvent() <FireBullets: Disabled> { return FMRES_IGNORED; }
public fw_PlaybackEvent() <> { return FMRES_IGNORED; }
public fw_TraceAttack_Post() <FireBullets: Disabled> { return HAM_IGNORED; }
public fw_TraceAttack_Post() <> { return FMRES_IGNORED; }
public fw_TraceAttack() <FireBullets: Disabled> { return HAM_IGNORED; }
public fw_TraceAttack() <> { return FMRES_IGNORED; }
stock UTIL_SendWeaponAnim(id, Sequence) {
set_pev(id, pev_weaponanim, Sequence);
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id);
write_byte(Sequence);
write_byte(0);
message_end();
}
stock UTIL_DropWeapon(id, slot) {
static iEntity; iEntity = get_pdata_cbase(id, (m_rpgPlayerItems + slot), 5);
if(iEntity > 0) {
static iNext;
static szWeaponName[32];
do{
iNext = get_pdata_cbase(iEntity, m_pNext, 4);
if(get_weaponname(get_pdata_int(iEntity, m_iId, 4), szWeaponName, 31)) {
engclient_cmd(id, "drop", szWeaponName);
}
} while(( iEntity = iNext) > 0);
}
}
stock Weaponlist(id, type) {
message_begin(MSG_ONE, g_msg_WeaponList, _, id);
if(type) {
write_string(WEAPON_NEW);
write_byte(LIST_NEW_1);
write_byte(LIST_NEW_2);
write_byte(LIST_NEW_3);
write_byte(LIST_NEW_4);
write_byte(LIST_NEW_5);
write_byte(LIST_NEW_6);
write_byte(LIST_NEW_7);
write_byte(LIST_NEW_8);
}
else {
write_string(WEAPON_OLD);
write_byte(LIST_OLD_1);
write_byte(LIST_OLD_2);
write_byte(LIST_OLD_3);
write_byte(LIST_OLD_4);
write_byte(LIST_OLD_5);
write_byte(LIST_OLD_6);
write_byte(LIST_OLD_7);
write_byte(LIST_OLD_8);
}
message_end();
}
stock UTIL_EjectBrass(id, ModelShellIndex, Float:Up, Float:Forward, Float:Right, Koord1, Koord2) {
static Float:Velocity[3]; pev(id, pev_velocity, Velocity);
static Float:ViewOfs[3]; pev(id, pev_view_ofs, ViewOfs);
static Float:Angles[3]; pev(id, pev_angles, Angles);
static Float:Origin[3]; pev(id, pev_origin, Origin);
static Float:AnglesV[3]; pev(id, pev_v_angle, AnglesV);
static Float:Punchangle[3]; pev(id, pev_punchangle, Punchangle);
AnglesV[0] = Punchangle[0] + AnglesV[0];
AnglesV[1] = Punchangle[1] + AnglesV[1];
AnglesV[2] = Punchangle[2] + AnglesV[2];
engfunc(EngFunc_MakeVectors, AnglesV);
static Float:VRight[3]; global_get(glb_v_right, VRight);
static Float:VUp[3]; global_get(glb_v_up, VUp);
static Float:VForward[3]; global_get(glb_v_forward, VForward);
static Float:vShellOrigin[3], Float:vShellVelocity[3];
vShellOrigin[0] = Origin[0]+ViewOfs[0]+VUp[0]*Up+VForward[0]*Forward+VRight[0]*Right;
vShellOrigin[1] = Origin[1]+ViewOfs[1]+VUp[1]*Up+VForward[1]*Forward+VRight[1]*Right;
vShellOrigin[2] = Origin[2]+ViewOfs[2]+VUp[2]*Up+VForward[2]*Forward+VRight[2]*Right;
vShellVelocity[1] = Velocity[1]+VRight[1]*random_num(Koord1,Koord2)+VUp[1]*random_float(100.0,150.0)+VForward[1]*25.0;
vShellVelocity[0] = Velocity[0]+VRight[0]*random_num(Koord1,Koord2)+VUp[0]*random_float(100.0,150.0)+VForward[0]*25.0;
vShellVelocity[2] = Velocity[2]+VRight[2]*random_num(Koord1,Koord2)+VUp[2]*random_float(100.0,150.0)+VForward[2]*25.0;
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vShellOrigin, 0);
write_byte(TE_MODEL);
engfunc(EngFunc_WriteCoord, vShellOrigin[0]);
engfunc(EngFunc_WriteCoord, vShellOrigin[1]);
engfunc(EngFunc_WriteCoord, vShellOrigin[2]);
engfunc(EngFunc_WriteCoord, vShellVelocity[0]);
engfunc(EngFunc_WriteCoord, vShellVelocity[1]);
engfunc(EngFunc_WriteCoord, vShellVelocity[2]);
engfunc(EngFunc_WriteAngle, Angles[1]);
write_short(ModelShellIndex);
write_byte(1);
write_byte(15); // 2.5 seconds
message_end();
}