From 9fcb19e1dfc3c9535a25591f2ea7b0586a04ac53 Mon Sep 17 00:00:00 2001 From: Mario Date: Sat, 11 Jul 2020 02:05:41 +1000 Subject: [PATCH] Move muzzle flash model handling to the client side --- .../common/mutators/mutator/overkill/okhmg.qc | 5 +- .../mutators/mutator/overkill/okmachinegun.qc | 5 +- .../common/mutators/mutator/overkill/okrpc.qc | 8 +- .../turrets/turret/machinegun_weapon.qc | 4 +- qcsrc/common/weapons/all.qc | 96 ++++++++++++++++++- qcsrc/common/weapons/all.qh | 4 +- qcsrc/common/weapons/weapon/arc.qc | 2 +- qcsrc/common/weapons/weapon/blaster.qc | 2 +- qcsrc/common/weapons/weapon/crylink.qc | 4 +- qcsrc/common/weapons/weapon/devastator.qc | 10 +- qcsrc/common/weapons/weapon/electro.qc | 4 +- qcsrc/common/weapons/weapon/fireball.qc | 6 +- qcsrc/common/weapons/weapon/hagar.qc | 6 +- qcsrc/common/weapons/weapon/hlac.qc | 4 +- qcsrc/common/weapons/weapon/machinegun.qc | 52 +--------- qcsrc/common/weapons/weapon/minelayer.qc | 15 +-- qcsrc/common/weapons/weapon/mortar.qc | 4 +- qcsrc/common/weapons/weapon/rifle.qc | 2 +- qcsrc/common/weapons/weapon/seeker.qc | 4 +- qcsrc/common/weapons/weapon/shotgun.qc | 11 +-- qcsrc/common/weapons/weapon/vaporizer.qc | 6 +- qcsrc/common/weapons/weapon/vortex.qc | 2 +- qcsrc/server/defs.qh | 1 - qcsrc/server/g_hook.qc | 2 +- 24 files changed, 133 insertions(+), 126 deletions(-) diff --git a/qcsrc/common/mutators/mutator/overkill/okhmg.qc b/qcsrc/common/mutators/mutator/overkill/okhmg.qc index 818b33359..2f8a651c4 100644 --- a/qcsrc/common/mutators/mutator/overkill/okhmg.qc +++ b/qcsrc/common/mutators/mutator/overkill/okhmg.qc @@ -40,10 +40,7 @@ void W_OverkillHeavyMachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1; - W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); - - W_MachineGun_MuzzleFlash(actor, weaponentity); - W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0'); + W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, MDL_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); if (autocvar_g_casings >= 2) // casing code { diff --git a/qcsrc/common/mutators/mutator/overkill/okmachinegun.qc b/qcsrc/common/mutators/mutator/overkill/okmachinegun.qc index f689e4aa0..a1add71a8 100644 --- a/qcsrc/common/mutators/mutator/overkill/okmachinegun.qc +++ b/qcsrc/common/mutators/mutator/overkill/okmachinegun.qc @@ -34,10 +34,7 @@ void W_OverkillMachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weap actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1; - W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); - - W_MachineGun_MuzzleFlash(actor, weaponentity); - W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0'); + W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, MDL_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); if(autocvar_g_casings >= 2) // casing code { diff --git a/qcsrc/common/mutators/mutator/overkill/okrpc.qc b/qcsrc/common/mutators/mutator/overkill/okrpc.qc index db2803cee..57d5947ae 100644 --- a/qcsrc/common/mutators/mutator/overkill/okrpc.qc +++ b/qcsrc/common/mutators/mutator/overkill/okrpc.qc @@ -87,11 +87,10 @@ void W_OverkillRocketPropelledChainsaw_Think(entity this) void W_OverkillRocketPropelledChainsaw_Attack(Weapon thiswep, entity actor, .entity weaponentity) { entity missile = spawn(); //WarpZone_RefSys_SpawnSameRefSys(actor); - entity flash = spawn (); W_DecreaseAmmo(thiswep, actor, WEP_CVAR_PRI(okrpc, ammo), weaponentity); W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 5, SND_ROCKET_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(okrpc, damage), thiswep.m_id); - W_MuzzleFlash(actor, weaponentity, EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_ROCKET_MUZZLEFLASH, MDL_RPC_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); PROJECTILE_MAKETRIGGER(missile); missile.owner = missile.realowner = actor; @@ -124,11 +123,6 @@ void W_OverkillRocketPropelledChainsaw_Attack(Weapon thiswep, entity actor, .ent CSQCProjectile(missile, true, PROJECTILE_RPC, false); - // TODO: move to client - setmodel(flash, MDL_RPC_MUZZLEFLASH); // precision set below - SUB_SetFade (flash, time, 0.1); - flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - W_AttachToShotorg(actor, weaponentity, flash, '5 0 0'); missile.m_chainsaw_damage = 0; MUTATOR_CALLHOOK(EditProjectile, actor, missile); diff --git a/qcsrc/common/turrets/turret/machinegun_weapon.qc b/qcsrc/common/turrets/turret/machinegun_weapon.qc index a56e7de38..38a74c8e9 100644 --- a/qcsrc/common/turrets/turret/machinegun_weapon.qc +++ b/qcsrc/common/turrets/turret/machinegun_weapon.qc @@ -2,7 +2,7 @@ #ifdef SVQC -void W_MachineGun_MuzzleFlash(entity actor, .entity weaponentity); +void W_MuzzleFlash_Model(entity wepent, entity muzzlemodel); SOUND(MachineGunTurretAttack_FIRE, W_Sound("electro_fire")); METHOD(MachineGunTurretAttack, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { @@ -18,7 +18,7 @@ METHOD(MachineGunTurretAttack, wr_think, void(entity thiswep, entity actor, .ent weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, 0, w_ready); } fireBullet(actor, weaponentity, actor.tur_shotorg, actor.tur_shotdir_updated, actor.shot_spread, 0, actor.shot_dmg, actor.shot_force, DEATH_TURRET_MACHINEGUN.m_id, EFFECT_BULLET); - W_MachineGun_MuzzleFlash(actor, weaponentity); + W_MuzzleFlash_Model(actor.(weaponentity), MDL_MACHINEGUN_MUZZLEFLASH); setattachment(actor.(weaponentity).muzzle_flash, actor.tur_head, "tag_fire"); } } diff --git a/qcsrc/common/weapons/all.qc b/qcsrc/common/weapons/all.qc index abc4bab55..ad0e0cae3 100644 --- a/qcsrc/common/weapons/all.qc +++ b/qcsrc/common/weapons/all.qc @@ -673,12 +673,93 @@ CLIENT_COMMAND(weapon_find, "Show spawn locations of a weapon") } #endif +#ifdef SVQC +void W_MuzzleFlash_Model_AttachToShotorg(entity actor, .entity weaponentity, entity flash, vector offset) +{ + flash.owner = actor; + flash.angles_z = random() * 360; + + entity view = actor.(weaponentity); + entity exterior = actor.exteriorweaponentity; + + if (view.oldorigin.x > 0) + { + setattachment(flash, exterior, ""); + setorigin(flash, view.oldorigin + offset); + } + else + { + if (gettagindex(exterior, "shot")) setattachment(flash, exterior, "shot"); + else setattachment(flash, exterior, "tag_shot"); + setorigin(flash, offset); + } +} +#elif defined(CSQC) +void W_MuzzleFlash_Model_AttachToShotorg(entity wepent, entity flash, vector offset) +{ + flash.owner = wepent; + flash.angles_z = random() * 360; + + if (gettagindex(wepent, "shot")) setattachment(flash, wepent, "shot"); + else setattachment(flash, wepent, "tag_shot"); + setorigin(flash, offset); +} +#endif + +void W_MuzzleFlash_Model_Think(entity this) +{ + this.frame += 2; + this.scale *= 0.5; + this.alpha -= 0.25; + this.nextthink = time + 0.05; + + if(this.alpha <= 0) + { + setthink(this, SUB_Remove); + this.nextthink = time; + this.realowner.muzzle_flash = NULL; + return; + } +} + +void W_MuzzleFlash_Model(entity wepent, entity muzzlemodel) +{ + if(wepent.muzzle_flash == NULL) + wepent.muzzle_flash = spawn(); + + entity flash = wepent.muzzle_flash; + setmodel(flash, muzzlemodel); // precision set below + + flash.scale = 0.75; + setthink(flash, W_MuzzleFlash_Model_Think); + flash.nextthink = time + 0.02; + flash.frame = 2; + flash.alpha = 0.75; + flash.angles_z = random() * 180; + flash.effects = EF_ADDITIVE | EF_FULLBRIGHT; + flash.owner = flash.realowner = wepent; + +#ifdef CSQC + flash.drawmask = MASK_NORMAL; +#endif +} + REGISTER_NET_TEMP(w_muzzleflash) #ifdef SVQC -void W_MuzzleFlash(entity actor, .entity weaponentity, entity eff, vector shotorg, vector shotdir) +void W_MuzzleFlash(entity actor, .entity weaponentity, entity eff, entity muzzlemodel, vector shotorg, vector shotdir) { - Send_Effect_Except(eff, shotorg, shotdir * 1000, 1, actor); + // don't show an exterior muzzle effect for the off-hand + if(weaponslot(weaponentity) == 0) + { + Send_Effect_Except(eff, shotorg, shotdir * 1000, 1, actor); + + if(muzzlemodel != MDL_Null) + { + W_MuzzleFlash_Model(actor.exteriorweaponentity, muzzlemodel); + W_MuzzleFlash_Model_AttachToShotorg(actor, weaponentity, actor.exteriorweaponentity.muzzle_flash, '5 0 0'); + } + } FOREACH_CLIENT(it == actor || (IS_SPEC(it) && it.enemy == actor), { @@ -691,6 +772,9 @@ void W_MuzzleFlash(entity actor, .entity weaponentity, entity eff, vector shotor (Effects_COUNT >= 255) ? WriteShort(channel, eff.m_id) : WriteByte(channel, eff.m_id); + (Models_COUNT >= 255) + ? WriteShort(channel, muzzlemodel.m_id) + : WriteByte(channel, muzzlemodel.m_id); WriteVector(channel, shotorg); }); } @@ -700,6 +784,7 @@ NET_HANDLE(w_muzzleflash, bool isNew) return = true; int slot = ReadByte(); int net_name = (Effects_COUNT >= 255) ? ReadShort() : ReadByte(); + int net_modelname = (Models_COUNT >= 255) ? ReadShort() : ReadByte(); vector sv_shotorg = ReadVector(); entity eff = Effects_from(net_name); @@ -716,6 +801,7 @@ NET_HANDLE(w_muzzleflash, bool isNew) } if(!autocvar_r_drawviewmodel) return; + entity muzzlemodel = Models_from(net_modelname); entity wepent = viewmodels[slot]; // get the local player entity to calculate shot origin entity rlplayer = CSQCModel_server2csqc(player_localentnum - 1); @@ -730,6 +816,12 @@ NET_HANDLE(w_muzzleflash, bool isNew) org = trace_endpos - forward * 1; pointparticles(eff, org, forward * 1000, 1); + + if(muzzlemodel != MDL_Null) + { + W_MuzzleFlash_Model(wepent, muzzlemodel); + W_MuzzleFlash_Model_AttachToShotorg(wepent, wepent.muzzle_flash, '5 0 0'); + } } #endif diff --git a/qcsrc/common/weapons/all.qh b/qcsrc/common/weapons/all.qh index 14134e5e2..bc6ff5cb7 100644 --- a/qcsrc/common/weapons/all.qh +++ b/qcsrc/common/weapons/all.qh @@ -364,6 +364,8 @@ vector weaponentity_glowmod(Weapon wep, entity actor, int c, entity wepent) .vector anim_idle; .vector anim_reload; +.entity muzzle_flash; + // static frame globals ENUMCLASS(WFRAME) @@ -398,6 +400,6 @@ void wframe_send(entity actor, entity weaponentity, int wepframe, float attackra #endif #ifdef SVQC -void W_MuzzleFlash(entity actor, .entity weaponentity, entity eff, vector shotorg, vector shotdir); +void W_MuzzleFlash(entity actor, .entity weaponentity, entity eff, entity muzzlemodel, vector shotorg, vector shotdir); #endif #endif diff --git a/qcsrc/common/weapons/weapon/arc.qc b/qcsrc/common/weapons/weapon/arc.qc index 1090ce81d..986d016b1 100644 --- a/qcsrc/common/weapons/weapon/arc.qc +++ b/qcsrc/common/weapons/weapon/arc.qc @@ -131,7 +131,7 @@ void W_Arc_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity) W_SetupShot(actor, weaponentity, false, 2, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR(arc, bolt_damage), WEP_ARC.m_id | HITTYPE_SECONDARY); - W_MuzzleFlash(actor, weaponentity, EFFECT_ARC_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_ARC_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); missile = new(missile); missile.owner = missile.realowner = actor; diff --git a/qcsrc/common/weapons/weapon/blaster.qc b/qcsrc/common/weapons/weapon/blaster.qc index 350268efc..00919e68f 100644 --- a/qcsrc/common/weapons/weapon/blaster.qc +++ b/qcsrc/common/weapons/weapon/blaster.qc @@ -55,7 +55,7 @@ void W_Blaster_Attack( vector s_forward = v_forward * cos(atk_shotangle * DEG2RAD) + v_up * sin(atk_shotangle * DEG2RAD); W_SetupShot_Dir(actor, weaponentity, s_forward, false, 3, SND_LASERGUN_FIRE, CH_WEAPON_B, atk_damage, atk_deathtype); - W_MuzzleFlash(actor, weaponentity, EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_BLASTER_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); entity missile = new(blasterbolt); missile.owner = missile.realowner = actor; diff --git a/qcsrc/common/weapons/weapon/crylink.qc b/qcsrc/common/weapons/weapon/crylink.qc index 680d961ca..bfb9499f4 100644 --- a/qcsrc/common/weapons/weapon/crylink.qc +++ b/qcsrc/common/weapons/weapon/crylink.qc @@ -307,7 +307,7 @@ void W_Crylink_Attack(Weapon thiswep, entity actor, .entity weaponentity) up = v_up; shots = WEP_CVAR_PRI(crylink, shots); - W_MuzzleFlash(actor, weaponentity, EFFECT_CRYLINK_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_CRYLINK_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); proj = prevproj = firstproj = NULL; for(counter = 0; counter < shots; ++counter) { @@ -420,7 +420,7 @@ void W_Crylink_Attack2(Weapon thiswep, entity actor, .entity weaponentity) up = v_up; shots = WEP_CVAR_SEC(crylink, shots); - W_MuzzleFlash(actor, weaponentity, EFFECT_CRYLINK_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_CRYLINK_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); proj = prevproj = firstproj = NULL; for(counter = 0; counter < shots; ++counter) { diff --git a/qcsrc/common/weapons/weapon/devastator.qc b/qcsrc/common/weapons/weapon/devastator.qc index 4a622275b..5a1d56e39 100644 --- a/qcsrc/common/weapons/weapon/devastator.qc +++ b/qcsrc/common/weapons/weapon/devastator.qc @@ -308,7 +308,7 @@ void W_Devastator_Attack(Weapon thiswep, entity actor, .entity weaponentity, int W_DecreaseAmmo(thiswep, actor, WEP_CVAR(devastator, ammo), weaponentity); W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 5, SND_ROCKET_FIRE, CH_WEAPON_A, WEP_CVAR(devastator, damage), thiswep.m_id); - W_MuzzleFlash(actor, weaponentity, EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_ROCKET_MUZZLEFLASH, MDL_DEVASTATOR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); entity missile = WarpZone_RefSys_SpawnSameRefSys(actor); missile.weaponentity_fld = weaponentity; @@ -351,14 +351,6 @@ void W_Devastator_Attack(Weapon thiswep, entity actor, .entity weaponentity, int CSQCProjectile(missile, WEP_CVAR(devastator, guiderate) == 0 && WEP_CVAR(devastator, speedaccel) == 0, PROJECTILE_ROCKET, false); // because of fly sound - // muzzle flash for 1st person view - // TODO: handle on the client side - entity flash = spawn(); - setmodel(flash, MDL_DEVASTATOR_MUZZLEFLASH); // precision set below - SUB_SetFade(flash, time, 0.1); - flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - W_AttachToShotorg(actor, weaponentity, flash, '5 0 0'); - // common properties MUTATOR_CALLHOOK(EditProjectile, actor, missile); diff --git a/qcsrc/common/weapons/weapon/electro.qc b/qcsrc/common/weapons/weapon/electro.qc index f2bcc6013..369267ad1 100644 --- a/qcsrc/common/weapons/weapon/electro.qc +++ b/qcsrc/common/weapons/weapon/electro.qc @@ -227,7 +227,7 @@ void W_Electro_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity) thiswep.m_id ); - W_MuzzleFlash(actor, weaponentity, EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_ELECTRO_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); proj = new(electro_bolt); proj.owner = proj.realowner = actor; @@ -378,7 +378,7 @@ void W_Electro_Attack_Orb(Weapon thiswep, entity actor, .entity weaponentity) w_shotdir = v_forward; // no TrueAim for grenades please - W_MuzzleFlash(actor, weaponentity, EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_ELECTRO_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); entity proj = new(electro_orb); proj.owner = proj.realowner = actor; diff --git a/qcsrc/common/weapons/weapon/fireball.qc b/qcsrc/common/weapons/weapon/fireball.qc index 3e36d7e69..d658c8b80 100644 --- a/qcsrc/common/weapons/weapon/fireball.qc +++ b/qcsrc/common/weapons/weapon/fireball.qc @@ -137,7 +137,7 @@ void W_Fireball_Attack1(entity actor, .entity weaponentity) { W_SetupShot_ProjectileSize(actor, weaponentity, '-16 -16 -16', '16 16 16', false, 2, SND_FIREBALL_FIRE2, CH_WEAPON_A, WEP_CVAR_PRI(fireball, damage) + WEP_CVAR_PRI(fireball, bfgdamage), WEP_FIREBALL.m_id); - W_MuzzleFlash(actor, weaponentity, EFFECT_FIREBALL_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_FIREBALL_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); entity proj = new(plasma_prim); proj.owner = proj.realowner = actor; @@ -176,7 +176,7 @@ void W_Fireball_AttackEffect(entity actor, .entity weaponentity, float i, vector { W_SetupShot_ProjectileSize(actor, weaponentity, '-16 -16 -16', '16 16 16', false, 0, SND_Null, 0, 0, WEP_FIREBALL.m_id); // TODO: probably doesn't need deathtype, just a prefire effect w_shotorg += f_diff.x * v_up + f_diff.y * v_right; - W_MuzzleFlash(actor, weaponentity, EFFECT_FIREBALL_PRE_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_FIREBALL_PRE_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); } void W_Fireball_Attack1_Frame4(Weapon thiswep, entity actor, .entity weaponentity, int fire) @@ -275,7 +275,7 @@ void W_Fireball_Attack2(entity actor, .entity weaponentity) traceline(w_shotorg, w_shotorg + f_diff_x * v_up + f_diff_y * v_right, MOVE_NORMAL, actor); w_shotorg = trace_endpos; - W_MuzzleFlash(actor, weaponentity, EFFECT_FIREBALL_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_FIREBALL_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); proj = new(grenade); proj.owner = proj.realowner = actor; diff --git a/qcsrc/common/weapons/weapon/hagar.qc b/qcsrc/common/weapons/weapon/hagar.qc index 260f3425f..2f7c9912c 100644 --- a/qcsrc/common/weapons/weapon/hagar.qc +++ b/qcsrc/common/weapons/weapon/hagar.qc @@ -83,7 +83,7 @@ void W_Hagar_Attack(Weapon thiswep, entity actor, .entity weaponentity) W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(hagar, damage), thiswep.m_id); - W_MuzzleFlash(actor, weaponentity, EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_HAGAR_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); missile = new(missile); missile.owner = missile.realowner = actor; @@ -129,7 +129,7 @@ void W_Hagar_Attack2(Weapon thiswep, entity actor, .entity weaponentity) W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage), thiswep.m_id | HITTYPE_SECONDARY); - W_MuzzleFlash(actor, weaponentity, EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_HAGAR_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); missile = new(missile); missile.owner = missile.realowner = actor; @@ -185,7 +185,7 @@ void W_Hagar_Attack2_Load_Release(Weapon thiswep, entity actor, .entity weaponen shots = actor.(weaponentity).hagar_load; W_SetupShot(actor, weaponentity, false, 2, SND_HAGAR_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hagar, damage) * shots, thiswep.m_id | HITTYPE_SECONDARY); - W_MuzzleFlash(actor, weaponentity, EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_HAGAR_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); forward = v_forward; right = v_right; diff --git a/qcsrc/common/weapons/weapon/hlac.qc b/qcsrc/common/weapons/weapon/hlac.qc index 71c2c7320..949b17602 100644 --- a/qcsrc/common/weapons/weapon/hlac.qc +++ b/qcsrc/common/weapons/weapon/hlac.qc @@ -31,7 +31,7 @@ void W_HLAC_Attack(Weapon thiswep, entity actor, .entity weaponentity) spread = spread * WEP_CVAR_PRI(hlac, spread_crouchmod); W_SetupShot(actor, weaponentity, false, 3, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(hlac, damage), thiswep.m_id); - W_MuzzleFlash(actor, weaponentity, EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_BLASTER_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); if(!autocvar_g_norecoil) { actor.punchangle_x = random() - 0.5; @@ -81,7 +81,7 @@ void W_HLAC_Attack2(Weapon thiswep, entity actor, .entity weaponentity) spread = spread * WEP_CVAR_SEC(hlac, spread_crouchmod); W_SetupShot(actor, weaponentity, false, 3, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hlac, damage), thiswep.m_id | HITTYPE_SECONDARY); - W_MuzzleFlash(actor, weaponentity, EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_BLASTER_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); missile = new(hlacbolt); missile.owner = missile.realowner = actor; diff --git a/qcsrc/common/weapons/weapon/machinegun.qc b/qcsrc/common/weapons/weapon/machinegun.qc index 94128ea44..8e203d41c 100644 --- a/qcsrc/common/weapons/weapon/machinegun.qc +++ b/qcsrc/common/weapons/weapon/machinegun.qc @@ -2,43 +2,6 @@ #ifdef SVQC -void W_MachineGun_MuzzleFlash_Think(entity this) -{ - this.frame += 2; - this.scale *= 0.5; - this.alpha -= 0.25; - this.nextthink = time + 0.05; - - if(this.alpha <= 0) - { - setthink(this, SUB_Remove); - this.nextthink = time; - this.realowner.muzzle_flash = NULL; - return; - } - -} - -void W_MachineGun_MuzzleFlash(entity actor, .entity weaponentity) -{ - entity wepent = actor.(weaponentity); - - if(wepent.muzzle_flash == NULL) - wepent.muzzle_flash = spawn(); - - // muzzle flash for 1st person view - setmodel(wepent.muzzle_flash, MDL_MACHINEGUN_MUZZLEFLASH); // precision set below - - wepent.muzzle_flash.scale = 0.75; - setthink(wepent.muzzle_flash, W_MachineGun_MuzzleFlash_Think); - wepent.muzzle_flash.nextthink = time + 0.02; - wepent.muzzle_flash.frame = 2; - wepent.muzzle_flash.alpha = 0.75; - wepent.muzzle_flash.angles_z = random() * 180; - wepent.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - wepent.muzzle_flash.owner = wepent.muzzle_flash.realowner = wepent; -} - void W_MachineGun_Attack(Weapon thiswep, int deathtype, entity actor, .entity weaponentity) { W_SetupShot(actor, weaponentity, true, 0, SND_UZI_FIRE, CH_WEAPON_A, ((actor.(weaponentity).misc_bulletcounter == 1) ? WEP_CVAR(machinegun, first_damage) : WEP_CVAR(machinegun, sustained_damage)), deathtype); @@ -55,10 +18,7 @@ void W_MachineGun_Attack(Weapon thiswep, int deathtype, entity actor, .entity we else fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, sustained_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), WEP_CVAR(machinegun, sustained_force), deathtype, EFFECT_BULLET); - W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); - - W_MachineGun_MuzzleFlash(actor, weaponentity); - W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0'); + W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, MDL_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); // casing code if(autocvar_g_casings >= 2) @@ -131,10 +91,7 @@ void W_MachineGun_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1; - W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); - - W_MachineGun_MuzzleFlash(actor, weaponentity); - W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0'); + W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, MDL_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); if(autocvar_g_casings >= 2) // casing code { @@ -157,10 +114,7 @@ void W_MachineGun_Attack_Burst(Weapon thiswep, entity actor, .entity weaponentit fireBullet(actor, weaponentity, w_shotorg, w_shotdir, WEP_CVAR(machinegun, burst_spread), WEP_CVAR(machinegun, solidpenetration), WEP_CVAR(machinegun, sustained_damage), WEP_CVAR(machinegun, sustained_force), thiswep.m_id, EFFECT_BULLET); - W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); - - W_MachineGun_MuzzleFlash(actor, weaponentity); - W_AttachToShotorg(actor, weaponentity, actor.(weaponentity).muzzle_flash, '5 0 0'); + W_MuzzleFlash(actor, weaponentity, EFFECT_MACHINEGUN_MUZZLEFLASH, MDL_MACHINEGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); if(autocvar_g_casings >= 2) // casing code { diff --git a/qcsrc/common/weapons/weapon/minelayer.qc b/qcsrc/common/weapons/weapon/minelayer.qc index 9c13df3c6..bf676e0ec 100644 --- a/qcsrc/common/weapons/weapon/minelayer.qc +++ b/qcsrc/common/weapons/weapon/minelayer.qc @@ -254,9 +254,6 @@ void W_MineLayer_Damage(entity this, entity inflictor, entity attacker, float da void W_MineLayer_Attack(Weapon thiswep, entity actor, .entity weaponentity) { - entity mine; - entity flash; - // scan how many mines we placed, and return if we reached our limit if(WEP_CVAR(minelayer, limit)) { @@ -273,9 +270,9 @@ void W_MineLayer_Attack(Weapon thiswep, entity actor, .entity weaponentity) W_DecreaseAmmo(thiswep, actor, WEP_CVAR(minelayer, ammo), weaponentity); W_SetupShot_ProjectileSize(actor, weaponentity, '-4 -4 -4', '4 4 4', false, 5, SND_MINE_FIRE, CH_WEAPON_A, WEP_CVAR(minelayer, damage), thiswep.m_id); - W_MuzzleFlash(actor, weaponentity, EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_ROCKET_MUZZLEFLASH, MDL_MINELAYER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); - mine = WarpZone_RefSys_SpawnSameRefSys(actor); + entity mine = WarpZone_RefSys_SpawnSameRefSys(actor); mine.weaponentity_fld = weaponentity; IL_PUSH(g_mines, mine); mine.owner = mine.realowner = actor; @@ -317,14 +314,6 @@ void W_MineLayer_Attack(Weapon thiswep, entity actor, .entity weaponentity) CSQCProjectile(mine, true, PROJECTILE_MINE, true); - // muzzle flash for 1st person view - // TODO: handle on the client - flash = spawn(); - setmodel(flash, MDL_MINELAYER_MUZZLEFLASH); // precision set below - SUB_SetFade(flash, time, 0.1); - flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - W_AttachToShotorg(actor, weaponentity, flash, '5 0 0'); - // common properties MUTATOR_CALLHOOK(EditProjectile, actor, mine); diff --git a/qcsrc/common/weapons/weapon/mortar.qc b/qcsrc/common/weapons/weapon/mortar.qc index 089075ee2..0db041412 100644 --- a/qcsrc/common/weapons/weapon/mortar.qc +++ b/qcsrc/common/weapons/weapon/mortar.qc @@ -154,7 +154,7 @@ void W_Mortar_Attack(Weapon thiswep, entity actor, .entity weaponentity) W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 4, SND_GRENADE_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(mortar, damage), thiswep.m_id); w_shotdir = v_forward; // no TrueAim for grenades please - W_MuzzleFlash(actor, weaponentity, EFFECT_GRENADE_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_GRENADE_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); entity gren = new(grenade); gren.owner = gren.realowner = actor; @@ -206,7 +206,7 @@ void W_Mortar_Attack2(Weapon thiswep, entity actor, .entity weaponentity) W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 4, SND_GRENADE_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(mortar, damage), thiswep.m_id | HITTYPE_SECONDARY); w_shotdir = v_forward; // no TrueAim for grenades please - W_MuzzleFlash(actor, weaponentity, EFFECT_GRENADE_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_GRENADE_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); gren = new(grenade); gren.owner = gren.realowner = actor; diff --git a/qcsrc/common/weapons/weapon/rifle.qc b/qcsrc/common/weapons/weapon/rifle.qc index f5c8b7f00..273d820c3 100644 --- a/qcsrc/common/weapons/weapon/rifle.qc +++ b/qcsrc/common/weapons/weapon/rifle.qc @@ -10,7 +10,7 @@ void W_Rifle_FireBullet(Weapon thiswep, .entity weaponentity, float pSpread, flo W_SetupShot(actor, weaponentity, true, 2, pSound, CH_WEAPON_A, pDamage * pShots, deathtype); - W_MuzzleFlash(actor, weaponentity, EFFECT_RIFLE_MUZZLEFLASH, w_shotorg, w_shotdir * 2000); + W_MuzzleFlash(actor, weaponentity, EFFECT_RIFLE_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 2000); if(PHYS_INPUT_BUTTON_ZOOM(actor) | PHYS_INPUT_BUTTON_ZOOMSCRIPT(actor)) // if zoomed, shoot from the eye { diff --git a/qcsrc/common/weapons/weapon/seeker.qc b/qcsrc/common/weapons/weapon/seeker.qc index a82762fa4..de50dd771 100644 --- a/qcsrc/common/weapons/weapon/seeker.qc +++ b/qcsrc/common/weapons/weapon/seeker.qc @@ -171,7 +171,7 @@ void W_Seeker_Fire_Missile(Weapon thiswep, entity actor, .entity weaponentity, v makevectors(actor.v_angle); W_SetupShot_ProjectileSize(actor, weaponentity, '-2 -2 -2', '2 2 2', false, 2, SND_SEEKER_FIRE, CH_WEAPON_A, 0, ((m_target != NULL) ? thiswep.m_id | HITTYPE_SECONDARY : thiswep.m_id)); w_shotorg += f_diff; - W_MuzzleFlash(actor, weaponentity, EFFECT_SEEKER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_SEEKER_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); //actor.detornator = false; @@ -269,7 +269,7 @@ void W_Seeker_Fire_Flac(Weapon thiswep, entity actor, .entity weaponentity) W_SetupShot_ProjectileSize(actor, weaponentity, '-2 -2 -2', '2 2 2', false, 2, SND_FLAC_FIRE, CH_WEAPON_A, WEP_CVAR(seeker, flac_damage), thiswep.m_id | HITTYPE_SECONDARY); w_shotorg += f_diff; - W_MuzzleFlash(actor, weaponentity, EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_HAGAR_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); missile = new(missile); missile.owner = missile.realowner = actor; diff --git a/qcsrc/common/weapons/weapon/shotgun.qc b/qcsrc/common/weapons/weapon/shotgun.qc index 0fdb620b2..30643a8aa 100644 --- a/qcsrc/common/weapons/weapon/shotgun.qc +++ b/qcsrc/common/weapons/weapon/shotgun.qc @@ -31,7 +31,7 @@ void W_Shotgun_Attack(Weapon thiswep, entity actor, .entity weaponentity, float if(lag && bullets > 0) antilag_restore_all(actor); - W_MuzzleFlash(actor, weaponentity, EFFECT_SHOTGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_SHOTGUN_MUZZLEFLASH, MDL_SHOTGUN_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); // casing code if(autocvar_g_casings >= 1) @@ -40,15 +40,6 @@ void W_Shotgun_Attack(Weapon thiswep, entity actor, .entity weaponentity, float //for(int sc = 0;sc < WEP_CVAR_PRI(shotgun, ammo);sc = sc + 1) SpawnCasing(((random() * 50 + 50) * v_right) - (v_forward * (random() * 25 + 25)) - ((random() * 5 - 30) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 1, actor, weaponentity); } - - // muzzle flash for 1st person view - // TODO: handle on the client - entity flash = spawn(); - setmodel(flash, MDL_SHOTGUN_MUZZLEFLASH); // precision set below - setthink(flash, SUB_Remove); - flash.nextthink = time + 0.06; - flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - W_AttachToShotorg(actor, weaponentity, flash, '5 0 0'); } .float swing_prev; diff --git a/qcsrc/common/weapons/weapon/vaporizer.qc b/qcsrc/common/weapons/weapon/vaporizer.qc index 15b50f8ca..171f922cf 100644 --- a/qcsrc/common/weapons/weapon/vaporizer.qc +++ b/qcsrc/common/weapons/weapon/vaporizer.qc @@ -127,7 +127,7 @@ void W_Vaporizer_Attack(Weapon thiswep, entity actor, .entity weaponentity) FireRailgunBullet(actor, weaponentity, w_shotorg, w_shotorg + w_shotdir * max_shot_distance, vaporizer_damage, WEP_CVAR_PRI(vaporizer, force), 0, 0, 0, 0, thiswep.m_id); // do this now, as goodhits is disabled below - W_MuzzleFlash(actor, weaponentity, EFFECT_VORTEX_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_VORTEX_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); SendCSQCVaporizerBeamParticle(actor, damage_goodhits); if(yoda && flying) @@ -187,7 +187,7 @@ void W_RocketMinsta_Attack2(entity actor, .entity weaponentity) W_SetupShot_ProjectileSize (actor, weaponentity, '0 0 -3', '0 0 -3', false, 2, SND_CRYLINK_FIRE, CH_WEAPON_A, autocvar_g_rm_laser_damage, WEP_ELECTRO.m_id); - W_MuzzleFlash(actor, weaponentity, EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_ELECTRO_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); while(counter < total) { @@ -239,7 +239,7 @@ void W_RocketMinsta_Attack3 (entity actor, .entity weaponentity) W_SetupShot_ProjectileSize (actor, weaponentity, '0 0 -3', '0 0 -3', false, 2, SND_ELECTRO_FIRE2, CH_WEAPON_A, autocvar_g_rm_laser_damage, WEP_ELECTRO.m_id); - W_MuzzleFlash(actor, weaponentity, EFFECT_ELECTRO_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_ELECTRO_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); while(counter < total) { diff --git a/qcsrc/common/weapons/weapon/vortex.qc b/qcsrc/common/weapons/weapon/vortex.qc index 12fb5bde2..4e10a5839 100644 --- a/qcsrc/common/weapons/weapon/vortex.qc +++ b/qcsrc/common/weapons/weapon/vortex.qc @@ -152,7 +152,7 @@ void W_Vortex_Attack(Weapon thiswep, entity actor, .entity weaponentity, float i actor.vortex_lasthit = damage_goodhits; //beam and muzzle flash done on client - W_MuzzleFlash(actor, weaponentity, EFFECT_VORTEX_MUZZLEFLASH, w_shotorg, w_shotdir * 1000); + W_MuzzleFlash(actor, weaponentity, EFFECT_VORTEX_MUZZLEFLASH, MDL_Null, w_shotorg, w_shotdir * 1000); SendCSQCVortexBeamParticle(charge); W_DecreaseAmmo(thiswep, actor, myammo, weaponentity); diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index e12970a9c..1e50f3edb 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -357,7 +357,6 @@ const int ACTIVE_TOGGLE = 3; .entity iceblock; .entity frozen_by; // for ice fields -.entity muzzle_flash; .float misc_bulletcounter; // replaces uzi & hlac bullet counter. void PlayerUseKey(entity this); diff --git a/qcsrc/server/g_hook.qc b/qcsrc/server/g_hook.qc index 72d146741..48d02d57b 100644 --- a/qcsrc/server/g_hook.qc +++ b/qcsrc/server/g_hook.qc @@ -364,7 +364,7 @@ void FireGrapplingHook(entity actor, .entity weaponentity) vector oldmovedir = actor.(weaponentity).movedir; actor.(weaponentity).movedir = vs; W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', true, 0, SND_HOOK_FIRE, CH_WEAPON_B, 0, WEP_HOOK.m_id); - W_MuzzleFlash(actor, weaponentity, EFFECT_HOOK_MUZZLEFLASH, w_shotorg, '0 0 0'); + W_MuzzleFlash(actor, weaponentity, EFFECT_HOOK_MUZZLEFLASH, MDL_Null, w_shotorg, '0 0 0'); actor.(weaponentity).movedir = oldmovedir; entity missile = WarpZone_RefSys_SpawnSameRefSys(actor); -- 2.39.2