/* AMX Mod X * AK-47: Avtomat Kalashnikova. * * http://aghl.ru/forum/ - Russian Half-Life and Adrenaline Gamer Community * * This file is provided as is (no warranties) */ // UNDEFINE TO USE CSO MODEL BY KOSHAK //#define _CSO_ #pragma semicolon 1 #pragma ctrlchar '\' #include #include #include #include #define PLUGIN "AK-47: Avtomat Kalashnikova" #define VERSION "1.0a" #define AUTHOR "KORD_12.7" // Weapon settings #define WEAPON_NAME "weapon_ak47" #define WEAPON_SLOT 2 #define WEAPON_POSITION 5 #define WEAPON_PRIMARY_AMMO "762x39" #define WEAPON_PRIMARY_AMMO_MAX 90 #define WEAPON_SECONDARY_AMMO "" // NULL #define WEAPON_SECONDARY_AMMO_MAX -1 #define WEAPON_MAX_CLIP 30 #define WEAPON_DEFAULT_AMMO 30 #define WEAPON_FLAGS 0 #define WEAPON_WEIGHT 15 #define WEAPON_DAMAGE 16.0 // Hud #define WEAPON_HUD_TXT "sprites/weapon_ak47.txt" #define WEAPON_HUD_SPR "sprites/weapon_ak47.spr" // Ammobox #define AMMOBOX_CLASSNAME "ammo_ak47clip" // Models and sounds #define MODEL_CLIP "models/w_ak47_clip.mdl" #define MODEL_SHELL "models/shell_762x39.mdl" #if defined _CSO_ #define MODEL_WORLD "models/w_ak47_cso.mdl" #define MODEL_VIEW "models/v_ak47_cso.mdl" #define MODEL_PLAYER "models/p_ak47_cso.mdl" #define SOUND_COCK "weapons/ak47_boltpull.wav" #define SOUND_FIRE "weapons/ak47-1.wav" #define SOUND_RELOAD_1 "weapons/ak47_clipin.wav" #define SOUND_RELOAD_2 "weapons/ak47_clipout.wav" #else #define MODEL_WORLD "models/w_ak47_fa.mdl" #define MODEL_VIEW "models/v_ak47_fa.mdl" #define MODEL_PLAYER "models/p_ak47_fa.mdl" #define SOUND_COCK "weapons/ak47_cock.wav" #define SOUND_FIRE "weapons/ak47_fire1.wav" #define SOUND_RELOAD_1 "weapons/ak47_magin.wav" #define SOUND_RELOAD_2 "weapons/ak47_magout.wav" #endif #define SOUND_MISS_1 "weapons/bayonet_slash1.wav" #define SOUND_MISS_2 "weapons/bayonet_slash2.wav" #define SOUND_MISS_3 "weapons/bayonet_slash3.wav" #define SOUND_HIT_WALL "weapons/bayonet_hit_wall.wav" #define SOUND_HIT_FLESH_1 "weapons/knife_hit_flesh1.wav" #define SOUND_HIT_FLESH_2 "weapons/knife_hit_flesh2.wav" // Animation #define ANIM_EXTENSION "mp5" enum _:Animation { #if defined _CSO_ ANIM_IDLE, ANIM_RELOAD, ANIM_DEPLOY, ANIM_FIRE_1, ANIM_FIRE_2, ANIM_FIRE_3, ANIM_STAB #else ANIM_IDLE_1, ANIM_IDLE_2, ANIM_FIRE_1, ANIM_FIRE_2, ANIM_STAB, ANIM_RELOAD_A, ANIM_RELOAD_A_EMPTY, ANIM_RELOAD_B, ANIM_RELOAD_B_EMPTY, ANIM_DEPLOY, ANIM_HOLSTER #endif }; new g_iShell; //********************************************** //* Precache resources * //********************************************** public plugin_precache() { PRECACHE_MODEL(MODEL_VIEW); PRECACHE_MODEL(MODEL_WORLD); PRECACHE_MODEL(MODEL_PLAYER); PRECACHE_MODEL(MODEL_CLIP); PRECACHE_MODEL(MODEL_SHELL); PRECACHE_SOUND(SOUND_COCK); PRECACHE_SOUND(SOUND_FIRE); PRECACHE_SOUND(SOUND_MISS_1); PRECACHE_SOUND(SOUND_MISS_2); PRECACHE_SOUND(SOUND_MISS_3); PRECACHE_SOUND(SOUND_RELOAD_1); PRECACHE_SOUND(SOUND_RELOAD_2); PRECACHE_SOUND(SOUND_HIT_WALL); PRECACHE_SOUND(SOUND_HIT_FLESH_1); PRECACHE_SOUND(SOUND_HIT_FLESH_2); PRECACHE_GENERIC(WEAPON_HUD_TXT); PRECACHE_GENERIC(WEAPON_HUD_SPR); g_iShell = PRECACHE_MODEL(MODEL_SHELL); } //********************************************** //* Register weapon. * //********************************************** public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); new iAK47 = wpnmod_register_weapon ( WEAPON_NAME, WEAPON_SLOT, WEAPON_POSITION, WEAPON_PRIMARY_AMMO, WEAPON_PRIMARY_AMMO_MAX, WEAPON_SECONDARY_AMMO, WEAPON_SECONDARY_AMMO_MAX, WEAPON_MAX_CLIP, WEAPON_FLAGS, WEAPON_WEIGHT ); new iAmmoAK47= wpnmod_register_ammobox(AMMOBOX_CLASSNAME); wpnmod_register_weapon_forward(iAK47, Fwd_Wpn_Spawn, "AK47_Spawn"); wpnmod_register_weapon_forward(iAK47, Fwd_Wpn_Deploy, "AK47_Deploy"); wpnmod_register_weapon_forward(iAK47, Fwd_Wpn_Idle, "AK47_Idle"); wpnmod_register_weapon_forward(iAK47, Fwd_Wpn_PrimaryAttack, "AK47_PrimaryAttack"); wpnmod_register_weapon_forward(iAK47, Fwd_Wpn_SecondaryAttack, "AK47_SecondaryAttack"); wpnmod_register_weapon_forward(iAK47, Fwd_Wpn_Reload, "AK47_Reload"); wpnmod_register_weapon_forward(iAK47, Fwd_Wpn_Holster, "AK47_Holster"); wpnmod_register_ammobox_forward(iAmmoAK47, Fwd_Ammo_Spawn, "AmmoAK47_Spawn"); wpnmod_register_ammobox_forward(iAmmoAK47, Fwd_Ammo_AddAmmo, "AmmoAK47_AddAmmo"); } //********************************************** //* Weapon spawn. * //********************************************** public AK47_Spawn(const iItem) { // Setting world model SET_MODEL(iItem, MODEL_WORLD); // Give a default ammo to weapon wpnmod_set_offset_int(iItem, Offset_iDefaultAmmo, WEAPON_DEFAULT_AMMO); wpnmod_set_offset_int(iItem, Offset_iInSpecialReload, 0); } //********************************************** //* Deploys the weapon. * //********************************************** public AK47_Deploy(const iItem, const iPlayer, const iClip) { return wpnmod_default_deploy(iItem, MODEL_VIEW, MODEL_PLAYER, ANIM_DEPLOY, ANIM_EXTENSION); } //********************************************** //* Called when the weapon is holster. * //********************************************** public AK47_Holster(const iItem) { // Cancel any reload in progress. wpnmod_set_offset_int(iItem, Offset_iInReload, 0); } //********************************************** //* Displays the idle animation for the weapon.* //********************************************** public AK47_Idle(const iItem, const iPlayer, const iClip) { wpnmod_reset_empty_sound(iItem); if (wpnmod_get_offset_float(iItem, Offset_flTimeWeaponIdle) > 0.0) { return; } #if defined _CSO_ wpnmod_send_weapon_anim(iItem, ANIM_IDLE); wpnmod_set_offset_float(iItem, Offset_flTimeWeaponIdle, 5.0); #else new iAnim; new Float: flNextIdle; if (random_float(0.0, 1.0) <= 0.75) { iAnim = ANIM_IDLE_1; flNextIdle = 5.0; } else { iAnim = ANIM_IDLE_2; flNextIdle = 6.2; } wpnmod_send_weapon_anim(iItem, iAnim); wpnmod_set_offset_float(iItem, Offset_flTimeWeaponIdle, flNextIdle); #endif } //********************************************** //* The main attack of a weapon is triggered. * //********************************************** public AK47_PrimaryAttack(const iItem, const iPlayer, iClip) { static Float: vecPunchangle[3]; if (pev(iPlayer, pev_waterlevel) == 3 || iClip <= 0) { wpnmod_play_empty_sound(iItem); wpnmod_set_offset_float(iItem, Offset_flNextPrimaryAttack, 0.15); return; } wpnmod_set_offset_int(iItem, Offset_iClip, iClip - 1); wpnmod_set_offset_int(iPlayer, Offset_iWeaponVolume, LOUD_GUN_VOLUME); wpnmod_set_offset_int(iPlayer, Offset_iWeaponFlash, BRIGHT_GUN_FLASH); wpnmod_set_offset_float(iItem, Offset_flNextPrimaryAttack, 0.08); wpnmod_set_offset_float(iItem, Offset_flTimeWeaponIdle, 7.0); wpnmod_set_player_anim(iPlayer, PLAYER_ATTACK1); #if defined _CSO_ wpnmod_send_weapon_anim(iItem, random_num(ANIM_FIRE_1, ANIM_FIRE_3)); wpnmod_eject_brass(iPlayer, g_iShell, 1, 16.0, -12.0, 10.0); #else wpnmod_send_weapon_anim(iItem, random_num(ANIM_FIRE_1, ANIM_FIRE_2)); wpnmod_eject_brass(iPlayer, g_iShell, 1, 18.0, -12.0, 4.0); #endif emit_sound(iPlayer, CHAN_WEAPON, SOUND_FIRE, 0.9, ATTN_NORM, 0, PITCH_NORM); wpnmod_fire_bullets ( iPlayer, iPlayer, 1, VECTOR_CONE_2DEGREES, 8192.0, WEAPON_DAMAGE, DMG_BULLET | DMG_NEVERGIB, 3 ); vecPunchangle[0] = random_float(-2.0, 2.0); set_pev(iPlayer, pev_punchangle, vecPunchangle); set_pev(iPlayer, pev_effects, pev(iPlayer, pev_effects) | EF_MUZZLEFLASH); } //********************************************** //* Secondary attack of a weapon is triggered. * //********************************************** public AK47_SecondaryAttack(const iItem, const iPlayer) { wpnmod_set_think(iItem, "AK47_Stab"); wpnmod_send_weapon_anim(iItem, ANIM_STAB); wpnmod_set_offset_float(iItem, Offset_flNextPrimaryAttack, 0.65); wpnmod_set_offset_float(iItem, Offset_flNextSecondaryAttack, 0.65); wpnmod_set_offset_float(iItem, Offset_flTimeWeaponIdle, 5.0); set_pev(iItem, pev_nextthink, get_gametime() + 0.3); } //********************************************** //* Think functions. * //********************************************** public AK47_Stab(const iItem, const iPlayer) { #define Offset_trHit Offset_iuser1 #define Instance(%0) ((%0 == -1) ? 0 : %0) new iClass; new iTrace; new iEntity; new iHitWorld; new Float: vecSrc[3]; new Float: vecEnd[3]; new Float: vecUp[3]; new Float: vecAngle[3]; new Float: vecRight[3]; new Float: vecForward[3]; new Float: flFraction; iTrace = create_tr2(); wpnmod_get_gun_position(iPlayer, vecSrc); global_get(glb_v_up, vecUp); global_get(glb_v_right, vecRight); global_get(glb_v_forward, vecForward); xs_vec_mul_scalar(vecUp, -2.0, vecUp); xs_vec_mul_scalar(vecRight, 1.0, vecRight); xs_vec_mul_scalar(vecForward, 48.0, vecForward); xs_vec_add(vecUp, vecRight, vecRight); xs_vec_add(vecRight, vecForward, vecForward); xs_vec_add(vecForward, vecSrc, vecEnd); engfunc(EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, iPlayer, iTrace); get_tr2(iTrace, TR_flFraction, flFraction); if (flFraction >= 1.0) { engfunc(EngFunc_TraceHull, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, HULL_HEAD, iPlayer, iTrace); get_tr2(iTrace, TR_flFraction, flFraction); if (flFraction < 1.0) { new iHit = Instance(get_tr2(iTrace, TR_pHit)); if (!iHit || ExecuteHamB(Ham_IsBSPModel, iHit)) { FindHullIntersection(vecSrc, iTrace, Float: {-16.0, -16.0, -18.0}, Float: {16.0, 16.0, 18.0}, iPlayer); } get_tr2(iTrace, TR_vecEndPos, vecEnd); } } get_tr2(iTrace, TR_flFraction, flFraction); switch (random_num(0, 2)) { case 0: emit_sound(iPlayer, CHAN_WEAPON, SOUND_MISS_1, 1.0, ATTN_NORM, 0, PITCH_NORM); case 1: emit_sound(iPlayer, CHAN_WEAPON, SOUND_MISS_2, 1.0, ATTN_NORM, 0, PITCH_NORM); case 2: emit_sound(iPlayer, CHAN_WEAPON, SOUND_MISS_3, 1.0, ATTN_NORM, 0, PITCH_NORM); } if (flFraction < 1.0) { iHitWorld = true; iEntity = Instance(get_tr2(iTrace, TR_pHit)); wpnmod_clear_multi_damage(); pev(iPlayer, pev_v_angle, vecAngle); engfunc(EngFunc_MakeVectors, vecAngle); global_get(glb_v_forward, vecForward); ExecuteHamB(Ham_TraceAttack, iEntity, iPlayer, WEAPON_DAMAGE * 2.5, vecForward, iTrace, DMG_CLUB | DMG_NEVERGIB); wpnmod_apply_multi_damage(iPlayer, iPlayer); if (iEntity && (iClass = ExecuteHamB(Ham_Classify, iEntity)) != CLASS_NONE && iClass != CLASS_MACHINE) { switch (random_num(0, 1)) { case 0: emit_sound(iPlayer, CHAN_ITEM, SOUND_HIT_FLESH_1, 1.0, ATTN_NORM, 0, PITCH_NORM); case 1: emit_sound(iPlayer, CHAN_ITEM, SOUND_HIT_FLESH_2, 1.0, ATTN_NORM, 0, PITCH_NORM); } if (!ExecuteHamB(Ham_IsAlive, iEntity)) { return; } iHitWorld = false; } if (iHitWorld) { wpnmod_set_offset_int(iItem, Offset_trHit, iTrace); emit_sound(iPlayer, CHAN_ITEM, SOUND_HIT_WALL, 1.0, ATTN_NORM, 0, PITCH_NORM); } wpnmod_set_think(iItem, "AK47_Smack"); set_pev(iItem, pev_nextthink, get_gametime() + 0.1); } free_tr2(iTrace); } public AK47_Smack(const iItem) { new iTrace = wpnmod_get_offset_int(iItem, Offset_trHit); if (iTrace) { wpnmod_decal_trace(iTrace, wpnmod_get_damage_decal(Instance(get_tr2(iTrace, TR_pHit)))); free_tr2(iTrace); } } //********************************************** //* Called when the weapon is reloaded. * //********************************************** public AK47_Reload(const iItem, const iPlayer, const iClip, const iAmmo) { if (iAmmo <= 0 || iClip >= WEAPON_MAX_CLIP) { return; } #if defined _CSO_ wpnmod_default_reload(iItem, WEAPON_MAX_CLIP, ANIM_RELOAD, 2.45); #else new iAnim; new iInSpecialReload; new Float: flNextReload = 2.05; iAnim = (iInSpecialReload = wpnmod_get_offset_int(iItem, Offset_iInSpecialReload)) ? ANIM_RELOAD_B : ANIM_RELOAD_A; if (!iClip) { iAnim ++; flNextReload = 2.52; } wpnmod_default_reload(iItem, WEAPON_MAX_CLIP, iAnim, flNextReload); wpnmod_set_offset_int(iItem, Offset_iInSpecialReload, !iInSpecialReload); #endif } //********************************************** //* Ammobox spawn. * //********************************************** public AmmoAK47_Spawn(const iItem) { // Setting world model SET_MODEL(iItem, MODEL_CLIP); } //********************************************** //* Extract ammo from box to player. * //********************************************** public AmmoAK47_AddAmmo(const iItem, const iPlayer) { new iResult = ( ExecuteHamB ( Ham_GiveAmmo, iPlayer, WEAPON_MAX_CLIP, WEAPON_PRIMARY_AMMO, WEAPON_PRIMARY_AMMO_MAX ) != -1 ); if (iResult) { emit_sound(iItem, CHAN_ITEM, "items/9mmclip1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM); } return iResult; } //********************************************** //* Some usefull stocks. * //********************************************** stock FindHullIntersection(const Float: vecSrc[3], &iTrace, const Float: vecMins[3], const Float: vecMaxs[3], const iEntity) { new i, j, k; new iTempTrace; new Float: vecEnd[3]; new Float: flDistance; new Float: flFraction; new Float: vecEndPos[3]; new Float: vecHullEnd[3]; new Float: flThisDistance; new Float: vecMinMaxs[2][3]; flDistance = 999999.0; xs_vec_copy(vecMins, vecMinMaxs[0]); xs_vec_copy(vecMaxs, vecMinMaxs[1]); get_tr2(iTrace, TR_vecEndPos, vecHullEnd); xs_vec_sub(vecHullEnd, vecSrc, vecHullEnd); xs_vec_mul_scalar(vecHullEnd, 2.0, vecHullEnd); xs_vec_add(vecHullEnd, vecSrc, vecHullEnd); engfunc(EngFunc_TraceLine, vecSrc, vecHullEnd, DONT_IGNORE_MONSTERS, iEntity, (iTempTrace = create_tr2())); get_tr2(iTempTrace, TR_flFraction, flFraction); if (flFraction < 1.0) { free_tr2(iTrace); iTrace = iTempTrace; return; } for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) { for (k = 0; k < 2; k++) { vecEnd[0] = vecHullEnd[0] + vecMinMaxs[i][0]; vecEnd[1] = vecHullEnd[1] + vecMinMaxs[j][1]; vecEnd[2] = vecHullEnd[2] + vecMinMaxs[k][2]; engfunc(EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, iEntity, iTempTrace); get_tr2(iTempTrace, TR_flFraction, flFraction); if (flFraction < 1.0) { get_tr2(iTempTrace, TR_vecEndPos, vecEndPos); xs_vec_sub(vecEndPos, vecSrc, vecEndPos); if ((flThisDistance = xs_vec_len(vecEndPos)) < flDistance) { free_tr2(iTrace); iTrace = iTempTrace; flDistance = flThisDistance; } } } } } }