From ef3133c4089555559f6ff5daa81a4f85d8a048e4 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 8 Apr 2006 13:16:09 +0000 Subject: [PATCH] Special escapes for say and team_say: %a = armor, %h = health, %l = location (nearest important item or, if defined, info_location), %x = entity pointed at git-svn-id: svn://svn.icculus.org/nexuiz/trunk@1248 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/gamec/clientcommands.c | 4 + data/qcsrc/server/gamec/ctf.c | 4 + data/qcsrc/server/gamec/miscfunctions.c | 100 +++++++++++++++++++++++ data/qcsrc/server/gamec/t_items.c | 4 + 4 files changed, 112 insertions(+) diff --git a/data/qcsrc/server/gamec/clientcommands.c b/data/qcsrc/server/gamec/clientcommands.c index 5a9faad56..9166b5304 100644 --- a/data/qcsrc/server/gamec/clientcommands.c +++ b/data/qcsrc/server/gamec/clientcommands.c @@ -243,6 +243,10 @@ void SV_ParseClientCommand(string s) { bprint(self.netname, "^2 is ready\n"); ReadyCount(); } + } else if(argv(0) == "say") { + clientcommand(self, formatmessage(s)); + } else if(argv(0) == "say_team") { + clientcommand(self, formatmessage(s)); } else { clientcommand(self,s); } diff --git a/data/qcsrc/server/gamec/ctf.c b/data/qcsrc/server/gamec/ctf.c index f416acc3f..72a92a1e4 100644 --- a/data/qcsrc/server/gamec/ctf.c +++ b/data/qcsrc/server/gamec/ctf.c @@ -444,6 +444,8 @@ void() item_flag_team1 = self.team = 5; // color 4 team (red) self.items = IT_KEY2; // gold key (redish enough) + self.netname = "red base"; + self.target = "###item###"; self.skin = 0; if (!self.model) self.model = "models/ctf/flag_red.md3"; @@ -494,6 +496,8 @@ void() item_flag_team2 = self.team = 14; // color 13 team (blue) self.items = IT_KEY1; // silver key (bluish enough) + self.netname = "blue base"; + self.target = "###item###"; self.skin = 0; if (!self.model) self.model = "models/ctf/flag_blue.md3"; diff --git a/data/qcsrc/server/gamec/miscfunctions.c b/data/qcsrc/server/gamec/miscfunctions.c index a51d53b7d..368bd433a 100644 --- a/data/qcsrc/server/gamec/miscfunctions.c +++ b/data/qcsrc/server/gamec/miscfunctions.c @@ -101,3 +101,103 @@ void relocate_spawnpoint() setorigin(self, find_floor(self.origin) + '0 0 30'); } + +// NOTE: DO NOT USE THIS FUNCTION TOO OFTEN. +// IT WILL MOST PROBABLY DESTROY _ALL_ OTHER TEMP +// STRINGS AND TAKE QUITE LONG. haystack and needle MUST +// BE CONSTANT OR strzoneD! +float(string haystack, string needle, float offset) strstr = +{ + float len, endpos; + string found; + len = strlen(needle); + endpos = strlen(haystack) - len; + while(offset < endpos) + { + found = substring(haystack, offset, len); + if(found == needle) + return offset; + offset = offset + 1; + } + return -1; +} + +entity(vector point, .string field, string value, vector axismod) findnearest = +{ + entity localhead; + entity best; + float bestlen; + + float len; + vector dist; + + best = world; + bestlen = 10000; + localhead = find(world, field, value); + while(localhead) + { + if((localhead.items == IT_KEY1 || localhead.items == IT_KEY2) && localhead.target = "###item###") + dist = localhead.oldorigin; + else + dist = localhead.origin; + dist = dist - point; + dist = dist_x * axismod_x * '1 0 0' + dist_y * axismod_y * '0 1 0' + dist_z * axismod_z * '0 0 1'; + len = vlen(dist); + if(len < bestlen) + { + bestlen = len; + best = localhead; + } + localhead = find(localhead, field, value); + } + return best; +} + +string(string msg) formatmessage = +{ + float p; + string msg_save; + string escape; + string replacement; + msg_save = strzone(msg); + p = 0; + while(1) + { + p = strstr(msg_save, "%", p); + if(p < 0) + break; + replacement = substring(msg_save, p, 2); + escape = substring(msg_save, p + 1, 1); + if(escape == "a") + replacement = ftos(floor(self.armorvalue)); + else if(escape == "h") + replacement = ftos(floor(self.health)); + else if(escape == "l") + { + entity loc; + loc = findnearest(self.origin, classname, "info_location", '1 1 1'); + if(!loc) + loc = findnearest(self.origin, target, "###item###", '1 1 4'); + if(loc) + replacement = loc.netname; + else + replacement = "someplace"; + } + else if(escape == "x") + { + if(self.cursor_trace_ent) + replacement = self.cursor_trace_ent.netname; + else + replacement = "nothing"; + } + dprint(strcat(ftos(p), "<", msg, "\n")); + msg = strcat(substring(msg_save, 0, p), replacement); + msg = strcat(msg, substring(msg_save, p+2, strlen(msg_save) - (p+2))); + dprint(strcat(ftos(p), ">", msg, "\n")); + strunzone(msg_save); + msg_save = strzone(msg); + p = p + 2; + } + strunzone(msg_save); + return msg; +} diff --git a/data/qcsrc/server/gamec/t_items.c b/data/qcsrc/server/gamec/t_items.c index 7f0927a82..d1a9b8430 100644 --- a/data/qcsrc/server/gamec/t_items.c +++ b/data/qcsrc/server/gamec/t_items.c @@ -219,6 +219,10 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, } } + if(itemid & (IT_STRENGTH | IT_INVINCIBLE | IT_KEY1 | IT_KEY2 | IT_ROCKET_LAUNCHER | IT_HAGAR | IT_NEX | IT_CRYLINK | IT_ELECTRO | IT_GRENADE_LAUNCHER | IT_UZI | IT_SHOTGUN | IT_LASER) || itemname == "100 Health" || itemname == "Armor") + { + self.target = "###item###"; // for finding the nearest item using find() + } self.mdl = itemmodel; //self.noise = pickupsound; self.item_pickupsound = pickupsound; -- 2.39.2