[nexuiz-commits] r6648 - in trunk/data: qcsrc/server scripts

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon May 4 02:36:40 EDT 2009


Author: div0
Date: 2009-05-04 02:36:40 -0400 (Mon, 04 May 2009)
New Revision: 6648

Modified:
   trunk/data/qcsrc/server/func_breakable.qc
   trunk/data/scripts/entities.def
Log:
new toys for func_breakable (lots new options about debris)


Modified: trunk/data/qcsrc/server/func_breakable.qc
===================================================================
--- trunk/data/qcsrc/server/func_breakable.qc	2009-05-03 23:50:45 UTC (rev 6647)
+++ trunk/data/qcsrc/server/func_breakable.qc	2009-05-04 06:36:40 UTC (rev 6648)
@@ -4,6 +4,15 @@
 .float dmg_edge;
 .float dmg_radius;
 .float dmg_force;
+.float debrismovetype;
+.float debrissolid;
+.vector debrisvelocity;
+.vector debrisvelocityjitter;
+.vector debrisavelocityjitter;
+.float debristime;
+.float debristimejitter;
+.float debrisfadetime;
+.float debrisdamageforcescale;
 
 .string mdl_dead; // or "" to hide when broken
 .string debris; // space separated list of debris models
@@ -29,7 +38,7 @@
 // func_breakable
 // - basically func_assault_destructible for general gameplay use
 //
-void LaunchDebris (string debrisname) =
+void LaunchDebris (string debrisname, vector force) =
 {
 	local	entity dbr;
 
@@ -39,16 +48,22 @@
 	           + '0 1 0' * random() * (self.absmax_y - self.absmin_y)
 	           + '0 0 1' * random() * (self.absmax_z - self.absmin_z));
 	setmodel (dbr, debrisname );
-	dbr.movetype = MOVETYPE_BOUNCE;
-	dbr.solid = SOLID_NOT;
-	// TODO parametrize this
-	dbr.velocity_x = 70 * crandom();
-	dbr.velocity_y = 70 * crandom();
-	dbr.velocity_z = 140 + 70 * random();
-	dbr.avelocity_x = random()*600;
-	dbr.avelocity_y = random()*600;
-	dbr.avelocity_z = random()*600;
-	SUB_SetFade(dbr, time + 1 + random() * 5, 1);
+	dbr.owner = self; // do not be affected by our own explosion
+	dbr.movetype = self.debrismovetype;
+	dbr.solid = self.debrissolid;
+	if(dbr.solid != SOLID_BSP) // SOLID_BSP has exact collision, MAYBE this works? TODO check this out
+		setsize(dbr, '0 0 0', '0 0 0'); // needed for performance, until engine can deal better with it
+	dbr.velocity_x = self.debrisvelocity_x + self.debrisvelocityjitter_x * crandom();
+	dbr.velocity_y = self.debrisvelocity_y + self.debrisvelocityjitter_y * crandom();
+	dbr.velocity_z = self.debrisvelocity_z + self.debrisvelocityjitter_z * crandom();
+	self.velocity = self.velocity + force * self.debrisdamageforcescale;
+	dbr.avelocity_x = random()*self.debrisavelocityjitter_x;
+	dbr.avelocity_y = random()*self.debrisavelocityjitter_y;
+	dbr.avelocity_z = random()*self.debrisavelocityjitter_z;
+	dbr.damageforcescale = self.debrisdamageforcescale;
+	if(dbr.damageforcescale)
+		dbr.takedamage = DAMAGE_YES;
+	SUB_SetFade(dbr, time + self.debristime + crandom() * self.debristimejitter, self.debrisfadetime);
 };
 
 void func_breakable_colormod()
@@ -121,15 +136,17 @@
 	func_breakable_behave_restore();
 }
 
+vector debrisforce; // global, set before calling this
 void func_breakable_destroy() {
 	float n, i;
+	string oldmsg;
 
 	activator = self.owner;
 
 	// now throw around the debris
 	n = tokenize_console(self.debris);
 	for(i = 0; i < n; ++i)
-		LaunchDebris(argv(i));
+		LaunchDebris(argv(i), debrisforce);
 
 	func_breakable_destroyed();
 
@@ -142,7 +159,10 @@
 	if(self.cnt)
 		pointparticles(self.cnt, self.absmin * 0.5 + self.absmax * 0.5, '0 0 0', self.count);
 
+	oldmsg = self.message;
+	self.message = "";
 	SUB_UseTargets();
+	self.message = oldmsg;
 }
 
 void func_breakable_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
@@ -158,7 +178,10 @@
 	func_breakable_colormod();
 
 	if(self.health <= 0)
