From 119728c6a54d327396cc5005e480ceff96716061 Mon Sep 17 00:00:00 2001 From: kadaverjack Date: Thu, 2 Feb 2006 23:06:11 +0000 Subject: [PATCH] - fixed playercount in lms - set intermission at matchend for spectators - spectating bots can be removed now - added score logfile option - fixed bug where exteriorweapon entity was still visible when a player was gibbed git-svn-id: svn://svn.icculus.org/nexuiz/trunk@956 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- Docs/FAQ.aft | 2 +- Docs/FAQ.html | 2 +- data/default.cfg | 7 + data/qcsrc/server/gamec/bots.c | 6 +- data/qcsrc/server/gamec/builtins.h | 1 + data/qcsrc/server/gamec/cl_client.c | 9 +- data/qcsrc/server/gamec/cl_player.c | 1 + data/qcsrc/server/gamec/cl_weaponsystem.c | 5 + data/qcsrc/server/gamec/constants.h | 1 + data/qcsrc/server/gamec/defs.h | 3 + data/qcsrc/server/gamec/g_damage.c | 2 +- data/qcsrc/server/gamec/g_world.c | 81 +- data/qcsrc/server/gamec/mauvebot.c | 13 +- data/qcsrc/server/gamec/urrebot_load.c | 1962 ++++++++++----------- data/qcsrc/server/gamec/w_laser.c | 3 - data/qcsrc/server/gamec/w_nex.c | 2 +- 16 files changed, 1091 insertions(+), 1009 deletions(-) diff --git a/Docs/FAQ.aft b/Docs/FAQ.aft index 9f3be65c9..ac2526914 100644 --- a/Docs/FAQ.aft +++ b/Docs/FAQ.aft @@ -126,4 +126,4 @@ _Game data:_ to check out the Nexuiz svn, you'll need a [svn client (http://subv ^<< svn co svn://svn.icculus.org/nexuiz/trunk/ ^>> -To compile the gamecode you need [fteqcc (http://sourceforge.net/project/showfiles.php?group\_id=116842&package\_id=129507)]. Just download it and run it twice, once in |data/menuqc| and once in |data/qcsrc|. +To compile the gamecode you need [fteqcc (http://sourceforge.net/project/showfiles.php?group\_id=116842&package\_id=129507)]. Just download it and run it twice, once in |data/menuqc| and once in |data/qcsrc/server|. diff --git a/Docs/FAQ.html b/Docs/FAQ.html index 8edf05074..b7f54dd18 100644 --- a/Docs/FAQ.html +++ b/Docs/FAQ.html @@ -298,7 +298,7 @@ There's a
 svn co svn://svn.icculus.org/nexuiz/trunk/
 
-To compile the gamecode you need
fteqcc. Just download it and run it twice, once in data/menuqc and once in data/qcsrc. +To compile the gamecode you need fteqcc. Just download it and run it twice, once in data/menuqc and once in data/qcsrc/server.

