From a2cb79c9d8f7bb3521b437d22abf2ea18c3d5f99 Mon Sep 17 00:00:00 2001 From: stpohle Date: Tue, 27 Jan 2004 21:58:05 +0000 Subject: [PATCH] respawn test 1 --- include/map.h | 3 ++- include/network.h | 4 ++-- include/packets.h | 2 +- src/network.c | 8 ++++---- src/packets.c | 22 ++++++++++++++++++---- src/player.c | 21 ++++++++++++++++++++- 6 files changed, 47 insertions(+), 13 deletions(-) diff --git a/include/map.h b/include/map.h index 00c0fa8..9d8ef69 100644 --- a/include/map.h +++ b/include/map.h @@ -1,4 +1,4 @@ -/* $Id: map.h,v 1.10 2004/01/25 14:10:29 stpohle Exp $ */ +/* $Id: map.h,v 1.11 2004/01/27 21:58:05 stpohle Exp $ */ /* map.h */ #ifndef _MAP_H_ @@ -71,6 +71,7 @@ extern void map_new (char *filename); extern void map_set_playerposition (int usermap); extern void map_load (FILE * fmap); extern void map_set_player_way (int pl); +extern void map_set_player_way1 (int pl); extern void map_set_player_way2 (int pl, int hardway); diff --git a/include/network.h b/include/network.h index ddb6aee..e074a6f 100644 --- a/include/network.h +++ b/include/network.h @@ -1,4 +1,4 @@ -/* $Id: network.h,v 1.12 2004/01/27 21:13:42 stpohle Exp $ +/* $Id: network.h,v 1.13 2004/01/27 21:58:05 stpohle Exp $ * network.h file... for everything what have to do with the network stuff */ @@ -110,7 +110,7 @@ extern void net_game_send_bomb (int p, int b); extern void net_game_send_field (int x, int y); extern void net_game_send_special (int pl_nr, int ex_nr); extern void net_game_send_dropitems (int pl_nr, _flyingitem **fiptr, int cnt); -extern void net_game_send_respawn (int pl_nr, _point pos); +extern void net_game_send_respawn (int pl_nr); extern void net_game_fillsockaddr (); extern void net_game_send_ill (int p_nr); extern void net_delplayer (int pl_nr); diff --git a/include/packets.h b/include/packets.h index 49fdf12..b4b45fc 100644 --- a/include/packets.h +++ b/include/packets.h @@ -356,7 +356,7 @@ extern void send_special (_net_addr *addr, int p_nr, int typ, int ex_nr); extern void send_mapinfo (_net_addr *addr); extern void send_tunneldata (_net_addr *addr, int tunnelnr, int x, int y); extern void send_dropitems (_net_addr *addr, int pl_nr, _flyingitem **fitems, int cnt); -extern void send_respawn (_net_addr * addr, int plnr, _point pos); +extern void send_respawn (_net_addr * addr, int plnr); extern void fwd_pkg (struct pkg *packet, _net_addr *addr); diff --git a/src/network.c b/src/network.c index e937df8..578c4c5 100644 --- a/src/network.c +++ b/src/network.c @@ -1,4 +1,4 @@ -/* $Id: network.c,v 1.56 2004/01/27 21:13:44 stpohle Exp $ */ +/* $Id: network.c,v 1.57 2004/01/27 21:58:06 stpohle Exp $ */ /* network routines. */ @@ -844,15 +844,15 @@ void send_ogc_update () { /* send the respawn data to all clients and with the new position of the player */ -void net_game_send_respawn (int pl_nr, _point pos) { +void net_game_send_respawn (int pl_nr) { int pl; - d_printf ("Send Respawn Data %d New Position (%d,%d)\n", pl_nr, pos.x, pos.y); + d_printf ("Send Respawn Data %d New Position (%d,%d)\n", pl_nr); if (pl_nr < 0 || pl_nr >= MAX_PLAYERS) return; for (pl = 0; pl < MAX_PLAYERS; pl++) if (!PS_IS_aiplayer (players[pl].state) && PS_IS_netplayer (players[pl].state) && pl != pl_nr && NET_CANSEND(pl)) - send_respawn (&players[pl].net.addr, pl_nr, pos); + send_respawn (&players[pl].net.addr, pl_nr); }; diff --git a/src/packets.c b/src/packets.c index 9e68bb6..799d666 100644 --- a/src/packets.c +++ b/src/packets.c @@ -1325,21 +1325,32 @@ do_mapinfo (struct pkg_mapinfo *map_pkg, _net_addr * addr) /*** *** Respawn Date Handling ***/ -void send_respawn (_net_addr * addr, int plnr, _point pos) { +void send_respawn (_net_addr * addr, int plnr) { struct pkg_respawn r_dat; r_dat.h.typ = PKG_respawn; r_dat.h.len = HTON16 (sizeof (struct pkg_respawn)); r_dat.h.flags = PKGF_ackreq; r_dat.pl_nr = plnr; - r_dat.x = pos.x; - r_dat.y = pos.y; + r_dat.x = players[plnr].pos.x; + r_dat.y = players[plnr].pos.y; send_pkg ((struct pkg *) &r_dat, addr); }; void do_respawn (struct pkg_respawn *r_pkg, _net_addr *addr) { - + d_printf ("do_respawn (addr %d, pl_nr %d, pos %d,%d)\n", addr->pl_nr, r_pkg->pl_nr, r_pkg->x, r_pkg->y); + if (addr->pl_nr == -1 || r_pkg->pl_nr == -1) + return; + + /* check if the right player is sending the information */ + if (addr->pl_nr != bman.p_servnr && addr->pl_nr != r_pkg->pl_nr) + return; + + players[r_pkg->pl_nr].pos.x = r_pkg->x; + players[r_pkg->pl_nr].pos.y = r_pkg->y; + if (PS_IS_dead (players[r_pkg->pl_nr].state)) + players[r_pkg->pl_nr].state |= PSF_respawn; }; @@ -1524,6 +1535,9 @@ do_pkg (struct pkg *packet, _net_addr * addr) case (PKG_dropitem): do_dropitems ((struct pkg_dropitem *) packet, addr); break; + case (PKG_respawn): + do_respawn ((struct pkg_respawn *) packet, addr); + break; default: send_error (addr, "BomberClone: unknown data packet"); break; diff --git a/src/player.c b/src/player.c index 4ae8ed2..355b187 100644 --- a/src/player.c +++ b/src/player.c @@ -1,4 +1,4 @@ -/* $Id: player.c,v 1.69 2004/01/27 21:13:45 stpohle Exp $ +/* $Id: player.c,v 1.70 2004/01/27 21:58:06 stpohle Exp $ * player.c - everything what have to do with the player */ #include @@ -861,5 +861,24 @@ player_findfreebomb (_player * player) /* check if a player died and check if we have to respawn */ void player_checkdeath (int pnr) { + _player *player = &players[pnr]; + int trypos; + /* check for respawn */ + if (bman.gametype == GT_deathmatch && PS_IS_dead (player->state) && player->frame >= gfx.dead.frames) { + /* check new position */ + trypos = 0; + do { + map_set_player_way1 (pnr); + trypos++; + } while (trypos < 100 && (player->pos.x == -1 || player->pos.y == -1)); + + if (player->pos.x != -1 && player->pos.y != -1) { + player->frame = 0; + player->state |= PSF_respawn; + + if (GT_MP) + net_game_send_respawn (pnr); + } + } };