r3007 - in trunk: data data/models/player data/qcsrc/server pro

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Dec 7 13:08:17 EST 2007


Author: lordhavoc
Date: 2007-12-07 13:08:17 -0500 (Fri, 07 Dec 2007)
New Revision: 3007

Added:
   trunk/data/models/player/template.md3.animinfo
Modified:
   trunk/data/qcsrc/server/cl_client.qc
   trunk/data/qcsrc/server/cl_physics.qc
   trunk/data/qcsrc/server/cl_player.qc
   trunk/data/qcsrc/server/cl_weapons.qc
   trunk/data/qcsrc/server/cl_weaponsystem.qc
   trunk/data/qcsrc/server/defs.qh
   trunk/data/weapons.cfg
   trunk/pro/weaponsPro.cfg
Log:
implemented models/player/whatever.md3.animinfo file support so md3
player models can be used (also .dpm and all other model formats)
added models/player/template.md3.animinfo example
note: animinfo can not be used for zym player models because it does not
include dead1/dead2 anims - this can be added if needed


Added: trunk/data/models/player/template.md3.animinfo
===================================================================
--- trunk/data/models/player/template.md3.animinfo	                        (rev 0)
+++ trunk/data/models/player/template.md3.animinfo	2007-12-07 18:08:17 UTC (rev 3007)
@@ -0,0 +1,21 @@
+  0 40 20 // die1         : die
+ 40 40 20 // die2         : die differently
+ 80  6 20 // draw         : raise weapon
+ 86  6 20 // duck         : crouch quickly
+ 92 12 20 // duckwalk     : crouch walking
+104 10 20 // duckjump     : jump from crouching position, stays on last frame until you land
+114 20 20 // duckidle     : crouched
+134 30 20 // idle         : standing
+164 10 20 // jump         : jump, stays on last frame until you land
+174 10 20 // pain1        : flinch from pain
+184 10 20 // pain2        : flinch differently
+194  6 20 // shoot        : 300ms shooting anim, may be played faster/slower by code, used for all weapons
+200  1 20 // taunt        : not used
+201 10 20 // run          : run forward
+211 10 20 // runbackwards : run backwards
+221 10 20 // strafeleft   : fast shuffling to the left
+231 10 20 // straferight  : fast shuffling to the right
+241 10 20 // forwardright : running forward and right
+251 10 20 // forwardleft  : running forward and left
+261 10 20 // backright    : running backward and right
+271 10 20 // backleft     : running backward and left
\ No newline at end of file

Modified: trunk/data/qcsrc/server/cl_client.qc
===================================================================
--- trunk/data/qcsrc/server/cl_client.qc	2007-12-07 13:43:44 UTC (rev 3006)
+++ trunk/data/qcsrc/server/cl_client.qc	2007-12-07 18:08:17 UTC (rev 3007)
@@ -248,7 +248,8 @@
 #ifdef ALLOW_VARIABLE_LOD
 	string s;
 
