From e06039a12721b131698a4e2df7ded67c71ce8dbb Mon Sep 17 00:00:00 2001 From: div0 Date: Tue, 17 Feb 2009 14:46:54 +0000 Subject: [PATCH] make use of EF_TELEPORT_BIT for weapon animation git-svn-id: svn://svn.icculus.org/nexuiz/trunk@5886 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/cl_weaponsystem.qc | 17 ++++++++++++----- data/qcsrc/server/constants.qh | 2 +- data/qcsrc/server/defs.qh | 4 ++++ data/qcsrc/server/extensions.qh | 10 ++++++++++ data/qcsrc/server/t_teleporters.qc | 5 +---- data/qcsrc/server/w_electro.qc | 6 ++++++ 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/data/qcsrc/server/cl_weaponsystem.qc b/data/qcsrc/server/cl_weaponsystem.qc index 384c9e8ad..e580696a8 100644 --- a/data/qcsrc/server/cl_weaponsystem.qc +++ b/data/qcsrc/server/cl_weaponsystem.qc @@ -254,6 +254,7 @@ float CL_Weaponentity_CustomizeEntityForClient() .string weaponname; void CL_Weaponentity_Think() { + float tb; self.nextthink = time; if (intermission_running) self.frame = WFRAME_IDLE; @@ -277,12 +278,12 @@ void CL_Weaponentity_Think() else self.model = ""; } - self.effects = self.owner.effects | EF_LOWPRECISION; - self.effects = self.effects - (self.effects & (EF_FULLBRIGHT)); // can mask team color, so get rid of it - if (self.owner.teleport_time) - // owner is currently being teleported, so don't apply EF_NODRAW otherwise the viewmodel would "blink" - self.effects &~= EF_NODRAW; + tb = (self.effects & EF_TELEPORT_BIT); + self.effects = self.owner.effects | EF_LOWPRECISION; + self.effects &~= EF_FULLBRIGHT; // can mask team color, so get rid of it + self.effects &~= EF_TELEPORT_BIT; + self.effects |= tb; if(self.owner.alpha != 0) self.alpha = self.owner.alpha; @@ -553,7 +554,13 @@ void weapon_thinkf(float fr, float t, void() func) if (fr >= 0) { if (self.weaponentity != world) + { + if(fr == WFRAME_FIRE1 || fr == WFRAME_FIRE2) + { + BITXOR_ASSIGN(self.weaponentity.effects, EF_TELEPORT_BIT); + } self.weaponentity.frame = fr; + } } if(self.weapon_think == w_ready && func != w_ready && self.weaponentity.state == WS_RAISE) diff --git a/data/qcsrc/server/constants.qh b/data/qcsrc/server/constants.qh index 6ebea5ec8..fb68a788f 100644 --- a/data/qcsrc/server/constants.qh +++ b/data/qcsrc/server/constants.qh @@ -119,7 +119,7 @@ float EF_MUZZLEFLASH = 2; float EF_BRIGHTLIGHT = 4; float EF_DIMLIGHT = 8; -#define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE) +#define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT) float MSG_BROADCAST = 0; // unreliable float MSG_ONE = 1; // reliable diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index 789fce12c..744371240 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -532,3 +532,7 @@ void SUB_UseTargets(); void ClientData_Touch(entity e); vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons + +// the QC VM sucks +#define BITXOR(v,b) ((v) + (b) - 2 * ((v) & (b))) +#define BITXOR_ASSIGN(v,b) ((v) += ((b) - 2 * ((v) & (b)))) diff --git a/data/qcsrc/server/extensions.qh b/data/qcsrc/server/extensions.qh index 1c1ca931b..64f3868b7 100644 --- a/data/qcsrc/server/extensions.qh +++ b/data/qcsrc/server/extensions.qh @@ -183,6 +183,16 @@ float EF_STARDUST = 2048; //description: //entity emits bouncing sparkles in every direction +//DP_EF_TELEPORT_BIT +//idea: id software +//darkplaces implementation: div0 +//effects bit: +float EF_TELEPORT_BIT = 2097152; +//description: +//when toggled, interpolation of the entity is skipped for one frame. Useful for teleporting. +//to toggle this bit in QC, you can do: +// self.effects += (EF_TELEPORT_BIT - 2 * (self.effects & EF_TELEPORT_BIT)); + //DP_ENT_ALPHA //idea: Nehahra //darkplaces implementation: LordHavoc diff --git a/data/qcsrc/server/t_teleporters.qc b/data/qcsrc/server/t_teleporters.qc index 4cb2e3c8d..c1719b4d4 100644 --- a/data/qcsrc/server/t_teleporters.qc +++ b/data/qcsrc/server/t_teleporters.qc @@ -64,6 +64,7 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle player.angles = to_angles; player.fixangle = TRUE; player.velocity = to_velocity; + BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT); UpdateCSQCProjectile(player); @@ -72,10 +73,6 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle if(player.takedamage && player.deadflag == DEAD_NO && !g_race) tdeath(player, teleporter, telefragger, telefragmin, telefragmax); - // hide myself a tic - player.effects = player.effects | EF_NODRAW; - player.teleport_time = time + cvar("sys_ticrate"); - // player no longer is on ground player.flags &~= FL_ONGROUND; diff --git a/data/qcsrc/server/w_electro.qc b/data/qcsrc/server/w_electro.qc index 44da1b1af..9db5c54bd 100644 --- a/data/qcsrc/server/w_electro.qc +++ b/data/qcsrc/server/w_electro.qc @@ -138,6 +138,12 @@ void W_Electro_Attack2() proj.event_damage = W_Plasma_Damage; proj.flags = FL_PROJECTILE; + entity p2; + p2 = spawn(); + copyentity(proj, p2); + setmodel(p2, "models/ebomb.mdl"); + setsize(p2, proj.mins, proj.maxs); + CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, FALSE); // no culling, it has sound } -- 2.39.2