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