X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fspawnpoints.qc;h=730c92884f75b09ddf7ff1cf890a610272ad084e;hb=5d6b967bf27d726370078c61b1b894d2486fb4b3;hp=254e799eebfb082deb3e4a1ec2eaae3fb8a8b3f4;hpb=fdbfb6f9364d8aeae67e108400a6bd1dd37dc0b7;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/spawnpoints.qc b/qcsrc/server/spawnpoints.qc index 254e799ee..730c92884 100644 --- a/qcsrc/server/spawnpoints.qc +++ b/qcsrc/server/spawnpoints.qc @@ -1,24 +1,26 @@ #include "spawnpoints.qh" -#include "mutators/_mod.qh" +#include #include "g_world.qh" #include "race.qh" +#include "defs.qh" #include "../common/constants.qh" #include #include "../common/teams.qh" -#include "../common/triggers/subs.qh" +#include +#include "../common/mapobjects/subs.qh" +#include "../common/mapobjects/target/spawnpoint.qh" #include "../common/util.qh" #include "../lib/warpzone/common.qh" #include "../lib/warpzone/util_server.qh" +#include bool SpawnPoint_Send(entity this, entity to, int sf) { WriteHeader(MSG_ENTITY, ENT_CLIENT_SPAWNPOINT); WriteByte(MSG_ENTITY, this.team); - WriteCoord(MSG_ENTITY, this.origin.x); - WriteCoord(MSG_ENTITY, this.origin.y); - WriteCoord(MSG_ENTITY, this.origin.z); + WriteVector(MSG_ENTITY, this.origin); return true; } @@ -32,9 +34,7 @@ bool SpawnEvent_Send(entity this, entity to, int sf) if(autocvar_g_spawn_alloweffects) { WriteByte(MSG_ENTITY, etof(this.owner)); - WriteCoord(MSG_ENTITY, this.owner.origin.x); - WriteCoord(MSG_ENTITY, this.owner.origin.y); - WriteCoord(MSG_ENTITY, this.owner.origin.z); + WriteVector(MSG_ENTITY, this.owner.origin); send = true; } else if((to == this.owner) || (IS_SPEC(to) && (to.enemy == this.owner)) ) @@ -83,14 +83,15 @@ void relocate_spawnpoint(entity this) this.maxs = PL_MAX_CONST; if (!move_out_of_solid(this)) objerror(this, "could not get out of solid at all!"); - LOG_INFO("^1NOTE: this map needs FIXING. Spawnpoint at ", vtos(o - '0 0 1')); - LOG_INFO(" needs to be moved out of solid, e.g. by '", ftos(this.origin.x - o.x)); - LOG_INFO(" ", ftos(this.origin.y - o.y)); - LOG_INFO(" ", ftos(this.origin.z - o.z), "'\n"); + LOG_INFOF( + "^1NOTE: this map needs FIXING. Spawnpoint at %s needs to be moved out of solid, e.g. by %s", + vtos(o - '0 0 1'), + vtos(this.origin - o) + ); if (autocvar_g_spawnpoints_auto_move_out_of_solid) { if (!spawnpoint_nag) - LOG_INFO("\{1}^1NOTE: this map needs FIXING (it contains spawnpoints in solid, see server log)\n"); + LOG_INFO("\{1}^1NOTE: this map needs FIXING (it contains spawnpoints in solid, see server log)"); spawnpoint_nag = 1; } else @@ -215,11 +216,6 @@ spawnfunc(info_player_team4) // _y: weight vector Spawn_Score(entity this, entity spot, float mindist, float teamcheck) { - float shortest, thisdist; - float prio; - - prio = 0; - // filter out spots for the wrong team if(teamcheck >= 0) if(spot.team != teamcheck) @@ -240,9 +236,10 @@ vector Spawn_Score(entity this, entity spot, float mindist, float teamcheck) return '-1 0 0'; } - shortest = vlen(world.maxs - world.mins); + float prio = 0; + float shortest = vlen(world.maxs - world.mins); FOREACH_CLIENT(IS_PLAYER(it) && it != this, { - thisdist = vlen(it.origin - spot.origin); + float thisdist = vlen(it.origin - spot.origin); if (thisdist < shortest) shortest = thisdist; }); @@ -252,7 +249,7 @@ vector Spawn_Score(entity this, entity spot, float mindist, float teamcheck) vector spawn_score = prio * '1 0 0' + shortest * '0 1 0'; // filter out spots for assault - if(spot.target != "") + if(spot.target && spot.target != "") { int found = 0; for(entity targ = findchain(targetname, spot.target); targ; targ = targ.chain) @@ -266,7 +263,7 @@ vector Spawn_Score(entity this, entity spot, float mindist, float teamcheck) } } - if(!found) + if(!found && !g_cts) { LOG_TRACE("WARNING: spawnpoint at ", vtos(spot.origin), " could not find its target ", spot.target); return '-1 0 0'; @@ -331,14 +328,24 @@ SelectSpawnPoint Finds a point to respawn ============= */ +bool testspawn_checked; +entity testspawn_point; entity SelectSpawnPoint(entity this, bool anypoint) { float teamcheck; - entity spot, firstspot; + entity spot = NULL; + + if(!testspawn_checked) + { + testspawn_point = find(NULL, classname, "testplayerstart"); + testspawn_checked = true; + } + + if(testspawn_point) + return testspawn_point; - spot = find(NULL, classname, "testplayerstart"); - if (spot) - return spot; + if(this.spawnpoint_targ) + return this.spawnpoint_targ; if(anypoint || autocvar_g_spawn_useallspawns) teamcheck = -1; @@ -366,7 +373,16 @@ entity SelectSpawnPoint(entity this, bool anypoint) // get the entire list of spots - firstspot = findchain(classname, "info_player_deathmatch"); + //entity firstspot = findchain(classname, "info_player_deathmatch"); + entity firstspot = IL_FIRST(g_spawnpoints); + entity prev = NULL; + IL_EACH(g_spawnpoints, true, + { + if(prev) + prev.chain = it; + it.chain = NULL; + prev = it; + }); // filter out the bad ones // (note this returns the original list if none survived) if(anypoint)