r4795 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Oct 21 10:32:57 EDT 2008


Author: div0
Date: 2008-10-21 10:32:57 -0400 (Tue, 21 Oct 2008)
New Revision: 4795

Added:
   trunk/data/qcsrc/server/func_breakable.qc
Modified:
   trunk/data/qcsrc/server/miscfunctions.qc
   trunk/data/qcsrc/server/progs.src
Log:
clean up the func_breakable mess a bit; TODO merge it with assault's


Added: trunk/data/qcsrc/server/func_breakable.qc
===================================================================
--- trunk/data/qcsrc/server/func_breakable.qc	                        (rev 0)
+++ trunk/data/qcsrc/server/func_breakable.qc	2008-10-21 14:32:57 UTC (rev 4795)
@@ -0,0 +1,136 @@
+// TODO add assault's colormodding to this, make assault redirect to this one
+// TODO add the fields this uses to the entities.def when done
+
+.string mdl_dead; // or "" to hide when broken
+.string debris; // space separated list of debris models
+// other fields:
+//   mdl = particle effect name
+//   count = particle effect multiplier
+//   targetname = target to trigger to unbreak the model
+//   target = targets to trigger when broken
+// notes:
+//   for mdl_dead to work, origin must be set (using a common/origin brush).
+//   Otherwise mdl_dead will be displayed at the map origin, and nobody would
+//   want that!
+
+.vector mins_save, maxs_save;
+
+void func_breakable_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
+
+//
+// func_breakable
+// - basically func_assault_destructible for general gameplay use
+//
+void LaunchDebris (string debrisname) =
+{
+	local	entity dbr;
+
+	dbr = spawn();
+	dbr.origin = self.origin + self.absmin
+	           + '1 0 0' * random() * (self.absmax_x - self.absmin_x)
+	           + '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);
+};
+
+void func_breakable_make_destroyed()
+{
+	if(self.mdl_dead == "")
+	{
+		self.model = "";
+		self.solid = SOLID_NOT;
+	}
+	else
+	{
+		setmodel(self, self.mdl_dead);
+		self.solid = SOLID_BSP;
+	}
+	self.health = self.max_health;
+	self.takedamage = DAMAGE_NO;
+	self.event_damage = SUB_Null;
+	self.state = 1;
+	setsize(self, '0 0 0', '0 0 0');
+}
+
+void func_breakable_restore()
+{
+	setmodel(self, self.mdl);
+	self.solid = SOLID_BSP;
+	self.health = self.max_health;
+	self.takedamage = DAMAGE_AIM;
+	self.event_damage = func_breakable_damage;
+	self.state = 0;
+	setsize(self, self.mins_save, self.maxs_save);
+}
+
+void func_breakable_destroy() {
+	float n, i;
+
+	func_breakable_make_destroyed();
+
+	// now throw around the debris
+	n = tokenize_sane(self.debris);
+	for(i = 0; i < n; ++i)
+		LaunchDebris(argv(i));
+
+	if(self.cnt)
+		pointparticles(self.cnt, self.absmin * 0.5 + self.absmax * 0.5, '0 0 0', self.count);
+
+	SUB_UseTargets();
+}
+
+void func_breakable_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+	if(self.state == 1)
+		return;
+	self.health = self.health - damage;
+	if(self.health < 0)
+	{
+		activator = attacker;
+		func_breakable_destroy();
+	}
+}
+
+// destructible walls that can be used to trigger target_objective_decrease
+void spawnfunc_func_breakable() {
+	float n, i;
+	if(!self.health)
+		self.health = 100;
+	self.max_health = self.health;
+
+	if(self.mdl != "")
+		self.cnt = particleeffectnum(self.mdl);
+	if(self.count == 0)
+		self.count = 1;
+
+	self.mdl = self.model;
+	SetBrushEntityModel();
+	self.mins_save = self.mins;
+	self.maxs_save = self.mins;
+
+	self.use = func_breakable_restore;
+
+	// precache all the models
+	if (self.mdl_dead)
+		precache_model(self.mdl_dead);
+	n = tokenize_sane(self.debris);
+	for(i = 0; i < n; ++i)
+		precache_model(argv(i));
+
+	self.event_damage = func_breakable_damage;
+
+	if(self.state)
+		func_breakable_make_destroyed();
+	else
+		func_breakable_restore();
+}

Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc	2008-10-21 13:48:58 UTC (rev 4794)
+++ trunk/data/qcsrc/server/miscfunctions.qc	2008-10-21 14:32:57 UTC (rev 4795)
@@ -1441,100 +1441,6 @@
 						return 0;
 }
 
