r5113 - in trunk/data: qcsrc/server scripts

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Thu Nov 27 03:06:36 EST 2008


Author: div0
Date: 2008-11-27 03:06:32 -0500 (Thu, 27 Nov 2008)
New Revision: 5113

Modified:
   trunk/data/qcsrc/server/arena.qc
   trunk/data/qcsrc/server/assault.qc
   trunk/data/qcsrc/server/func_breakable.qc
   trunk/data/qcsrc/server/g_damage.qc
   trunk/data/qcsrc/server/g_triggers.qc
   trunk/data/qcsrc/server/w_seeker.qc
   trunk/data/scripts/entities.def
Log:
breakable: add support for causing damage, and playing a sound
seeker: allow following func_breakable
assault: fixes


Modified: trunk/data/qcsrc/server/arena.qc
===================================================================
--- trunk/data/qcsrc/server/arena.qc	2008-11-26 20:46:31 UTC (rev 5112)
+++ trunk/data/qcsrc/server/arena.qc	2008-11-27 08:06:32 UTC (rev 5113)
@@ -126,19 +126,22 @@
 		{
 			target_assault_roundend_reset();
 		}
-		else if(self.classname == "target_assault_roundstart")
-		{
-			self.use();
-		}
 	}
 
-	// Waypoints come LAST (keyhunt keys reference them)
+	// Waypoints and assault start come LAST
 	for(self = world; (self = nextent(self)); )
+	if(clienttype(self) == CLIENTTYPE_NOTACLIENT)
+	{
 		if(self.classname == "sprite_waypoint")
 		{
 			if(self.health | g_keyhunt)
 				WaypointSprite_Kill(self);
 		}
+		else if(self.classname == "target_assault_roundstart")
+		{
+			self.use();
+		}
+	}
 
 	// Moving the player reset code here since the player-reset depends
 	// on spawnpoint entities which have to be reset first --blub

Modified: trunk/data/qcsrc/server/assault.qc
===================================================================
--- trunk/data/qcsrc/server/assault.qc	2008-11-26 20:46:31 UTC (rev 5112)
+++ trunk/data/qcsrc/server/assault.qc	2008-11-27 08:06:32 UTC (rev 5113)
@@ -1,7 +1,7 @@
 void spawnfunc_func_breakable();
 void target_objective_decrease_activate();
 .entity assault_decreaser;
-.entity sprite;
+.entity assault_sprite;
 
 void spawnfunc_info_player_attacker() {
 	if(!g_assault)
@@ -64,8 +64,10 @@
 		return;
 	}
 
-	if(other.sprite.classname == "assault_decreaser_sprite")
-		WaypointSprite_Disown(other.sprite, waypointsprite_deadlifetime);
+	if(other.assault_sprite.classname == "assault_decreaser_sprite")
+		WaypointSprite_Disown(other.assault_sprite, waypointsprite_deadlifetime);
+	else
+		return; // already activated! cannot activate again!
 
 	if(self.enemy.health < ASSAULT_VALUE_INACTIVE)
 	{
@@ -129,10 +131,10 @@
 	self.owner = world;
 	for(ent = world; (ent = find(ent, target, self.targetname)); )
 	{
-		if(ent.sprite != world)
-			WaypointSprite_Disown(ent.sprite, waypointsprite_deadlifetime);
+		if(ent.assault_sprite != world)
+			WaypointSprite_Disown(ent.assault_sprite, waypointsprite_deadlifetime);
 
-		spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, sprite);
+		spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite);
 		spr.assault_decreaser = self;
 		spr.waypointsprite_visible_for_player = assault_decreaser_sprite_visible;
 		spr.classname = "assault_decreaser_sprite";
@@ -156,10 +158,6 @@
 
 	self.classname = "target_objective_decrease";
 
-	precache_model("models/sprites/defend.sp2");
-	precache_model("models/sprites/destroy.sp2");
-	precache_model("models/sprites/push.sp2");
-
 	if(!self.dmg) {
 		self.dmg = 101;
 	}

Modified: trunk/data/qcsrc/server/func_breakable.qc
===================================================================
--- trunk/data/qcsrc/server/func_breakable.qc	2008-11-26 20:46:31 UTC (rev 5112)
+++ trunk/data/qcsrc/server/func_breakable.qc	2008-11-27 08:06:32 UTC (rev 5113)
@@ -1,6 +1,9 @@
 .entity sprite;
 
-// TODO add the fields this uses to the entities.def when done
+.float dmg;
+.float dmg_edge;
+.float dmg_radius;
+.float dmg_force;
 
 .string mdl_dead; // or "" to hide when broken
 .string debris; // space separated list of debris models