+	{
+		debrisforce = force;
 		W_PrepareExplosionByDamage(attacker, func_breakable_destroy);
+	}
 }
 
 void func_breakable_reset()
@@ -178,6 +201,15 @@
 		self.health = 100;
 	self.max_health = self.health;
 
+	// yes, I know, MOVETYPE_NONE is not available here, not that one would want it here anyway
+	if(!self.debrismovetype) self.debrismovetype = MOVETYPE_BOUNCE;
+	if(!self.debrissolid) self.debrissolid = SOLID_NOT;
+	if(self.debrisvelocity == '0 0 0') self.debrisvelocity = '0 0 140';
+	if(self.debrisvelocityjitter == '0 0 0') self.debrisvelocityjitter = '70 70 70';
+	if(self.debrisavelocityjitter == '0 0 0') self.debrisavelocityjitter = '600 600 600';
+	if(!self.debristime) self.debristime = 3.5;
+	if(!self.debristimejitter) self.debristime = 2.5;
+
 	if(self.mdl != "")
 		self.cnt = particleeffectnum(self.mdl);
 	if(self.count == 0)

Modified: trunk/data/scripts/entities.def
===================================================================
--- trunk/data/scripts/entities.def	2009-05-03 23:50:45 UTC (rev 6647)
+++ trunk/data/scripts/entities.def	2009-05-04 06:36:40 UTC (rev 6648)
@@ -36,6 +36,26 @@
 health: The damage this trigger can take
 target: The entity/entities to be triggered once this entity gets invisible
 targetname: The name other entities can use to target this entity
+mdl: particle effect name to show when destroyed
+count: particle effect multiplier
+mdl_dead: optional replacement model to show when destroyed
+debris: names of debris models to show when destroyed, separated by spaces
+noise: sound to play when destroyed
+dmg: damage to deal to the environment when destroyed
+dmg_edge: edge damage to deal to the environment when destroyed
+dmg_radius: damage radius
+dmg_force: damage force
+message: death message when a player gets hit by the explosion
+message2: death message when someone gets pushed into this (default: "was pushed into an explosion by"). The # character is replaced by the attacker name if present (and it instead does not get appended to the end)
+debrismovetype: way in which the debris moves: one of 1 = ANGLENOCLIP, 2 = ANGLECLIP, 3 = WALK, 4 = STEP, 5 = FLY, 6 = TOSS, 7 = PUSH, 8 = NOCLIP, 9 = FLYMISSILE, 10 = BOUNCE, 11 = BOUNCEMISSILE
+debrissolid: solidity of the debris: one of 0 = NOT, 1 = TRIGGER, 2 = BBOX, 3 = SLIDEBOX, 4 = BSP, 5 = CORPSE
+debrisvelocity: initial velocity vector of the debris (static part)
+debrisvelocityjitter: initial velocity vector of the debris (random part)
+debrisavelocityjitter: initial angular velocity vector of the debris (random part)
+debristime: time till the debris fades (average)
+debristimejitter: time till the debris fades (random part)
+debrisfadetime: how long debris takes to fade
+debrisdamageforcescale: how much debris is affected by damage force (e.g. explosions)
 */
 
 /*QUAKED func_assault_wall (.5 0 .5) ?
@@ -1406,6 +1426,15 @@
 dmg_force: damage force
 message: death message when a player gets hit by the explosion
 message2: death message when someone gets pushed into this (default: "was pushed into an explosion by"). The # character is replaced by the attacker name if present (and it instead does not get appended to the end)
+debrismovetype: way in which the debris moves: one of 1 = ANGLENOCLIP, 2 = ANGLECLIP, 3 = WALK, 4 = STEP, 5 = FLY, 6 = TOSS, 7 = PUSH, 8 = NOCLIP, 9 = FLYMISSILE, 10 = BOUNCE, 11 = BOUNCEMISSILE
+debrissolid: solidity of the debris: one of 0 = NOT, 1 = TRIGGER, 2 = BBOX, 3 = SLIDEBOX, 4 = BSP, 5 = CORPSE
+debrisvelocity: initial velocity vector of the debris (static part)
+debrisvelocityjitter: initial velocity vector of the debris (random part)
+debrisavelocityjitter: initial angular velocity vector of the debris (random part)
+debristime: time till the debris fades (average)
+debristimejitter: time till the debris fades (random part)
+debrisfadetime: how long debris takes to fade
+debrisdamageforcescale: how much debris is affected by damage force (e.g. explosions)
 -------- SPAWNFLAGS --------
 DISABLED: do not allow damaging this until it is first activated
 INDICATE: indicate amount of damage already taken by coloring



More information about the nexuiz-commits mailing list