- fprintf(stderr, "player %d: %s <%s>\n", event.u.net.sender,
- event.u.net.data, //Players[event.u.net.sender].name
- Players[event.u.net.sender].host);
- for (i = 1; i <= totalPlayers; i++)
- if (i != event.u.net.sender)
- SendPacketTo(i, event.u.net.sender, event.u.net.type,
- sizeof(Player) - sizeof(Players[0].spy),
- &Players[event.u.net.sender]);
- if (--playercount == 0) {
- fprintf(stderr, "Starting game\n");
- for (i = 1; i <= totalPlayers; i++)
- SendPacketTo(i, 0, NP_goAhead, 0, NULL);
- playercount++;
+ if (Players[event.u.net.sender].team < 1
+ || Players[event.u.net.sender].team > 7) {
+ int team;
+
+ for (team = 1; team < 7; team++) {
+ for (i = 1; i < MAX_SCREENS; i++)
+ if (Players[i].alive > 0 && Players[i].team == team)
+ break; //team in use
+ if (i == MAX_SCREENS) break;
+ } //find unused team
+ Players[event.u.net.sender].team = team;
+ SendPacketTo(event.u.net.sender, event.u.net.sender, NP_team,
+ sizeof(Players[event.u.net.sender].team),
+ &Players[event.u.net.sender].team);
+ } //invalid team
+ if (Game.started < 2)
+ Players[event.u.net.sender].flags |= SCF_paused;
+ if (!Game.continuous && Game.started >= 2) {
+ char data[40];
+ strcpy(data, "Can't join: Game has already started");
+ fprintf(stderr, MSG_SERVER_PLAYER_JOIN_ESTARTED,
+ event.u.net.sender);
+ SendPacketTo(event.u.net.sender, 0, NP_error,
+ strlen(data)+1, data);
+// SCloseNet(event.u.net.sender, 0);
+ break;
+ } //can't join started game
+ {
+ static struct {
+ int playerflags;
+ int gravity; //1
+ int started; //2
+ int continuous; //3
+ long seed; //4
+ int initspeed; //5
+ } data;
+
+ memcpy(&data, &Players[event.u.net.sender].flags,
+ sizeof(data.playerflags));
+ memcpy(&data.gravity, &Game.gravity,
+ sizeof(data) - sizeof(data.playerflags));
+ SendPacketTo(event.u.net.sender, 0, NP_gamedata,
+ sizeof(data), &data);
+ } //send game options
+ for (i = 1; i < MAX_SCREENS; i++)
+ if (netGen[i].fd >= 0 && i != event.u.net.sender) {
+ SendPacketTo(event.u.net.sender, i, NP_newPlayer,
+ sizeof(_Player), &Players[i]);
+ SendPacketTo(event.u.net.sender, i, NP_newPiece,
+ sizeof(Players[i].curShape), &Players[i].curShape);
+ SendPacketTo(i, event.u.net.sender, NP_newPlayer,
+ sizeof(_Player), &Players[event.u.net.sender]);
+ } //send (to) players
+ fprintf(stderr, MSG_SERVER_PLAYER_JOIN "\n",
+ event.u.net.sender,
+ Players[event.u.net.sender].name,
+ Players[event.u.net.sender].host,
+ teamname[Players[event.u.net.sender].team]);
+ if (++playersReady >= minplayers) {
+ if (Game.started > 1)
+ SendPacketTo(event.u.net.sender, 0,
+ NP_start, 0, NULL);
+/* else {
+ fprintf(stderr, "* Starting game (%010d)\n",
+ Game.seed);
+ for (i = 1; i < MAX_SCREENS; i++)
+ SendPacketTo(i, 0, NP_start, 0, NULL);
+ Game.started++;
+ } //first goahead (to all)*/