-	s = strcat(substring(modelname, 0, strlen(modelname) - 4), "_1.zym");
+	// FIXME: this only supports 3-letter extensions
+	s = strcat(substring(modelname, 0, strlen(modelname) - 4), "_1", substring(modelname, 0, strlen(modelname) - 4));
 	if(fexists(s))
 	{
 		precache_model(s);
@@ -258,7 +259,7 @@
 	else
 		self.modelindex_lod1 = -1;
 
-	s = strcat(substring(modelname, 0, strlen(modelname) - 4), "_2.zym");
+	s = strcat(substring(modelname, 0, strlen(modelname) - 4), "_2", substring(modelname, 0, strlen(modelname) - 4));
 	if(fexists(s))
 	{
 		precache_model(s);
@@ -281,6 +282,7 @@
 	precache_model(modelname);
 	setmodel(e, modelname); // players have high precision
 #endif
+	player_setupanimsformodel();
 }
 
 /*
@@ -332,9 +334,7 @@
 	self.pauseregen_finished = 0;
 	self.damageforcescale = 0;
 	self.death_time = 0;
-	self.dead_time = 0;
 	self.dead_frame = 0;
-	self.die_frame = 0;
 	self.deaths = 0;
 	self.alpha = 0;
 	self.scale = 0;
@@ -451,9 +451,7 @@
 		self.pauseregen_finished = time + cvar("g_balance_pause_health_regen_spawn");
 		self.damageforcescale = 2;
 		self.death_time = 0;
-		self.dead_time = 0;
 		self.dead_frame = 0;
-		self.die_frame = 0;
 		self.alpha = 0;
 		self.scale = 0;
 		self.fade_time = 0;
@@ -1386,6 +1384,7 @@
 				self.crouch = TRUE;
 				self.view_ofs = PL_CROUCH_VIEW_OFS;
 				setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX);
+				player_setanim(self.anim_duck, FALSE, TRUE, TRUE);
 			}
 		}
 		else

Modified: trunk/data/qcsrc/server/cl_physics.qc
===================================================================
--- trunk/data/qcsrc/server/cl_physics.qc	2007-12-07 13:43:44 UTC (rev 3006)
+++ trunk/data/qcsrc/server/cl_physics.qc	2007-12-07 18:08:17 UTC (rev 3007)
@@ -74,6 +74,11 @@
 
 	self.flags = self.flags - FL_ONGROUND;
 	self.flags = self.flags - FL_JUMPRELEASED;
+
+	if (self.crouch)
+		player_setanim(self.anim_duckjump, FALSE, TRUE, TRUE);
+	else
+		player_setanim(self.anim_jump, FALSE, TRUE, TRUE);
 }
 
 void() CheckWaterJump =

Modified: trunk/data/qcsrc/server/cl_player.qc
===================================================================
--- trunk/data/qcsrc/server/cl_player.qc	2007-12-07 13:43:44 UTC (rev 3006)
+++ trunk/data/qcsrc/server/cl_player.qc	2007-12-07 18:08:17 UTC (rev 3007)
@@ -1,7 +1,3 @@
-$frame die1 die2 draw duck duckwalk duckjump duckidle idle
-$frame jump pain1 pain2 shoot taunt run runbackwards
-$frame strafeleft straferight dead1 dead2 forwardright
-$frame forwardleft backright backleft
 
 // changes by LordHavoc on 03/29/04 and 03/30/04 at Vermeulen's request
 // merged player_run and player_stand to player_anim
@@ -32,7 +28,16 @@
 	self.damageforcescale = oldself.damageforcescale;
 	self.effects = oldself.effects;
 	self.event_damage = oldself.event_damage;
+	self.animstate_startframe = oldself.animstate_startframe;
+	self.animstate_numframes = oldself.animstate_numframes;
+	self.animstate_framerate = oldself.animstate_framerate;
+	self.animstate_starttime = oldself.animstate_starttime;
+	self.animstate_endtime = oldself.animstate_endtime;
+	self.animstate_override = oldself.animstate_override;
+	self.animstate_looping = oldself.animstate_looping;
 	self.frame = oldself.frame;
+	self.dead_frame = oldself.dead_frame;
+	self.pain_finished = oldself.pain_finished;
 	self.health = oldself.health;
 	self.armorvalue = oldself.armorvalue;
 	self.armortype = oldself.armortype;
@@ -58,11 +63,137 @@
 	self = oldself;
 }
 
+float animparseerror;
+vector(float animfile) animparseline =
+{
+	local string line;
+	local float c;
+	local vector anim;
+	if (animfile < 0)
+		return '0 1 2';
+	line = fgets(animfile);
+	c = tokenize(line);
+	if (c != 3)
+	{
+		animparseerror = TRUE;
+		return '0 1 2';
+	}
+	anim_x = stof(argv(0));
+	anim_y = stof(argv(1));
+	anim_z = stof(argv(2));
+	// don't allow completely bogus values
+	if (anim_x < 0 || anim_y < 1 || anim_z < 0.001)
+		anim = '0 1 2';
+	return anim;
+};
+
+void() player_setupanimsformodel =
+{
+	local string animfilename;
+	local float animfile;
+	// defaults for legacy .zym models without animinfo files
+	self.anim_die1 = '0 1 0.5'; // 2 seconds
+	self.anim_die2 = '1 1 0.5'; // 2 seconds
+	self.anim_draw = '2 1 3'; // TODO: analyze models and set framerate
+	self.anim_duck = '3 1 100'; // this anim seems bogus in most models, so make it play VERY briefly!
+	self.anim_duckwalk = '4 1 1';
+	self.anim_duckjump = '5 1 100'; // zym anims keep playing until changed, so this only has to start the anim, landing will end it
+	self.anim_duckidle = '6 1 1';
+	self.anim_idle = '7 1 1';
+	self.anim_jump = '8 1 100'; // zym anims keep playing until changed, so this only has to start the anim, landing will end it
+	self.anim_pain1 = '9 1 2'; // 0.5 seconds
+	self.anim_pain2 = '10 1 2'; // 0.5 seconds
+	self.anim_shoot = '11 1 5'; // TODO: analyze models and set framerate
+	self.anim_taunt = '12 1 1'; // FIXME?  there is no code using this anim
+	self.anim_run = '13 1 1';
+	self.anim_runbackwards = '14 1 1';
+	self.anim_strafeleft = '15 1 1';
+	self.anim_straferight = '16 1 1';
+	self.anim_dead1 = '17 1 1';
+	self.anim_dead2 = '18 1 1';
+	self.anim_forwardright = '19 1 1';
+	self.anim_forwardleft = '20 1 1';
+	self.anim_backright = '21 1 1';
+	self.anim_backleft  = '22 1 1';
+	animparseerror = FALSE;
+	animfilename = strcat(self.model, ".animinfo");
+	animfile = fopen(animfilename, FILE_READ);
+	if (animfile >= 0)
+	{
+		self.anim_die1         = animparseline(animfile);
+		self.anim_die2         = animparseline(animfile);
+		self.anim_draw         = animparseline(animfile);
+		self.anim_duck         = animparseline(animfile);
+		self.anim_duckwalk     = animparseline(animfile);
+		self.anim_duckjump     = animparseline(animfile);
+		self.anim_duckidle     = animparseline(animfile);
+		self.anim_idle         = animparseline(animfile);
+		self.anim_jump         = animparseline(animfile);
+		self.anim_pain1        = animparseline(animfile);
+		self.anim_pain2        = animparseline(animfile);
+		self.anim_shoot        = animparseline(animfile);
+		self.anim_taunt        = animparseline(animfile);
+		self.anim_run          = animparseline(animfile);
+		self.anim_runbackwards = animparseline(animfile);
+		self.anim_strafeleft   = animparseline(animfile);
+		self.anim_straferight  = animparseline(animfile);
+		self.anim_forwardright = animparseline(animfile);
+		self.anim_forwardleft  = animparseline(animfile);
+		self.anim_backright    = animparseline(animfile);
+		self.anim_backleft     = animparseline(animfile);
+		fclose(animfile);
+
+		// derived anims
+		self.anim_dead1 = '0 1 1' + '1 0 0' * (self.anim_die1_x + self.anim_die1_y - 1);
+		self.anim_dead2 = '0 1 1' + '1 0 0' * (self.anim_die2_x + self.anim_die2_y - 1);
+
+		if (animparseerror)
+			print("Parse error in ", animfilename, ", some player animations are broken\n");
+	}
+	else
+		dprint("File ", animfilename, " not found, assuming legacy .zym model animation timings\n");
+	// reset animstate now
+	player_setanim(self.anim_idle, TRUE, FALSE, TRUE);
+};
+
+void(vector anim, float looping, float override, float restart) player_setanim =
+{
+	if (!restart)
+	if (anim_x != self.animstate_startframe)
+	if (anim_y != self.animstate_numframes)
+	if (anim_z != self.animstate_framerate)
+		return;
+	self.animstate_startframe = anim_x;
+	self.animstate_numframes = anim_y;
+	self.animstate_framerate = anim_z;
+	self.animstate_starttime = time;
+	self.animstate_endtime = time + self.animstate_numframes / self.animstate_framerate;
+	self.animstate_looping = looping;
+	self.animstate_override = override;
+	self.frame = self.animstate_startframe;
+};
+
+void() player_updateframe =
+{
+	if (time >= self.animstate_endtime)
+	{
+		if (self.animstate_looping)
+		{
+			self.animstate_starttime = self.animstate_endtime;
+			self.animstate_endtime = self.animstate_endtime + self.animstate_numframes / self.animstate_framerate;
+		}
+		self.animstate_override = FALSE;
+	}
+	self.frame = self.animstate_startframe + bound(0, (time - self.animstate_starttime) * self.animstate_framerate, self.animstate_numframes - 1);
+};
+
 void player_anim (void)
 {
+	player_updateframe();
+
 	if (self.deadflag != DEAD_NO)
 	{
-		if (time > self.dead_time)
+		if (time > self.animstate_endtime)
 		{
 			if (self.maxs_z > 5)
 			{
@@ -71,54 +202,49 @@
 			}
 			self.frame = self.dead_frame;
 		}
-		else
-			self.frame = self.die_frame;
 		return;
 	}
 
-
-	if (self.crouch)
+	if (!self.animstate_override)
 	{
-		if (self.movement_x * self.movement_x + self.movement_y * self.movement_y > 20)
-			self.frame = $duckwalk;
+		if (!(self.flags & FL_ONGROUND))
+		{
+			if (self.crouch)
+				player_setanim(self.anim_duckjump, FALSE, TRUE, FALSE);
+			else
+				player_setanim(self.anim_jump, FALSE, TRUE, FALSE);
+		}
+		else if (self.crouch)
+		{
+			if (self.movement_x * self.movement_x + self.movement_y * self.movement_y > 20)
+				player_setanim(self.anim_duckwalk, TRUE, FALSE, FALSE);
+			else
+				player_setanim(self.anim_duckidle, TRUE, FALSE, FALSE);
+		}
+		else if ((self.movement_x * self.movement_x + self.movement_y * self.movement_y) > 20)
+		{
+			if (self.movement_x > 0 && self.movement_y == 0)
+				player_setanim(self.anim_run, TRUE, FALSE, FALSE);
+			else if (self.movement_x < 0 && self.movement_y == 0)
+				player_setanim(self.anim_runbackwards, TRUE, FALSE, FALSE);
+			else if (self.movement_x == 0 && self.movement_y > 0)
+				player_setanim(self.anim_straferight, TRUE, FALSE, FALSE);
+			else if (self.movement_x == 0 && self.movement_y < 0)
+				player_setanim(self.anim_strafeleft, TRUE, FALSE, FALSE);
+			else if (self.movement_x > 0 && self.movement_y > 0)
+				player_setanim(self.anim_forwardright, TRUE, FALSE, FALSE);
+			else if (self.movement_x > 0 && self.movement_y < 0)
+				player_setanim(self.anim_forwardleft, TRUE, FALSE, FALSE);
+			else if (self.movement_x < 0 && self.movement_y > 0)
+				player_setanim(self.anim_backright, TRUE, FALSE, FALSE);
+			else if (self.movement_x < 0 && self.movement_y < 0)
+				player_setanim(self.anim_backleft, TRUE, FALSE, FALSE);
+			else
+				player_setanim(self.anim_run, TRUE, FALSE, FALSE);
+		}
 		else
-			self.frame = $duckidle;
+			player_setanim(self.anim_idle, TRUE, FALSE, FALSE);
 	}
-	else if ((self.movement_x * self.movement_x + self.movement_y * self.movement_y) > 20)
-	{
-		if (self.movement_x > 0 && self.movement_y == 0)
-			self.frame = $run;
-		else if (self.movement_x < 0 && self.movement_y == 0)
-			self.frame = $runbackwards;
-		else if (self.movement_x == 0 && self.movement_y > 0)
-			self.frame = $straferight;
-		else if (self.movement_x == 0 && self.movement_y < 0)
-			self.frame = $strafeleft;
-		else if (self.movement_x > 0 && self.movement_y > 0)
-			self.frame = $forwardright;
-		else if (self.movement_x > 0 && self.movement_y < 0)
-			self.frame = $forwardleft;
-		else if (self.movement_x < 0 && self.movement_y > 0)
-			self.frame = $backright;
-		else if (self.movement_x < 0 && self.movement_y < 0)
-			self.frame = $backleft;
-		else
-			self.frame = $run;
-	}
-	else if (self.pain_finished > time)
-		self.frame = self.pain_frame;
-	else if (ATTACK_FINISHED(self) > time)
-		self.frame = $shoot;
-	else
-		self.frame = $idle;
-
-	if (!(self.flags & FL_ONGROUND))
-	{
-		if (self.crouch)
-			self.frame = $duckidle;		// if player is crouching while in air, show crouch frame
-		else
-			self.frame = $jump;
-	}
 }
 //End change by Supajoe on 11:44 PM EST 11/16/03 (Subject: Player animations)
 
@@ -173,7 +299,6 @@
 		// don't use any animations as a gib
 		self.frame = 0;
 		self.dead_frame = 0;
-		self.die_frame = 0;
 		// view just above the floor
 		self.view_ofs = '0 0 4';
 
@@ -224,9 +349,9 @@
 	if (self.pain_finished < time)		//Don't switch pain sequences like crazy
 	{
 		if (random() > 0.5)
-			self.pain_frame = $pain1;
+			player_setanim(self.anim_pain1, FALSE, TRUE, TRUE);
 		else
-			self.pain_frame = $pain2;
+			player_setanim(self.anim_pain2, FALSE, TRUE, TRUE);
 		self.pain_finished = time + 0.5;	//Supajoe
 
 		// throw off bot aim temporarily
@@ -360,20 +485,16 @@
 			self.respawn_countdown = 10; // first number to count down from is 10
 		else
 			self.respawn_countdown = -1; // do not count down
-		// when to switch to the dead_frame
-		self.dead_time = time + 2;
 		if (random() < 0.5)
 		{
-			self.die_frame = $die1;
-			self.dead_frame = $dead1;
+			player_setanim(self.anim_die1, FALSE, TRUE, TRUE);
+			self.dead_frame = self.anim_dead1_x;
 		}
 		else
 		{
-			self.die_frame = $die2;
-			self.dead_frame = $dead2;
+			player_setanim(self.anim_die2, FALSE, TRUE, TRUE);
+			self.dead_frame = self.anim_dead2_x;
 		}
-		// start the animation
-		player_anim();
 		// set damage function to corpse damage
 		self.event_damage = PlayerCorpseDamage;
 		// call the corpse damage function just in case it wants to gib

Modified: trunk/data/qcsrc/server/cl_weapons.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weapons.qc	2007-12-07 13:43:44 UTC (rev 3006)
+++ trunk/data/qcsrc/server/cl_weapons.qc	2007-12-07 18:08:17 UTC (rev 3007)
@@ -231,6 +231,7 @@
 	{
 		if (self.weaponentity.state == WS_CLEAR)
 		{
+			player_setanim(self.anim_draw, FALSE, TRUE, TRUE);
 			self.weaponentity.state = WS_RAISE;
 			weapon_action(self.switchweapon, WR_SETUP);
 			// VorteX: add player model weapon select frame here

Modified: trunk/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weaponsystem.qc	2007-12-07 13:43:44 UTC (rev 3006)
+++ trunk/data/qcsrc/server/cl_weaponsystem.qc	2007-12-07 18:08:17 UTC (rev 3007)
@@ -410,6 +410,15 @@
 	// VorteX: haste can be added here
 	self.weapon_nextthink = max(time, self.weapon_nextthink_lastframe + t);
 	self.weapon_think = func;
+
+	if (fr == WFRAME_FIRE1 || fr == WFRAME_FIRE2)
+	if (t)
+	{
+		local vector anim;
+		anim = self.anim_shoot;
+		anim_z = anim_y / t;
+		player_setanim(anim, FALSE, TRUE, TRUE);
+	}
 };
 
 void(float spd, vector org) weapon_boblayer1 =

Modified: trunk/data/qcsrc/server/defs.qh
===================================================================
--- trunk/data/qcsrc/server/defs.qh	2007-12-07 13:43:44 UTC (rev 3006)
+++ trunk/data/qcsrc/server/defs.qh	2007-12-07 18:08:17 UTC (rev 3007)
@@ -68,12 +68,51 @@
 
 .float play_time;
 .float death_time;
-.float dead_time;
 .float dead_frame;
-.float die_frame;
 .float fade_time;
 .float fade_rate;
 
+// player animation state
+.float animstate_startframe;
+.float animstate_numframes;
+.float animstate_framerate;
+.float animstate_starttime;
+.float animstate_endtime;
+.float animstate_override;
+.float animstate_looping;
+
+// player animation data for this model
+// each vector is as follows:
+// _x = startframe
+// _y = numframes
+// _z = framerate
+.vector anim_die1; // player dies
+.vector anim_die2; // player dies differently
+.vector anim_draw; // player pulls out a weapon
+.vector anim_duck; // player crouches (from idle to duckidle)
+.vector anim_duckwalk; // player walking while crouching
+.vector anim_duckjump; // player jumping from a crouch
+.vector anim_duckidle; // player idling while crouching
+.vector anim_idle; // player standing
+.vector anim_jump; // player jump
+.vector anim_pain1; // player flinches from pain
+.vector anim_pain2; // player flinches from pain, differently
+.vector anim_shoot; // player shoots
+.vector anim_taunt; // player taunts others (FIXME: no code references this)
+.vector anim_run; // player running forward
+.vector anim_runbackwards; // player running backward
+.vector anim_strafeleft; // player shuffling left quickly
+.vector anim_straferight; // player shuffling right quickly
+.vector anim_dead1; // player dead (must be identical to last frame of die1)
+.vector anim_dead2; // player dead (must be identical to last frame of die2)
+.vector anim_forwardright; // player running forward and right
+.vector anim_forwardleft; // player running forward and left
+.vector anim_backright; // player running backward and right
+.vector anim_backleft; // player running back and left
+
+void() player_setupanimsformodel;
+void(vector anim, float looping, float override, float restart) player_setanim;
+
 .string mdl;
 
 .string playermodel;

Modified: trunk/data/weapons.cfg
===================================================================
--- trunk/data/weapons.cfg	2007-12-07 13:43:44 UTC (rev 3006)
+++ trunk/data/weapons.cfg	2007-12-07 18:08:17 UTC (rev 3007)
@@ -102,7 +102,7 @@
 set g_balance_electro_primary_speed 2000
 set g_balance_electro_primary_lifetime 30
 set g_balance_electro_primary_refire 0.6
-set g_balance_electro_primary_animtime 0.05
+set g_balance_electro_primary_animtime 0.3
 set g_balance_electro_primary_ammo 2
 set g_balance_electro_secondary_damage 60
 set g_balance_electro_secondary_edgedamage 0
@@ -112,7 +112,7 @@
 set g_balance_electro_secondary_speed_up 200
 set g_balance_electro_secondary_lifetime 5
 set g_balance_electro_secondary_refire 0.3
-set g_balance_electro_secondary_animtime 0.05
+set g_balance_electro_secondary_animtime 0.3
 set g_balance_electro_secondary_ammo 2
 set g_balance_electro_combo_damage 70
 set g_balance_electro_combo_edgedamage 0
@@ -128,7 +128,7 @@
 set g_balance_crylink_primary_shots 4
 set g_balance_crylink_primary_lifetime 30
 set g_balance_crylink_primary_refire 0.25
-set g_balance_crylink_primary_animtime 0.15
+set g_balance_crylink_primary_animtime 0.3
 set g_balance_crylink_primary_ammo 1
 set g_balance_crylink_secondary_damage 20
 set g_balance_crylink_secondary_edgedamage 0
@@ -139,7 +139,7 @@
 set g_balance_crylink_secondary_shots 7
 set g_balance_crylink_secondary_lifetime 30
 set g_balance_crylink_secondary_refire 0.5
-set g_balance_crylink_secondary_animtime 0.15
+set g_balance_crylink_secondary_animtime 0.3
 set g_balance_crylink_secondary_ammo 3
 
 set g_balance_nex_damage 140

Modified: trunk/pro/weaponsPro.cfg
===================================================================
--- trunk/pro/weaponsPro.cfg	2007-12-07 13:43:44 UTC (rev 3006)
+++ trunk/pro/weaponsPro.cfg	2007-12-07 18:08:17 UTC (rev 3007)
@@ -102,7 +102,7 @@
 set g_balance_electro_primary_speed 2000
 set g_balance_electro_primary_lifetime 30
 set g_balance_electro_primary_refire 0.5
-set g_balance_electro_primary_animtime 0.05
+set g_balance_electro_primary_animtime 0.3
 set g_balance_electro_primary_ammo 2
 set g_balance_electro_secondary_damage 50
 set g_balance_electro_secondary_edgedamage 10
@@ -112,7 +112,7 @@
 set g_balance_electro_secondary_speed_up 200
 set g_balance_electro_secondary_lifetime 5
 set g_balance_electro_secondary_refire 0.3
-set g_balance_electro_secondary_animtime 0.05
+set g_balance_electro_secondary_animtime 0.3
 set g_balance_electro_secondary_ammo 2
 set g_balance_electro_combo_damage 70
 set g_balance_electro_combo_edgedamage 0
@@ -139,7 +139,7 @@
 set g_balance_crylink_secondary_shots 5
 set g_balance_crylink_secondary_lifetime 30
 set g_balance_crylink_secondary_refire 0.6
-set g_balance_crylink_secondary_animtime 0.15
+set g_balance_crylink_secondary_animtime 0.3
 set g_balance_crylink_secondary_ammo 5
 
 set g_balance_nex_damage 70




More information about the nexuiz-commits mailing list