#include "../common/constants.qh"
#include <common/net_linked.qh>
#include "../common/teams.qh"
+#include <common/mapinfo.qh>
#include "../common/mapobjects/subs.qh"
#include "../common/mapobjects/target/spawnpoint.qh"
#include "../common/util.qh"
{
this.team = actor.team;
some_spawn_has_been_used = true;
+ this.SendFlags |= 1; // update team on the client side
}
//LOG_INFO("spawnpoint was used!\n");
}
+void spawnpoint_reset(entity this)
+{
+ this.SendFlags |= 1; // update team since it was restored during reset
+}
+
void relocate_spawnpoint(entity this)
{
// nudge off the floor
this.use = spawnpoint_use;
setthink(this, spawnpoint_think);
this.nextthink = time + 0.5 + random() * 2; // shouldn't need it for a little second
+ this.reset2 = spawnpoint_reset; // restores team, allows re-sending the spawnpoint
this.team_saved = this.team;
IL_PUSH(g_saved_team, this);
if (!this.cnt)
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;
}
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)
}
}
- 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';
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;
+ }
- spot = find(NULL, classname, "testplayerstart");
- if (spot)
- return spot;
+ 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)