@@ -117,8 +120,16 @@
 void func_breakable_destroy() {
 	float n, i;
 
+	activator = self.owner;
+
 	func_breakable_destroyed();
 
+	if(self.noise)
+		sound (self, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+
+	if(self.dmg)
+		RadiusDamage(self, activator, self.dmg, self.dmg_edge, self.dmg_radius, self, self.dmg_force, DEATH_HURTTRIGGER, world);
+
 	// now throw around the debris
 	n = tokenize_sane(self.debris);
 	for(i = 0; i < n; ++i)
@@ -140,12 +151,10 @@
 	if(self.sprite)
 		WaypointSprite_Ping(self.sprite);
 	self.health = self.health - damage;
+	func_breakable_colormod();
+
 	if(self.health < 0)
-	{
-		activator = attacker;
-		func_breakable_destroy();
-	}
-	func_breakable_colormod();
+		W_PrepareExplosionByDamage(attacker, func_breakable_destroy);
 }
 
 void func_breakable_reset()
@@ -169,6 +178,15 @@
 	if(self.count == 0)
 		self.count = 1;
 
+	if(!self.message)
+		self.message = "got too close to an explosion";
+	if(!self.message2)
+		self.message2 = "was pushed into an explosion by";
+	if(!self.dmg_radius)
+		self.dmg_radius = 150;
+	if(!self.dmg_force)
+		self.dmg_force = 200;
+
 	self.mdl = self.model;
 	SetBrushEntityModel();
 	self.mins_save = self.mins;
@@ -182,6 +200,8 @@
 	n = tokenize_sane(self.debris);
 	for(i = 0; i < n; ++i)
 		precache_model(argv(i));
+	if(self.noise)
+		precache_sound(self.noise);
 
 	func_breakable_reset();
 }

Modified: trunk/data/qcsrc/server/g_damage.qc
===================================================================
--- trunk/data/qcsrc/server/g_damage.qc	2008-11-26 20:46:31 UTC (rev 5112)
+++ trunk/data/qcsrc/server/g_damage.qc	2008-11-27 08:06:32 UTC (rev 5113)
@@ -432,8 +432,8 @@
 		else
 		{
 			centerprint(targ, "^1Watch your step!\n\n\n");
-			if (deathtype == DEATH_HURTTRIGGER && attacker.message != "")
-				bprint ("^1",s, "^1 ", attacker.message, "\n");
+			if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "")
+				bprint ("^1",s, "^1 ", inflictor.message, "\n");
 			else if (deathtype == DEATH_DROWN)
 				if(sv_gentle)
 					bprint ("^1",s, "^1 was in the water for too long\n");

Modified: trunk/data/qcsrc/server/g_triggers.qc
===================================================================
--- trunk/data/qcsrc/server/g_triggers.qc	2008-11-26 20:46:31 UTC (rev 5112)
+++ trunk/data/qcsrc/server/g_triggers.qc	2008-11-27 08:06:32 UTC (rev 5113)
@@ -86,16 +86,17 @@
 		switch(i)
 		{
 			default:
-			case 0: s = self.target; break;
-			case 1: s = self.target2; break;
-			case 2: s = self.target3; break;
-			case 3: s = self.target4; break;
+			case 0: s = stemp.target; break;
+			case 1: s = stemp.target2; break;
+			case 2: s = stemp.target3; break;
+			case 3: s = stemp.target4; break;
 		}
 		if (s != "")
 		{
 			for(t = world; (t = find(t, targetname, s)); )
 			if(t.use)
 			{
+				print(stemp.classname, " ", stemp.targetname, " -> ", t.classname, " ", t.targetname, "\n");
 				self = t;
 				other = stemp;
 				activator = act;

Modified: trunk/data/qcsrc/server/w_seeker.qc
===================================================================
--- trunk/data/qcsrc/server/w_seeker.qc	2008-11-26 20:46:31 UTC (rev 5112)
+++ trunk/data/qcsrc/server/w_seeker.qc	2008-11-27 08:06:32 UTC (rev 5113)
@@ -33,7 +33,7 @@
 void Seeker_Missile_Think()
 {
 	entity e;
-	vector desireddir, olddir, newdir;
+	vector desireddir, olddir, newdir, eorg;
 	float turnrate;
 	float dist;
 
@@ -56,10 +56,11 @@
 	if (self.enemy != world)
 	{
 		e               = self.enemy;
+		eorg            = 0.5 * (e.absmin + e.absmax);
 		turnrate        = cvar("g_balance_seeker_missile_turnrate");		    // how fast to turn
-		desireddir      = normalize(e.origin - self.origin);
+		desireddir      = normalize(eorg - self.origin);
 		olddir          = normalize(self.velocity);				            // get my current direction
-		dist            = vlen(e.origin - self.origin);
+		dist            = vlen(eorg - self.origin);
 
 		// Do evasive maneuvers for world objects? ( this should be a cpu hog. :P )
 		if (cvar("g_balance_seeker_missile_smart") && (dist > cvar("g_balance_seeker_missile_smart_mindist")))
@@ -68,7 +69,7 @@
 			if ( vlen(self.origin + olddir * self.wait) < dist)
 				traceline(self.origin, self.origin + olddir * self.wait, FALSE, self);
 			else
-				traceline(self.origin, self.enemy.origin, FALSE, self);
+				traceline(self.origin, eorg, FALSE, self);
 
 			// Setup adaptive tracelength
 			self.wait = vlen(self.origin - trace_endpos);

Modified: trunk/data/scripts/entities.def
===================================================================
--- trunk/data/scripts/entities.def	2008-11-26 20:46:31 UTC (rev 5112)
+++ trunk/data/scripts/entities.def	2008-11-27 08:06:32 UTC (rev 5113)
@@ -1165,6 +1165,13 @@
 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)
 -------- 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