[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