r4303 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Sep 2 17:22:16 EDT 2008


Author: avirox
Date: 2008-09-02 17:22:16 -0400 (Tue, 02 Sep 2008)
New Revision: 4303

Modified:
   trunk/data/qcsrc/server/miscfunctions.qc
Log:
- Added new entity: "func_breakable"; functions the same way func_assault_destructible does, but it's for general gameplay use (IE destructible glass, crates, etc.)

Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc	2008-09-02 21:16:56 UTC (rev 4302)
+++ trunk/data/qcsrc/server/miscfunctions.qc	2008-09-02 21:22:16 UTC (rev 4303)
@@ -1303,3 +1303,97 @@
 					else
 						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;
+}
\ No newline at end of file




More information about the nexuiz-commits mailing list