All pastes #635663 Raw Edit

G_ClientTeamInfo04.diff

public c v1 · immutable
#635663 ·published 2007-07-27 08:27 UTC
rendered paste body
Index: src/game/g_client.c===================================================================--- src/game/g_client.c	(Revision 10260)+++ src/game/g_client.c	(Arbeitskopie)@@ -2184,8 +2184,33 @@ }  /**+ * @brief Find valid actor spawn fields for this player.+ * @param[in] player The player to spawn the actors for.+ * @param[in] type The type of spawn-point so search for (ET_ACTORSPAWN or ET_ACTOR2x2SPAWN)+ * @return A pointer to a found spawn point or NULL if nothing was found or on error.+ */+static edict_t *G_ClientGetFreeSpawnPoint(player_t * player, int spawnType)+{+	int i;+	edict_t *ent;+	+	/* Abort for non-spawnpoints */+	assert(spawnType != ET_ACTORSPAWN && spawnType != ET_ACTOR2x2SPAWN);+	+	for (i = 0, ent = g_edicts; i < globals.num_edicts; i++, ent++)+		if ((ent->type == spawnType)+		 && (player->pers.team == ent->team))+		/** @todo how do we check if this spawn point isn't used already? */+			return ent;++	return NULL;+}++++/**  * @brief The client lets the server spawn the actors for a given player by sending their information (models, inventory, etc..) over the network.- * @param[in] player The player to spawn the actos for.+ * @param[in] player The player to spawn the actors for.  * @sa CL_SendTeamInfo  * @sa globals.ClientTeamInfo  */@@ -2195,41 +2220,56 @@ 	int i, j, k, length; 	int container, x, y; 	item_t item;+	int dummyFieldSize = 0;  	/* find a team */ 	G_GetTeam(player);  	length = gi.ReadByte();	/* Get the length of data that the clients sent. */ -	/* Find valid actor spawn fields for this player. */-	for (j = 0, ent = g_edicts; j < globals.num_edicts; j++, ent++)-		if ((ent->type == ET_ACTORSPAWN || ent->type == ET_ACTOR2x2SPAWN)-			&& player->pers.team == ent->team)-			break;- 	for (i = 0; i < length; i++) { 		/* Search for a spawn point for each entry the client sent */ -		if (j < globals.num_edicts && i < maxsoldiersperplayer->integer) {+		if (i < maxsoldiersperplayer->integer) { 			/* Here the client tells the server the information for the spawned actor(s). */-			level.num_alive[ent->team]++;-			level.num_spawned[ent->team]++;-			ent->pnum = player->num;-			Com_DPrintf("Team %i - player: %i\n", ent->team, player->num);-			ent->chr.fieldSize = gi.ReadByte();-			ent->fieldSize = ent->chr.fieldSize;-			switch (ent->fieldSize) {++			/* Receive fieldsize and get matching spawnpoint. */+			dummyFieldSize = gi.ReadByte();+			switch (dummyFieldSize) {+			case 0: 			case ACTOR_SIZE_NORMAL:+				/* Find valid actor spawn fields for this player. */+				ent = G_ClientGetFreeSpawnPoint(player, ET_ACTORSPAWN);+				if (!ent) {+					gi.dprintf("G_ClientTeamInfo: Could not spawn actor because no useable spawn-point is avaialble (%i)\n", dummyFieldSize);+				} 				ent->type = ET_ACTOR; 				break; 			case ACTOR_SIZE_2x2:+				/* Find valid actor spawn fields for this player. */+				ent = G_ClientGetFreeSpawnPoint(player, ET_ACTOR2x2SPAWN);+				if (!ent) {+					gi.dprintf("G_ClientTeamInfo: Could not spawn actor because no useable spawn-point is avaialble (%i)\n", dummyFieldSize);+				} 				ent->type = ET_ACTOR2x2; 				ent->morale = 100; 				break; 			default:-				gi.dprintf("G_ClientTeamInfo: unknown edict fieldSize (%i)\n", ent->fieldSize);+				gi.dprintf("G_ClientTeamInfo: unknown fieldSize for edict (%i)\n", dummyFieldSize); 				break; 			}++			level.num_alive[ent->team]++;+			level.num_spawned[ent->team]++;+			ent->pnum = player->num;++			Com_DPrintf("Team %i - player: %i\n", ent->team, player->num);++			ent->chr.fieldSize = dummyFieldSize;+			ent->fieldSize = ent->chr.fieldSize;+			+			Com_DPrintf("Team %i - size: %i\n", ent->team, ent->fieldSize);+ 			gi.linkentity(ent);  			/* model */@@ -2315,12 +2355,6 @@ 			for (k = 0; k < j; k++) 				gi.ReadByte(); /* inventory */ 		}--		/* Find valid actor spawn fields for this player. */-		for (; j < globals.num_edicts; j++, ent++)-			if ((ent->type == ET_ACTORSPAWN || ent->type == ET_ACTOR2x2SPAWN)-			&& player->pers.team == ent->team)-				break; 	} 	G_ClientTeamAssign(player); }