r102 - trunk/progsqc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Feb 22 01:24:59 EST 2008


Author: vermeulen
Date: 2008-02-22 01:24:59 -0500 (Fri, 22 Feb 2008)
New Revision: 102

Added:
   trunk/progsqc/ctf.qc
Modified:
   trunk/progsqc/damage.qc
   trunk/progsqc/gamedefs.qc
   trunk/progsqc/inventory.qc
   trunk/progsqc/player.qc
   trunk/progsqc/progs.src
   trunk/progsqc/util.qc
Log:
Added cvars,
g_teams_spawnspots
g_teams_friendlyfire
g_teams_forcecolors
g_teams_flags
g_teams_flags_reward
g_teams_flags_teamreward
Team deathmatch can be done, along with CTF.
Took out obituaries for now, I think i want to do something different for that

Added: trunk/progsqc/ctf.qc
===================================================================
--- trunk/progsqc/ctf.qc	                        (rev 0)
+++ trunk/progsqc/ctf.qc	2008-02-22 06:24:59 UTC (rev 102)
@@ -0,0 +1,264 @@
+void(entity e) RegenFlag =
+{
+	setattachment(e, world, "");
+	e.movetype = MOVETYPE_NONE;
+	e.solid = SOLID_TRIGGER;
+	setorigin(e, e.oldorigin);
+	e.angles = e.mangle;
+	e.cnt = FLAG_BASE;
+	e.owner = world;
+	e.flags = FL_ITEM; // clear FL_ONGROUND and any other junk
+};
+
+void(entity e) ReturnFlag =
+{
+	if (e.owner)
+	if (e.owner.flagcarried == e)
+	{
+		e.owner.flagcarried = world;
+	}
+	e.owner = world;
+	RegenFlag(e);
+};
+
+void(entity e) DropFlag =
+{
+	local entity p;
+
+	if (!e.owner)
+	{
+		dprint("FLAG: drop - no owner?!?!\n");
+		return;
+	}
+	p = e.owner;
+	if (p.flagcarried != e)
+	{
+		dprint("FLAG: drop - owner is not carrying this flag??\n");
+		return;
+	}
+	bprint(p.netname, "^7 lost the ", e.netname, "\n");
+
+	setattachment(e, world, "");
+
+	if (p.flagcarried == e)
+		p.flagcarried = world;
+	e.owner = world;
+
+	e.solid = SOLID_TRIGGER;
+	e.movetype = MOVETYPE_TOSS;
+	setorigin(e, p.origin - '0 0 24' + '0 0 37');
+	e.cnt = FLAG_DROPPED;
+	e.velocity = '0 0 300';
+	e.pain_finished = time + 30;
+
+	trace_startsolid = FALSE;
+	tracebox(e.origin, e.mins, e.maxs, e.origin, TRUE, e);
+	if(trace_startsolid)
+		dprint("FLAG FALLTHROUGH will happen SOON\n");
+};
+
+
+void() FlagTouch =
+{
+	local float t;
+	local entity head;
+	local entity player;
+	local string s, s0, h0;
+	if (other.classname != "player")
+		return;
+	if (other.health < 1) // ignore dead players
+		return;
+
+	if (self.cnt == FLAG_CARRY)
+		return;
+
+	if (self.cnt == FLAG_BASE)
+	if (other.team == self.team)
+	if (other.flagcarried) // he's got a flag
+	if (other.flagcarried.team != self.team) // capture
+	{
+		if (other.flagcarried == world)
+		{
+			return;
+		}
+		bprint(other.netname, "^7 captured the ", other.flagcarried.netname,"\n");
+		other.frags = other.frags + cvar("g_teams_flags_reward");
+
+		// give credit to all players of the team (rewards large teams)
+		// NOTE: this defaults to 0
+		FOR_EACH_PLAYER(head)
+			if (head.team == self.team)
+				head.frags = head.frags + cvar("g_teams_flags_teamreward");
+
+		sound (self, CHAN_AUTO, self.noise2, 1, ATTN_NONE);
+		RegenFlag (other.flagcarried);
+		other.flagcarried = world;
+		other.next_take_time = time + 1;
+	}
+	
+	if (self.cnt == FLAG_BASE)
+	if (other.team != self.team)
+	if (!other.flagcarried)
+	{
+		if (other.next_take_time > time)
+			return;
+		// pick up
+		self.solid = SOLID_NOT;
+		setorigin(self, self.origin); // relink
+		self.owner = other;
+		other.flagcarried = self;
+		self.cnt = FLAG_CARRY;
+		self.angles = '0 0 0';
+		bprint(other.netname, "^7 got the ", self.netname, "\n");
+		//UpdateFrags(other, cvar("g_ctf_flagscore_pickup"));
+
+		sound (self, CHAN_AUTO, self.noise, 1, ATTN_NONE);
+
+		//FOR_EACH_PLAYER(player)
+		//	if(player.team == self.team)
+		//		centerprint(player, "The enemy got your flag! Retrieve it!");
+
+		self.movetype = MOVETYPE_NONE;
+		setorigin(self, '-15 0 7');
+		setattachment(self, other, "");
+
+		return;
+	}
+
+	if (self.cnt == FLAG_DROPPED)
+	{
+		//self.flags = FL_ITEM; // clear FL_ONGROUND and any other junk
+		if (other.team == self.team || (other.team != COLOR_TEAM1 && other.team != COLOR_TEAM2))
+		{
+			// return flag
+			bprint(other.netname, "^7 returned the ", self.netname, "\n");
+			//if (other.team == COLOR_TEAM1 || other.team == COLOR_TEAM2)
+			//	UpdateFrags(other, cvar("g_ctf_flagscore_return"));
+			//else
+			//	UpdateFrags(other, cvar("g_ctf_flagscore_return_rogue"));
+			sound (self, CHAN_AUTO, self.noise1, 1, ATTN_NONE);
+			ReturnFlag(self);
+		}
+		else if (!other.flagcarried)
+		{
+			// pick up
+			self.solid = SOLID_NOT;
+			setorigin(self, self.origin); // relink
+			self.owner = other;
+			other.flagcarried = self;
+			self.cnt = FLAG_CARRY;
+			bprint(other.netname, "^7 picked up the ", self.netname, "\n");
+			//UpdateFrags(other, cvar("g_ctf_flagscore_pickup"));
+			sound (self, CHAN_AUTO, self.noise, 1, ATTN_NONE);
+
+			//FOR_EACH_PLAYER(player)
+			//	if(player.team == self.team)
+			//		centerprint(player, "The enemy got your flag! Retrieve it!");
+
+			self.movetype = MOVETYPE_NONE;	// flag must have MOVETYPE_NONE here, otherwise it will drop through the floor...
+			setorigin(self, '-15 0 7');
+			setattachment(self, other, "");
+		}
+	}
+};
+
+void() FlagThink =
+{
+	local entity e;
+
+	self.nextthink = time + 0.1;
+
+	if (self.cnt == FLAG_BASE)
+		return;
+
+	if (self.cnt == FLAG_DROPPED)
+	{
+		if(self.origin_z < -131072)
+		{
+			dprint("FLAG FALLTHROUGH just happened\n");
+			self.pain_finished = 0;
+		}
+		setattachment(self, world, "");
+		if (time > self.pain_finished)
+		{
+			bprint("The ", self.netname, " has returned to base\n");
+			sound (e, CHAN_AUTO, self.noise3, 1, ATTN_NONE);
+			ReturnFlag(self);
+		}
+		return;
+	}
+
+	e = self.owner;
+	if (e.classname != "player" || (e.deadflag) || (e.flagcarried != self))
+	{
+		dprint("CANNOT HAPPEN - player dead and STILL had a flag!\n");
+		DropFlag(self);
+		return;
+	}
+}
+
+void() flag_setup =
+{
+	if (!self.noise)
+		self.noise = "ctf/take.wav";
+	if (!self.noise1)
+		self.noise1 = "ctf/return.wav";
+	if (!self.noise2)
+		self.noise2 = "ctf/capture.wav";
+	if (!self.noise3)
+		self.noise3 = "ctf/respawn.wav";
+	precache_model (self.model);
+	setmodel (self, self.model); // precision set below
+	precache_sound (self.noise);
+	precache_sound (self.noise1);
+	precache_sound (self.noise2);
+	precache_sound (self.noise3);
+	setsize(self, '-16 -16 -37', '16 16 37');
+	setorigin(self, self.origin + '0 0 37');
+	self.nextthink = time + 0.2; // start after doors etc
+	
+	if(!self.scale)
+		self.scale = 0.6;
+
+	self.effects = self.effects | EF_FULLBRIGHT | EF_LOWPRECISION;
+
+	setattachment(self, world, "");
+
+	self.flags = FL_ITEM;
+	self.solid = SOLID_TRIGGER;
+	self.movetype = MOVETYPE_NONE;
+	self.velocity = '0 0 0';
+	self.origin_z = self.origin_z + 6;
+	self.think = FlagThink;
+	self.touch = FlagTouch;
+	self.nextthink = time + 0.1;
+	self.cnt = FLAG_BASE;
+	self.mangle = self.angles;
+	//self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
+
+	self.oldorigin = self.origin;
+}
+
+void() item_flag_team1 =
+{
+	if (!(cvar("g_teams") && cvar("g_teams_flags")))
+		return;
+	self.team = COLOR_TEAM1;
+	self.classname = "item_flag_team1";
+	self.netname = "^1RED^7 flag";
+	if (!self.model)
+		self.model = "models/items/flag_red.md3";
+	flag_setup();
+}
+
+void() item_flag_team2 =
+{
+	if (!(cvar("g_teams") && cvar("g_teams_flags")))
+		return;
+	self.team = COLOR_TEAM2;
+	self.classname = "item_flag_team2";
+	self.netname = "^1BLUE^7 flag";
+	if (!self.model)
+		self.model = "models/items/flag_blue.md3";
+	flag_setup();
+}
\ No newline at end of file

