X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fspawnpoints.qc;h=517bc1892ca8541c77f8b35d4bb9c969c6d6cd7a;hb=e4f9890f27ce9c12d1b8202b21dbed214342e9c9;hp=69c1360851f2c41e9d694a3790a4552e784847ba;hpb=c0da80fe6125a43ee99a90808ac6f9d0ddcf88c8;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/spawnpoints.qc b/qcsrc/server/spawnpoints.qc index 69c136085..517bc1892 100644 --- a/qcsrc/server/spawnpoints.qc +++ b/qcsrc/server/spawnpoints.qc @@ -1,9 +1,10 @@ #include "spawnpoints.qh" -#include "mutators/all.qh" +#include "mutators/_mod.qh" #include "g_world.qh" #include "race.qh" #include "../common/constants.qh" +#include #include "../common/teams.qh" #include "../common/triggers/subs.qh" #include "../common/util.qh" @@ -81,7 +82,7 @@ void relocate_spawnpoint(entity this) this.mins = PL_MIN_CONST; this.maxs = PL_MAX_CONST; if (!move_out_of_solid(this)) - objerror("could not get out of solid at all!"); + 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)); @@ -96,7 +97,7 @@ void relocate_spawnpoint(entity this) { setorigin(this, o); this.mins = this.maxs = '0 0 0'; - objerror("player spawn point in solid, mapper sucks!\n"); + objerror(this, "player spawn point in solid, mapper sucks!\n"); return; } } @@ -166,6 +167,7 @@ spawnfunc(info_player_start) spawnfunc(info_player_deathmatch) { this.classname = "info_player_deathmatch"; + IL_PUSH(g_spawnpoints, this); relocate_spawnpoint(this); } @@ -246,21 +248,18 @@ vector Spawn_Score(entity this, entity spot, float mindist, float teamcheck) if(shortest > mindist) prio += SPAWN_PRIO_GOOD_DISTANCE; - spawn_score = prio * '1 0 0' + shortest * '0 1 0'; - spawn_spot = spot; + vector spawn_score = prio * '1 0 0' + shortest * '0 1 0'; // filter out spots for assault - if(spot.target != "") { - entity ent; - float found; - - found = 0; - for(ent = world; (ent = find(ent, targetname, spot.target)); ) + if(spot.target != "") + { + int found = 0; + for(entity targ = findchain(targetname, spot.target); targ; targ = targ.chain) { ++found; - if(ent.spawn_evalfunc) + if(targ.spawn_evalfunc) { - spawn_score = ent.spawn_evalfunc(ent, this, spot, spawn_score); + spawn_score = targ.spawn_evalfunc(targ, this, spot, spawn_score); if(spawn_score.x < 0) return spawn_score; } @@ -268,12 +267,13 @@ vector Spawn_Score(entity this, entity spot, float mindist, float teamcheck) if(!found) { - LOG_TRACE("WARNING: spawnpoint at ", vtos(spot.origin), " could not find its target ", spot.target, "\n"); + LOG_TRACE("WARNING: spawnpoint at ", vtos(spot.origin), " could not find its target ", spot.target); return '-1 0 0'; } } - MUTATOR_CALLHOOK(Spawn_Score, this, spawn_spot, spawn_score); + MUTATOR_CALLHOOK(Spawn_Score, this, spot, spawn_score); + spawn_score = M_ARGV(2, vector); return spawn_score; } @@ -288,8 +288,8 @@ entity Spawn_FilterOutBadSpots(entity this, entity firstspot, float mindist, flo { entity spot, spotlist, spotlistend; - spotlist = world; - spotlistend = world; + spotlist = NULL; + spotlistend = NULL; Spawn_ScoreAll(this, firstspot, mindist, teamcheck); @@ -305,7 +305,7 @@ entity Spawn_FilterOutBadSpots(entity this, entity firstspot, float mindist, flo } } if(spotlistend) - spotlistend.chain = world; + spotlistend.chain = NULL; return spotlist; } @@ -318,7 +318,7 @@ entity Spawn_WeightedPoint(entity firstspot, float lower, float upper, float exp RandomSelection_Init(); for(spot = firstspot; spot; spot = spot.chain) - RandomSelection_Add(spot, 0, string_null, pow(bound(lower, spot.spawnpoint_score.y, upper), exponent) * spot.cnt, (spot.spawnpoint_score.y >= lower) * 0.5 + spot.spawnpoint_score.x); + RandomSelection_AddEnt(spot, pow(bound(lower, spot.spawnpoint_score.y, upper), exponent) * spot.cnt, (spot.spawnpoint_score.y >= lower) * 0.5 + spot.spawnpoint_score.x); return RandomSelection_chosen_ent; } @@ -335,7 +335,7 @@ entity SelectSpawnPoint(entity this, bool anypoint) float teamcheck; entity spot, firstspot; - spot = find (world, classname, "testplayerstart"); + spot = find(NULL, classname, "testplayerstart"); if (spot) return spot; @@ -392,7 +392,7 @@ entity SelectSpawnPoint(entity this, bool anypoint) else { if(some_spawn_has_been_used) - return world; // team can't spawn any more, because of actions of other team + return NULL; // team can't spawn any more, because of actions of other team else error("Cannot find a spawn point - please fix the map!"); }