Ok I have been experimenting with this lately, I have created a mod that adds in the Displacer Gun from Opposing forces. I was able to play the animations for the weapons when they are firing/reloading/idleing/ect. I also noticed that setting it once won't work. I needed to constantly set it either in server frame or prethink. I used prethink. Here is my code and what I have so far, not many intentions to finish it:
Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#define SEQ_IDLE 0
#define SEQ_CHARGE 2
#define SEQ_FIRE 4
// All the CS Standard knife sounds
new const g_szKnifeSnd[9][] = {
"weapons/knife_deploy1.wav",
"weapons/knife_hit1.wav",
"weapons/knife_hit2.wav",
"weapons/knife_hit3.wav",
"weapons/knife_hit4.wav",
"weapons/knife_hitwall1.wav",
"weapons/knife_slash1.wav",
"weapons/knife_slash2.wav",
"weapons/knife_stab.wav"
}
new g_iSequence[33] // Current sequence your weapon is in
new g_sprGlow, g_sprSmoke // Sprites
public plugin_init()
{
register_plugin("Displacer Cannon", "0.1", "Knekter")
register_event("CurWeapon", "WeaponChange", "be")
register_forward(FM_SetModel, "SetModel")
register_forward(FM_EmitSound, "EmitSound")
}
public plugin_precache()
{
precache_model("models/v_displacer.mdl")
precache_model("models/p_displacer.mdl")
precache_model("models/w_displacer.mdl")
precache_sound("weapons/displacer_spin.wav")
precache_sound("weapons/displacer_fire.wav")
g_sprGlow = precache_model("sprites/glow04.spr")
g_sprSmoke = precache_model("sprites/smoke.spr")
}
public WeaponChange(id)
{
new iWeap = read_data(2)
if(iWeap == 29)
{
entity_set_string(id, EV_SZ_viewmodel, "models/v_displacer.mdl")
entity_set_string(id, EV_SZ_weaponmodel, "models/p_displacer.mdl")
}
}
public EmitSound(entity, channel, const sound[])
{
for(new iSnd = 0; iSnd < 8; iSnd++)
{
if(containi(sound, g_szKnifeSnd[iSnd]) != -1)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
public client_PreThink(id)
{
new iClip, iAmmo
new iWeap = get_user_weapon(id, iClip, iAmmo)
if(iWeap == 29)
{
if(g_iSequence[id] == SEQ_CHARGE)
entity_set_int(id, EV_INT_weaponanim, SEQ_CHARGE)
else if(g_iSequence[id] == SEQ_FIRE)
entity_set_int(id, EV_INT_weaponanim, SEQ_FIRE)
else if(g_iSequence[id] == SEQ_IDLE)
entity_set_int(id, EV_INT_weaponanim, SEQ_IDLE)
if((get_user_button(id) & IN_ATTACK) && !(get_user_oldbutton(id) & IN_ATTACK) && !task_exists(id + 57455))
{
new param[1]
param[0] = id
client_cmd(id, "spk ^"%s^"", "weapons/displacer_spin.wav")
set_task(1.0, "FireDisplacer", id + 57455, param, 1)
g_iSequence[id] = SEQ_CHARGE
}
}
return PLUGIN_CONTINUE
}
public FireDisplacer(param[1])
{
new id = param[0]
g_iSequence[id] = SEQ_FIRE
client_cmd(id, "spk ^"%s^"", "weapons/displacer_fire.wav")
new entity = create_entity("info_target")
if(entity > 0)
{
new Float:Origin[3], Float:Velocity[3], Float:Angle[3]
entity_set_string(entity, EV_SZ_classname, "energy_ball")
entity_get_vector(id, EV_VEC_origin, Origin)
Origin[2] += 12.0
entity_set_origin(entity, Origin)
entity_set_size(entity, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 1.0})
entity_set_int(entity, EV_INT_solid, 2)
entity_set_int(entity, EV_INT_movetype, 5)
entity_set_edict(entity, EV_ENT_owner, id)
velocity_by_aim(id, 500, Velocity)
vector_to_angle(Velocity, Angle)
entity_set_vector(entity, EV_VEC_angles, Angle)
entity_set_vector(entity, EV_VEC_velocity, Velocity)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(22)
write_short(entity)
write_short(g_sprSmoke)
write_byte(10)
write_byte(5)
write_byte(255)
write_byte(156)
write_byte(0)
write_byte(255)
message_end()
new param2[2]
param[0] = id
param2[1] = entity
set_task(0.1, "EnergyEffect", id + 49734, param2, 1, "b")
}
set_task(0.9, "IdleDisplacer", id)
return PLUGIN_CONTINUE
}
public EnergyEffect(param2[1])
{
new entity = param2[0]
if(is_valid_ent(entity))
{
new Float:fOrigin[3], Origin[3]
entity_get_vector(entity, EV_VEC_origin, fOrigin)
FVecIVec(fOrigin, Origin)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(17)
write_coord(Origin[0])
write_coord(Origin[1])
write_coord(Origin[2])
write_short(g_sprGlow)
write_byte(10)
write_byte(150)
message_end()
}
return PLUGIN_CONTINUE
}
public IdleDisplacer(id)
{
g_iSequence[id] = SEQ_IDLE
}
public pfn_touch(ptr, ptd)
{
if(ptr > 0 && ptd >= 0)
{
new pToucher[33]
entity_get_string(ptr, EV_SZ_classname, pToucher, 32)
if(equal(pToucher, "energy_ball"))
{
new Float:fOrigin[3], Origin[3]
entity_get_vector(ptr, EV_VEC_origin, fOrigin)
FVecIVec(fOrigin, Origin)
/*message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(27)
write_coord(Origin[0])
write_coord(Origin[1])
write_coord(Origin[2])
write_byte(200)
write_byte(255)
write_byte(255)
write_byte(255)
write_byte(200)
write_byte(5)
write_byte(10)
message_end()
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(14)
write_coord(Origin[0])
write_coord(Origin[1])
write_coord(Origin[2])
write_byte(100)
write_byte(100)
write_byte(10)
message_end()*/
new param[4]
param[0] = Origin[0]
param[1] = Origin[1]
param[2] = Origin[2]
param[3] = entity_get_edict(ptr, EV_ENT_owner)
remove_task(entity_get_edict(ptr, EV_ENT_owner) + 49734)
set_task(0.8, "DetonateBall", ptr + 75665, param, 4)
remove_entity(ptr)
}
}
return PLUGIN_CONTINUE
}
public DetonateBall(param[4])
{
return PLUGIN_CONTINUE
}
I guess some day I will finish this up/ change the energy ball effect.