diff --git a/data/default.cfg b/data/default.cfg index 673a15fc2..bad1bfbf1 100644 --- a/data/default.cfg +++ b/data/default.cfg @@ -478,3 +478,10 @@ set urrebots_combattime "1" set urrebots_stratsearch_dist "10000000" set urrebots_minisearch_dist "1000" set urrebots_debug "0" + +// score log +alias printstats "set _printstats 1" // print status on demand +set sv_logscores_console 0 // print scores to server console +set sv_logscores_file 0 // print scores to file +set sv_logscores_filename "scores.log" // filename +set sv_logscores_bots 0 // exclude bots by default diff --git a/data/qcsrc/server/gamec/bots.c b/data/qcsrc/server/gamec/bots.c index a4d57a76d..80bdba23e 100644 --- a/data/qcsrc/server/gamec/bots.c +++ b/data/qcsrc/server/gamec/bots.c @@ -128,8 +128,8 @@ void() AutoBotRemove = } if (bot_number > 0) bot_number -= 1; - //if(cvar("g_lms") && self.frags < 1) // DP_SV_BOTCLIENT handles this automaticly - // lms_dead_count -= 1; + self = ent; + ClientDisconnect(); dropclient(ent); } } @@ -222,4 +222,4 @@ void() Bots_Shared = remove_MauveBot(); UrreBotRemove(); } -}; \ No newline at end of file +}; diff --git a/data/qcsrc/server/gamec/builtins.h b/data/qcsrc/server/gamec/builtins.h index 5930077b2..ade5a6a50 100644 --- a/data/qcsrc/server/gamec/builtins.h +++ b/data/qcsrc/server/gamec/builtins.h @@ -64,3 +64,4 @@ string precache_model2 (string s) = #75; string precache_sound2 (string s) = #76; string precache_file2 (string s) = #77; entity(.float fld, float match) findchainflags = #450; +entity(entity start, .float fld, float match) findflags = #449; diff --git a/data/qcsrc/server/gamec/cl_client.c b/data/qcsrc/server/gamec/cl_client.c index 7ed2d953f..11b9050a4 100644 --- a/data/qcsrc/server/gamec/cl_client.c +++ b/data/qcsrc/server/gamec/cl_client.c @@ -186,7 +186,7 @@ void PutObserverInServer (void) self.takedamage = DAMAGE_NO; self.solid = SOLID_NOT; self.movetype = MOVETYPE_NOCLIP; - self.flags = FL_NOTARGET; + self.flags = FL_CLIENT | FL_NOTARGET; self.armorvalue = 666; self.effects = 0; self.armorvalue = cvar("g_balance_armor_start"); @@ -493,6 +493,8 @@ void ClientConnect (void) { self.classname = "player_joining"; + if(player_count<0) player_count = 0; + //if(cvar("g_domination")) // dom_player_join_team(self); @@ -568,8 +570,8 @@ void ClientConnect (void) } } - if(clienttype(self) != CLIENTTYPE_BOT) - player_count += 1; + player_count += 1; + self.jointime = time; } /* @@ -600,7 +602,6 @@ void ClientDisconnect (void) DropAllRunes(self); // decrease player count for lms - // if(clienttype(self) != CLIENTTYPE_BOT) // WHY?! bots are equally clients, let them be! player_count -= 1; // player was dead, decrease dead count if(cvar("g_lms") && self.frags < 1) diff --git a/data/qcsrc/server/gamec/cl_player.c b/data/qcsrc/server/gamec/cl_player.c index 93e887c1b..091a43c89 100644 --- a/data/qcsrc/server/gamec/cl_player.c +++ b/data/qcsrc/server/gamec/cl_player.c @@ -303,6 +303,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if (self.health <= 2) { DropAllRunes(self); + self.deaths += 1; // throw a weapon SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.weapon); diff --git a/data/qcsrc/server/gamec/cl_weaponsystem.c b/data/qcsrc/server/gamec/cl_weaponsystem.c index b539258f0..5ff87c278 100644 --- a/data/qcsrc/server/gamec/cl_weaponsystem.c +++ b/data/qcsrc/server/gamec/cl_weaponsystem.c @@ -106,6 +106,11 @@ void() CL_Weaponentity_Think = void() CL_ExteriorWeaponentity_Think = { self.nextthink = time; + if(self.owner.deadflag != DEAD_NO) + { + self.model = ""; + return; + } if (self.owner.exteriorweaponentity != self) { remove(self); diff --git a/data/qcsrc/server/gamec/constants.h b/data/qcsrc/server/gamec/constants.h index b27e98eb7..5483de41b 100644 --- a/data/qcsrc/server/gamec/constants.h +++ b/data/qcsrc/server/gamec/constants.h @@ -124,6 +124,7 @@ float EF_BRIGHTFIELD = 1; float EF_MUZZLEFLASH = 2; float EF_BRIGHTLIGHT = 4; float EF_DIMLIGHT = 8; +float EF_DOUBLESIDED = 32768; float MSG_BROADCAST = 0; float MSG_ONE = 1; diff --git a/data/qcsrc/server/gamec/defs.h b/data/qcsrc/server/gamec/defs.h index de1c53cf5..45977824c 100644 --- a/data/qcsrc/server/gamec/defs.h +++ b/data/qcsrc/server/gamec/defs.h @@ -233,3 +233,6 @@ float GRAPHOOK_RELEASE = 21; .float nextstep; .float ready; + +.float deaths; +.float jointime; diff --git a/data/qcsrc/server/gamec/g_damage.c b/data/qcsrc/server/gamec/g_damage.c index ce459cda6..2bd5bf012 100644 --- a/data/qcsrc/server/gamec/g_damage.c +++ b/data/qcsrc/server/gamec/g_damage.c @@ -235,7 +235,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float (deathtype == DEATH_SLIME) || (deathtype == DEATH_LAVA)) return; - if (targ.extralives && (deathtype == IT_NEX)) + if (targ.extralives && (deathtype == IT_NEX) && (targ.team != attacker.team || teamplay == 1 || teamplay == 3)) { targ.extralives = targ.extralives - 1; centerprint(targ, strcat("^3Remaining extra lives: ",ftos(targ.extralives),"\n")); diff --git a/data/qcsrc/server/gamec/g_world.c b/data/qcsrc/server/gamec/g_world.c index 0a054fc9a..e73d0d605 100644 --- a/data/qcsrc/server/gamec/g_world.c +++ b/data/qcsrc/server/gamec/g_world.c @@ -534,6 +534,72 @@ RULES =============================================================================== */ +void() DumpStats = +{ + local float file, now; + local string gametype, s; + + if(cvar("_printstats")) + cvar_set("_printstats", "0"); + else if(!gameover) + return; + + now = time; + + if (cvar("g_tdm")) + gametype = "tdm"; + else if (cvar("g_ctf")) + gametype = "ctf"; + else if (cvar("g_domination")) + gametype = "dom"; + else if (cvar("g_runematch")) + gametype = "rune"; + else + gametype = "dm"; + + if(gameover) + s = ":scores:"; + else + s = ":status:"; + + s = strcat(s, gametype, "_", mapname, ":", ftos(now), "\n"); + + if(cvar("sv_logscores_console")) + localcmd("echo ", s); + if(cvar("sv_logscores_file")) + { + file = fopen(cvar_string("sv_logscores_filename"), FILE_APPEND); + fputs(file, s); + } + + other = findchain(classname, "player"); + while (other) + { + if ((clienttype(other) == CLIENTTYPE_REAL) || (clienttype(other) == CLIENTTYPE_BOT && cvar("sv_logscores_bots"))) + { + s = strcat(":player:", ftos(other.frags), ":"); + s = strcat(s, ftos(other.deaths), ":"); + s = strcat(s, ftos(rint(now - other.jointime)), ":"); + s = strcat(s, ftos(other.team), ":", other.netname, "\n"); + + if(cvar("sv_logscores_console")) + localcmd("echo ", s); + if(cvar("sv_logscores_file")) + fputs(file, s); + } + other = other.chain; + } + + if(cvar("sv_logscores_console")) + localcmd("echo :end\n"); + if(cvar("sv_logscores_file")) + { + fputs(file, ":end\n"); + fclose(file); + } +} + + /* go to the next level for deathmatch only called if a time or frag limit has expired @@ -552,8 +618,10 @@ void() NextLevel = WriteByte (MSG_ALL, 3); //pos = FindIntermission (); + + DumpStats(); - other = find (world, classname, "player"); + other = findchainflags(flags, FL_CLIENT); while (other != world) { //other.nextthink = time + 0.5; @@ -582,7 +650,7 @@ void() NextLevel = setorigin (other, pos.origin); } */ - other = find (other, classname, "player"); + other = other.chain; } WriteByte (MSG_ALL, SVC_INTERMISSION); @@ -646,6 +714,8 @@ void() CheckRules_World = if (gameover) // someone else quit the game already return; + DumpStats(); + timelimit = cvar("timelimit") * 60; fraglimit = cvar("fraglimit"); @@ -664,16 +734,13 @@ void() CheckRules_World = // last man camping winning conditions if(cvar("g_lms")) { - local float clients; - clients = player_count;// + bot_number + actualurrebots; // Whoever did this should read up on DP_SV_BOTCLIENT - if(lms_dead_count < 0) lms_dead_count = 0; // goto next map if only one player is alive or // if there is only one player as spectator (could happen with g_lms_join_anytime 1) - if((clients > 1 && (clients - lms_dead_count) <= 1) || - (clients == 1 && lms_dead_count == 1)) + if((player_count > 1 && (player_count - lms_dead_count) <= 1) || + (player_count == 1 && lms_dead_count == 1)) NextLevel(); return; } diff --git a/data/qcsrc/server/gamec/mauvebot.c b/data/qcsrc/server/gamec/mauvebot.c index 6ed3046ab..51f837157 100644 --- a/data/qcsrc/server/gamec/mauvebot.c +++ b/data/qcsrc/server/gamec/mauvebot.c @@ -126,12 +126,12 @@ string () PickARandomName = local string h; local entity t; - t = find(world, classname, "player"); + t = findflags(world, flags, FL_CLIENT); while(t) { if (clienttype(self) == CLIENTTYPE_BOT) y = y + 1; - t = find(t, classname, "player"); + t = findflags(t, flags, FL_CLIENT); } if (y > 18) @@ -207,7 +207,7 @@ void() remove_MauveBot = flo = floor(random() * mauvebots); - ent = find(world, classname, "player"); + ent = findflags(world, flags, FL_CLIENT); while(ent) { @@ -217,10 +217,9 @@ void() remove_MauveBot = { if (flo == i) { + self = ent; + ClientDisconnect(); dropclient(ent); - // bot was dead, so decrease dead count - // if(cvar("g_lms") && self.frags < 1) DP_SV_BOTCLIENT handles this automaticly - // lms_dead_count -= 1; if (mauvebots > 0) mauvebots = mauvebots - 1; return; @@ -228,7 +227,7 @@ void() remove_MauveBot = i = i + 1; } } - ent = find(ent, classname, "player"); + ent = findflags(ent, flags, FL_CLIENT); } }; diff --git a/data/qcsrc/server/gamec/urrebot_load.c b/data/qcsrc/server/gamec/urrebot_load.c index e22d80ee1..c954df023 100644 --- a/data/qcsrc/server/gamec/urrebot_load.c +++ b/data/qcsrc/server/gamec/urrebot_load.c @@ -1,981 +1,981 @@ -/* --- UrreBotSetup --- -Issues a random funky name, random colors, playermodel and team to the bot*/ - -void() UrreBotSetup = -{ - local float r, shirt, pants; - local string s; - - r = random()*18; - if (r <= 1) - s = "GrooveMachine"; - else if (r <= 2) - s = "Worm"; - else if (r <= 3) - s = "ClownLock"; - else if (r <= 4) - s = "DiscO"; - else if (r <= 5) - s = "FunkyFresh"; - else if (r <= 6) - s = "DanceWithMe"; - else if (r <= 7) - s = "BodyJiggle"; - else if (r <= 8) - s = "CantSwim"; - else if (r <= 9) - s = "AtomicDog"; - else if (r <= 10) - s = "Follower"; - else if (r <= 11) - s = "BrassMonkey"; - else if (r <= 12) - s = "SirNose"; - else if (r <= 13) - s = "StarChild"; - else if (r <= 14) - s = "GeorgeC"; - else if (r <= 15) - s = "Bootsy"; - else if (r <= 16) - s = "Flashlight"; - else if (r <= 17) - s = "Bodysnatcher"; - else - s = "Boogieboy"; - - self.netname = s; - - r = random()*15; - if (r <= 1) - { - self.playermodel = "models/player/carni.zym"; - if (random() < 0.5) - self.playerskin = "0"; - else - self.playerskin = "1"; - } - else if (r <= 2) - { - self.playermodel = "models/player/crash.zym"; - self.playerskin = "0"; - } - else if (r <= 3) - { - self.playermodel = "models/player/grunt.zym"; - self.playerskin = "0"; - } - else if (r <= 4) - { - self.playermodel = "models/player/headhunter.zym"; - self.playerskin = "0"; - } - else if (r <= 5) - { - self.playermodel = "models/player/insurrectionist.zym"; - self.playerskin = "0"; - } - else if (r <= 6) - { - self.playermodel = "models/player/jeandarc.zym"; - self.playerskin = "0"; - } - else if (r <= 7) - { - self.playermodel = "models/player/lurk.zym"; - if (random() < 0.5) - self.playerskin = "0"; - else - self.playerskin = "1"; - } - else if (r <= 8) - { - self.playermodel = "models/player/lycanthrope.zym"; - self.playerskin = "0"; - } - else if (r <= 9) - { - self.playermodel = "models/player/marine.zym"; - self.playerskin = "0"; - } - else if (r <= 10) - { - self.playermodel = "models/player/nexus.zym"; - if (random() < 0.5) - self.playerskin = "0"; - else - self.playerskin = "1"; - } - else if (r <= 11) - { - self.playermodel = "models/player/pyria.zym"; - self.playerskin = "0"; - } - else if (r <= 12) - { - self.playermodel = "models/player/shock.zym"; - self.playerskin = "0"; - } - else if (r <= 13) - { - self.playermodel = "models/player/skadi.zym"; - self.playerskin = "0"; - } - else if (r <= 14) - { - self.playermodel = "models/player/specop.zym"; - self.playerskin = "0"; - } - else - { - self.playermodel = "models/player/visitant.zym"; - self.playerskin = "0"; - } - - if (teamplay) - JoinBestTeam(self, 0); - else - { - shirt = floor(random()*15); - pants = floor(random()*15); - self.clientcolors = pants + shirt * 16; - } -}; - -/* --- UrreBotAdd --- -Adds an UrreBot to the server*/ - -entity(float bottype) UrreBotAdd = -{ - local entity ent, ret; - - ent = self; - self = spawnclient(); - if (!self) - { - bprint("Can not add UrreBot, server full\n"); - if (bottype == BOT_TYPE_URREBOT) - cvar_set("urrebots", ftos(urrebots)); - else - cvar_set("bot_number", ftos(bot_number)); - self = ent; - return world; - } - UrreBotSetup(); - self.list = urrebot_chain; - urrebot_chain = self; - ClientConnect(); - PutClientInServer(); - ret = self; - self = ent; - - strategytoken = urrebot_chain; - - return ret; -}; - -/* --- UrreBotRemove --- -removes an UrreBot from the server*/ - -void() UrreBotRemove = -{ - local entity ent, t; - - ent = findchain(classname, "player"); - while (ent) - { - if (clienttype(ent) == CLIENTTYPE_BOT) - { - if (ent.bot_type == BOT_TYPE_URREBOT) - { - if (urrebot_chain == self) - urrebot_chain = self.list; - else - { - t = find(world, classname, "player"); - while(t) - { - if (t.list == ent) - t.list = ent.list; - t = find(t, classname, "player"); - } - } - if (urrebots > 0) - urrebots -= 1; - //if(cvar("g_lms") && self.frags < 1) // DP_SV_BOTCLIENT handles this automaticly - // lms_dead_count -= 1; - dropclient(ent); - } - } - ent = ent.chain; - } -}; - -/* --- SpawnNavNode --- -The one to guess what this does gets free bacon from FrikaC*/ - -entity(vector org, vector nnmins, vector nnmaxs) SpawnNavNode = -{ - newmis = spawn(); - setsize(newmis, nnmins, nnmaxs); - newmis.classname = "navnode"; - setorigin(newmis, org); - return newmis; -}; - -/* --- AddPlane --- -Adds a plane to the plane list of a navnode*/ - -void(entity navn, vector normal, float dist) AddPlane = -{ - local float f; - - newmis = spawn(); - newmis.classname = "plane"; - newmis.list = navn.plane_chain; - navn.plane_chain = newmis; - newmis.mangle = normal*-1; - newmis.delay = dist; - f = (navn.origin * newmis.mangle) - ((navn.origin + (newmis.delay * newmis.mangle)) * newmis.mangle); - if (f > 0) - { - newmis.mangle = newmis.mangle*-1; - newmis.delay = newmis.delay*-1; - } -}; - -/* --- LinkNavNodes --- -Links the navnodes and gives some special attributes (like doors, teleporters)*/ - -void() LinkNavNodes = -{ - local entity e, t, tdest; - - navnode_chain = world; - navnodes = 0; - - e = findchain(classname, "navnode"); - while (e) - { - e.list = navnode_chain; - navnode_chain = e; - e.delay = navnodes; - navnodes = navnodes + 1; - e = e.chain; - } - - e = navnode_chain; - while (e) - { - if (e.link0) - { - e.link0.think = SUB_Remove; - e.link0.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link0.delay) - e.link0 = t; - t = t.list; - } - e.lflags0 = e.lflags0 | LF_REMOTE; - } - if (e.link1) - { - e.link1.think = SUB_Remove; - e.link1.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link1.delay) - e.link1 = t; - t = t.list; - } - e.lflags1 = e.lflags1 | LF_REMOTE; - } - if (e.link2) - { - e.link2.think = SUB_Remove; - e.link2.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link2.delay) - e.link2 = t; - t = t.list; - } - e.lflags2 = e.lflags2 | LF_REMOTE; - } - if (e.link3) - { - e.link3.think = SUB_Remove; - e.link3.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link3.delay) - e.link3 = t; - t = t.list; - } - e.lflags3 = e.lflags3 | LF_REMOTE; - } - if (e.link4) - { - e.link4.think = SUB_Remove; - e.link4.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link4.delay) - e.link4 = t; - t = t.list; - } - e.lflags4 = e.lflags4 | LF_REMOTE; - } - if (e.link5) - { - e.link5.think = SUB_Remove; - e.link5.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link5.delay) - e.link5 = t; - t = t.list; - } - e.lflags5 = e.lflags5 | LF_REMOTE; - } - if (e.link6) - { - e.link6.think = SUB_Remove; - e.link6.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link6.delay) - e.link6 = t; - t = t.list; - } - e.lflags6 = e.lflags6 | LF_REMOTE; - } - if (e.link7) - { - e.link7.think = SUB_Remove; - e.link7.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link7.delay) - e.link7 = t; - t = t.list; - } - e.lflags7 = e.lflags7 | LF_REMOTE; - } - if (e.link8) - { - e.link8.think = SUB_Remove; - e.link8.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link8.delay) - e.link8 = t; - t = t.list; - } - e.lflags8 = e.lflags8 | LF_REMOTE; - } - if (e.link9) - { - e.link9.think = SUB_Remove; - e.link9.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link9.delay) - e.link9 = t; - t = t.list; - } - e.lflags9 = e.lflags9 | LF_REMOTE; - } - if (e.link10) - { - e.link10.think = SUB_Remove; - e.link10.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link10.delay) - e.link10 = t; - t = t.list; - } - e.lflags10 = e.lflags10 | LF_REMOTE; - } - if (e.link11) - { - e.link11.think = SUB_Remove; - e.link11.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link11.delay) - e.link11 = t; - t = t.list; - } - e.lflags11 = e.lflags11 | LF_REMOTE; - } - if (e.link12) - { - e.link12.think = SUB_Remove; - e.link12.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link12.delay) - e.link12 = t; - t = t.list; - } - e.lflags12 = e.lflags12 | LF_REMOTE; - } - if (e.link13) - { - e.link13.think = SUB_Remove; - e.link13.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link13.delay) - e.link13 = t; - t = t.list; - } - e.lflags13 = e.lflags13 | LF_REMOTE; - } - if (e.link14) - { - e.link14.think = SUB_Remove; - e.link14.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link14.delay) - e.link14 = t; - t = t.list; - } - e.lflags14 = e.lflags14 | LF_REMOTE; - } - if (e.link15) - { - e.link15.think = SUB_Remove; - e.link15.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link15.delay) - e.link15 = t; - t = t.list; - } - e.lflags15 = e.lflags15 | LF_REMOTE; - } - if (e.link16) - { - e.link16.think = SUB_Remove; - e.link16.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link16.delay) - e.link16 = t; - t = t.list; - } - e.lflags16 = e.lflags16 | LF_REMOTE; - } - if (e.link17) - { - e.link17.think = SUB_Remove; - e.link17.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link17.delay) - e.link17 = t; - t = t.list; - } - e.lflags17 = e.lflags17 | LF_REMOTE; - } - if (e.link18) - { - e.link18.think = SUB_Remove; - e.link18.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link18.delay) - e.link18 = t; - t = t.list; - } - e.lflags18 = e.lflags18 | LF_REMOTE; - } - if (e.link19) - { - e.link19.think = SUB_Remove; - e.link19.nextthink = time; - t = navnode_chain; - while (t) - { - if (t.delay == e.link19.delay) - e.link19 = t; - t = t.list; - } - e.lflags19 = e.lflags19 | LF_REMOTE; - } - e = e.list; - } - e = navnode_chain; - while (e) - { - if (!(e.sflags & S_TELEPORT)) - { - t = navnode_chain; - while (t) - { - if (boxesoverlap(e.origin + e.mins, e.origin + e.maxs, t.origin + t.mins, t.origin + t.maxs)) - if (t != e) - if (t != e.link0) - if (t != e.link1) - if (t != e.link2) - if (t != e.link3) - if (t != e.link4) - if (t != e.link5) - if (t != e.link6) - if (t != e.link7) - if (t != e.link8) - if (t != e.link9) - if (t != e.link10) - if (t != e.link11) - if (t != e.link12) - if (t != e.link13) - if (t != e.link14) - if (t != e.link15) - if (t != e.link16) - if (t != e.link17) - if (t != e.link18) - if (t != e.link19) - { - if (!e.link0) - e.link0 = t; - else if (!e.link1) - e.link1 = t; - else if (!e.link2) - e.link2 = t; - else if (!e.link3) - e.link3 = t; - else if (!e.link4) - e.link4 = t; - else if (!e.link5) - e.link5 = t; - else if (!e.link6) - e.link6 = t; - else if (!e.link7) - e.link7 = t; - else if (!e.link8) - e.link8 = t; - else if (!e.link9) - e.link9 = t; - else if (!e.link10) - e.link10 = t; - else if (!e.link11) - e.link11 = t; - else if (!e.link12) - e.link12 = t; - else if (!e.link13) - e.link13 = t; - else if (!e.link14) - e.link14 = t; - else if (!e.link15) - e.link15 = t; - else if (!e.link16) - e.link16 = t; - else if (!e.link17) - e.link17 = t; - else if (!e.link18) - e.link18 = t; - else if (!e.link19) - e.link19 = t; - else - dprint("WARNING: Too many linking NavNodes!\n"); - } - t = t.list; - } - } - e = e.list; - } - e = navnode_chain; - while (e) - { - if (e.sflags & S_TELEPORT) - { - t = findchain(classname, "trigger_teleport"); - while (t) - { - if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax)) - { - tdest = find(world, targetname, t.target); - tdest = FindCurrentNavNode(tdest.origin, '0 0 0', '0 0 0'); - e.link0 = tdest; - } - t = t.chain; - } - if (!e.link0) - error("Expected navnode\n"); - } - else if (e.sflags & S_DOOR) - { - t = findchain(classname, "door"); - while (t) - { - if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax)) - e.goalentity = t; - t = t.chain; - } - if (!e.goalentity) - error("Expected door\n"); - } - e = e.list; - } -}; - -/* --- LoadNavNodes --- -Loads the navnodes from an .nnl file (NavNodeList) for the map*/ - -void() LoadNavNodes = -{ - local float f, file, length; - local float pdst; - local float sfl; - local float tfl0, tfl1, tfl2, tfl3, tfl4, tfl5, tfl6, tfl7, tfl8, tfl9; - local float tfl10, tfl11, tfl12, tfl13, tfl14, tfl15, tfl16, tfl17, tfl18, tfl19; - local string s; - local float rl0, rl1, rl2, rl3, rl4, rl5, rl6, rl7, rl8, rl9; - local float rl10, rl11, rl12, rl13, rl14, rl15, rl16, rl17, rl18, rl19; - local vector pln; - local vector wborg, wbmaxs, wbmins; - local entity e, plane_storage; - - if (navnodes) - { - dprint("NavNodes present, map needs to be reloaded to load navnode-file\n"); - return; - } - - plane_storage = spawn(); - - length = strlen(world.model); - length = length - 5; - s = substring(world.model, 5, length); - s = strcat("maps/", s, ".nnl"); - - file = fopen(s, FILE_READ); - - if (file >= 0) - { - dprint("Found navnode file\n"); - s = fgets(file); - while (s == "navnode") - { - f = 0; - pdst = -1; - pln = nullvector; - wborg = wbmaxs = wbmins = nullvector; - plane_storage.plane_chain = world; - sfl = 0; - tfl0 = tfl1 = tfl2 = tfl3 = tfl4 = tfl5 = tfl6 = tfl7 = tfl8 = tfl9 = 0; - tfl10 = tfl11 = tfl12 = tfl13 = tfl14 = tfl15 = tfl16 = tfl17 = tfl18 = tfl19 = 0; - rl0 = rl1 = rl2 = rl3 = rl4 = rl5 = rl6 = rl7 = rl8 = rl9 = -1; - rl10 = rl11 = rl12 = rl13 = rl14 = rl15 = rl16 = rl17 = rl18 = rl19 = -1; - s = fgets(file); - wborg = stov(s); - s = fgets(file); - wbmins = stov(s); - s = fgets(file); - wbmaxs = stov(s); - s = fgets(file); - while (s == "plane") - { - s = fgets(file); - pln = stov(s); - s = fgets(file); - pdst = stof(s); - AddPlane(plane_storage, pln*-1, pdst); - s = fgets(file); - } - while (substring(s, 0, 6) == "remote") - { - length = strlen(s); - f = stof(substring(s, 6, length)); - s = fgets(file); - if (!f) - rl0 = stof(s); - else if (f == 1) - rl1 = stof(s); - else if (f == 2) - rl2 = stof(s); - else if (f == 3) - rl3 = stof(s); - else if (f == 4) - rl4 = stof(s); - else if (f == 5) - rl5 = stof(s); - else if (f == 6) - rl6 = stof(s); - else if (f == 7) - rl7 = stof(s); - else if (f == 8) - rl8 = stof(s); - else if (f == 9) - rl9 = stof(s); - else if (f == 10) - rl10 = stof(s); - else if (f == 11) - rl11 = stof(s); - else if (f == 12) - rl12 = stof(s); - else if (f == 13) - rl13 = stof(s); - else if (f == 14) - rl14 = stof(s); - else if (f == 15) - rl15 = stof(s); - else if (f == 16) - rl16 = stof(s); - else if (f == 17) - rl17 = stof(s); - else if (f == 18) - rl18 = stof(s); - else if (f == 19) - rl19 = stof(s); - s = fgets(file); - } - if (s == "sflags") - { - s = fgets(file); - sfl = stof(s); - s = fgets(file); - } - while (substring(s, 0, 6) == "lflags") - { - length = strlen(s); - f = stof(substring(s, 6, length)); - s = fgets(file); - if (!f) - tfl0 = stof(s); - else if (f == 1) - tfl1 = stof(s); - else if (f == 2) - tfl2 = stof(s); - else if (f == 3) - tfl3 = stof(s); - else if (f == 4) - tfl4 = stof(s); - else if (f == 5) - tfl5 = stof(s); - else if (f == 6) - tfl6 = stof(s); - else if (f == 7) - tfl7 = stof(s); - else if (f == 8) - tfl8 = stof(s); - else if (f == 9) - tfl9 = stof(s); - else if (f == 10) - tfl10 = stof(s); - else if (f == 11) - tfl11 = stof(s); - else if (f == 12) - tfl12 = stof(s); - else if (f == 13) - tfl13 = stof(s); - else if (f == 14) - tfl14 = stof(s); - else if (f == 15) - tfl15 = stof(s); - else if (f == 16) - tfl16 = stof(s); - else if (f == 17) - tfl17 = stof(s); - else if (f == 18) - tfl18 = stof(s); - else if (f == 19) - tfl19 = stof(s); - s = fgets(file); - } - e = SpawnNavNode(wborg, wbmins, wbmaxs); - if (plane_storage.plane_chain) - e.plane_chain = plane_storage.plane_chain; - e.sflags = sfl; - e.lflags0 = tfl0; - e.lflags1 = tfl1; - e.lflags2 = tfl2; - e.lflags3 = tfl3; - e.lflags4 = tfl4; - e.lflags5 = tfl5; - e.lflags6 = tfl6; - e.lflags7 = tfl7; - e.lflags8 = tfl8; - e.lflags9 = tfl9; - e.lflags10 = tfl10; - e.lflags11 = tfl11; - e.lflags12 = tfl12; - e.lflags13 = tfl13; - e.lflags14 = tfl14; - e.lflags15 = tfl15; - e.lflags16 = tfl16; - e.lflags17 = tfl17; - e.lflags18 = tfl18; - e.lflags19 = tfl19; - if (rl0 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl0; - e.link0 = newmis; - } - if (rl1 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl1; - e.link1 = newmis; - } - if (rl2 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl2; - e.link2 = newmis; - } - if (rl3 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl3; - e.link3 = newmis; - } - if (rl4 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl4; - e.link4 = newmis; - } - if (rl5 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl5; - e.link5 = newmis; - } - if (rl6 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl6; - e.link6 = newmis; - } - if (rl7 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl7; - e.link7 = newmis; - } - if (rl8 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl8; - e.link8 = newmis; - } - if (rl9 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl9; - e.link9 = newmis; - } - if (rl10 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl10; - e.link10 = newmis; - } - if (rl11 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl11; - e.link11 = newmis; - } - if (rl12 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl12; - e.link12 = newmis; - } - if (rl13 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl13; - e.link13 = newmis; - } - if (rl14 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl14; - e.link14 = newmis; - } - if (rl15 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl15; - e.link15 = newmis; - } - if (rl16 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl16; - e.link16 = newmis; - } - if (rl17 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl17; - e.link17 = newmis; - } - if (rl18 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl18; - e.link18 = newmis; - } - if (rl19 > -1) - { - newmis = spawn(); - newmis.classname = "remotelinker"; - newmis.delay = rl19; - e.link19 = newmis; - } - } - fclose(file); - } - else - dprint("No navnode file found\n"); - remove(plane_storage); - plane_storage = world; -}; \ No newline at end of file +/* --- UrreBotSetup --- +Issues a random funky name, random colors, playermodel and team to the bot*/ + +void() UrreBotSetup = +{ + local float r, shirt, pants; + local string s; + + r = random()*18; + if (r <= 1) + s = "GrooveMachine"; + else if (r <= 2) + s = "Worm"; + else if (r <= 3) + s = "ClownLock"; + else if (r <= 4) + s = "DiscO"; + else if (r <= 5) + s = "FunkyFresh"; + else if (r <= 6) + s = "DanceWithMe"; + else if (r <= 7) + s = "BodyJiggle"; + else if (r <= 8) + s = "CantSwim"; + else if (r <= 9) + s = "AtomicDog"; + else if (r <= 10) + s = "Follower"; + else if (r <= 11) + s = "BrassMonkey"; + else if (r <= 12) + s = "SirNose"; + else if (r <= 13) + s = "StarChild"; + else if (r <= 14) + s = "GeorgeC"; + else if (r <= 15) + s = "Bootsy"; + else if (r <= 16) + s = "Flashlight"; + else if (r <= 17) + s = "Bodysnatcher"; + else + s = "Boogieboy"; + + self.netname = s; + + r = random()*15; + if (r <= 1) + { + self.playermodel = "models/player/carni.zym"; + if (random() < 0.5) + self.playerskin = "0"; + else + self.playerskin = "1"; + } + else if (r <= 2) + { + self.playermodel = "models/player/crash.zym"; + self.playerskin = "0"; + } + else if (r <= 3) + { + self.playermodel = "models/player/grunt.zym"; + self.playerskin = "0"; + } + else if (r <= 4) + { + self.playermodel = "models/player/headhunter.zym"; + self.playerskin = "0"; + } + else if (r <= 5) + { + self.playermodel = "models/player/insurrectionist.zym"; + self.playerskin = "0"; + } + else if (r <= 6) + { + self.playermodel = "models/player/jeandarc.zym"; + self.playerskin = "0"; + } + else if (r <= 7) + { + self.playermodel = "models/player/lurk.zym"; + if (random() < 0.5) + self.playerskin = "0"; + else + self.playerskin = "1"; + } + else if (r <= 8) + { + self.playermodel = "models/player/lycanthrope.zym"; + self.playerskin = "0"; + } + else if (r <= 9) + { + self.playermodel = "models/player/marine.zym"; + self.playerskin = "0"; + } + else if (r <= 10) + { + self.playermodel = "models/player/nexus.zym"; + if (random() < 0.5) + self.playerskin = "0"; + else + self.playerskin = "1"; + } + else if (r <= 11) + { + self.playermodel = "models/player/pyria.zym"; + self.playerskin = "0"; + } + else if (r <= 12) + { + self.playermodel = "models/player/shock.zym"; + self.playerskin = "0"; + } + else if (r <= 13) + { + self.playermodel = "models/player/skadi.zym"; + self.playerskin = "0"; + } + else if (r <= 14) + { + self.playermodel = "models/player/specop.zym"; + self.playerskin = "0"; + } + else + { + self.playermodel = "models/player/visitant.zym"; + self.playerskin = "0"; + } + + if (teamplay) + JoinBestTeam(self, 0); + else + { + shirt = floor(random()*15); + pants = floor(random()*15); + self.clientcolors = pants + shirt * 16; + } +}; + +/* --- UrreBotAdd --- +Adds an UrreBot to the server*/ + +entity(float bottype) UrreBotAdd = +{ + local entity ent, ret; + + ent = self; + self = spawnclient(); + if (!self) + { + bprint("Can not add UrreBot, server full\n"); + if (bottype == BOT_TYPE_URREBOT) + cvar_set("urrebots", ftos(urrebots)); + else + cvar_set("bot_number", ftos(bot_number)); + self = ent; + return world; + } + UrreBotSetup(); + self.list = urrebot_chain; + urrebot_chain = self; + ClientConnect(); + PutClientInServer(); + ret = self; + self = ent; + + strategytoken = urrebot_chain; + + return ret; +}; + +/* --- UrreBotRemove --- +removes an UrreBot from the server*/ + +void() UrreBotRemove = +{ + local entity ent, t; + + ent = findchainflags(flags, FL_CLIENT); + while (ent) + { + if (clienttype(ent) == CLIENTTYPE_BOT) + { + if (ent.bot_type == BOT_TYPE_URREBOT) + { + if (urrebot_chain == self) + urrebot_chain = self.list; + else + { + t = find(world, classname, "player"); + while(t) + { + if (t.list == ent) + t.list = ent.list; + t = find(t, classname, "player"); + } + } + if (urrebots > 0) + urrebots -= 1; + self = ent; + ClientDisconnect(); + dropclient(ent); + } + } + ent = ent.chain; + } +}; + +/* --- SpawnNavNode --- +The one to guess what this does gets free bacon from FrikaC*/ + +entity(vector org, vector nnmins, vector nnmaxs) SpawnNavNode = +{ + newmis = spawn(); + setsize(newmis, nnmins, nnmaxs); + newmis.classname = "navnode"; + setorigin(newmis, org); + return newmis; +}; + +/* --- AddPlane --- +Adds a plane to the plane list of a navnode*/ + +void(entity navn, vector normal, float dist) AddPlane = +{ + local float f; + + newmis = spawn(); + newmis.classname = "plane"; + newmis.list = navn.plane_chain; + navn.plane_chain = newmis; + newmis.mangle = normal*-1; + newmis.delay = dist; + f = (navn.origin * newmis.mangle) - ((navn.origin + (newmis.delay * newmis.mangle)) * newmis.mangle); + if (f > 0) + { + newmis.mangle = newmis.mangle*-1; + newmis.delay = newmis.delay*-1; + } +}; + +/* --- LinkNavNodes --- +Links the navnodes and gives some special attributes (like doors, teleporters)*/ + +void() LinkNavNodes = +{ + local entity e, t, tdest; + + navnode_chain = world; + navnodes = 0; + + e = findchain(classname, "navnode"); + while (e) + { + e.list = navnode_chain; + navnode_chain = e; + e.delay = navnodes; + navnodes = navnodes + 1; + e = e.chain; + } + + e = navnode_chain; + while (e) + { + if (e.link0) + { + e.link0.think = SUB_Remove; + e.link0.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link0.delay) + e.link0 = t; + t = t.list; + } + e.lflags0 = e.lflags0 | LF_REMOTE; + } + if (e.link1) + { + e.link1.think = SUB_Remove; + e.link1.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link1.delay) + e.link1 = t; + t = t.list; + } + e.lflags1 = e.lflags1 | LF_REMOTE; + } + if (e.link2) + { + e.link2.think = SUB_Remove; + e.link2.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link2.delay) + e.link2 = t; + t = t.list; + } + e.lflags2 = e.lflags2 | LF_REMOTE; + } + if (e.link3) + { + e.link3.think = SUB_Remove; + e.link3.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link3.delay) + e.link3 = t; + t = t.list; + } + e.lflags3 = e.lflags3 | LF_REMOTE; + } + if (e.link4) + { + e.link4.think = SUB_Remove; + e.link4.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link4.delay) + e.link4 = t; + t = t.list; + } + e.lflags4 = e.lflags4 | LF_REMOTE; + } + if (e.link5) + { + e.link5.think = SUB_Remove; + e.link5.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link5.delay) + e.link5 = t; + t = t.list; + } + e.lflags5 = e.lflags5 | LF_REMOTE; + } + if (e.link6) + { + e.link6.think = SUB_Remove; + e.link6.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link6.delay) + e.link6 = t; + t = t.list; + } + e.lflags6 = e.lflags6 | LF_REMOTE; + } + if (e.link7) + { + e.link7.think = SUB_Remove; + e.link7.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link7.delay) + e.link7 = t; + t = t.list; + } + e.lflags7 = e.lflags7 | LF_REMOTE; + } + if (e.link8) + { + e.link8.think = SUB_Remove; + e.link8.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link8.delay) + e.link8 = t; + t = t.list; + } + e.lflags8 = e.lflags8 | LF_REMOTE; + } + if (e.link9) + { + e.link9.think = SUB_Remove; + e.link9.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link9.delay) + e.link9 = t; + t = t.list; + } + e.lflags9 = e.lflags9 | LF_REMOTE; + } + if (e.link10) + { + e.link10.think = SUB_Remove; + e.link10.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link10.delay) + e.link10 = t; + t = t.list; + } + e.lflags10 = e.lflags10 | LF_REMOTE; + } + if (e.link11) + { + e.link11.think = SUB_Remove; + e.link11.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link11.delay) + e.link11 = t; + t = t.list; + } + e.lflags11 = e.lflags11 | LF_REMOTE; + } + if (e.link12) + { + e.link12.think = SUB_Remove; + e.link12.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link12.delay) + e.link12 = t; + t = t.list; + } + e.lflags12 = e.lflags12 | LF_REMOTE; + } + if (e.link13) + { + e.link13.think = SUB_Remove; + e.link13.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link13.delay) + e.link13 = t; + t = t.list; + } + e.lflags13 = e.lflags13 | LF_REMOTE; + } + if (e.link14) + { + e.link14.think = SUB_Remove; + e.link14.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link14.delay) + e.link14 = t; + t = t.list; + } + e.lflags14 = e.lflags14 | LF_REMOTE; + } + if (e.link15) + { + e.link15.think = SUB_Remove; + e.link15.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link15.delay) + e.link15 = t; + t = t.list; + } + e.lflags15 = e.lflags15 | LF_REMOTE; + } + if (e.link16) + { + e.link16.think = SUB_Remove; + e.link16.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link16.delay) + e.link16 = t; + t = t.list; + } + e.lflags16 = e.lflags16 | LF_REMOTE; + } + if (e.link17) + { + e.link17.think = SUB_Remove; + e.link17.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link17.delay) + e.link17 = t; + t = t.list; + } + e.lflags17 = e.lflags17 | LF_REMOTE; + } + if (e.link18) + { + e.link18.think = SUB_Remove; + e.link18.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link18.delay) + e.link18 = t; + t = t.list; + } + e.lflags18 = e.lflags18 | LF_REMOTE; + } + if (e.link19) + { + e.link19.think = SUB_Remove; + e.link19.nextthink = time; + t = navnode_chain; + while (t) + { + if (t.delay == e.link19.delay) + e.link19 = t; + t = t.list; + } + e.lflags19 = e.lflags19 | LF_REMOTE; + } + e = e.list; + } + e = navnode_chain; + while (e) + { + if (!(e.sflags & S_TELEPORT)) + { + t = navnode_chain; + while (t) + { + if (boxesoverlap(e.origin + e.mins, e.origin + e.maxs, t.origin + t.mins, t.origin + t.maxs)) + if (t != e) + if (t != e.link0) + if (t != e.link1) + if (t != e.link2) + if (t != e.link3) + if (t != e.link4) + if (t != e.link5) + if (t != e.link6) + if (t != e.link7) + if (t != e.link8) + if (t != e.link9) + if (t != e.link10) + if (t != e.link11) + if (t != e.link12) + if (t != e.link13) + if (t != e.link14) + if (t != e.link15) + if (t != e.link16) + if (t != e.link17) + if (t != e.link18) + if (t != e.link19) + { + if (!e.link0) + e.link0 = t; + else if (!e.link1) + e.link1 = t; + else if (!e.link2) + e.link2 = t; + else if (!e.link3) + e.link3 = t; + else if (!e.link4) + e.link4 = t; + else if (!e.link5) + e.link5 = t; + else if (!e.link6) + e.link6 = t; + else if (!e.link7) + e.link7 = t; + else if (!e.link8) + e.link8 = t; + else if (!e.link9) + e.link9 = t; + else if (!e.link10) + e.link10 = t; + else if (!e.link11) + e.link11 = t; + else if (!e.link12) + e.link12 = t; + else if (!e.link13) + e.link13 = t; + else if (!e.link14) + e.link14 = t; + else if (!e.link15) + e.link15 = t; + else if (!e.link16) + e.link16 = t; + else if (!e.link17) + e.link17 = t; + else if (!e.link18) + e.link18 = t; + else if (!e.link19) + e.link19 = t; + else + dprint("WARNING: Too many linking NavNodes!\n"); + } + t = t.list; + } + } + e = e.list; + } + e = navnode_chain; + while (e) + { + if (e.sflags & S_TELEPORT) + { + t = findchain(classname, "trigger_teleport"); + while (t) + { + if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax)) + { + tdest = find(world, targetname, t.target); + tdest = FindCurrentNavNode(tdest.origin, '0 0 0', '0 0 0'); + e.link0 = tdest; + } + t = t.chain; + } + if (!e.link0) + error("Expected navnode\n"); + } + else if (e.sflags & S_DOOR) + { + t = findchain(classname, "door"); + while (t) + { + if (boxesoverlap(t.absmin, t.absmax, e.absmin, e.absmax)) + e.goalentity = t; + t = t.chain; + } + if (!e.goalentity) + error("Expected door\n"); + } + e = e.list; + } +}; + +/* --- LoadNavNodes --- +Loads the navnodes from an .nnl file (NavNodeList) for the map*/ + +void() LoadNavNodes = +{ + local float f, file, length; + local float pdst; + local float sfl; + local float tfl0, tfl1, tfl2, tfl3, tfl4, tfl5, tfl6, tfl7, tfl8, tfl9; + local float tfl10, tfl11, tfl12, tfl13, tfl14, tfl15, tfl16, tfl17, tfl18, tfl19; + local string s; + local float rl0, rl1, rl2, rl3, rl4, rl5, rl6, rl7, rl8, rl9; + local float rl10, rl11, rl12, rl13, rl14, rl15, rl16, rl17, rl18, rl19; + local vector pln; + local vector wborg, wbmaxs, wbmins; + local entity e, plane_storage; + + if (navnodes) + { + dprint("NavNodes present, map needs to be reloaded to load navnode-file\n"); + return; + } + + plane_storage = spawn(); + + length = strlen(world.model); + length = length - 5; + s = substring(world.model, 5, length); + s = strcat("maps/", s, ".nnl"); + + file = fopen(s, FILE_READ); + + if (file >= 0) + { + dprint("Found navnode file\n"); + s = fgets(file); + while (s == "navnode") + { + f = 0; + pdst = -1; + pln = nullvector; + wborg = wbmaxs = wbmins = nullvector; + plane_storage.plane_chain = world; + sfl = 0; + tfl0 = tfl1 = tfl2 = tfl3 = tfl4 = tfl5 = tfl6 = tfl7 = tfl8 = tfl9 = 0; + tfl10 = tfl11 = tfl12 = tfl13 = tfl14 = tfl15 = tfl16 = tfl17 = tfl18 = tfl19 = 0; + rl0 = rl1 = rl2 = rl3 = rl4 = rl5 = rl6 = rl7 = rl8 = rl9 = -1; + rl10 = rl11 = rl12 = rl13 = rl14 = rl15 = rl16 = rl17 = rl18 = rl19 = -1; + s = fgets(file); + wborg = stov(s); + s = fgets(file); + wbmins = stov(s); + s = fgets(file); + wbmaxs = stov(s); + s = fgets(file); + while (s == "plane") + { + s = fgets(file); + pln = stov(s); + s = fgets(file); + pdst = stof(s); + AddPlane(plane_storage, pln*-1, pdst); + s = fgets(file); + } + while (substring(s, 0, 6) == "remote") + { + length = strlen(s); + f = stof(substring(s, 6, length)); + s = fgets(file); + if (!f) + rl0 = stof(s); + else if (f == 1) + rl1 = stof(s); + else if (f == 2) + rl2 = stof(s); + else if (f == 3) + rl3 = stof(s); + else if (f == 4) + rl4 = stof(s); + else if (f == 5) + rl5 = stof(s); + else if (f == 6) + rl6 = stof(s); + else if (f == 7) + rl7 = stof(s); + else if (f == 8) + rl8 = stof(s); + else if (f == 9) + rl9 = stof(s); + else if (f == 10) + rl10 = stof(s); + else if (f == 11) + rl11 = stof(s); + else if (f == 12) + rl12 = stof(s); + else if (f == 13) + rl13 = stof(s); + else if (f == 14) + rl14 = stof(s); + else if (f == 15) + rl15 = stof(s); + else if (f == 16) + rl16 = stof(s); + else if (f == 17) + rl17 = stof(s); + else if (f == 18) + rl18 = stof(s); + else if (f == 19) + rl19 = stof(s); + s = fgets(file); + } + if (s == "sflags") + { + s = fgets(file); + sfl = stof(s); + s = fgets(file); + } + while (substring(s, 0, 6) == "lflags") + { + length = strlen(s); + f = stof(substring(s, 6, length)); + s = fgets(file); + if (!f) + tfl0 = stof(s); + else if (f == 1) + tfl1 = stof(s); + else if (f == 2) + tfl2 = stof(s); + else if (f == 3) + tfl3 = stof(s); + else if (f == 4) + tfl4 = stof(s); + else if (f == 5) + tfl5 = stof(s); + else if (f == 6) + tfl6 = stof(s); + else if (f == 7) + tfl7 = stof(s); + else if (f == 8) + tfl8 = stof(s); + else if (f == 9) + tfl9 = stof(s); + else if (f == 10) + tfl10 = stof(s); + else if (f == 11) + tfl11 = stof(s); + else if (f == 12) + tfl12 = stof(s); + else if (f == 13) + tfl13 = stof(s); + else if (f == 14) + tfl14 = stof(s); + else if (f == 15) + tfl15 = stof(s); + else if (f == 16) + tfl16 = stof(s); + else if (f == 17) + tfl17 = stof(s); + else if (f == 18) + tfl18 = stof(s); + else if (f == 19) + tfl19 = stof(s); + s = fgets(file); + } + e = SpawnNavNode(wborg, wbmins, wbmaxs); + if (plane_storage.plane_chain) + e.plane_chain = plane_storage.plane_chain; + e.sflags = sfl; + e.lflags0 = tfl0; + e.lflags1 = tfl1; + e.lflags2 = tfl2; + e.lflags3 = tfl3; + e.lflags4 = tfl4; + e.lflags5 = tfl5; + e.lflags6 = tfl6; + e.lflags7 = tfl7; + e.lflags8 = tfl8; + e.lflags9 = tfl9; + e.lflags10 = tfl10; + e.lflags11 = tfl11; + e.lflags12 = tfl12; + e.lflags13 = tfl13; + e.lflags14 = tfl14; + e.lflags15 = tfl15; + e.lflags16 = tfl16; + e.lflags17 = tfl17; + e.lflags18 = tfl18; + e.lflags19 = tfl19; + if (rl0 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl0; + e.link0 = newmis; + } + if (rl1 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl1; + e.link1 = newmis; + } + if (rl2 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl2; + e.link2 = newmis; + } + if (rl3 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl3; + e.link3 = newmis; + } + if (rl4 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl4; + e.link4 = newmis; + } + if (rl5 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl5; + e.link5 = newmis; + } + if (rl6 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl6; + e.link6 = newmis; + } + if (rl7 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl7; + e.link7 = newmis; + } + if (rl8 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl8; + e.link8 = newmis; + } + if (rl9 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl9; + e.link9 = newmis; + } + if (rl10 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl10; + e.link10 = newmis; + } + if (rl11 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl11; + e.link11 = newmis; + } + if (rl12 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl12; + e.link12 = newmis; + } + if (rl13 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl13; + e.link13 = newmis; + } + if (rl14 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl14; + e.link14 = newmis; + } + if (rl15 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl15; + e.link15 = newmis; + } + if (rl16 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl16; + e.link16 = newmis; + } + if (rl17 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl17; + e.link17 = newmis; + } + if (rl18 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl18; + e.link18 = newmis; + } + if (rl19 > -1) + { + newmis = spawn(); + newmis.classname = "remotelinker"; + newmis.delay = rl19; + e.link19 = newmis; + } + } + fclose(file); + } + else + dprint("No navnode file found\n"); + remove(plane_storage); + plane_storage = world; +}; diff --git a/data/qcsrc/server/gamec/w_laser.c b/data/qcsrc/server/gamec/w_laser.c index efe295d28..b6a5089c2 100644 --- a/data/qcsrc/server/gamec/w_laser.c +++ b/data/qcsrc/server/gamec/w_laser.c @@ -1,11 +1,8 @@ void() laser_ready_01; void() laser_fire1_01; -void() laser_fire2_01; void() laser_deselect_01; void() laser_select_01; -void() W_LastUsedWeapon; - float() laser_check = {return TRUE;}; void(float req) w_laser = diff --git a/data/qcsrc/server/gamec/w_nex.c b/data/qcsrc/server/gamec/w_nex.c index e4117919d..f8dfb1e1d 100644 --- a/data/qcsrc/server/gamec/w_nex.c +++ b/data/qcsrc/server/gamec/w_nex.c @@ -136,7 +136,7 @@ void W_Nex_Attack (void) // assure that nexdamage is high enough in minstagib if (cvar("g_minstagib")) - FireRailgunBullet (org, trueaim, 200, IT_NEX); + FireRailgunBullet (org, trueaim, 1000, IT_NEX); else FireRailgunBullet (org, trueaim, cvar("g_balance_nex_damage"), IT_NEX); -- 2.39.2