Modified: trunk/progsqc/damage.qc
===================================================================
--- trunk/progsqc/damage.qc	2008-02-20 02:57:20 UTC (rev 101)
+++ trunk/progsqc/damage.qc	2008-02-22 06:24:59 UTC (rev 102)
@@ -11,196 +11,7 @@
 float DAMAGETYPE_UNKNOWN = 0;
 float DAMAGETYPE_FALL = 1;
 float DAMAGETYPE_WEAP1 = 2;
-float DAMAGETYPE_WEAP2 = 3;
-float DAMAGETYPE_WEAP3 = 4;
-float DAMAGETYPE_WEAP4 = 5;
-float DAMAGETYPE_WEAP5 = 6;
-float DAMAGETYPE_WEAP6 = 7;
 
-void(entity targ, entity attacker, float damagetype, float gibbed) PrintObituary =
-{
-	local float r;
-	local string m1;
-	local string m2;
-	local string m3;
-	local string m4;
-	if (targ.classname != "player")
-		return;
-	r = random();
-	m1 = "";
-	m2 = "";
-	m3 = "";
-	m4 = "";
-	if (targ == attacker)
-	{
-		m1 = targ.netname;
-		m2 = " became bored with life";
-	}
-	else if (teamplay && targ.team == attacker.team)
-	{
-		if (gibbed)
-		{
-			m1 = targ.netname;
-			m2 = " was destroyed by teammate ";
-			m3 = attacker.netname;
-			m4 = "";
-		}
-		else
-		{
-			m1 = targ.netname;
-			m2 = " was gunned down by teammate ";
-			m3 = attacker.netname;
-			m4 = "";
-		}
-	}
-	else if (damagetype == DAMAGETYPE_UNKNOWN)
-	{
-		m1 = targ.netname;
-		m2 = " died";
-	}
-	else if (damagetype == DAMAGETYPE_FALL)
-	{
-		m1 = targ.netname;
-		m2 = " met a flat world";
-	}
-	else if (damagetype == DAMAGETYPE_WEAP1)
-	{
-		m1 = targ.netname;
-		m2 = " now sports a new hole from ";
-		m3 = attacker.netname;
-		m4 = "";
-	}
-	else if (damagetype == DAMAGETYPE_WEAP2)
-	{
-		if (gibbed)
-		{
-			if (r < 0.33)
-			{
-				m1 = targ.netname;
-				m2 = " was disintegrated by ";
-				m3 = attacker.netname;
-				m4 = "";
-			}
-			else if (r < 0.66)
-			{
-				m1 = targ.netname;
-				m2 = " was vaporized by ";
-				m3 = attacker.netname;
-				m4 = "";
-			}
-			else
-			{
-				m1 = targ.netname;
-				m2 = " was melted by ";
-				m3 = attacker.netname;
-				m4 = "";
-			}
-		}
-		else
-		{
-			if (r < 0.25)
-			{
-				m1 = targ.netname;
-				m2 = " was singed by ";
-				m3 = attacker.netname;
-				m4 = "";
-			}
-			else if (r < 0.50)
-			{
-				m1 = targ.netname;
-				m2 = " was splashed by ";
-				m3 = attacker.netname;
-				m4 = "";
-			}
-			else if (r < 0.75)
-			{
-				m1 = targ.netname;
-				m2 = " bathed in plasma from ";
-				m3 = attacker.netname;
-				m4 = "";
-			}
-			else
-			{
-				m1 = targ.netname;
-				m2 = " was schooled in plasma dynamics by ";
-				m3 = attacker.netname;
-				m4 = "";
-			}
-		}
-	}
-	else if (damagetype == DAMAGETYPE_WEAP3)
-	{
-		if (r < 0.50)
-		{
-			m1 = targ.netname;
-			m2 = " was riddled with bullets from ";
-			m3 = attacker.netname;
-			m4 = "";
-		}
-		else if (r < 0.75)
-		{
-			m1 = targ.netname;
-			m2 = " was redecorated by ";
-			m3 = attacker.netname;
-			m4 = "";
-		}
-		else
-		{
-			m1 = targ.netname;
-			m2 = " was schooled in the minigun by ";
-			m3 = attacker.netname;
-			m4 = "";
-		}
-	}
-	else if (damagetype == DAMAGETYPE_WEAP4)
-	{
-		if (gibbed)
-		{
-			m1 = targ.netname;
-			m2 = " was blown apart by a volley from ";
-			m3 = attacker.netname;
-			m4 = "";
-		}
-		else
-		{
-			m1 = targ.netname;
-			m2 = " met a swarm of missiles from ";
-			m3 = attacker.netname;
-			m4 = "";
-		}
-	}
-	else if (damagetype == DAMAGETYPE_WEAP5)
-	{
-		if (gibbed)
-		{
-			m1 = targ.netname;
-			m2 = " was obliterated by ";
-			m3 = attacker.netname;
-			m4 = "";
-		}
-		else
-		{
-			m1 = targ.netname;
-			m2 = " blown into the afterlife by ";
-			m3 = attacker.netname;
-			m4 = "";
-		}
-	}
-	else if (damagetype == DAMAGETYPE_WEAP6)
-	{
-		m1 = targ.netname;
-		m2 = " was rendered absolutely dead by ";
-		m3 = attacker.netname;
-		m4 = "'s plasma railgun";
-	}
-	else
-	{
-		m1 = targ.netname;
-		m2 = " died from an unknown damagetype";
-	}
-	bprint(m1, m2, m3, m4, "\n");
-}
-
 void(entity targ, entity inflictor, entity attacker, float damagetype, float damage, vector location, vector force) T_Damage =
 {
 	local entity oldself;
@@ -211,6 +22,11 @@
 		return;
 	oldself = self;
 	self = targ;
+
+	if ((inflictor.team == attacker.team) && cvar("g_teams"))
+	{
+		damage = damage * cvar("g_teams_friendlyfire");
+	}
 	
 	//bprint(vtos(self.velocity), " ");
 	//bprint(" ", vtos(force));
@@ -259,14 +75,14 @@
 	{
 		if (self.health < self.gibhealth && self.th_gib)
 		{
-			PrintObituary(self, attacker, damagetype, TRUE);
+			attacker.frags = attacker.frags + 1;
 			self.deadflag = DEAD_DEAD;
 			self.solid = SOLID_CORPSE;
 			self.th_gib();
 		}
 		else if (self.health <= 0)
 		{
-			PrintObituary(self, attacker, damagetype, FALSE);
+			attacker.frags = attacker.frags + 1;
 			self.deadflag = DEAD_DYING;
 			self.solid = SOLID_CORPSE;
 			self.th_die();

Modified: trunk/progsqc/gamedefs.qc
===================================================================
--- trunk/progsqc/gamedefs.qc	2008-02-20 02:57:20 UTC (rev 101)
+++ trunk/progsqc/gamedefs.qc	2008-02-22 06:24:59 UTC (rev 102)
@@ -63,10 +63,23 @@
 .float team;
 .float classnum;
 
+.entity flagcarried;
+.float pain_finished;
+.float next_take_time;
+
 float AITYPE_NONE = 0;
 float AITYPE_1 = 1;
 float AITYPE_2 = 2;
 
+float FLAG_BASE = 1;
+float FLAG_CARRY = 2;
+float FLAG_DROPPED = 3;
+
+float COLOR_TEAM1	= 5;  // red
+float COLOR_TEAM2	= 14; // blue
+float COLOR_TEAM3	= 13; // yellow
+float COLOR_TEAM4	= 10; // pink
+
 // gravity scaling (engine feature)
 // TODO: move to defs.qc or dpextensions.qc or something else?
 .float gravity;

Modified: trunk/progsqc/inventory.qc
===================================================================
--- trunk/progsqc/inventory.qc	2008-02-20 02:57:20 UTC (rev 101)
+++ trunk/progsqc/inventory.qc	2008-02-22 06:24:59 UTC (rev 102)
@@ -597,8 +597,6 @@
 {
 	if (other.classname != "player")
 		return;
-	if (other.team != 1)
-	   	return;
 	sound(other, CHAN_AUTO, self.noise, 1, ATTN_NORM);
 	//bprint(self.netname,"\n");
 	

Modified: trunk/progsqc/player.qc
===================================================================
--- trunk/progsqc/player.qc	2008-02-20 02:57:20 UTC (rev 101)
+++ trunk/progsqc/player.qc	2008-02-22 06:24:59 UTC (rev 102)
@@ -5,7 +5,29 @@
 void(float impuls) player_impulse;
 void() bot_npcthink;
 
+void SetTeamColors(entity pl)
+{
+	float pants;// _color;
 
+	/*
+	if(pl.team == 4)
+		_color = COLOR_TEAM4 - 1;
+	else if(pl.team == 3)
+		_color = COLOR_TEAM3 - 1;
+	else if(pl.team == 2)
+		_color = COLOR_TEAM2 - 1;
+	else
+		_color = COLOR_TEAM1 - 1;
+		*/
+	//_color = ;
+
+	pants = (pl.team - 1) & 0x0F;
+
+	bprint(ftos(self.team)," 1\n");
+	setcolor(pl, 16*pants + pants);
+	bprint(ftos(self.team)," 2\n");
+}
+
 entity(float actortyp, float aityp, string mdldir, string mdlext, string snddir) playerclass_spawn =
 {
 	local entity e;
@@ -281,6 +303,14 @@
 {
 };
 
+void() info_player_team1 =
+{
+};
+
+void() info_player_team2 =
+{
+};
+
 /*
 saved out by quaked in region mode
 */
@@ -309,12 +339,20 @@
 	local float r;
 
 	spot = world;
-	if (deathmatch)
+	if (cvar("g_teams_spawnspots") && cvar("g_teams"))
 	{
+		if (self.team == COLOR_TEAM1)
+			name = "info_player_team1";
+		else if (self.team == COLOR_TEAM2)
+			name = "info_player_team2";
+		spot = find(world, classname, name);
+	}
+	else if (deathmatch)
+	{
 		name = "info_player_deathmatch";
 		spot = find(world, classname, name);
 	}
-	if (coop)
+	else if (coop)
 	{
 		name = "info_player_coop";
 		spot = find(world, classname, name);
@@ -330,11 +368,6 @@
 		spot = find(world, classname, name);
 	}
 	if (!spot)
-	{
-		name = "info_player_team1";
-		spot = find(world, classname, name);
-	}
-	if (!spot)
 		error ("No startpoint found\n");
 
 	r = random() * 100;
@@ -363,6 +396,9 @@
 
 	self.flags = FL_CLIENT;
 
+	self.team = cvar("g_startteam");
+	//self.classnum = cvar("g_startclass");
+
 	spot = SelectSpawnPoint ();
 	self.angles = spot.angles;
 	setorigin (self, spot.origin + '0 0 1');
@@ -372,11 +408,12 @@
 	self.nextthink = 0;
 	
 	stuffcmd(self, strcat("exec maps/", mapname, ".cfg\n"));
+
+	if (cvar("g_teams_forcecolors") && (cvar("g_teams")))
+	{
+		SetTeamColors(self);
+	}
 	
-	self.team = cvar("g_playerteam");
-	self.colormap = 1000;
-	//self.classnum = cvar("g_startclass");
-	
 	if (!self.spawned)
 	{
 	   self.health = 1;

Modified: trunk/progsqc/progs.src
===================================================================
--- trunk/progsqc/progs.src	2008-02-20 02:57:20 UTC (rev 101)
+++ trunk/progsqc/progs.src	2008-02-22 06:24:59 UTC (rev 102)
@@ -11,6 +11,7 @@
 inventory.qc
 actor.qc
 player.qc
+ctf.qc
 bots.qc
 structures.qc
 server.qc

Modified: trunk/progsqc/util.qc
===================================================================
--- trunk/progsqc/util.qc	2008-02-20 02:57:20 UTC (rev 101)
+++ trunk/progsqc/util.qc	2008-02-22 06:24:59 UTC (rev 102)
@@ -1,3 +1,9 @@
+#define FOR_EACH_CLIENT(v) for(v = world; (v = findflags(v, flags, FL_CLIENT)) != world; )
+#define FOR_EACH_REALCLIENT(v) FOR_EACH_CLIENT(v) if(clienttype(v) == CLIENTTYPE_REAL)
+string STR_PLAYER = "player";
+#define FOR_EACH_PLAYER(v) for(v = world; (v = find(v, classname, STR_PLAYER)) != world; )
+#define FOR_EACH_REALPLAYER(v) FOR_EACH_PLAYER(v) if(clienttype(v) == CLIENTTYPE_REAL)
+
 void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove;
 void()  SUB_CalcMoveDone;
 void() SUB_CalcAngleMoveDone;




More information about the zymotic-commits mailing list