-//
-// func_breakable
-// - basically func_assault_destructible for general gameplay use
-//
-float () crandom;
-void () SUB_UseTargets, assault_destructible_use, SUB_Remove, SUB_Null;
-void LaunchDebris (string debrisname) =
-{
-	local	entity dbr;
-
-	if (debrisname == "" || !debrisname)
-		return;
-
-	dbr = spawn();
-	dbr.origin = self.origin;
-	setmodel (dbr, debrisname );
-	setsize (dbr, '0 0 0', '0 0 0');
-	dbr.velocity_x = 70 * crandom();
-	dbr.velocity_y = 70 * crandom();
-	dbr.velocity_z = 140 + 70 * random();
-	dbr.movetype = MOVETYPE_BOUNCE;
-	dbr.solid = SOLID_BBOX;
-	dbr.avelocity_x = random()*600;
-	dbr.avelocity_y = random()*600;
-	dbr.avelocity_z = random()*600;
-	dbr.think = SUB_Remove;
-	dbr.nextthink = time + 13 + random()*10;
-};
-
-.string debris1, debris2, debris3;
-.string mdl_dead;
-void func_breakable_destroy() {
-	if (self.mdl_dead)
-		setmodel(self, self.mdl_dead);
-	else {
-		self.model = "";
-		self.solid = SOLID_NOT;
-	}
-	self.takedamage = DAMAGE_NO;
-
-	// now throw around the debris
-	LaunchDebris(self.debris1);
-	LaunchDebris(self.debris2);
-	LaunchDebris(self.debris3);
-
-	SUB_UseTargets();
-
-	self.event_damage = SUB_Null;
-}
-
-void func_breakable_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) {
-
-	if(self.cnt > 0) {
-		self.health = self.health - damage;
-		// add pain effects?
-	}
-
-	if(self.health < 0) {
-		activator = attacker;
-		func_breakable_destroy();
-	}
-}
-
-// destructible walls that can be used to trigger target_objective_decrease
-void spawnfunc_func_breakable() {
-	if(!self.health)
-		self.health = 100;
-
-	self.max_health = self.health;
-
-	//self.cnt = 0; // not yet activated
-
-
-
-	self.classname = "func_breakable";
-	self.mdl = self.model;
-	setmodel(self, self.mdl);
-
-	self.solid = SOLID_BSP;
-
-	// precache all the models
-	if (self.mdl_dead)
-		precache_model(self.mdl_dead);
-	if (self.debris1)
-		precache_model(self.debris1);
-	if (self.debris2)
-		precache_model(self.debris2);
-	if (self.debris3)
-		precache_model(self.debris3);
-
-	self.use = assault_destructible_use;	// shared use function, b/c they woudl do the same thing anyways
-	self.event_damage = func_breakable_damage;
-}
-
 void Net_LinkEntity(entity e)
 {
 	e.model = "net_entity";

Modified: trunk/data/qcsrc/server/progs.src
===================================================================
--- trunk/data/qcsrc/server/progs.src	2008-10-21 13:48:58 UTC (rev 4794)
+++ trunk/data/qcsrc/server/progs.src	2008-10-21 14:32:57 UTC (rev 4795)
@@ -141,3 +141,4 @@
 portals.qc
 
 target_spawn.qc
+func_breakable.qc




More information about the nexuiz-commits mailing list