r6108 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Thu Mar 12 00:32:41 EDT 2009
Author: lordhavoc
Date: 2009-03-12 00:32:41 -0400 (Thu, 12 Mar 2009)
New Revision: 6108
Modified:
trunk/data/qcsrc/server/cl_weaponsystem.qc
Log:
added sv_qcweaponanimation cvar which enables entirely qc-based weapon
animations if set to 1
Modified: trunk/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weaponsystem.qc 2009-03-12 03:56:37 UTC (rev 6107)
+++ trunk/data/qcsrc/server/cl_weaponsystem.qc 2009-03-12 04:32:41 UTC (rev 6108)
@@ -251,7 +251,26 @@
return TRUE;
}
+float qcweaponanimation;
+vector weapon_offset = '0 -10 0';
+vector weapon_adjust = '10 0 -15';
+.vector weapon_morph0origin;
+.vector weapon_morph0angles;
+.float weapon_morph0time;
+.vector weapon_morph1origin;
+.vector weapon_morph1angles;
+.float weapon_morph1time;
+.vector weapon_morph2origin;
+.vector weapon_morph2angles;
+.float weapon_morph2time;
+.vector weapon_morph3origin;
+.vector weapon_morph3angles;
+.float weapon_morph3time;
+.vector weapon_morph4origin;
+.vector weapon_morph4angles;
+.float weapon_morph4time;
.string weaponname;
+
void CL_Weaponentity_Think()
{
float tb;
@@ -278,27 +297,32 @@
float animfile;
if (self.owner.weaponname != "")
{
- animfilename = strcat("models/weapons/w_", self.owner.weaponname, ".dpm.animinfo");
- animfile = fopen(animfilename, FILE_READ);
- if (animfile >= 0)
- {
- animparseerror = FALSE;
- self.anim_fire1 = animparseline(animfile);
- self.anim_fire2 = animparseline(animfile);
- self.anim_idle = animparseline(animfile);
- self.anim_reload = animparseline(animfile);
- fclose(animfile);
- if (animparseerror)
- print("Parse error in ", animfilename, ", some player animations are broken\n");
- setmodel(self, strcat("models/weapons/w_", self.owner.weaponname, ".dpm")); // precision set below
- }
+ if (qcweaponanimation)
+ setmodel(self, strcat("models/weapons/v_", self.owner.weaponname, ".md3")); // precision set below
else
{
- self.anim_fire1 = '0 1 10';
- self.anim_fire2 = '1 1 10';
- self.anim_idle = '2 1 10';
- self.anim_reload = '3 1 10';
- setmodel(self, strcat("models/weapons/w_", self.owner.weaponname, ".zym")); // precision set below
+ animfilename = strcat("models/weapons/w_", self.owner.weaponname, ".dpm.animinfo");
+ animfile = fopen(animfilename, FILE_READ);
+ if (animfile >= 0)
+ {
+ animparseerror = FALSE;
+ self.anim_fire1 = animparseline(animfile);
+ self.anim_fire2 = animparseline(animfile);
+ self.anim_idle = animparseline(animfile);
+ self.anim_reload = animparseline(animfile);
+ fclose(animfile);
+ if (animparseerror)
+ print("Parse error in ", animfilename, ", some player animations are broken\n");
+ setmodel(self, strcat("models/weapons/w_", self.owner.weaponname, ".dpm")); // precision set below
+ }
+ else
+ {
+ self.anim_fire1 = '0 1 10';
+ self.anim_fire2 = '1 1 10';
+ self.anim_idle = '2 1 10';
+ self.anim_reload = '3 1 10';
+ setmodel(self, strcat("models/weapons/w_", self.owner.weaponname, ".zym")); // precision set below
+ }
}
}
else
@@ -329,7 +353,7 @@
}
tb = (self.effects & EF_TELEPORT_BIT);
- self.effects = self.owner.effects | EF_LOWPRECISION;
+ self.effects = self.owner.effects - (self.owner.effects & EF_LOWPRECISION);// | EF_LOWPRECISION;
self.effects &~= EF_FULLBRIGHT; // can mask team color, so get rid of it
self.effects &~= EF_TELEPORT_BIT;
self.effects |= tb;
@@ -345,13 +369,145 @@
local float f;
f = 0;
if (self.state == WS_RAISE)
+ {
f = (self.owner.weapon_nextthink - time) / cvar("g_balance_weaponswitchdelay");
+ self.angles_x = -90 * f * f;
+ makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0' + self.angles_z * '0 0 1');
+ setorigin(self, weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust);
+ }
else if (self.state == WS_DROP)
+ {
f = 1 - (self.owner.weapon_nextthink - time) / cvar("g_balance_weaponswitchdelay");
+ self.angles_x = -90 * f * f;
+ makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0' + self.angles_z * '0 0 1');
+ setorigin(self, weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust);
+ }
else if (self.state == WS_CLEAR)
+ {
f = 1;
- self.angles_x = -90 * f * f;
+ self.angles_x = -90 * f * f;
+ makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0' + self.angles_z * '0 0 1');
+ setorigin(self, weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust);
+ }
+ else if (time < self.owner.weapon_morph1time)
+ {
+ f = (time - self.owner.weapon_morph0time) / (self.owner.weapon_morph1time - self.owner.weapon_morph0time);
+ self.angles = self.owner.weapon_morph0angles * (1 - f) + self.owner.weapon_morph1angles * f;
+ setorigin(self, self.owner.weapon_morph0origin * (1 - f) + self.owner.weapon_morph1origin * f);
+ }
+ else if (time < self.owner.weapon_morph2time)
+ {
+ f = (time - self.owner.weapon_morph1time) / (self.owner.weapon_morph2time - self.owner.weapon_morph1time);
+ self.angles = self.owner.weapon_morph1angles * (1 - f) + self.owner.weapon_morph2angles * f;
+ setorigin(self, self.owner.weapon_morph1origin * (1 - f) + self.owner.weapon_morph2origin * f);
+ }
+ else if (time < self.owner.weapon_morph3time)
+ {
+ f = (time - self.owner.weapon_morph2time) / (self.owner.weapon_morph3time - self.owner.weapon_morph2time);
+ self.angles = self.owner.weapon_morph2angles * (1 - f) + self.owner.weapon_morph3angles * f;
+ setorigin(self, self.owner.weapon_morph2origin * (1 - f) + self.owner.weapon_morph3origin * f);
+ }
+ else if (time < self.owner.weapon_morph4time)
+ {
+ f = (time - self.owner.weapon_morph3time) / (self.owner.weapon_morph4time - self.owner.weapon_morph3time);
+ self.angles = self.owner.weapon_morph3angles * (1 - f) + self.owner.weapon_morph4angles * f;
+ setorigin(self, self.owner.weapon_morph3origin * (1 - f) + self.owner.weapon_morph4origin * f);
+ }
+ else if (qcweaponanimation)
+ {
+ // begin a new idle morph
+ self.owner.weapon_morph0time = time;
+ self.owner.weapon_morph0angles = self.angles;
+ self.owner.weapon_morph0origin = self.origin;
+ float r;
+ float t;
+
+ r = random();
+ if (r < 0.1)
+ {
+ // turn gun to the left to look at it
+ t = 2;
+ self.owner.weapon_morph1time = time + t * 0.2;
+ self.owner.weapon_morph1angles = randomvec() * 3 + '-5 30 0';
+ makevectors(self.owner.weapon_morph1angles_x * '-1 0 0' + self.owner.weapon_morph1angles_y * '0 1 0' + self.owner.weapon_morph1angles_z * '0 0 1');
+ self.owner.weapon_morph1origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.owner.weapon_morph2time = time + t * 0.6;
+ self.owner.weapon_morph2angles = randomvec() * 3 + '-5 30 0';
+ makevectors(self.owner.weapon_morph2angles_x * '-1 0 0' + self.owner.weapon_morph2angles_y * '0 1 0' + self.owner.weapon_morph2angles_z * '0 0 1');
+ self.owner.weapon_morph2origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.owner.weapon_morph3time = time + t;
+ self.owner.weapon_morph3angles = '0 0 0';
+ makevectors(self.owner.weapon_morph3angles_x * '-1 0 0' + self.owner.weapon_morph3angles_y * '0 1 0' + self.owner.weapon_morph3angles_z * '0 0 1');
+ self.owner.weapon_morph3origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+ }
+ else if (r < 0.2)
+ {
+ // raise the gun a bit
+ t = 2;
+ self.owner.weapon_morph1time = time + t * 0.2;
+ self.owner.weapon_morph1angles = randomvec() * 3 + '30 -10 0';
+ makevectors(self.owner.weapon_morph1angles_x * '-1 0 0' + self.owner.weapon_morph1angles_y * '0 1 0' + self.owner.weapon_morph1angles_z * '0 0 1');
+ self.owner.weapon_morph1origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.owner.weapon_morph2time = time + t * 0.5;
+ self.owner.weapon_morph2angles = randomvec() * 3 + '30 -10 5';
+ makevectors(self.owner.weapon_morph2angles_x * '-1 0 0' + self.owner.weapon_morph2angles_y * '0 1 0' + self.owner.weapon_morph2angles_z * '0 0 1');
+ self.owner.weapon_morph2origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.owner.weapon_morph3time = time + t;
+ self.owner.weapon_morph3angles = '0 0 0';
+ makevectors(self.owner.weapon_morph3angles_x * '-1 0 0' + self.owner.weapon_morph3angles_y * '0 1 0' + self.owner.weapon_morph3angles_z * '0 0 1');
+ self.owner.weapon_morph3origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+ }
+ else if (r < 0.3)
+ {
+ // tweak it a bit
+ t = 5;
+ self.owner.weapon_morph1time = time + t * 0.3;
+ self.owner.weapon_morph1angles = randomvec() * 6;
+ makevectors(self.owner.weapon_morph1angles_x * '-1 0 0' + self.owner.weapon_morph1angles_y * '0 1 0' + self.owner.weapon_morph1angles_z * '0 0 1');
+ self.owner.weapon_morph1origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.owner.weapon_morph2time = time + t * 0.7;
+ self.owner.weapon_morph2angles = randomvec() * 6;
+ makevectors(self.owner.weapon_morph2angles_x * '-1 0 0' + self.owner.weapon_morph2angles_y * '0 1 0' + self.owner.weapon_morph2angles_z * '0 0 1');
+ self.owner.weapon_morph2origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.owner.weapon_morph3time = time + t;
+ self.owner.weapon_morph3angles = '0 0 0';
+ makevectors(self.owner.weapon_morph3angles_x * '-1 0 0' + self.owner.weapon_morph3angles_y * '0 1 0' + self.owner.weapon_morph3angles_z * '0 0 1');
+ self.owner.weapon_morph3origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+ }
+ else
+ {
+ // hold it mostly steady
+ t = random() * 6 + 4;
+ self.owner.weapon_morph1time = time + t * 0.2;
+ self.owner.weapon_morph1angles = randomvec() * 1;
+ makevectors(self.owner.weapon_morph1angles_x * '-1 0 0' + self.owner.weapon_morph1angles_y * '0 1 0' + self.owner.weapon_morph1angles_z * '0 0 1');
+ self.owner.weapon_morph1origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.owner.weapon_morph2time = time + t * 0.5;
+ self.owner.weapon_morph2angles = randomvec() * 1;
+ makevectors(self.owner.weapon_morph2angles_x * '-1 0 0' + self.owner.weapon_morph2angles_y * '0 1 0' + self.owner.weapon_morph2angles_z * '0 0 1');
+ self.owner.weapon_morph2origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.owner.weapon_morph3time = time + t * 0.7;
+ self.owner.weapon_morph3angles = randomvec() * 1;
+ makevectors(self.owner.weapon_morph3angles_x * '-1 0 0' + self.owner.weapon_morph3angles_y * '0 1 0' + self.owner.weapon_morph3angles_z * '0 0 1');
+ self.owner.weapon_morph3origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+ }
+
+ self.owner.weapon_morph4time = time + t;
+ self.owner.weapon_morph4angles = '0 0 0';
+ makevectors(self.owner.weapon_morph4angles_x * '-1 0 0' + self.owner.weapon_morph4angles_y * '0 1 0' + self.owner.weapon_morph4angles_z * '0 0 1');
+ self.owner.weapon_morph4origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ }
+
// create or update the lasertarget entity
LaserTarget_Think();
};
@@ -536,6 +692,7 @@
void weapon_setup(float windex)
{
entity e;
+ qcweaponanimation = cvar("sv_qcweaponanimation");
e = get_weaponinfo(windex);
self.items &~= IT_AMMO;
self.items = self.items | e.items;
@@ -609,19 +766,100 @@
if (self.weaponentity)
{
- if (fr == WFRAME_IDLE)
- a = self.weaponentity.anim_idle;
- else if (fr == WFRAME_FIRE1)
- a = self.weaponentity.anim_fire1;
- else if (fr == WFRAME_FIRE2)
- a = self.weaponentity.anim_fire2;
- else if (fr == WFRAME_RELOAD)
- a = self.weaponentity.anim_reload;
- setanim(self.weaponentity, a, restartanim == FALSE, restartanim, restartanim);
+ if (qcweaponanimation)
+ {
+ self.weaponentity.frame = fr;
+ if (fr != WFRAME_IDLE)
+ {
+ vector of, or, ou;
+ of = v_forward;
+ or = v_right;
+ ou = v_up;
+ self.weaponentity.frame = fr;
+ self.weapon_morph0time = time;
+ self.weapon_morph0angles = self.weaponentity.angles;
+ self.weapon_morph0origin = self.weaponentity.origin;
+
+ self.weapon_morph1angles = '0 0 0';
+ self.weapon_morph1time = time + t;
+ makevectors(self.weapon_morph1angles_x * '-1 0 0' + self.weapon_morph1angles_y * '0 1 0' + self.weapon_morph1angles_z * '0 0 1');
+ self.weapon_morph1origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.weapon_morph2angles = '0 0 0';
+ self.weapon_morph2time = time + t;
+ makevectors(self.weapon_morph2angles_x * '-1 0 0' + self.weapon_morph2angles_y * '0 1 0' + self.weapon_morph2angles_z * '0 0 1');
+ self.weapon_morph2origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.weapon_morph3angles = '0 0 0';
+ self.weapon_morph3time = time + t;
+ makevectors(self.weapon_morph3angles_x * '-1 0 0' + self.weapon_morph3angles_y * '0 1 0' + self.weapon_morph3angles_z * '0 0 1');
+ self.weapon_morph3origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.weapon_morph4angles = '0 0 0';
+ self.weapon_morph4time = time + t + 1;
+ makevectors(self.weapon_morph4angles_x * '-1 0 0' + self.weapon_morph4angles_y * '0 1 0' + self.weapon_morph4angles_z * '0 0 1');
+ self.weapon_morph4origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ if (fr == WFRAME_FIRE1)
+ {
+ self.weapon_morph1angles = '5 0 0';
+ self.weapon_morph1time = time + t * 0.1;
+ makevectors(self.weapon_morph1angles_x * '-1 0 0' + self.weapon_morph1angles_y * '0 1 0' + self.weapon_morph1angles_z * '0 0 1');
+ self.weapon_morph1origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+ }
+ else if (fr == WFRAME_FIRE2)
+ {
+ self.weapon_morph1angles = '10 0 0';
+ self.weapon_morph1time = time + t * 0.1;
+ makevectors(self.weapon_morph1angles_x * '-1 0 0' + self.weapon_morph1angles_y * '0 1 0' + self.weapon_morph1angles_z * '0 0 1');
+ self.weapon_morph1origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+ }
+ else if (fr == WFRAME_RELOAD)
+ {
+ self.weapon_morph1time = time + t * 0.05;
+ self.weapon_morph1angles = '-10 40 0';
+ makevectors(self.weapon_morph1angles_x * '-1 0 0' + self.weapon_morph1angles_y * '0 1 0' + self.weapon_morph1angles_z * '0 0 1');
+ self.weapon_morph1origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
- if(reset)
+ self.weapon_morph2time = time + t * 0.15;
+ self.weapon_morph2angles = '-10 40 5';
+ makevectors(self.weapon_morph2angles_x * '-1 0 0' + self.weapon_morph2angles_y * '0 1 0' + self.weapon_morph2angles_z * '0 0 1');
+ self.weapon_morph2origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.weapon_morph3time = time + t * 0.25;
+ self.weapon_morph3angles = '-10 40 0';
+ makevectors(self.weapon_morph3angles_x * '-1 0 0' + self.weapon_morph3angles_y * '0 1 0' + self.weapon_morph3angles_z * '0 0 1');
+ self.weapon_morph3origin = weapon_offset_x * v_forward - weapon_offset_y * v_right + weapon_offset_z * v_up + weapon_adjust;
+
+ self.weapon_morph4time = time + t;
+ }
+
+ v_forward = of;
+ v_right = or;
+ v_up = ou;
+
+ if(reset)
+ {
+ BITXOR_ASSIGN(self.weaponentity.effects, EF_TELEPORT_BIT);
+ }
+ }
+ }
+ else
{
- BITXOR_ASSIGN(self.weaponentity.effects, EF_TELEPORT_BIT);
+ if (fr == WFRAME_IDLE)
+ a = self.weaponentity.anim_idle;
+ else if (fr == WFRAME_FIRE1)
+ a = self.weaponentity.anim_fire1;
+ else if (fr == WFRAME_FIRE2)
+ a = self.weaponentity.anim_fire2;
+ else if (fr == WFRAME_RELOAD)
+ a = self.weaponentity.anim_reload;
+ setanim(self.weaponentity, a, restartanim == FALSE, restartanim, restartanim);
+
+ if(reset)
+ {
+ BITXOR_ASSIGN(self.weaponentity.effects, EF_TELEPORT_BIT);
+ }
}
}
More information about the nexuiz-commits
mailing list