#include "spawnpoints.qh"
-#include "mutators/_mod.qh"
+#include <server/mutators/_mod.qh>
#include "g_world.qh"
#include "race.qh"
+#include "defs.qh"
#include "../common/constants.qh"
#include <common/net_linked.qh>
#include "../common/teams.qh"
-#include "../common/triggers/subs.qh"
-#include "../common/triggers/target/spawnpoint.qh"
+#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 <server/utils.qh>
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;
}
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)) )
if (autocvar_r_showbboxes)
{
// show where spawnpoints point at too
- makevectors(this.angles);
+ vector forward, right, up;
+ MAKE_VECTORS(this.angles, forward, right, up);
entity e = new(info_player_foo);
- setorigin(e, this.origin + v_forward * 24);
+ setorigin(e, this.origin + forward * 24);
setsize(e, '-8 -8 -8', '8 8 8');
e.solid = SOLID_TRIGGER;
}
// _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)
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;
});
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)
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;
- spot = find(NULL, classname, "testplayerstart");
- if (spot)
- return spot;
+ if(!testspawn_checked)
+ {
+ testspawn_point = find(NULL, classname, "testplayerstart");
+ testspawn_checked = true;
+ }
+
+ if(testspawn_point)
+ return testspawn_point;
if(this.spawnpoint_targ)
return this.spawnpoint_targ;
// 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)