Let's start!
We will take this gun's code as example ( i really do not know what it is).
| Main code:
- /* Plugin generated by AMXX-Studio */
- #include <amxmodx>
- #include <fakemeta>
- #include <fakemeta_util>
- #include <engine>
- #include <hamsandwich>
- #include <xs>
- #define PLUGIN "M249 Phoenix"
- #define VERSION "1.0"
- #define AUTHOR "Bim Bim Cay"
- // Models
- #define v_model "models/v_buffm249.mdl"
- #define p_model "models/p_buffm249.mdl"
- #define w_model "models/w_buffm249.mdl"
- // Sounds
- new const BuffM249_Sounds[4][] =
- {
- "weapons/buffm249-1.wav",
- "weapons/buffm249-2.wav",
- "weapons/buffm249_scream.wav",
- "weapons/buffm249_loop.wav"
- }
- // Sprites
- #define muzzleflash "sprites/muzzleflash43.spr"
- #define lasersprite "sprites/smoke.spr"
- // Animations
- #define ANIM_IDLE 0
- #define ANIM_SHOOT1 1
- #define ANIM_SHOOT2 2
- #define ANIM_RELOAD 3
- #define ANIM_DRAW 4
- #define ANIM_EXTENSION "m249"
- // Entity Classname
- #define MUZZLEFLASH_CLASSNAME "Muzzle_M249Phoenix"
- // Configs
- #define WEAPON_NAME "weapon_buffm249"
- #define WEAPON_BASE "weapon_sg552"
- #define WEAPON_MAX_CLIP 100
- #define WEAPON_DEFAULT_AMMO 200
- #define WEAPON_SHOOT_DAMAGE 150.0
- #define WEAPON_SHOOT_DAMAGEZ 400.0
- #define WEAPON_TIME_NEXT_ATTACK 0.1
- #define WEAPON_TIME_NEXT_ATTACKZ 0.75
- #define WEAPON_SHOOT_ACCURACY 94.0
- // MACROS
- #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
- #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
- #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
- #define INSTANCE(%0) ((%0 == -1) ? 0 : %0)
- #define IsValidPev(%0) (pev_valid(%0) == 2)
- #define IsObserver(%0) pev(%0,pev_iuser1)
- #define MUZZLE_INTOLERANCE 100
- #define OBS_IN_EYE 4
- // Shell
- #define MODEL_SHELL "models/rshell.mdl"
- new g_iszWeaponKey
- new g_iForwardDecalIndex
- new iShellModelIndex
- new g_SprTrail
- // Safety
- new g_HamBot
- new g_IsConnected, g_IsAlive
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- // Safety
- Register_SafetyFunc()
- // Forward
- register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
- register_forward(FM_TraceLine, "fw_TraceLine_Post", 1)
- register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
- register_forward(FM_SetModel, "fw_SetModel")
- unregister_forward(FM_DecalIndex, g_iForwardDecalIndex, 1)
- // Think
- register_think(MUZZLEFLASH_CLASSNAME, "fw_MuzzleFlash_Think")
- // Ham
- RegisterHam(Ham_Spawn, "weaponbox", "fw_Weaponbox_Spawn_Post", 1)
- RegisterHam(Ham_Item_Deploy, WEAPON_BASE, "fw_Item_Deploy_Post", 1)
- RegisterHam(Ham_Item_PostFrame, WEAPON_BASE, "fw_Item_PostFrame")
- RegisterHam(Ham_Weapon_Reload, WEAPON_BASE, "fw_Weapon_Reload")
- RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_BASE, "fw_Weapon_WeaponIdle")
- RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_BASE, "fw_Weapon_PrimaryAttack")
- RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_Entity")
- RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack_Entity")
- RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Entity")
- register_clcmd("say /get", "Get_MyWeapon")
- }
- public plugin_precache()
- {
- precache_model(v_model)
- precache_model(p_model)
- precache_model(w_model)
- precache_model(muzzleflash)
- for(new i = 0; i < sizeof(BuffM249_Sounds); i++)
- precache_sound(BuffM249_Sounds[i])
- iShellModelIndex = precache_model(MODEL_SHELL)
- g_SprTrail = precache_model(lasersprite)
- g_iszWeaponKey = engfunc(EngFunc_AllocString, WEAPON_NAME)
- g_iForwardDecalIndex = register_forward(FM_DecalIndex, "fw_DecalIndex_Post", 1)
- }
- public client_putinserver(iPlayer)
- {
- Safety_Connected(iPlayer)
- if(!g_HamBot && is_user_bot(iPlayer))
- {
- g_HamBot = 1
- set_task(0.1, "Register_HamBot", iPlayer)
- }
- }
- public Register_HamBot(iPlayer)
- {
- Register_SafetyFuncBot(iPlayer)
- RegisterHamFromEntity(Ham_TraceAttack, iPlayer, "fw_TraceAttack_Entity")
- }
- public client_disconnect(iPlayer)
- {
- Safety_Disconnected(iPlayer)
- }
- public Get_MyWeapon(iPlayer)
- {
- Weapon_Give(iPlayer)
- }
- //**********************************************
- //* Forward Hooking *
- //**********************************************
- public fw_UpdateClientData_Post(iPlayer, sendweapons, CD_Handle)
- {
- enum
- {
- SPEC_MODE,
- SPEC_TARGET,
- SPEC_END
- }
- static aSpecInfo[33][SPEC_END]
- static iTarget
- static iSpecMode
- static iActiveItem
- iTarget = (iSpecMode = IsObserver(iPlayer)) ? pev(iPlayer, pev_iuser2) : iPlayer
- if(!is_alive(iTarget))
- return FMRES_IGNORED
- iActiveItem = get_pdata_cbase(iTarget, 373, 5)
- if(!IsValidPev(iActiveItem) || !IsCustomItem(iActiveItem))
- return FMRES_IGNORED
- if(iSpecMode)
- {
- if(aSpecInfo[iPlayer][SPEC_MODE] != iSpecMode)
- {
- aSpecInfo[iPlayer][SPEC_MODE] = iSpecMode
- aSpecInfo[iPlayer][SPEC_TARGET] = 0
- }
- if(iSpecMode == OBS_IN_EYE && aSpecInfo[iPlayer][SPEC_TARGET] != iTarget)
- {
- aSpecInfo[iPlayer][SPEC_TARGET] = iTarget
- Weapon_SendAnim(iPlayer, iActiveItem, ANIM_IDLE)
- }
- }
- set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001)
- return FMRES_HANDLED
- }
- public fw_TraceLine_Post(Float:TraceStart[3], Float:TraceEnd[3], fNoMonsters, iEntToSkip, iTrace) <FireBullets: Enabled>
- {
- static Float:vecEndPos[3]
- get_tr2(iTrace, TR_vecEndPos, vecEndPos)
- engfunc(EngFunc_TraceLine, vecEndPos, TraceStart, fNoMonsters, iEntToSkip, 0)
- UTIL_GunshotDecalTrace(0)
- UTIL_GunshotDecalTrace(iTrace, true)
- }
- public fw_TraceLine_Post() </* Empty statement */>
- {
- /* Fallback */
- }
- public fw_TraceLine_Post() <FireBullets: Disabled>
- {
- /* Do notning */
- }
- public fw_PlaybackEvent() <FireBullets: Enabled>
- {
- return FMRES_SUPERCEDE
- }
- public fw_PlaybackEvent() </* Empty statement */>
- {
- return FMRES_IGNORED
- }
- public fw_PlaybackEvent() <FireBullets: Disabled>
- {
- return FMRES_IGNORED
- }
- //**********************************************
- //* Weaponbox world model. *
- //**********************************************
- public fw_SetModel(iEntity) <WeaponBox: Enabled>
- {
- state WeaponBox: Disabled
- if(!IsValidPev(iEntity))
- return FMRES_IGNORED
- #define MAX_ITEM_TYPES 6
- for(new i, iItem; i < MAX_ITEM_TYPES; i++)
- {
- iItem = get_pdata_cbase(iEntity, 34 + i, 4)
- if(IsValidPev(iItem) && IsCustomItem(iItem))
- {
- engfunc(EngFunc_SetModel, iEntity, w_model)
- return FMRES_SUPERCEDE
- }
- }
- return FMRES_IGNORED
- }
- public fw_SetModel() </* Empty statement */>
- {
- /* Fallback */
- return FMRES_IGNORED
- }
- public fw_SetModel() <WeaponBox: Disabled>
- {
- /* Do nothing */
- return FMRES_IGNORED
- }
- public fw_Weaponbox_Spawn_Post(iWeaponBox)
- {
- if(IsValidPev(iWeaponBox))
- {
- state (IsValidPev(pev(iWeaponBox, pev_owner))) WeaponBox: Enabled
- }
- return HAM_IGNORED
- }
- //**********************************************
- //* Weapon's codes. *
- //**********************************************
- public fw_Item_Deploy_Post(iItem)
- {
- if(!IsCustomItem(iItem))
- return
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- set_pev(iPlayer, pev_viewmodel2, v_model)
- set_pev(iPlayer, pev_weaponmodel2, p_model)
- Weapon_SendAnim(iPlayer, iItem, ANIM_DRAW)
- set_pdata_string(iPlayer, (492) * 4, ANIM_EXTENSION, -1 , 20)
- }
- public fw_Item_PostFrame(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- if(get_pdata_int(iItem, 54, 4))
- {
- static iClip; iClip = get_pdata_int(iItem, 51, 4)
- static iPrimaryAmmoIndex; iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem)
- static iAmmoPrimary; iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex)
- static iAmount; iAmount = min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary)
- set_pdata_int(iItem, 51, iClip + iAmount, 4)
- SetAmmoInventory(iPlayer, iPrimaryAmmoIndex, iAmmoPrimary - iAmount)
- set_pdata_int(iItem, 54, 0, 4)
- }
- static Float:flLastEventCheck; flLastEventCheck = get_pdata_float(iItem, 38, 4)
- if(flLastEventCheck < get_gametime())
- {
- flLastEventCheck = get_gametime() + 2.0
- set_pdata_float(iItem, 38, flLastEventCheck, 4)
- emit_sound(iPlayer, CHAN_ITEM, BuffM249_Sounds[3], 1.0, 0.4, 0, 94 + random_num(0, 15))
- }
- return HAM_IGNORED
- }
- public fw_Weapon_Reload(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- static iClip; iClip = get_pdata_int(iItem, 51, 4)
- static iPrimaryAmmoIndex; iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem)
- static iAmmoPrimary; iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex)
- if(min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary) <= 0)
- return HAM_SUPERCEDE
- set_pdata_int(iItem, 51, 0, 4)
- ExecuteHam(Ham_Weapon_Reload, iItem)
- set_pdata_int(iItem, 51, iClip, 4)
- set_pdata_float(iPlayer, 83, 4.53, 5)
- set_pdata_float(iItem, 48, 4.53, 4)
- Weapon_SendAnim(iPlayer, iItem, ANIM_RELOAD)
- return HAM_SUPERCEDE
- }
- public fw_Weapon_WeaponIdle(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- ExecuteHamB(Ham_Weapon_ResetEmptySound, iItem)
- if(get_pdata_float(iItem, 48, 4) > 0.0)
- return HAM_SUPERCEDE
- set_pdata_float(iItem, 48, 10.0, 4)
- Weapon_SendAnim(iPlayer, iItem, ANIM_IDLE)
- return HAM_SUPERCEDE
- }
- public fw_Weapon_PrimaryAttack(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- static iClip; iClip = get_pdata_int(iItem, 51, 4)
- if(iClip <= 0)
- {
- // No ammo, play empty sound and cancel
- if(get_pdata_int(iItem, 45, 4))
- {
- ExecuteHamB(Ham_Weapon_PlayEmptySound, iItem)
- set_pdata_float(iItem, 46, 0.2, 4)
- }
- return HAM_SUPERCEDE
- }
- CallOriginalFireBullets(iItem, iPlayer)
- static iFlags
- static szAnimation[64], Float:Velocity[3]
- iFlags = pev(iPlayer, pev_flags)
- if(iFlags & FL_DUCKING)
- {
- formatex(szAnimation, charsmax(szAnimation), "crouch_shoot_%s", ANIM_EXTENSION)
- }
- else
- {
- formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION)
- }
- Player_SetAnimation(iPlayer, szAnimation)
- set_pdata_float(iItem, 48, 1.0, 4)
- Weapon_SendAnim(iPlayer, iItem, random_num(ANIM_SHOOT1, ANIM_SHOOT2))
- pev(iPlayer, pev_velocity, Velocity)
- if(xs_vec_len(Velocity) > 0)
- {
- Weapon_KickBack(iItem, iPlayer, 0.5, 0.275, 0.2, 0.03, 3.0, 2.0, 10)
- }
- else if(!(iFlags & FL_ONGROUND))
- {
- Weapon_KickBack(iItem, iPlayer, 0.9, 0.475, 0.35, 0.0425, 5.0, 3.0, 6)
- }
- else if(iFlags & FL_DUCKING)
- {
- Weapon_KickBack(iItem, iPlayer, 0.225, 0.15, 0.1, 0.015, 2.0, 1.0, 10)
- }
- else
- {
- Weapon_KickBack(iItem, iPlayer, 0.25, 0.175, 0.125, 0.02, 2.25, 1.25, 10)
- }
- static Float:Accuracy
- Accuracy = ((100.0 - WEAPON_SHOOT_ACCURACY) * 1.5) / 100.0
- set_pdata_float(iItem, 62, Accuracy, 4)
- Make_MuzzleFlash(iPlayer)
- EjectBrass(iPlayer, iShellModelIndex, 1, .flForwardScale = 8.0)
- if(pev(iPlayer, pev_fov) == 90)
- {
- set_pdata_float(iItem, 46, WEAPON_TIME_NEXT_ATTACK, 4)
- set_pdata_float(iItem, 47, WEAPON_TIME_NEXT_ATTACK, 4)
- emit_sound(iPlayer, CHAN_WEAPON, BuffM249_Sounds[0], 1.0, 0.4, 0, 94 + random_num(0, 15))
- }
- else
- {
- set_pdata_float(iItem, 46, WEAPON_TIME_NEXT_ATTACKZ, 4)
- set_pdata_float(iItem, 47, WEAPON_TIME_NEXT_ATTACKZ, 4)
- emit_sound(iPlayer, CHAN_WEAPON, BuffM249_Sounds[1], 1.0, 0.4, 0, 94 + random_num(0, 15))
- Create_LaserEffect(iPlayer)
- }
- if(--iClip <= 0) emit_sound(iPlayer, CHAN_VOICE, BuffM249_Sounds[2], 1.0, 0.4, 0, 94 + random_num(0, 15))
- return HAM_SUPERCEDE
- }
- public fw_TraceAttack_Entity(iEntity, iAttacker, Float: flDamage) <FireBullets: Enabled>
- {
- if(pev(iAttacker, pev_fov) == 90)
- {
- SetHamParamFloat(3, WEAPON_SHOOT_DAMAGE)
- }
- else
- {
- SetHamParamFloat(3, WEAPON_SHOOT_DAMAGEZ)
- }
- }
- public fw_TraceAttack_Entity() </* Empty statement */>
- {
- /* Fallback */
- }
- public fw_TraceAttack_Entity() <FireBullets: Disabled>
- {
- /* Do notning */
- }
- //**********************************************
- //* Effects *
- //**********************************************
- Make_MuzzleFlash(iPlayer)
- {
- if(global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < MUZZLE_INTOLERANCE)
- return
- static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
- set_pev(Ent, pev_classname, MUZZLEFLASH_CLASSNAME)
- set_pev(Ent, pev_owner, iPlayer)
- set_pev(Ent, pev_body, 1)
- set_pev(Ent, pev_skin, iPlayer)
- set_pev(Ent, pev_movetype, MOVETYPE_FLY)
- engfunc(EngFunc_SetModel, Ent, muzzleflash)
- set_pev(Ent, pev_scale, 0.05)
- set_pev(Ent, pev_frame, 0.0)
- set_pev(Ent, pev_rendermode, kRenderTransAdd)
- set_pev(Ent, pev_renderamt, 255.0)
- static Float:Angles[3]
- Angles[2] = random_float(-180.0, 180.0)
- set_pev(Ent, pev_angles, Angles)
- new Float:Origin[3]
- pev(iPlayer, pev_origin, Origin)
- set_pev(Ent, pev_origin, Origin)
- set_pev(Ent, pev_nextthink, get_gametime() + 0.03)
- }
- public fw_MuzzleFlash_Think(Ent)
- {
- if(!pev_valid(Ent))
- return
- set_pev(Ent, pev_flags, FL_KILLME)
- }
- Create_LaserEffect(iPlayer)
- {
- static Float:StartOrigin[3], Float:EndOrigin[3]
- Get_Position(iPlayer, 40.0, !get_cvar_num("cl_righthand") ? -6.0 : 6.0, -7.0, StartOrigin)
- fm_get_aim_origin(iPlayer, EndOrigin)
- for(new i = 0; i < 6; i++)
- {
- Create_BeamPoints(StartOrigin, EndOrigin, g_SprTrail, 0, 0, 6 - i, 20, 0, 241, 175, 0, 100 - i * 15, 0)
- }
- }
- //**********************************************
- //* Safety Functions *
- //**********************************************
- public Register_SafetyFunc()
- {
- RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
- RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
- }
- public Register_SafetyFuncBot(iPlayer)
- {
- RegisterHamFromEntity(Ham_Spawn, iPlayer, "fw_Safety_Spawn_Post", 1)
- RegisterHamFromEntity(Ham_Killed, iPlayer, "fw_Safety_Killed_Post", 1)
- }
- public Safety_Connected(iPlayer)
- {
- Set_BitVar(g_IsConnected, iPlayer)
- UnSet_BitVar(g_IsAlive, iPlayer)
- }
- public Safety_Disconnected(iPlayer)
- {
- UnSet_BitVar(g_IsConnected, iPlayer)
- UnSet_BitVar(g_IsAlive, iPlayer)
- }
- public fw_Safety_Spawn_Post(iPlayer)
- {
- if(!is_user_alive(iPlayer))
- return
- Set_BitVar(g_IsAlive, iPlayer)
- }
- public fw_Safety_Killed_Post(iPlayer)
- {
- UnSet_BitVar(g_IsAlive, iPlayer)
- }
- public is_connected(iPlayer)
- {
- if(!(1 <= iPlayer <= 32))
- return 0
- if(!Get_BitVar(g_IsConnected, iPlayer))
- return 0
- return 1
- }
- public is_alive(iPlayer)
- {
- if(!is_connected(iPlayer))
- return 0
- if(!Get_BitVar(g_IsAlive, iPlayer))
- return 0
- return 1
- }
- //**********************************************
- //* Create and check our custom weapon. *
- //**********************************************
- IsCustomItem(iItem)
- {
- return (pev(iItem, pev_impulse) == g_iszWeaponKey)
- }
- Weapon_Create(Float: Origin[3] = {0.0, 0.0, 0.0}, Float: Angles[3] = {0.0, 0.0, 0.0})
- {
- new iWeapon
- static iszAllocStringCached
- if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_BASE)))
- {
- iWeapon = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
- }
- if(!IsValidPev(iWeapon))
- return FM_NULLENT
- dllfunc(DLLFunc_Spawn, iWeapon)
- set_pev(iWeapon, pev_origin, Origin)
- set_pdata_int(iWeapon, 51, WEAPON_MAX_CLIP, 4)
- set_pev(iWeapon, pev_impulse, g_iszWeaponKey)
- set_pev(iWeapon, pev_angles, Angles)
- engfunc(EngFunc_SetModel, iWeapon, w_model)
- return iWeapon
- }
- Weapon_Give(iPlayer)
- {
- if(!IsValidPev(iPlayer))
- {
- return FM_NULLENT
- }
- new iWeapon, Float: vecOrigin[3]
- pev(iPlayer, pev_origin, vecOrigin)
- if((iWeapon = Weapon_Create(vecOrigin)) != FM_NULLENT)
- {
- Player_DropWeapons(iPlayer, ExecuteHamB(Ham_Item_ItemSlot, iWeapon))
- set_pev(iWeapon, pev_spawnflags, pev(iWeapon, pev_spawnflags) | SF_NORESPAWN)
- dllfunc(DLLFunc_Touch, iWeapon, iPlayer)
- SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iWeapon), WEAPON_DEFAULT_AMMO)
- return iWeapon
- }
- return FM_NULLENT
- }
- Player_DropWeapons(iPlayer, iSlot)
- {
- new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, 367 + iSlot, 5)
- while(IsValidPev(iItem))
- {
- pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName))
- engclient_cmd(iPlayer, "drop", szWeaponName)
- iItem = get_pdata_cbase(iItem, 42, 4)
- }
- }
- //**********************************************
- //* Ammo Inventory. *
- //**********************************************
- PrimaryAmmoIndex(iItem)
- {
- return get_pdata_int(iItem, 49, 4)
- }
- GetAmmoInventory(iPlayer, iAmmoIndex)
- {
- if(iAmmoIndex == -1)
- return -1
- return get_pdata_int(iPlayer, 376 + iAmmoIndex, 5)
- }
- SetAmmoInventory(iPlayer, iAmmoIndex, iAmount)
- {
- if(iAmmoIndex == -1)
- return 0
- set_pdata_int(iPlayer, 376 + iAmmoIndex, iAmount, 5)
- return 1
- }
- //**********************************************
- //* Fire Bullets. *
- //**********************************************
- CallOriginalFireBullets(iItem, iPlayer)
- {
- state FireBullets: Enabled
- static Float:g_Recoil[3]
- pev(iPlayer, pev_punchangle, g_Recoil)
- ExecuteHam(Ham_Weapon_PrimaryAttack, iItem)
- set_pev(iPlayer, pev_punchangle, g_Recoil)
- state FireBullets: Disabled
- }
- //**********************************************
- //* Decals. *
- //**********************************************
- new Array: g_hDecals
- public fw_DecalIndex_Post()
- {
- if(!g_hDecals)
- {
- g_hDecals = ArrayCreate(1, 1)
- }
- ArrayPushCell(g_hDecals, get_orig_retval())
- }
- UTIL_GunshotDecalTrace(iTrace, bool: bIsGunshot = false)
- {
- static iHit
- static iMessage
- static iDecalIndex
- static Float:flFraction
- static Float:vecEndPos[3]
- iHit = INSTANCE(get_tr2(iTrace, TR_pHit))
- if(iHit && !IsValidPev(iHit) || (pev(iHit, pev_flags) & FL_KILLME))
- return
- if(pev(iHit, pev_solid) != SOLID_BSP && pev(iHit, pev_movetype) != MOVETYPE_PUSHSTEP)
- return
- iDecalIndex = ExecuteHamB(Ham_DamageDecal, iHit, 0)
- if(iDecalIndex < 0 || iDecalIndex >= ArraySize(g_hDecals))
- return
- iDecalIndex = ArrayGetCell(g_hDecals, iDecalIndex)
- get_tr2(iTrace, TR_flFraction, flFraction)
- get_tr2(iTrace, TR_vecEndPos, vecEndPos)
- if(iDecalIndex < 0 || flFraction >= 1.0)
- return
- if(bIsGunshot)
- {
- iMessage = TE_GUNSHOTDECAL
- }
- else
- {
- iMessage = TE_DECAL
- if(iHit != 0)
- {
- if(iDecalIndex > 255)
- {
- iMessage = TE_DECALHIGH
- iDecalIndex -= 256
- }
- }
- else
- {
- iMessage = TE_WORLDDECAL
- if(iDecalIndex > 255)
- {
- iMessage = TE_WORLDDECALHIGH
- iDecalIndex -= 256
- }
- }
- }
- engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEndPos, 0)
- write_byte(iMessage)
- engfunc(EngFunc_WriteCoord, vecEndPos[0])
- engfunc(EngFunc_WriteCoord, vecEndPos[1])
- engfunc(EngFunc_WriteCoord, vecEndPos[2])
- if(bIsGunshot)
- {
- write_short(iHit)
- write_byte(iDecalIndex)
- }
- else
- {
- write_byte(iDecalIndex)
- if(iHit)
- {
- write_short(iHit)
- }
- }
- message_end()
- }
- //**********************************************
- //* Set Animations. *
- //**********************************************
- stock Weapon_SendAnim(iPlayer, iItem, iAnim)
- {
- static i, iCount, iSpectator, aSpectators[32]
- set_pev(iPlayer, pev_weaponanim, iAnim)
- message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iPlayer)
- write_byte(iAnim)
- write_byte(pev(iItem, pev_body))
- message_end()
- if(IsObserver(iPlayer))
- return
- get_players(aSpectators, iCount, "bch")
- for(i = 0; i < iCount; i++)
- {
- iSpectator = aSpectators[i]
- if(IsObserver(iSpectator) != OBS_IN_EYE || pev(iSpectator, pev_iuser2) != iPlayer)
- continue
- set_pev(iSpectator, pev_weaponanim, iAnim)
- message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iSpectator)
- write_byte(iAnim)
- write_byte(pev(iItem, pev_body))
- message_end()
- }
- }
- stock Player_SetAnimation(iPlayer, szAnim[])
- {
- #define ACT_RANGE_ATTACK1 28
- // Linux extra offsets
- #define extra_offset_animating 4
- #define extra_offset_player 5
- // CBaseAnimating
- #define m_flFrameRate 36
- #define m_flGroundSpeed 37
- #define m_flLastEventCheck 38
- #define m_fSequenceFinished 39
- #define m_fSequenceLoops 40
- // CBaseMonster
- #define m_Activity 73
- #define m_IdealActivity 74
- // CBasePlayer
- #define m_flLastAttackTime 220
- new iAnimDesired, Float:flFrameRate, Float:flGroundSpeed, bool:bLoops
- if((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
- {
- iAnimDesired = 0
- }
- static Float:flGametime; flGametime = get_gametime()
- set_pev(iPlayer, pev_frame, 0.0)
- set_pev(iPlayer, pev_framerate, 1.0)
- set_pev(iPlayer, pev_animtime, flGametime)
- set_pev(iPlayer, pev_sequence, iAnimDesired)
- set_pdata_int(iPlayer, m_fSequenceLoops, bLoops, extra_offset_animating)
- set_pdata_int(iPlayer, m_fSequenceFinished, 0, extra_offset_animating)
- set_pdata_float(iPlayer, m_flFrameRate, flFrameRate, extra_offset_animating)
- set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, extra_offset_animating)
- set_pdata_float(iPlayer, m_flLastEventCheck, flGametime , extra_offset_animating)
- set_pdata_int(iPlayer, m_Activity, ACT_RANGE_ATTACK1, extra_offset_player)
- set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, extra_offset_player)
- set_pdata_float(iPlayer, m_flLastAttackTime, flGametime , extra_offset_player)
- }
- //**********************************************
- //* Kick back. *
- //**********************************************
- Weapon_KickBack(iItem, iPlayer, Float:upBase, Float:lateralBase, Float:upMod, Float:lateralMod, Float:upMax, Float:lateralMax, directionChange)
- {
- static iDirection
- static iShotsFired
- static Float: Punchangle[3]
- pev(iPlayer, pev_punchangle, Punchangle)
- if((iShotsFired = get_pdata_int(iItem, 64, 4)) != 1)
- {
- upBase += iShotsFired * upMod
- lateralBase += iShotsFired * lateralMod
- }
- upMax *= -1.0
- Punchangle[0] -= upBase
- if(upMax >= Punchangle[0])
- {
- Punchangle[0] = upMax
- }
- if((iDirection = get_pdata_int(iItem, 60, 4)))
- {
- Punchangle[1] += lateralBase
- if(lateralMax < Punchangle[1])
- {
- Punchangle[1] = lateralMax
- }
- }
- else
- {
- lateralMax *= -1.0;
- Punchangle[1] -= lateralBase
- if(lateralMax > Punchangle[1])
- {
- Punchangle[1] = lateralMax
- }
- }
- if(!random_num(0, directionChange))
- {
- set_pdata_int(iItem, 60, !iDirection, 4)
- }
- set_pev(iPlayer, pev_punchangle, Punchangle)
- }
- //**********************************************
- //* Brass ejection. *
- //**********************************************
- EjectBrass(iPlayer, iModelIndex, iBounce, Float:flUpScale = -9.0, Float:flForwardScale = 16.0, Float:flRightScale = 0.0)
- {
- static i, msgBrass
- static Float: vecUp[3]
- static Float: vecRight[3]
- static Float: vecForward[3]
- static Float: vecAngle[3]
- static Float: vecOrigin[3]
- static Float: vecViewOfs[3]
- static Float: vecVelocity[3]
- pev(iPlayer, pev_v_angle, vecAngle)
- pev(iPlayer, pev_punchangle, vecOrigin)
- xs_vec_add(vecAngle, vecOrigin, vecOrigin)
- engfunc(EngFunc_MakeVectors, vecOrigin)
- pev(iPlayer, pev_origin, vecOrigin)
- pev(iPlayer, pev_view_ofs, vecViewOfs)
- pev(iPlayer, pev_velocity, vecVelocity)
- global_get(glb_v_up, vecUp)
- global_get(glb_v_right, vecRight)
- global_get(glb_v_forward, vecForward)
- for(i = 0; i < 3; i++)
- {
- vecOrigin[i] = vecOrigin[i] + vecViewOfs[i] + vecForward[i] * flForwardScale + vecUp[i] * flUpScale + vecRight[i] * flRightScale
- vecVelocity[i] = vecVelocity[i] + vecForward[i] * 25.0 + vecUp[i] * random_float(100.0, 150.0) + vecRight[i] * random_float(50.0, 70.0)
- }
- if(msgBrass || (msgBrass = get_user_msgid("Brass")))
- {
- engfunc(EngFunc_MessageBegin, MSG_PVS, msgBrass, vecOrigin, 0)
- write_byte(0 /* dummy */)
- engfunc(EngFunc_WriteCoord, vecOrigin[0])
- engfunc(EngFunc_WriteCoord, vecOrigin[1])
- engfunc(EngFunc_WriteCoord, vecOrigin[2])
- engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
- engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
- engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
- engfunc(EngFunc_WriteCoord, vecVelocity[0])
- engfunc(EngFunc_WriteCoord, vecVelocity[1])
- engfunc(EngFunc_WriteCoord, vecVelocity[2])
- engfunc(EngFunc_WriteAngle, vecAngle[1])
- write_short(iModelIndex)
- write_byte(iBounce)
- write_byte(0 /* dummy */)
- write_byte(iPlayer)
- message_end()
- }
- }
- stock Get_Position(iPlayer, Float:forw, Float:right, Float:up, Float:vStart[])
- {
- new Float:Origin[3], Float:Angles[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
- pev(iPlayer, pev_origin, Origin)
- pev(iPlayer, pev_view_ofs,vUp) //for player
- xs_vec_add(Origin, vUp, Origin)
- pev(iPlayer, pev_v_angle, Angles) // if normal entity ,use pev_angles
- angle_vector(Angles, ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
- angle_vector(Angles, ANGLEVECTOR_RIGHT, vRight)
- angle_vector(Angles, ANGLEVECTOR_UP, vUp)
- vStart[0] = Origin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
- vStart[1] = Origin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
- vStart[2] = Origin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
- }
- stock get_speed_vector(Float:Origin1[3], Float:Origin2[3], Float:Speed, Float:NewVelocity[3])
- {
- NewVelocity[0] = Origin2[0] - Origin1[0]
- NewVelocity[1] = Origin2[1] - Origin1[1]
- NewVelocity[2] = Origin2[2] - Origin1[2]
- new Float:num = floatsqroot(Speed*Speed / (NewVelocity[0]*NewVelocity[0] + NewVelocity[1]*NewVelocity[1] + NewVelocity[2]*NewVelocity[2]))
- NewVelocity[0] *= num
- NewVelocity[1] *= num
- NewVelocity[2] *= num
- return 1
- }
- stock Create_BeamPoints(Float:StartPosition[3], Float:TargetPosition[3], SpritesID, StartFrame, Framerate, Life, LineWidth, Amplitude, Red, Green, Blue, Brightness, Speed)
- {
- message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_BEAMPOINTS)
- engfunc(EngFunc_WriteCoord, StartPosition[0])
- engfunc(EngFunc_WriteCoord, StartPosition[1])
- engfunc(EngFunc_WriteCoord, StartPosition[2])
- engfunc(EngFunc_WriteCoord, TargetPosition[0])
- engfunc(EngFunc_WriteCoord, TargetPosition[1])
- engfunc(EngFunc_WriteCoord, TargetPosition[2])
- write_short(SpritesID)
- write_byte(StartFrame)
- write_byte(Framerate)
- write_byte(Life)
- write_byte(LineWidth)
- write_byte(Amplitude)
- write_byte(Red)
- write_byte(Green)
- write_byte(Blue)
- write_byte(Brightness)
- write_byte(Speed)
- message_end()
- }
First thing we will talk about is includes.
- In this code, those are the includes:
Code: Select all
#include <amxmodx> #include <fakemeta> #include <fakemeta_util> #include <engine> #include <hamsandwich> #include <xs>
- If you opened zombie_escape.inc you will find a list of includes.
- Keep in your mind that you can not include an include that is already included in an included file (Read it several times so you get it ) .
- So we will replace the included files in zombie_escape.inc & we will put:
Code: Select all
#include <zombie_escape>
- As you can see in the code, there is something called public plugin_init()
Code: Select all
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) // Safety Register_SafetyFunc() // Forward register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1) register_forward(FM_TraceLine, "fw_TraceLine_Post", 1) register_forward(FM_PlaybackEvent, "fw_PlaybackEvent") register_forward(FM_SetModel, "fw_SetModel") unregister_forward(FM_DecalIndex, g_iForwardDecalIndex, 1) // Think register_think(MUZZLEFLASH_CLASSNAME, "fw_MuzzleFlash_Think") // Ham RegisterHam(Ham_Spawn, "weaponbox", "fw_Weaponbox_Spawn_Post", 1) RegisterHam(Ham_Item_Deploy, WEAPON_BASE, "fw_Item_Deploy_Post", 1) RegisterHam(Ham_Item_PostFrame, WEAPON_BASE, "fw_Item_PostFrame") RegisterHam(Ham_Weapon_Reload, WEAPON_BASE, "fw_Weapon_Reload") RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_BASE, "fw_Weapon_WeaponIdle") RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_BASE, "fw_Weapon_PrimaryAttack") RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_Entity") RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack_Entity") RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Entity") register_clcmd("say /get", "Get_MyWeapon") }
- Just go to the end of this function & let's add our item registering native.
Code: Select all
g_iItemid = ze_register_item("M249 Phoenix", 5, 0) // "M249 Phoenix" is the item name, you can just change it to whatever you want it be. // 5 is the item cost. // 0 is the item limit
- You will be wondering what is g_iItemId. Well, it's the handler of the registered item, you can put whatever you want, just you need to go before public plugin_init() & add this:
Code: Select all
new g_iItemId
- For more information about natives' sytnax, go to Our API
- In the public items, you will need to add a forwards to control the way the gun is gonna be in the game. We will be using the 2 main forwards which are:
Code: Select all
forward ze_select_item_pre(id, itemid) forward ze_select_item_post(id, itemid)
- We will start the pre forward. In this forward, there is two main & basic things you need to do before anything else which are make the gun available on not buying it & control for who it will appear. Let's explain with the code.
Code: Select all
public ze_select_item_pre(id, itemid) { // If it is not the gun the player is willing to buy then just make it available. // g_iItemID is the handler you made it before. // You can name itemid whatever you like but just not the same handler name. if (itemid != g_iItemID) return ZE_ITEM_AVAILABLE // In this item we are working on, it will be for humans only so we need to hide it for zombies so they do not get it. //If you want it to be for zombies, you need to add the not operator "!" before the native so it's gonna be like this: // if (!ze_is_user_zombie(id)) // If you want an item to be for zombies & humans then just don't add the next code. if (ze_is_user_zombie(id)) return ZE_ITEM_DONT_SHOW // Here we need to return a value so you don't get a warning on compiling. return ZE_ITEM_AVAILABLE }
- We have finished our pre forward. Now, to the post forward.
Code: Select all
public ze_select_item_post(id, itemid) { // Here we just block buying the gun if it is not the gun the player is willing to buy so we just add return without values. if (itemid != g_iItemId) return // Here you can give the item & you can even add a message to notice the player what he bought for example like this: ze_colored_print(id, "Congrats! You have bought M249 Phoenix! :D") // Do you remember in public plugin_init(), we found something like this in it: // register_clcmd("say /get", "Get_MyWeapon") // That line is to allow you to get the gun for free when you type that command. // Well, we don't care about it, we care about: // Get_MyWeapon // This is the function we will use to give the weapon to the player // It's like this: Get_MyWeapon(id) }
- Now, you have finished the main things you need to add & edit.
- These steps may differ from a gun to another.
- Our zombie escape mod only does have 2 main classes which are human & zombie.
- Some items do not have the function Get_MyWeapon Which means that the gun is not for Counter-Strike & for Half-Life or the code is bugged.
- /* Plugin generated by AMXX-Studio */
- #include <zombie_escape>
- #include <fakemeta_util>
- #include <engine>
- #include <xs>
- #define PLUGIN "M249 Phoenix"
- #define VERSION "1.0"
- #define AUTHOR "Bim Bim Cay"
- // Models
- #define v_model "models/v_buffm249.mdl"
- #define p_model "models/p_buffm249.mdl"
- #define w_model "models/w_buffm249.mdl"
- // Sounds
- new const BuffM249_Sounds[4][] =
- {
- "weapons/buffm249-1.wav",
- "weapons/buffm249-2.wav",
- "weapons/buffm249_scream.wav",
- "weapons/buffm249_loop.wav"
- }
- // Sprites
- #define muzzleflash "sprites/muzzleflash43.spr"
- #define lasersprite "sprites/smoke.spr"
- // Animations
- #define ANIM_IDLE 0
- #define ANIM_SHOOT1 1
- #define ANIM_SHOOT2 2
- #define ANIM_RELOAD 3
- #define ANIM_DRAW 4
- #define ANIM_EXTENSION "m249"
- // Entity Classname
- #define MUZZLEFLASH_CLASSNAME "Muzzle_M249Phoenix"
- // Configs
- #define WEAPON_NAME "weapon_buffm249"
- #define WEAPON_BASE "weapon_sg552"
- #define WEAPON_MAX_CLIP 100
- #define WEAPON_DEFAULT_AMMO 200
- #define WEAPON_SHOOT_DAMAGE 150.0
- #define WEAPON_SHOOT_DAMAGEZ 400.0
- #define WEAPON_TIME_NEXT_ATTACK 0.1
- #define WEAPON_TIME_NEXT_ATTACKZ 0.75
- #define WEAPON_SHOOT_ACCURACY 94.0
- // MACROS
- #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
- #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
- #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
- #define INSTANCE(%0) ((%0 == -1) ? 0 : %0)
- #define IsValidPev(%0) (pev_valid(%0) == 2)
- #define IsObserver(%0) pev(%0,pev_iuser1)
- #define MUZZLE_INTOLERANCE 100
- #define OBS_IN_EYE 4
- // Shell
- #define MODEL_SHELL "models/rshell.mdl"
- new g_iszWeaponKey
- new g_iForwardDecalIndex
- new iShellModelIndex
- new g_SprTrail
- // Safety
- new g_HamBot
- new g_IsConnected, g_IsAlive
- new g_iItemId
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- // Safety
- Register_SafetyFunc()
- // Forward
- register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
- register_forward(FM_TraceLine, "fw_TraceLine_Post", 1)
- register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
- register_forward(FM_SetModel, "fw_SetModel")
- unregister_forward(FM_DecalIndex, g_iForwardDecalIndex, 1)
- // Think
- register_think(MUZZLEFLASH_CLASSNAME, "fw_MuzzleFlash_Think")
- // Ham
- RegisterHam(Ham_Spawn, "weaponbox", "fw_Weaponbox_Spawn_Post", 1)
- RegisterHam(Ham_Item_Deploy, WEAPON_BASE, "fw_Item_Deploy_Post", 1)
- RegisterHam(Ham_Item_PostFrame, WEAPON_BASE, "fw_Item_PostFrame")
- RegisterHam(Ham_Weapon_Reload, WEAPON_BASE, "fw_Weapon_Reload")
- RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_BASE, "fw_Weapon_WeaponIdle")
- RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_BASE, "fw_Weapon_PrimaryAttack")
- RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_Entity")
- RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack_Entity")
- RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Entity")
- register_clcmd("say /get", "Get_MyWeapon")
- g_iItemId = ze_register_item("M249 Phoenix", 0, 0)
- }
- public ze_select_item_pre(id, itemid)
- {
- if (itemid != g_iItemId)
- return ZE_ITEM_AVAILABLE
- if (ze_is_user_zombie(id))
- return ZE_ITEM_DONT_SHOW
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid)
- {
- if (itemid != g_iItemId)
- return
- Get_MyWeapon(id)
- }
- public plugin_precache()
- {
- precache_model(v_model)
- precache_model(p_model)
- precache_model(w_model)
- precache_model(muzzleflash)
- for(new i = 0; i < sizeof(BuffM249_Sounds); i++)
- precache_sound(BuffM249_Sounds[i])
- iShellModelIndex = precache_model(MODEL_SHELL)
- g_SprTrail = precache_model(lasersprite)
- g_iszWeaponKey = engfunc(EngFunc_AllocString, WEAPON_NAME)
- g_iForwardDecalIndex = register_forward(FM_DecalIndex, "fw_DecalIndex_Post", 1)
- }
- public client_putinserver(iPlayer)
- {
- Safety_Connected(iPlayer)
- if(!g_HamBot && is_user_bot(iPlayer))
- {
- g_HamBot = 1
- set_task(0.1, "Register_HamBot", iPlayer)
- }
- }
- public Register_HamBot(iPlayer)
- {
- Register_SafetyFuncBot(iPlayer)
- RegisterHamFromEntity(Ham_TraceAttack, iPlayer, "fw_TraceAttack_Entity")
- }
- public client_disconnect(iPlayer)
- {
- Safety_Disconnected(iPlayer)
- }
- public Get_MyWeapon(iPlayer)
- {
- Weapon_Give(iPlayer)
- }
- //**********************************************
- //* Forward Hooking *
- //**********************************************
- public fw_UpdateClientData_Post(iPlayer, sendweapons, CD_Handle)
- {
- enum
- {
- SPEC_MODE,
- SPEC_TARGET,
- SPEC_END
- }
- static aSpecInfo[33][SPEC_END]
- static iTarget
- static iSpecMode
- static iActiveItem
- iTarget = (iSpecMode = IsObserver(iPlayer)) ? pev(iPlayer, pev_iuser2) : iPlayer
- if(!is_alive(iTarget))
- return FMRES_IGNORED
- iActiveItem = get_pdata_cbase(iTarget, 373, 5)
- if(!IsValidPev(iActiveItem) || !IsCustomItem(iActiveItem))
- return FMRES_IGNORED
- if(iSpecMode)
- {
- if(aSpecInfo[iPlayer][SPEC_MODE] != iSpecMode)
- {
- aSpecInfo[iPlayer][SPEC_MODE] = iSpecMode
- aSpecInfo[iPlayer][SPEC_TARGET] = 0
- }
- if(iSpecMode == OBS_IN_EYE && aSpecInfo[iPlayer][SPEC_TARGET] != iTarget)
- {
- aSpecInfo[iPlayer][SPEC_TARGET] = iTarget
- Weapon_SendAnim(iPlayer, iActiveItem, ANIM_IDLE)
- }
- }
- set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001)
- return FMRES_HANDLED
- }
- public fw_TraceLine_Post(Float:TraceStart[3], Float:TraceEnd[3], fNoMonsters, iEntToSkip, iTrace) <FireBullets: Enabled>
- {
- static Float:vecEndPos[3]
- get_tr2(iTrace, TR_vecEndPos, vecEndPos)
- engfunc(EngFunc_TraceLine, vecEndPos, TraceStart, fNoMonsters, iEntToSkip, 0)
- UTIL_GunshotDecalTrace(0)
- UTIL_GunshotDecalTrace(iTrace, true)
- }
- public fw_TraceLine_Post() </* Empty statement */>
- {
- /* Fallback */
- }
- public fw_TraceLine_Post() <FireBullets: Disabled>
- {
- /* Do notning */
- }
- public fw_PlaybackEvent() <FireBullets: Enabled>
- {
- return FMRES_SUPERCEDE
- }
- public fw_PlaybackEvent() </* Empty statement */>
- {
- return FMRES_IGNORED
- }
- public fw_PlaybackEvent() <FireBullets: Disabled>
- {
- return FMRES_IGNORED
- }
- //**********************************************
- //* Weaponbox world model. *
- //**********************************************
- public fw_SetModel(iEntity) <WeaponBox: Enabled>
- {
- state WeaponBox: Disabled
- if(!IsValidPev(iEntity))
- return FMRES_IGNORED
- #define MAX_ITEM_TYPES 6
- for(new i, iItem; i < MAX_ITEM_TYPES; i++)
- {
- iItem = get_pdata_cbase(iEntity, 34 + i, 4)
- if(IsValidPev(iItem) && IsCustomItem(iItem))
- {
- engfunc(EngFunc_SetModel, iEntity, w_model)
- return FMRES_SUPERCEDE
- }
- }
- return FMRES_IGNORED
- }
- public fw_SetModel() </* Empty statement */>
- {
- /* Fallback */
- return FMRES_IGNORED
- }
- public fw_SetModel() <WeaponBox: Disabled>
- {
- /* Do nothing */
- return FMRES_IGNORED
- }
- public fw_Weaponbox_Spawn_Post(iWeaponBox)
- {
- if(IsValidPev(iWeaponBox))
- {
- state (IsValidPev(pev(iWeaponBox, pev_owner))) WeaponBox: Enabled
- }
- return HAM_IGNORED
- }
- //**********************************************
- //* Weapon's codes. *
- //**********************************************
- public fw_Item_Deploy_Post(iItem)
- {
- if(!IsCustomItem(iItem))
- return
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- set_pev(iPlayer, pev_viewmodel2, v_model)
- set_pev(iPlayer, pev_weaponmodel2, p_model)
- Weapon_SendAnim(iPlayer, iItem, ANIM_DRAW)
- set_pdata_string(iPlayer, (492) * 4, ANIM_EXTENSION, -1 , 20)
- }
- public fw_Item_PostFrame(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- if(get_pdata_int(iItem, 54, 4))
- {
- static iClip; iClip = get_pdata_int(iItem, 51, 4)
- static iPrimaryAmmoIndex; iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem)
- static iAmmoPrimary; iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex)
- static iAmount; iAmount = min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary)
- set_pdata_int(iItem, 51, iClip + iAmount, 4)
- SetAmmoInventory(iPlayer, iPrimaryAmmoIndex, iAmmoPrimary - iAmount)
- set_pdata_int(iItem, 54, 0, 4)
- }
- static Float:flLastEventCheck; flLastEventCheck = get_pdata_float(iItem, 38, 4)
- if(flLastEventCheck < get_gametime())
- {
- flLastEventCheck = get_gametime() + 2.0
- set_pdata_float(iItem, 38, flLastEventCheck, 4)
- emit_sound(iPlayer, CHAN_ITEM, BuffM249_Sounds[3], 1.0, 0.4, 0, 94 + random_num(0, 15))
- }
- return HAM_IGNORED
- }
- public fw_Weapon_Reload(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- static iClip; iClip = get_pdata_int(iItem, 51, 4)
- static iPrimaryAmmoIndex; iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem)
- static iAmmoPrimary; iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex)
- if(min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary) <= 0)
- return HAM_SUPERCEDE
- set_pdata_int(iItem, 51, 0, 4)
- ExecuteHam(Ham_Weapon_Reload, iItem)
- set_pdata_int(iItem, 51, iClip, 4)
- set_pdata_float(iPlayer, 83, 4.53, 5)
- set_pdata_float(iItem, 48, 4.53, 4)
- Weapon_SendAnim(iPlayer, iItem, ANIM_RELOAD)
- return HAM_SUPERCEDE
- }
- public fw_Weapon_WeaponIdle(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- ExecuteHamB(Ham_Weapon_ResetEmptySound, iItem)
- if(get_pdata_float(iItem, 48, 4) > 0.0)
- return HAM_SUPERCEDE
- set_pdata_float(iItem, 48, 10.0, 4)
- Weapon_SendAnim(iPlayer, iItem, ANIM_IDLE)
- return HAM_SUPERCEDE
- }
- public fw_Weapon_PrimaryAttack(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- static iClip; iClip = get_pdata_int(iItem, 51, 4)
- if(iClip <= 0)
- {
- // No ammo, play empty sound and cancel
- if(get_pdata_int(iItem, 45, 4))
- {
- ExecuteHamB(Ham_Weapon_PlayEmptySound, iItem)
- set_pdata_float(iItem, 46, 0.2, 4)
- }
- return HAM_SUPERCEDE
- }
- CallOriginalFireBullets(iItem, iPlayer)
- static iFlags
- static szAnimation[64], Float:Velocity[3]
- iFlags = pev(iPlayer, pev_flags)
- if(iFlags & FL_DUCKING)
- {
- formatex(szAnimation, charsmax(szAnimation), "crouch_shoot_%s", ANIM_EXTENSION)
- }
- else
- {
- formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION)
- }
- Player_SetAnimation(iPlayer, szAnimation)
- set_pdata_float(iItem, 48, 1.0, 4)
- Weapon_SendAnim(iPlayer, iItem, random_num(ANIM_SHOOT1, ANIM_SHOOT2))
- pev(iPlayer, pev_velocity, Velocity)
- if(xs_vec_len(Velocity) > 0)
- {
- Weapon_KickBack(iItem, iPlayer, 0.5, 0.275, 0.2, 0.03, 3.0, 2.0, 10)
- }
- else if(!(iFlags & FL_ONGROUND))
- {
- Weapon_KickBack(iItem, iPlayer, 0.9, 0.475, 0.35, 0.0425, 5.0, 3.0, 6)
- }
- else if(iFlags & FL_DUCKING)
- {
- Weapon_KickBack(iItem, iPlayer, 0.225, 0.15, 0.1, 0.015, 2.0, 1.0, 10)
- }
- else
- {
- Weapon_KickBack(iItem, iPlayer, 0.25, 0.175, 0.125, 0.02, 2.25, 1.25, 10)
- }
- static Float:Accuracy
- Accuracy = ((100.0 - WEAPON_SHOOT_ACCURACY) * 1.5) / 100.0
- set_pdata_float(iItem, 62, Accuracy, 4)
- Make_MuzzleFlash(iPlayer)
- EjectBrass(iPlayer, iShellModelIndex, 1, .flForwardScale = 8.0)
- if(pev(iPlayer, pev_fov) == 90)
- {
- set_pdata_float(iItem, 46, WEAPON_TIME_NEXT_ATTACK, 4)
- set_pdata_float(iItem, 47, WEAPON_TIME_NEXT_ATTACK, 4)
- emit_sound(iPlayer, CHAN_WEAPON, BuffM249_Sounds[0], 1.0, 0.4, 0, 94 + random_num(0, 15))
- }
- else
- {
- set_pdata_float(iItem, 46, WEAPON_TIME_NEXT_ATTACKZ, 4)
- set_pdata_float(iItem, 47, WEAPON_TIME_NEXT_ATTACKZ, 4)
- emit_sound(iPlayer, CHAN_WEAPON, BuffM249_Sounds[1], 1.0, 0.4, 0, 94 + random_num(0, 15))
- Create_LaserEffect(iPlayer)
- }
- if(--iClip <= 0) emit_sound(iPlayer, CHAN_VOICE, BuffM249_Sounds[2], 1.0, 0.4, 0, 94 + random_num(0, 15))
- return HAM_SUPERCEDE
- }
- public fw_TraceAttack_Entity(iEntity, iAttacker, Float: flDamage) <FireBullets: Enabled>
- {
- if(pev(iAttacker, pev_fov) == 90)
- {
- SetHamParamFloat(3, WEAPON_SHOOT_DAMAGE)
- }
- else
- {
- SetHamParamFloat(3, WEAPON_SHOOT_DAMAGEZ)
- }
- }
- public fw_TraceAttack_Entity() </* Empty statement */>
- {
- /* Fallback */
- }
- public fw_TraceAttack_Entity() <FireBullets: Disabled>
- {
- /* Do notning */
- }
- //**********************************************
- //* Effects *
- //**********************************************
- Make_MuzzleFlash(iPlayer)
- {
- if(global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < MUZZLE_INTOLERANCE)
- return
- static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
- set_pev(Ent, pev_classname, MUZZLEFLASH_CLASSNAME)
- set_pev(Ent, pev_owner, iPlayer)
- set_pev(Ent, pev_body, 1)
- set_pev(Ent, pev_skin, iPlayer)
- set_pev(Ent, pev_movetype, MOVETYPE_FLY)
- engfunc(EngFunc_SetModel, Ent, muzzleflash)
- set_pev(Ent, pev_scale, 0.05)
- set_pev(Ent, pev_frame, 0.0)
- set_pev(Ent, pev_rendermode, kRenderTransAdd)
- set_pev(Ent, pev_renderamt, 255.0)
- static Float:Angles[3]
- Angles[2] = random_float(-180.0, 180.0)
- set_pev(Ent, pev_angles, Angles)
- new Float:Origin[3]
- pev(iPlayer, pev_origin, Origin)
- set_pev(Ent, pev_origin, Origin)
- set_pev(Ent, pev_nextthink, get_gametime() + 0.03)
- }
- public fw_MuzzleFlash_Think(Ent)
- {
- if(!pev_valid(Ent))
- return
- set_pev(Ent, pev_flags, FL_KILLME)
- }
- Create_LaserEffect(iPlayer)
- {
- static Float:StartOrigin[3], Float:EndOrigin[3]
- Get_Position(iPlayer, 40.0, !get_cvar_num("cl_righthand") ? -6.0 : 6.0, -7.0, StartOrigin)
- fm_get_aim_origin(iPlayer, EndOrigin)
- for(new i = 0; i < 6; i++)
- {
- Create_BeamPoints(StartOrigin, EndOrigin, g_SprTrail, 0, 0, 6 - i, 20, 0, 241, 175, 0, 100 - i * 15, 0)
- }
- }
- //**********************************************
- //* Safety Functions *
- //**********************************************
- public Register_SafetyFunc()
- {
- RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
- RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
- }
- public Register_SafetyFuncBot(iPlayer)
- {
- RegisterHamFromEntity(Ham_Spawn, iPlayer, "fw_Safety_Spawn_Post", 1)
- RegisterHamFromEntity(Ham_Killed, iPlayer, "fw_Safety_Killed_Post", 1)
- }
- public Safety_Connected(iPlayer)
- {
- Set_BitVar(g_IsConnected, iPlayer)
- UnSet_BitVar(g_IsAlive, iPlayer)
- }
- public Safety_Disconnected(iPlayer)
- {
- UnSet_BitVar(g_IsConnected, iPlayer)
- UnSet_BitVar(g_IsAlive, iPlayer)
- }
- public fw_Safety_Spawn_Post(iPlayer)
- {
- if(!is_user_alive(iPlayer))
- return
- Set_BitVar(g_IsAlive, iPlayer)
- }
- public fw_Safety_Killed_Post(iPlayer)
- {
- UnSet_BitVar(g_IsAlive, iPlayer)
- }
- public is_connected(iPlayer)
- {
- if(!(1 <= iPlayer <= 32))
- return 0
- if(!Get_BitVar(g_IsConnected, iPlayer))
- return 0
- return 1
- }
- public is_alive(iPlayer)
- {
- if(!is_connected(iPlayer))
- return 0
- if(!Get_BitVar(g_IsAlive, iPlayer))
- return 0
- return 1
- }
- //**********************************************
- //* Create and check our custom weapon. *
- //**********************************************
- IsCustomItem(iItem)
- {
- return (pev(iItem, pev_impulse) == g_iszWeaponKey)
- }
- Weapon_Create(Float: Origin[3] = {0.0, 0.0, 0.0}, Float: Angles[3] = {0.0, 0.0, 0.0})
- {
- new iWeapon
- static iszAllocStringCached
- if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_BASE)))
- {
- iWeapon = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
- }
- if(!IsValidPev(iWeapon))
- return FM_NULLENT
- dllfunc(DLLFunc_Spawn, iWeapon)
- set_pev(iWeapon, pev_origin, Origin)
- set_pdata_int(iWeapon, 51, WEAPON_MAX_CLIP, 4)
- set_pev(iWeapon, pev_impulse, g_iszWeaponKey)
- set_pev(iWeapon, pev_angles, Angles)
- engfunc(EngFunc_SetModel, iWeapon, w_model)
- return iWeapon
- }
- Weapon_Give(iPlayer)
- {
- if(!IsValidPev(iPlayer))
- {
- return FM_NULLENT
- }
- new iWeapon, Float: vecOrigin[3]
- pev(iPlayer, pev_origin, vecOrigin)
- if((iWeapon = Weapon_Create(vecOrigin)) != FM_NULLENT)
- {
- Player_DropWeapons(iPlayer, ExecuteHamB(Ham_Item_ItemSlot, iWeapon))
- set_pev(iWeapon, pev_spawnflags, pev(iWeapon, pev_spawnflags) | SF_NORESPAWN)
- dllfunc(DLLFunc_Touch, iWeapon, iPlayer)
- SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iWeapon), WEAPON_DEFAULT_AMMO)
- return iWeapon
- }
- return FM_NULLENT
- }
- Player_DropWeapons(iPlayer, iSlot)
- {
- new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, 367 + iSlot, 5)
- while(IsValidPev(iItem))
- {
- pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName))
- engclient_cmd(iPlayer, "drop", szWeaponName)
- iItem = get_pdata_cbase(iItem, 42, 4)
- }
- }
- //**********************************************
- //* Ammo Inventory. *
- //**********************************************
- PrimaryAmmoIndex(iItem)
- {
- return get_pdata_int(iItem, 49, 4)
- }
- GetAmmoInventory(iPlayer, iAmmoIndex)
- {
- if(iAmmoIndex == -1)
- return -1
- return get_pdata_int(iPlayer, 376 + iAmmoIndex, 5)
- }
- SetAmmoInventory(iPlayer, iAmmoIndex, iAmount)
- {
- if(iAmmoIndex == -1)
- return 0
- set_pdata_int(iPlayer, 376 + iAmmoIndex, iAmount, 5)
- return 1
- }
- //**********************************************
- //* Fire Bullets. *
- //**********************************************
- CallOriginalFireBullets(iItem, iPlayer)
- {
- state FireBullets: Enabled
- static Float:g_Recoil[3]
- pev(iPlayer, pev_punchangle, g_Recoil)
- ExecuteHam(Ham_Weapon_PrimaryAttack, iItem)
- set_pev(iPlayer, pev_punchangle, g_Recoil)
- state FireBullets: Disabled
- }
- //**********************************************
- //* Decals. *
- //**********************************************
- new Array: g_hDecals
- public fw_DecalIndex_Post()
- {
- if(!g_hDecals)
- {
- g_hDecals = ArrayCreate(1, 1)
- }
- ArrayPushCell(g_hDecals, get_orig_retval())
- }
- UTIL_GunshotDecalTrace(iTrace, bool: bIsGunshot = false)
- {
- static iHit
- static iMessage
- static iDecalIndex
- static Float:flFraction
- static Float:vecEndPos[3]
- iHit = INSTANCE(get_tr2(iTrace, TR_pHit))
- if(iHit && !IsValidPev(iHit) || (pev(iHit, pev_flags) & FL_KILLME))
- return
- if(pev(iHit, pev_solid) != SOLID_BSP && pev(iHit, pev_movetype) != MOVETYPE_PUSHSTEP)
- return
- iDecalIndex = ExecuteHamB(Ham_DamageDecal, iHit, 0)
- if(iDecalIndex < 0 || iDecalIndex >= ArraySize(g_hDecals))
- return
- iDecalIndex = ArrayGetCell(g_hDecals, iDecalIndex)
- get_tr2(iTrace, TR_flFraction, flFraction)
- get_tr2(iTrace, TR_vecEndPos, vecEndPos)
- if(iDecalIndex < 0 || flFraction >= 1.0)
- return
- if(bIsGunshot)
- {
- iMessage = TE_GUNSHOTDECAL
- }
- else
- {
- iMessage = TE_DECAL
- if(iHit != 0)
- {
- if(iDecalIndex > 255)
- {
- iMessage = TE_DECALHIGH
- iDecalIndex -= 256
- }
- }
- else
- {
- iMessage = TE_WORLDDECAL
- if(iDecalIndex > 255)
- {
- iMessage = TE_WORLDDECALHIGH
- iDecalIndex -= 256
- }
- }
- }
- engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEndPos, 0)
- write_byte(iMessage)
- engfunc(EngFunc_WriteCoord, vecEndPos[0])
- engfunc(EngFunc_WriteCoord, vecEndPos[1])
- engfunc(EngFunc_WriteCoord, vecEndPos[2])
- if(bIsGunshot)
- {
- write_short(iHit)
- write_byte(iDecalIndex)
- }
- else
- {
- write_byte(iDecalIndex)
- if(iHit)
- {
- write_short(iHit)
- }
- }
- message_end()
- }
- //**********************************************
- //* Set Animations. *
- //**********************************************
- stock Weapon_SendAnim(iPlayer, iItem, iAnim)
- {
- static i, iCount, iSpectator, aSpectators[32]
- set_pev(iPlayer, pev_weaponanim, iAnim)
- message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iPlayer)
- write_byte(iAnim)
- write_byte(pev(iItem, pev_body))
- message_end()
- if(IsObserver(iPlayer))
- return
- get_players(aSpectators, iCount, "bch")
- for(i = 0; i < iCount; i++)
- {
- iSpectator = aSpectators[i]
- if(IsObserver(iSpectator) != OBS_IN_EYE || pev(iSpectator, pev_iuser2) != iPlayer)
- continue
- set_pev(iSpectator, pev_weaponanim, iAnim)
- message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iSpectator)
- write_byte(iAnim)
- write_byte(pev(iItem, pev_body))
- message_end()
- }
- }
- stock Player_SetAnimation(iPlayer, szAnim[])
- {
- #define ACT_RANGE_ATTACK1 28
- // Linux extra offsets
- #define extra_offset_animating 4
- #define extra_offset_player 5
- // CBaseAnimating
- #define m_flFrameRate 36
- #define m_flGroundSpeed 37
- #define m_flLastEventCheck 38
- #define m_fSequenceFinished 39
- #define m_fSequenceLoops 40
- // CBaseMonster
- #define m_Activity 73
- #define m_IdealActivity 74
- // CBasePlayer
- #define m_flLastAttackTime 220
- new iAnimDesired, Float:flFrameRate, Float:flGroundSpeed, bool:bLoops
- if((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
- {
- iAnimDesired = 0
- }
- static Float:flGametime; flGametime = get_gametime()
- set_pev(iPlayer, pev_frame, 0.0)
- set_pev(iPlayer, pev_framerate, 1.0)
- set_pev(iPlayer, pev_animtime, flGametime)
- set_pev(iPlayer, pev_sequence, iAnimDesired)
- set_pdata_int(iPlayer, m_fSequenceLoops, bLoops, extra_offset_animating)
- set_pdata_int(iPlayer, m_fSequenceFinished, 0, extra_offset_animating)
- set_pdata_float(iPlayer, m_flFrameRate, flFrameRate, extra_offset_animating)
- set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, extra_offset_animating)
- set_pdata_float(iPlayer, m_flLastEventCheck, flGametime , extra_offset_animating)
- set_pdata_int(iPlayer, m_Activity, ACT_RANGE_ATTACK1, extra_offset_player)
- set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, extra_offset_player)
- set_pdata_float(iPlayer, m_flLastAttackTime, flGametime , extra_offset_player)
- }
- //**********************************************
- //* Kick back. *
- //**********************************************
- Weapon_KickBack(iItem, iPlayer, Float:upBase, Float:lateralBase, Float:upMod, Float:lateralMod, Float:upMax, Float:lateralMax, directionChange)
- {
- static iDirection
- static iShotsFired
- static Float: Punchangle[3]
- pev(iPlayer, pev_punchangle, Punchangle)
- if((iShotsFired = get_pdata_int(iItem, 64, 4)) != 1)
- {
- upBase += iShotsFired * upMod
- lateralBase += iShotsFired * lateralMod
- }
- upMax *= -1.0
- Punchangle[0] -= upBase
- if(upMax >= Punchangle[0])
- {
- Punchangle[0] = upMax
- }
- if((iDirection = get_pdata_int(iItem, 60, 4)))
- {
- Punchangle[1] += lateralBase
- if(lateralMax < Punchangle[1])
- {
- Punchangle[1] = lateralMax
- }
- }
- else
- {
- lateralMax *= -1.0;
- Punchangle[1] -= lateralBase
- if(lateralMax > Punchangle[1])
- {
- Punchangle[1] = lateralMax
- }
- }
- if(!random_num(0, directionChange))
- {
- set_pdata_int(iItem, 60, !iDirection, 4)
- }
- set_pev(iPlayer, pev_punchangle, Punchangle)
- }
- //**********************************************
- //* Brass ejection. *
- //**********************************************
- EjectBrass(iPlayer, iModelIndex, iBounce, Float:flUpScale = -9.0, Float:flForwardScale = 16.0, Float:flRightScale = 0.0)
- {
- static i, msgBrass
- static Float: vecUp[3]
- static Float: vecRight[3]
- static Float: vecForward[3]
- static Float: vecAngle[3]
- static Float: vecOrigin[3]
- static Float: vecViewOfs[3]
- static Float: vecVelocity[3]
- pev(iPlayer, pev_v_angle, vecAngle)
- pev(iPlayer, pev_punchangle, vecOrigin)
- xs_vec_add(vecAngle, vecOrigin, vecOrigin)
- engfunc(EngFunc_MakeVectors, vecOrigin)
- pev(iPlayer, pev_origin, vecOrigin)
- pev(iPlayer, pev_view_ofs, vecViewOfs)
- pev(iPlayer, pev_velocity, vecVelocity)
- global_get(glb_v_up, vecUp)
- global_get(glb_v_right, vecRight)
- global_get(glb_v_forward, vecForward)
- for(i = 0; i < 3; i++)
- {
- vecOrigin[i] = vecOrigin[i] + vecViewOfs[i] + vecForward[i] * flForwardScale + vecUp[i] * flUpScale + vecRight[i] * flRightScale
- vecVelocity[i] = vecVelocity[i] + vecForward[i] * 25.0 + vecUp[i] * random_float(100.0, 150.0) + vecRight[i] * random_float(50.0, 70.0)
- }
- if(msgBrass || (msgBrass = get_user_msgid("Brass")))
- {
- engfunc(EngFunc_MessageBegin, MSG_PVS, msgBrass, vecOrigin, 0)
- write_byte(0 /* dummy */)
- engfunc(EngFunc_WriteCoord, vecOrigin[0])
- engfunc(EngFunc_WriteCoord, vecOrigin[1])
- engfunc(EngFunc_WriteCoord, vecOrigin[2])
- engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
- engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
- engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
- engfunc(EngFunc_WriteCoord, vecVelocity[0])
- engfunc(EngFunc_WriteCoord, vecVelocity[1])
- engfunc(EngFunc_WriteCoord, vecVelocity[2])
- engfunc(EngFunc_WriteAngle, vecAngle[1])
- write_short(iModelIndex)
- write_byte(iBounce)
- write_byte(0 /* dummy */)
- write_byte(iPlayer)
- message_end()
- }
- }
- stock Get_Position(iPlayer, Float:forw, Float:right, Float:up, Float:vStart[])
- {
- new Float:Origin[3], Float:Angles[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
- pev(iPlayer, pev_origin, Origin)
- pev(iPlayer, pev_view_ofs,vUp) //for player
- xs_vec_add(Origin, vUp, Origin)
- pev(iPlayer, pev_v_angle, Angles) // if normal entity ,use pev_angles
- angle_vector(Angles, ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
- angle_vector(Angles, ANGLEVECTOR_RIGHT, vRight)
- angle_vector(Angles, ANGLEVECTOR_UP, vUp)
- vStart[0] = Origin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
- vStart[1] = Origin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
- vStart[2] = Origin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
- }
- stock get_speed_vector(Float:Origin1[3], Float:Origin2[3], Float:Speed, Float:NewVelocity[3])
- {
- NewVelocity[0] = Origin2[0] - Origin1[0]
- NewVelocity[1] = Origin2[1] - Origin1[1]
- NewVelocity[2] = Origin2[2] - Origin1[2]
- new Float:num = floatsqroot(Speed*Speed / (NewVelocity[0]*NewVelocity[0] + NewVelocity[1]*NewVelocity[1] + NewVelocity[2]*NewVelocity[2]))
- NewVelocity[0] *= num
- NewVelocity[1] *= num
- NewVelocity[2] *= num
- return 1
- }
- stock Create_BeamPoints(Float:StartPosition[3], Float:TargetPosition[3], SpritesID, StartFrame, Framerate, Life, LineWidth, Amplitude, Red, Green, Blue, Brightness, Speed)
- {
- message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_BEAMPOINTS)
- engfunc(EngFunc_WriteCoord, StartPosition[0])
- engfunc(EngFunc_WriteCoord, StartPosition[1])
- engfunc(EngFunc_WriteCoord, StartPosition[2])
- engfunc(EngFunc_WriteCoord, TargetPosition[0])
- engfunc(EngFunc_WriteCoord, TargetPosition[1])
- engfunc(EngFunc_WriteCoord, TargetPosition[2])
- write_short(SpritesID)
- write_byte(StartFrame)
- write_byte(Framerate)
- write_byte(Life)
- write_byte(LineWidth)
- write_byte(Amplitude)
- write_byte(Red)
- write_byte(Green)
- write_byte(Blue)
- write_byte(Brightness)
- write_byte(Speed)
- message_end()
- }
If you have any problem, just comment down.
My regards.