From: TimePath Date: Sun, 29 Nov 2015 23:58:59 +0000 (+1100) Subject: Viewmodels: clientside Vortex glow X-Git-Tag: xonotic-v0.8.2~1601^2~6 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=738328d7b67a0acb4fd750730377256359939a65;p=xonotic%2Fxonotic-data.pk3dir.git Viewmodels: clientside Vortex glow --- diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index a6d05d9a6..07fa43edd 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -270,7 +270,9 @@ void viewmodel_draw(entity this) int mask = (intermission || (getstati(STAT_HEALTH) <= 0) || autocvar_chase_active) ? 0 : MASK_NORMAL; float a = this.alpha; int c = stof(getplayerkeyvalue(current_player, "colors")); - vector g = this.glowmod; // TODO: completely clientside: colormapPaletteColor(c & 0x0F, true) * 2; + vector g; + Weapon wep = Weapons_from(switchingweapon); + if (!(g = wep.wr_glow(wep))) g = colormapPaletteColor(c & 0x0F, true) * 2; entity me = CSQCModel_server2csqc(player_localentnum - 1); int fx = ((me.csqcmodel_effects & EFMASK_CHEAP) | EF_NODEPTHTEST) diff --git a/qcsrc/common/stats.qh b/qcsrc/common/stats.qh index be3e10f5e..5b2599794 100644 --- a/qcsrc/common/stats.qh +++ b/qcsrc/common/stats.qh @@ -1,6 +1,10 @@ #ifndef STATS_H #define STATS_H +#ifdef SVQC +#include "../server/cl_client.qh" +#endif + // Full list of all stat constants, included in a single location for easy reference // 255 is the current limit (MAX_CL_STATS - 1), engine will need to be modified if you wish to add more stats @@ -36,6 +40,9 @@ REGISTER_STAT(SWITCHWEAPON, int) /** weapon currently being switched to (is copied from switchweapon once switch is possible) */ REGISTER_STAT(SWITCHINGWEAPON, int) REGISTER_STAT(WEAPON_NEXTTHINK, float) +#ifdef SVQC +SPECTATE_COPY(_STAT(WEAPON_NEXTTHINK)) +#endif REGISTER_STAT(GAMESTARTTIME, float) REGISTER_STAT(STRENGTH_FINISHED, float) diff --git a/qcsrc/common/weapons/all.qc b/qcsrc/common/weapons/all.qc index 849403f87..f0b606e8b 100644 --- a/qcsrc/common/weapons/all.qc +++ b/qcsrc/common/weapons/all.qc @@ -582,32 +582,6 @@ void wframe_send(entity actor, entity weaponentity, vector a, bool restartanim) } #endif -REGISTER_NET_TEMP(wglow) -#ifdef CSQC -NET_HANDLE(wglow, bool isNew) -{ - vector g = '0 0 0'; - g.x = ReadCoord(); - g.y = ReadCoord(); - g.z = ReadCoord(); - viewmodel.glowmod = g; - return true; -} -#endif - -#ifdef SVQC -void wglow_send(entity actor, vector g) -{ - if (!IS_REAL_CLIENT(actor)) return; - int channel = MSG_ONE; - msg_entity = actor; - WriteHeader(channel, wglow); - WriteCoord(channel, g.x); - WriteCoord(channel, g.y); - WriteCoord(channel, g.z); -} -#endif - #endif #endif diff --git a/qcsrc/common/weapons/weapon.qh b/qcsrc/common/weapons/weapon.qh index 71e121f81..3f09e914a 100644 --- a/qcsrc/common/weapons/weapon.qh +++ b/qcsrc/common/weapons/weapon.qh @@ -118,6 +118,8 @@ CLASS(Weapon, Object) // no weapon specific image for this weapon return false; } + /** (CLIENT) weapon specific glow */ + METHOD(Weapon, wr_glow, vector(Weapon this)) { return '0 0 0'; } /** (SERVER) the weapon is dropped */ METHOD(Weapon, wr_drop, void(Weapon this)) {} /** (SERVER) a weapon is picked up */ diff --git a/qcsrc/common/weapons/weapon/vortex.qc b/qcsrc/common/weapons/weapon/vortex.qc index ad8c6600d..a3caf7aab 100644 --- a/qcsrc/common/weapons/weapon/vortex.qc +++ b/qcsrc/common/weapons/weapon/vortex.qc @@ -61,6 +61,37 @@ VORTEX_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP) #endif #ifdef IMPLEMENTATION +REGISTER_STAT(WEP_CVAR_vortex_charge, bool, WEP_CVAR(vortex, charge)) +REGISTER_STAT(WEP_CVAR_vortex_charge_animlimit, float, WEP_CVAR(vortex, charge_animlimit)) + +#if defined(CSQC) +float autocvar_g_weapon_charge_colormod_red_full; +float autocvar_g_weapon_charge_colormod_red_half; +float autocvar_g_weapon_charge_colormod_green_full; +float autocvar_g_weapon_charge_colormod_blue_full; +float autocvar_g_weapon_charge_colormod_blue_half; +float autocvar_g_weapon_charge_colormod_green_half; +float autocvar_g_weapon_charge_colormod_hdrmultiplier; + +METHOD(Vortex, wr_glow, vector(Vortex this)) +{ + if (!STAT(WEP_CVAR_vortex_charge)) return '0 0 0'; + float charge = STAT(VORTEX_CHARGE); + float animlimit = STAT(WEP_CVAR_vortex_charge_animlimit); + vector g; + g.x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, charge / animlimit); + g.y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, charge / animlimit); + g.z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, charge / animlimit); + if (charge > animlimit) + { + g.x += autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (charge - animlimit) / (1 - animlimit); + g.y += autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (charge - animlimit) / (1 - animlimit); + g.z += autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (charge - animlimit) / (1 - animlimit); + } + return g; +} +#endif + REGISTER_NET_TEMP(TE_CSQC_VORTEXBEAMPARTICLE) #if defined(SVQC) diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 623b5f766..e4220f5d0 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -296,13 +296,6 @@ bool autocvar_g_use_ammunition; bool autocvar_g_waypointeditor; int autocvar_g_waypointeditor_auto; bool autocvar_g_waypoints_for_items; -float autocvar_g_weapon_charge_colormod_blue_full; -float autocvar_g_weapon_charge_colormod_blue_half; -float autocvar_g_weapon_charge_colormod_green_full; -float autocvar_g_weapon_charge_colormod_green_half; -float autocvar_g_weapon_charge_colormod_hdrmultiplier; -float autocvar_g_weapon_charge_colormod_red_full; -float autocvar_g_weapon_charge_colormod_red_half; #define autocvar_g_weapon_stay cvar("g_weapon_stay") bool autocvar_g_weapon_throwable; #define autocvar_g_weaponarena cvar_string("g_weaponarena") diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 0cc6a0b65..e1b34a9bb 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1664,8 +1664,8 @@ spectate mode routines ====================== */ -void SpectateCopy(entity spectatee) -{SELFPARAM(); +void SpectateCopy(entity this, entity spectatee) +{ MUTATOR_CALLHOOK(SpectateCopy, spectatee, self); self.armortype = spectatee.armortype; self.armorvalue = spectatee.armorvalue; @@ -1690,7 +1690,6 @@ void SpectateCopy(entity spectatee) self.switchweapon = spectatee.switchweapon; self.switchingweapon = spectatee.switchingweapon; self.weapon = spectatee.weapon; - self.weapon_nextthink = spectatee.weapon_nextthink; self.vortex_charge = spectatee.vortex_charge; self.vortex_chargepool_ammo = spectatee.vortex_chargepool_ammo; self.hagar_load = spectatee.hagar_load; @@ -1751,7 +1750,7 @@ bool SpectateUpdate() return false; } - SpectateCopy(self.enemy); + SpectateCopy(this, this.enemy); return true; } @@ -2148,8 +2147,6 @@ void PlayerUseKey() } -void wglow_send(entity actor, vector g); - /* ============= PlayerPreThink @@ -2325,28 +2322,6 @@ void PlayerPreThink () if(frametime) { - vector g; - if (IS_SPEC(self)) - { - g = self.enemy.weaponentity_glowmod; - } - else if(self.weapon == WEP_VORTEX.m_id && WEP_CVAR(vortex, charge)) - { - g.x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.vortex_charge / WEP_CVAR(vortex, charge_animlimit)); - g.y = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_half * min(1, self.vortex_charge / WEP_CVAR(vortex, charge_animlimit)); - g.z = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_half * min(1, self.vortex_charge / WEP_CVAR(vortex, charge_animlimit)); - - if(self.vortex_charge > WEP_CVAR(vortex, charge_animlimit)) - { - g.x += autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_full * (self.vortex_charge - WEP_CVAR(vortex, charge_animlimit)) / (1 - WEP_CVAR(vortex, charge_animlimit)); - g.y += autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_green_full * (self.vortex_charge - WEP_CVAR(vortex, charge_animlimit)) / (1 - WEP_CVAR(vortex, charge_animlimit)); - g.z += autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_blue_full * (self.vortex_charge - WEP_CVAR(vortex, charge_animlimit)) / (1 - WEP_CVAR(vortex, charge_animlimit)); - } - } - else - g = colormapPaletteColor(self.clientcolors & 0x0F, true) * 2; - if (g != self.weaponentity_glowmod) - wglow_send(self, self.weaponentity_glowmod = g); player_powerups(); } diff --git a/qcsrc/server/cl_client.qh b/qcsrc/server/cl_client.qh index 1b462a329..a0dfd72f8 100644 --- a/qcsrc/server/cl_client.qh +++ b/qcsrc/server/cl_client.qh @@ -8,4 +8,6 @@ float CalcRotRegen(float current, float regenstable, float regenfactor, float re float Spectate(entity pl); +#define SPECTATE_COPY(fld) [[accumulate]] void SpectateCopy(entity this, entity spectatee) { this.(fld) = spectatee.(fld); } + #endif