From 5fe56d8bacef2d81f6a1ff0dda420b80db28e2e6 Mon Sep 17 00:00:00 2001 From: Yamagi Burmeister Date: Thu, 6 Feb 2014 19:23:06 +0100 Subject: [PATCH] Fix manual loading of maps in coop mode This change ports my magic "find the right coop spawnpoint if target is unset"-heuristic from baseq2 to rogue. This code was originally written by me and is licensed to the GPL and the Quake II SDK license. With this change all maps can by loaded by console in coop mode without spawnpoint problems. --- src/player/client.c | 113 +++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 70 deletions(-) diff --git a/src/player/client.c b/src/player/client.c index 986182e..57dce95 100644 --- a/src/player/client.c +++ b/src/player/client.c @@ -14,75 +14,6 @@ void ClientUserinfoChanged(edict_t *ent, char *userinfo); void SP_misc_teleporter_dest(edict_t *ent); void Touch_Item(edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf); -/* Gross, ugly, disgustuing hack section */ - -/* This function is an ugly as hell hack to fix some map flaws. - * The coop spawn spots on some maps are SNAFU. There are coop spots - * with the wrong targetname as well as spots with no name at all. - * - * we use carnal knowledge of the maps to fix the coop spot targetnames - * to match that of the nearest named single player spot. - */ -#if 0 -static void -SP_FixCoopSpots(edict_t *self) -{ - edict_t *spot; - vec3_t d; - - spot = NULL; - - if (!self) - { - return; - } - - while (1) - { - spot = G_Find(spot, FOFS(classname), "info_player_start"); - - if (!spot) - { - return; - } - - if (!spot->targetname) - { - continue; - } - - VectorSubtract(self->s.origin, spot->s.origin, d); - - if (VectorLength(d) < 384) - { - if ((!self->targetname) || - (Q_stricmp(self->targetname, spot->targetname) != 0)) - { - self->targetname = spot->targetname; - } - - return; - } - } -} -#endif - -/* - * Sow if that one wasn't ugly enough for you then try this one on for size - * some maps don't have any coop spots at all, so we need to create them - * where they should have been - */ -#if 0 -static void -SP_CreateCoopSpots(edict_t *self) -{ - if (!self) - { - return; - } -} -#endif - /* * QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 32) * @@ -1298,7 +1229,11 @@ void SelectSpawnPoint(edict_t *ent, vec3_t origin, vec3_t angles) { edict_t *spot = NULL; - + edict_t *coopspot = NULL; + int index; + int counter = 0; + vec3_t d; + if (!ent) { return; @@ -1349,6 +1284,44 @@ SelectSpawnPoint(edict_t *ent, vec3_t origin, vec3_t angles) } } + /* If we are in coop and we didn't find a coop + spawnpoint due to map bugs (not correctly + connected or the map was loaded via console + and thus no previously map is known to the + client) use one in 550 units radius. */ + if (coop->value) + { + index = ent->client - game.clients; + + if (Q_stricmp(spot->classname, "info_player_start") == 0 && index != 0) + { + while(counter < 3) + { + coopspot = G_Find(coopspot, FOFS(classname), "info_player_coop"); + + if (!coopspot) + { + break; + } + + VectorSubtract(coopspot->s.origin, spot->s.origin, d); + + if ((VectorLength(d) < 550)) + { + if (index == counter) + { + spot = coopspot; + break; + } + else + { + counter++; + } + } + } + } + } + VectorCopy(spot->s.origin, origin); origin[2] += 9; VectorCopy(spot->s.angles, angles);