Update of /cvsroot/netrek/server/Vanilla/ntserv In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv28256/ntserv Modified Files: Makefile.in daemonII.c data.c detonate.c enter.c findslot.c genspkt.c getship.c input.c interface.c main.c ntscmds.c openmem.c orbit.c redraw.c socket.c transwarp.c Log Message: merge 2.11.1 from darcs Index: redraw.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/redraw.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- redraw.c 12 May 2006 03:44:48 -0000 1.4 +++ redraw.c 1 Jun 2006 03:17:25 -0000 1.5 @@ -210,7 +210,7 @@ me->p_wtemp = pl->p_wtemp; me->p_etemp = pl->p_etemp; /* These flags shouldn't be propagated to observers */ -#define NOOBSMASK (PFWAR|PFREFITTING|PFSELFDEST|PFPLOCK|PFPLLOCK|PFOBSERV) +#define NOOBSMASK (PFSELFDEST|PFPLOCK|PFPLLOCK|PFOBSERV) me->p_flags = (pl->p_flags & ~NOOBSMASK) | (me->p_flags & NOOBSMASK); me->p_dir = pl->p_dir; Index: ntscmds.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/ntscmds.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- ntscmds.c 12 May 2006 03:44:48 -0000 1.12 +++ ntscmds.c 1 Jun 2006 03:17:25 -0000 1.13 @@ -56,6 +56,9 @@ void do_sbtime_msg(char *comm, struct message *mess); void do_queue_msg(char *comm, struct message *mess); void do_nowobble(char *comm, struct message *mess); +#ifdef EXPERIMENTAL_BECOME +void do_become(char *comm, struct message *mess); +#endif #ifdef GENO_COUNT void do_genos_query(char *comm, struct message *mess, int who); @@ -153,6 +156,12 @@ 0, "Test new wobble on planet lock fix.", do_nowobble }, /* NOWOBBLE */ +#ifdef EXPERIMENTAL_BECOME + { "BECOME", + 0, + "Become a different slot number", + do_become }, /* BECOME */ +#endif { "TIME", C_PR_INPICKUP, "Show time left on surrender timer.", @@ -745,6 +754,42 @@ nowobble ? "on (new test mode)" : "off (classic mode)", nowobble, comm ); } +#ifdef EXPERIMENTAL_BECOME +/* become another slot ... lacking client support, in progress */ +void do_become(char *comm, struct message *mess) +{ + int who, pno; + char *addr; + + who = mess->m_from; + addr = addr_mess(who,MINDIV); + + pno = atoi(comm+strlen("become ")); + + if (pno < 0) return; + if (pno > (MAXPLAYER-1)) return; + + if (me->p_no == pno) { + pmessage(who, MINDIV, addr, "you are this slot already"); + return; + } + + struct player *be = &players[pno]; + if (be->p_status != PFREE) { + pmessage(who, MINDIV, addr, "slot is not free"); + return; + } + + memcpy(be, me, sizeof(struct player)); + me->p_status = PFREE; + me = be; + me->p_no = pno; + sprintf(me->p_mapchars,"%c%c",teamlet[me->p_team], shipnos[me->p_no]); + sprintf(me->p_longname, "%s (%s)", me->p_name, me->p_mapchars); + updateSelf(1); +} +#endif + void do_password(char *comm, struct message *mess) { int who = mess->m_from; Index: orbit.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/orbit.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- orbit.c 10 Apr 2006 10:56:32 -0000 1.3 +++ orbit.c 1 Jun 2006 03:17:25 -0000 1.4 @@ -33,6 +33,9 @@ { me->p_flags &= ~(PFPLOCK | PFPLLOCK | PFTRACT | PFPRESS); #ifdef SB_TRANSWARP + /* upon arrival at a base, during a dock attempt, if the dock fails, + and we were transwarping in, force a refit delay for five + seconds. */ if (me->p_flags & PFTWARP){ me->p_flags &= ~PFTWARP; me->p_flags |= PFREFITTING; Index: Makefile.in =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/Makefile.in,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- Makefile.in 6 May 2006 13:12:56 -0000 1.7 +++ Makefile.in 1 Jun 2006 03:17:25 -0000 1.8 @@ -2,6 +2,8 @@ srcdir = @srcdir@ CONFIG = system.mk +RANLIB = @RANLIB@ +RANLIB_FLAGS = @RANLIB_FLAGS@ include ../$(CONFIG) @@ -80,23 +82,23 @@ all: $(PMAKE) ntserv daemonII ntserv: $(PMAKE) $(R_OBJS) - $(CC) $(CFLAGS) ${LDFLAGS} -o ntserv $(R_OBJS) $(LIBS) $(LIBCRYPT) `glib-config --libs` -lgdbm + $(CC) $(CFLAGS) ${LDFLAGS} -o ntserv $(R_OBJS) $(LIBS) $(LIBCRYPT) -lgdbm daemonII: $(PMAKE) $(D_OBJS) $(CC) $(CFLAGS) ${LDFLAGS} -o daemonII $(D_OBJS) $(EXTRALIBS) libnetrek.a: $(L_OBJS) - ar cru $@ $(L_OBJS) - ranlib $@ + $(AR) cru $@ $(L_OBJS) + $(RANLIB) $(RANLIB_FLAGS) $@ libnetrek.so: $(L_OBJS) - gcc -shared -Wl,-soname,$@ -o $@ $(L_OBJS) -lc + $(CC) -shared -Wl,-soname,$@ -o $@ $(L_OBJS) -lc commands.o: $(PMAKE) ${srcdir}/commands.c $(CC) $(CFLAGS) $(DEP) -c ${srcdir}/commands.c db.o: $(PMAKE) db.c - $(CC) $(CFLAGS) $(DEP) `glib-config --cflags` -c db.c + $(CC) $(CFLAGS) $(DEP) -c db.c cflags: echo "static char cflags[]=\"$(CFLAGS) $(LIBS)\";" >../cflags.h @@ -131,6 +133,11 @@ touch $(DESTDIR)$(LOCALSTATEDIR)/planets chmod 600 $(DESTDIR)$(LOCALSTATEDIR)/planets +install-ntserv: ntserv + mkdir $(DESTDIR)$(LIBDIR)/ntserv-archive + mv $(DESTDIR)$(LIBDIR)/ntserv $(DESTDIR)$(LIBDIR)/ntserv-archive/ntserv.`date +%Y-%m-%d`.$$ + $(INSTALLPROG) $(INSTALLOPTS) ntserv $(DESTDIR)$(LIBDIR)/ntserv + installbin: install echo "target installbin deprecated, assumed install" Index: input.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/input.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- input.c 21 Mar 2005 05:23:43 -0000 1.1 +++ input.c 1 Jun 2006 03:17:25 -0000 1.2 @@ -22,6 +22,7 @@ #include "struct.h" #include "data.h" #include "proto.h" +#include "packets.h" #define GHOSTTIME (30 * 1000000 / UPDATE) /* 30 secs */ @@ -56,10 +57,8 @@ ERROR(2,("%s: ghostbusted by ping loss\n", me->p_mapchars)); fflush(stderr); - } else + } #endif /*PING*/ - - me->p_ghostbuster = 0; } static int resurrect(void) @@ -110,6 +109,15 @@ return 1; } +static void gamedown() +{ + struct badversion_spacket packet; + packet.type = SP_BADVERSION; + packet.why = 6; + sendClientPacket(&packet); + flushSockBuf(); +} + void input(void) { fd_set readfds; @@ -127,6 +135,7 @@ resurrect(); } if (! (status -> gameup & GU_GAMEOK)){ + gamedown(); freeslot(me); exit(0); } @@ -150,6 +159,7 @@ } readFromClient(); + me->p_ghostbuster = 0; if (sendflag) { intrupt(); sendflag=0; @@ -159,5 +169,3 @@ } } - - Index: enter.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/enter.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- enter.c 26 Apr 2006 09:52:43 -0000 1.4 +++ enter.c 1 Jun 2006 03:17:25 -0000 1.5 @@ -210,7 +210,7 @@ #endif /*LTD_STATS*/ /* If switching, become hostile to former team 6/29/92 TC */ if (lastteam >= 0) - declare_war(1<<lastteam); + declare_war(1<<lastteam, 0); } if (lastrank==-1) lastrank=mystats->st_rank; /* NBT patch */ lastteam=tno; Index: getship.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/getship.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- getship.c 21 Mar 2005 05:23:43 -0000 1.1 +++ getship.c 1 Jun 2006 03:17:25 -0000 1.2 @@ -276,8 +276,8 @@ shipvals[ATT].s_mass = 32765; /* att: */ shipvals[ATT].s_tractstr = 32765; /* att: */ shipvals[ATT].s_tractrng = 25; /* att: */ - shipvals[ATT].s_width = 28; /* att: */ - shipvals[ATT].s_height = 28; /* att: */ + shipvals[ATT].s_width = 20; /* att: */ + shipvals[ATT].s_height = 20; /* att: */ shipvals[ATT].s_type = ATT; /* att: */ shipvals[CRUISER].s_turns = 170000; /* cruiser: */ shipvals[CRUISER].s_accint = 150; /* cruiser: */ Index: openmem.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/openmem.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- openmem.c 12 May 2006 03:44:48 -0000 1.5 +++ openmem.c 1 Jun 2006 03:17:25 -0000 1.6 @@ -1,6 +1,3 @@ -/* - * $Id$ - */ #include "copyright.h" #include <stdio.h> @@ -10,9 +7,7 @@ #include <sys/ipc.h> #include <sys/shm.h> #include <errno.h> -#include <pwd.h> -#include <ctype.h> -#include <time.h> /* 7/16/91 TC */ +#include <signal.h> #include "defs.h" #include "struct.h" #include "data.h" @@ -53,10 +48,59 @@ * */ +/* identifier of the shared memory segment */ +static int shmid; + +/* shared memory key */ +static int pkey = PKEY; + +/* shared memory pointer */ +static struct memory *sharedMemory = NULL; + +/* daemon initialisation is pending */ +static int daemon_initialisation_pending; + +/* set a different shared memory key for this process and children */ +void setpkey(int nkey) +{ + char ev[32]; + pkey = nkey; + sprintf(ev, "NETREK_PKEY=%d", nkey); + if (putenv(ev) != 0) { + perror("setpkey: putenv"); + } +} + +/* get the current shared memory key for this process */ +int getpkey() +{ + return pkey; +} + +/* initialise shared memory key from environment variables */ +static void initpkey() +{ + char *ev = getenv("NETREK_PKEY"); + if (ev == NULL) return; + pkey = atoi(ev); + if (pkey < 1) pkey = PKEY; +} + +/* called when daemon initialisation is complete */ +static void daemon_ready(int signum) +{ + daemon_initialisation_pending = 0; +} + +/* start the daemon, wait for it to finish initialising */ static void startdaemon(void) { pid_t i; + /* ask to be told when daemon initialisation completes */ + daemon_initialisation_pending = 1; + signal(SIGUSR1, daemon_ready); + i = fork(); if (i == (pid_t)0) { execl(Daemon, "daemon", (char *) NULL); @@ -64,8 +108,13 @@ ERROR(1,("Couldn't start daemon!!!\n")); _exit(1); } + + /* wait until daemon has initialised */ + while (daemon_initialisation_pending) pause(); + signal(SIGUSR1, NULL); } +/* connect all the pointers to the various areas of the segment */ static void setup_memory(struct memory *sharedMemory) { players = sharedMemory->players; @@ -86,14 +135,8 @@ /*ARGSUSED*/ int openmem(int trystart) { - extern int errno; - int shmemKey = PKEY; - struct memory *sharedMemory; - int shmid; - - errno = 0; - - shmid = shmget(shmemKey, SHMFLAG, 0); + initpkey(); + shmid = shmget(pkey, SHMFLAG, 0); if (shmid < 0) { /* Could not find the shared memory */ if (errno != ENOENT) { /* Error other not created yet */ perror("shmget"); @@ -101,7 +144,6 @@ } if (trystart==1){ /* Create the memory */ startdaemon(); - sleep(2); } else if (trystart < 0){ /* Just checking if it exists */ return 0; @@ -110,7 +152,7 @@ fprintf(stderr,"Warning: Daemon not running!\n"); exit(1); } - shmid = shmget(shmemKey, SHMFLAG, 0); + shmid = shmget(pkey, SHMFLAG, 0); if (shmid < 0) { /* This is a bummer of an error */ ERROR(1, ("Daemon not running (err:%d)\n",errno)); exit(1); @@ -123,30 +165,22 @@ exit(1); } setup_memory(sharedMemory); - return 1; } -/* Static variable only used by these routines in the daemon*/ -static int shmid; /* The id of the shared memory segment */ - int setupmem(void) { - extern int errno; - int shmemKey = PKEY; - struct memory *sharedMemory; struct shmid_ds smbuf; - errno = 0; - + initpkey(); /* Kill any existing segments */ - if ((shmid = shmget(shmemKey, SHMFLAG , 0)) >= 0) { + if ((shmid = shmget(pkey, SHMFLAG , 0)) >= 0) { ERROR(2,("setupmem: Killing existing segment\n")); shmctl(shmid, IPC_RMID, (struct shmid_ds *) 0); } /* Get them memory id */ - shmid = shmget(shmemKey, sizeof(struct memory), IPC_CREAT | 0777); + shmid = shmget(pkey, sizeof(struct memory), IPC_CREAT | 0777); if (shmid < 0) { ERROR(1,("setupmem: Can't open shared memory, error %i\n",errno)); return 0; @@ -177,11 +211,12 @@ if (shmctl(shmid, IPC_RMID, (struct shmid_ds *) 0) < 0){ return 0; } + perror("removemem"); return 1; } -#ifdef nodef -static int detachmem(void) { - return shmdt((void*)players); /* cheat! what is a better way?? jc */ +int detachmem(void) { + if (shmdt(sharedMemory) < 0) return 0; + perror("detachmem"); + return 1; } -#endif Index: transwarp.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/transwarp.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- transwarp.c 21 Mar 2005 05:23:44 -0000 1.1 +++ transwarp.c 1 Jun 2006 03:17:25 -0000 1.2 @@ -56,7 +56,7 @@ } if (!((!(j->p_war & me->p_team)) && (!(me->p_war & j->p_team)))) { - new_warning(UNDEF, "The starbase is not peaceful, captain!", -1); + new_warning(UNDEF, "Transwarp request rejected by battle computers, captain!", -1); return (0); } if (!(j->p_flags & PFDOCKOK)) { Index: findslot.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/findslot.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- findslot.c 6 May 2006 14:02:37 -0000 1.5 +++ findslot.c 1 Jun 2006 03:17:25 -0000 1.6 @@ -17,22 +17,20 @@ #include "packets.h" #include "proto.h" -#ifdef NO_DUPLICATE_HOSTS -/* return true if the host is not already in the game */ -static int absent(int w_queue, char *host) { - int i; - for (i=0; i<MAXPLAYER; i++) { +/* return number of other hosts in game with same ip */ +static int player_count_by_ip(int w_queue, char *ip) { + int i, j; + for (i=0, j=0; i<MAXPLAYER; i++) { if (players[i].p_status == PFREE) continue; if ((players[i].p_flags & PFROBOT)) continue; #ifdef OBSERVERS /* if we want a pickup slot, ignore any observer slot we have */ if (w_queue == QU_PICKUP && players[i].p_status == POBSERV) continue; #endif - if (strcmp(players[i].p_full_hostname, host) == 0) return 0; + if (strcmp(players[i].p_ip, ip) == 0) j++; } - return 1; + return j; } -#endif /* * The following code for findslot() is really nice. @@ -48,7 +46,7 @@ * oldcount: (local) My position last time I looked. */ -int findslot(int w_queue, char *host) +int findslot(int w_queue, char *ip) { u_int oldcount; /* My old number */ pid_t mypid = getpid(); @@ -59,24 +57,16 @@ /* Ensure that the queue is open */ if (!(queues[w_queue].q_flags & QU_OPEN)) return (-1); -#ifdef NO_DUPLICATE_HOSTS /* pre-queue if client from same ip address is already playing */ if ((w_queue == QU_PICKUP) || (w_queue == QU_PICKUP_OBS)) { for (;;) { -#ifdef CONTINUUM - /* dogmeat's obstrek server */ - if (!strcmp(host, "c-24-4-208-59.client.comcast.net")) break; - /* roland's workplace */ - if (!strcmp(host, "ip57.bb168.pacific.net.hk")) break; -#endif - if (absent(w_queue, host)) break; + if (player_count_by_ip(w_queue, ip) <= duplicates) break; if (rep++ % 10 == 1) { sendQueuePacket((short) MAXPLAYER); } if (isClientDead()) { fflush(stderr); exit(0); } if (!(status->gameup & GU_GAMEOK)) { return (-1); } sleep(1); } } -#endif /* If no one is waiting, I will try to enter now */ if (queues[w_queue].first == -1) Index: data.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/data.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- data.c 12 May 2006 03:44:48 -0000 1.8 +++ data.c 1 Jun 2006 03:17:25 -0000 1.9 @@ -413,3 +413,4 @@ int eject_vote_enable=0; int eject_vote_only_if_queue=0; int eject_vote_vicious=0; +int duplicates=3; Index: genspkt.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/genspkt.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- genspkt.c 6 May 2006 14:02:37 -0000 1.6 +++ genspkt.c 1 Jun 2006 03:17:25 -0000 1.7 @@ -151,8 +151,8 @@ u_char clientVKills[MAXPLAYER*2+2 +4]; int clientVKillsCount; struct stats_s_spacket singleStats; -unsigned char n_flags[MAXPLAYER]; -int highest_active_player; +static unsigned char n_flags[MAXPLAYER]; +static int highest_active_player; #if MAXPLAYER > 32 static u_char clientVXPlayers[33*4]; @@ -300,13 +300,16 @@ } +/* This function is for sending the flags of OTHER players, the player's + own flags are handled elsewhere. The cambot will set f_many_self, + and use this function to record the flags of all players. */ int sndFlags( struct flags_spacket *flags, struct player *pl, int howmuch) { /*#define FLAGMASK (PFSHIELD|PFBOMB|PFORBIT|PFCLOAK|PFROBOT|PFBEAMUP|PFBEAMDOWN|PFPRACTR|PFDOCK|PFTRACT|PFPRESS|PFDOCKOK) aieee, too much. 7/27/91 TC */ /*#define FLAGMASK (PFSHIELD|PFBOMB|PFORBIT|PFCLOAK|PFROBOT| PFPRACTR|PFDOCK|PFTRACT|PFPRESS|PFDOCKOK) still more than needed */ /* Flags we get to know about players not seen */ -#define INVISOMASK (PFCLOAK|PFROBOT|PFPRACTR|PFDOCKOK|PFOBSERV) +#define INVISOMASK (PFCLOAK|PFROBOT|PFPRACTR|PFDOCKOK|PFOBSERV|PFBPROBOT) /* Flags we get to know about players who are seen */ #define FLAGMASK (PFSHIELD | INVISOMASK) @@ -314,16 +317,17 @@ int tractor = ((F_show_all_tractors || f_many_self) && pl->p_flags&PFTRACT)? (pl->p_tractor|0x40):0; +#ifdef OBSERVERS + if (!f_many_self && pl->p_status == POBSERV) { + mask = PFOBSERV; /* All we need to know about observers. */ + tractor = 0; + } else +#endif if (howmuch == UPDT_ALL) { mask = FLAGMASK; if(F_show_all_tractors || f_many_self) mask |= PFTRACT|PFPRESS; } else mask = INVISOMASK; - - /* With short packets 2 flag sampling, these don't need to be sent */ - if (send_short>1 && pl->p_no<32) - mask &= ~(PFSHIELD|PFCLOAK); - if ((ntohl(flags->flags)&mask) == (pl->p_flags&mask) && flags->tractor==tractor) @@ -561,6 +565,7 @@ tp->type = SP_TORP; tp->x = htonl(t->t_x); tp->y = htonl(t->t_y); + tp->dir = t->t_dir; /* The robot needs this */ tp->tnum = htons(i); sendClientPacket(tp); if ( (t->t_status != tpi->status) @@ -623,6 +628,11 @@ || ((t->t_war & me->p_team) != tpi->war)) { tpi->type = SP_PLASMA_INFO; tpi->war = t->t_war & me->p_team; + /* In PP plasma mode, plasmas change teams, but client doesn't + know. If player is at war with plasma's new team, set the + plasma's war flag, so client knows it is hostile. */ + if (pingpong_plasma && (t->t_team & me->p_war)) + tpi->war |= me->p_team; tpi->pnum = htons(i); tpi->status = t->t_status; sendClientPacket(tpi); @@ -759,7 +769,8 @@ updtPlanet(struct planet_spacket *pl, struct planet *plan, int howmuch) { -#define PLFLAGMASK (PLREPAIR|PLFUEL|PLAGRI|PLHOME|PLCOUP) +#define PLFLAGMASK (PLREPAIR|PLFUEL|PLAGRI|PLHOME|PLCOUP|PLCORE) + if (howmuch == UPDT_ALL) { if ( pl->info != plan->pl_info @@ -887,7 +898,7 @@ case DMKILLP: #ifdef CHAIN_REACTION if (why_dead) { - swarning(KILLARGS2,(u_char)cur->args[5],0); + swarning(KILLARGS2,(u_char)cur->args[5],(u_char)cur->args[4]); } #endif swarning(DMKILLP, (u_char)cur->args[1], (u_char)cur->args[2]); @@ -1168,17 +1179,21 @@ sndPlayerInfo(cpli, pl); sndKills(kills, pl); + /* S_P2 new flag sampling */ + if (send_short > 1) { + u_int oldflags; #ifdef OBSERVERS - if(pl->p_status != POBSERV){ + /* Skip observers' flags, unless I am the observer. */ + if (pl->p_status != POBSERV || pl == me) { #endif - /* S_P2 new flag sampling */ - if(!(pl->p_flags & PFROBOT)) { /* No robos please */ switch(pl->p_status){ +#ifdef OBSERVERS + case POBSERV: +#endif case PALIVE: /* huh, we must work */ highest_active_player = i; if(pl->p_flags & PFCLOAK){ n_flags[i] = 1; - break; } else if(pl->p_flags & PFSHIELD){ n_flags[i] = 2; @@ -1197,10 +1212,16 @@ /* Is it ok to send the old value ? */ break; } - } /* robos out */ + /* Mark shield and cloak as updated, so they won't be resent + again with a flags packet. */ + oldflags = ntohl(flags->flags); + oldflags &= ~(PFSHIELD|PFCLOAK); + oldflags |= pl->p_flags&(PFSHIELD|PFCLOAK); + flags->flags = htonl(oldflags); #ifdef OBSERVERS - } + } #endif + } if (sndPStatus(pstatus, pl)) { update=1; Index: detonate.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/detonate.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- detonate.c 24 Apr 2006 10:12:18 -0000 1.3 +++ detonate.c 1 Jun 2006 03:17:25 -0000 1.4 @@ -28,7 +28,8 @@ } if (me->p_flags & PFWEP) { new_warning(UNDEF, "Weapons overheated"); - return; + if (!chaosmode) + return; } me->p_fuel -= myship->s_detcost; Index: main.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/main.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- main.c 12 May 2006 03:44:48 -0000 1.10 +++ main.c 1 Jun 2006 03:17:25 -0000 1.11 @@ -35,8 +35,7 @@ static void sendMotd(void); static void sendConfigMsg(void); static void printStats(void); -static int check_temporary_bans(char *ip); -static int check_permanent_bans(char *login, char *host); +static void bans_check(); extern int ignored[MAXPLAYER]; int indie = 0; /* always be indie 8/28/91 TC */ @@ -171,7 +170,7 @@ sendMotd(); /* wait for a slot to become free */ - pno = findslot(w_queue, host); + pno = findslot(w_queue, inet_ntoa(*(struct in_addr *)&remoteaddr)); if (pno < 0) { /* trigger client's "Sorry, but you cannot play xtrek now. Try again later." */ @@ -400,37 +399,7 @@ #endif me->p_status = PALIVE; /* Put player in game */ me->p_ghostbuster = 0; - - if (!bypassed) { - char *reason = NULL; - if (check_permanent_bans(login, host) == TRUE) { - reason = "banned by the administrator"; - } else if (check_permanent_bans(login, me->p_ip) == TRUE) { - reason = "banned by the administrator"; - } else if (check_temporary_bans(me->p_ip) == TRUE) { - reason = "banned by the players"; - } - if (reason != NULL) { - FILE *logfile; - time_t curtime; - - pmessage(0, MALL, "GOD->ALL","%s (%s@%s) is %s.", - me->p_name, me->p_login, me->p_ip, reason); - new_warning(UNDEF,"You are banned from the game."); - me->p_explode=100; - me->p_status=PEXPLODE; - me->p_whydead=KQUIT; /* make him self destruct */ - me->p_whodead=0; - logfile=fopen(LogFileName, "a"); - if (logfile) { - curtime=time(NULL); - fprintf(logfile, "Banned and exiting: %s (%s@%s), (%c), %s", - me->p_name, me->p_login, host, shipnos[me->p_no], ctime(&curtime) - ); - fclose(logfile); - } - } - } + bans_check(); /* Get input until the player quits or dies */ living++; @@ -818,7 +787,7 @@ } /* check temporary bans voted */ -static int check_temporary_bans(char *ip) +static int bans_check_temporary(char *ip) { int i; for(i=0; i<MAXBANS; i++) { @@ -839,7 +808,7 @@ } /* check permanent bans in file */ -static int check_permanent_bans(char *login, char *host) +static int bans_check_permanent(char *login, char *host) { FILE *bannedfile; char log_buf[64], host_buf[64], line_buf[160]; @@ -907,6 +876,65 @@ return(FALSE); } +static void bans_log() +{ + FILE *logfile; + time_t curtime; + + logfile = fopen(LogFileName, "a"); + if (logfile) { + curtime = time(NULL); + fprintf(logfile, "Banned: %s (%s@%s), (%c), %s", + me->p_name, me->p_login, host, shipnos[me->p_no], ctime(&curtime) + ); + fclose(logfile); + } +} + +static void bans_enforce_alive() +{ + new_warning(UNDEF,"You are banned from the game, goodbye."); + me->p_explode=100; + me->p_status=PEXPLODE; + me->p_whydead=KQUIT; /* make him self destruct */ + me->p_whodead=0; +} + +static void bans_enforce_observ() +{ + mute = 1; + new_warning(UNDEF,"You are banned from the game, you may not speak."); +} + +static void bans_enforce(char *reason) +{ + pmessage(0, MALL, "GOD->ALL","%s (%s@%s) is %s.", + me->p_name, me->p_login, me->p_ip, reason); + bans_log(); + if (me->p_status == PALIVE) { + bans_enforce_alive(); + } else if (me->p_status == POBSERV) { + bans_enforce_observ(); + } +} + +static void bans_check() +{ + if (!bypassed) { + char *reason = NULL; + if (bans_check_permanent(login, host) == TRUE) { + reason = "banned by the administrator"; + } else if (bans_check_permanent(login, me->p_ip) == TRUE) { + reason = "banned by the administrator"; + } else if (bans_check_temporary(me->p_ip) == TRUE) { + reason = "banned by the players"; + } + if (reason != NULL) { + bans_enforce(reason); + } + } +} + /* ARGSUSED */ void message_flag(struct message *cur, char *address) { Index: daemonII.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/daemonII.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- daemonII.c 12 May 2006 03:44:48 -0000 1.14 +++ daemonII.c 1 Jun 2006 03:17:25 -0000 1.15 @@ -276,10 +276,12 @@ exitDaemon(0); } - x = 0; - check_load(); + /* signal parent ntserv that daemon is ready */ + kill(getppid(), SIGUSR1); + + x = 0; for (;;) { PAUSE(SIGALRM); if (debug) { @@ -336,7 +338,6 @@ #define TERMINATOR (-2) /* Terminator */ #define STERMINATOR (-3) /* sticky Terminator */ -int nplayers = 0; /* isae - was missing int */ int dietime = -1; /* isae - was missing int */ static int tournamentMode(void) @@ -493,7 +494,8 @@ pmessage(0, MALL, "GOD->ALL","Diplomat insults foriegn emperor's mother and fighting breaks out!"); break; case 6: - pmessage(0, MALL, "GOD->ALL","Dan Quayle declares self as galactic emperor and chaos breaks out!"); + pmessage(0, MALL, "GOD->ALL","%s declares self as galactic emperor and chaos breaks out!", + WARMONGER); break; default: pmessage(0, MALL, "GOD->ALL","Peace parties have been demobilized, and fighting ensues."); @@ -523,7 +525,8 @@ pmessage(0, MALL, "GOD->ALL","Diplomat apologizes to foreign emperor's mother and invasion is stopped!"); break; case 6: - pmessage(0, MALL, "GOD->ALL","Dan Quayle is locked up and order returns to the galaxy!"); + pmessage(0, MALL, "GOD->ALL","%s is locked up and order returns to the galaxy!", + WARMONGER); break; default: pmessage(0, MALL, "GOD->ALL","The peace party has reformed, and is rallying for peace"); @@ -864,7 +867,7 @@ float dist; /* used by tractor beams */ int maxspeed; - nplayers = 0; + int nfree = 0; tcount[FED] = tcount[ROM] = tcount[KLI] = tcount[ORI] = 0; for (i = status->active = 0, j = &players[i]; i < MAXPLAYER; i++, j++) { int outfitdelay; @@ -907,7 +910,7 @@ } continue; case PFREE: - nplayers++; + nfree++; j->p_ghostbuster = 0; /* stop from hosing new players */ continue; #ifdef OBSERVERS @@ -1473,11 +1476,15 @@ break; } /* end switch */ } - if (nplayers == MAXPLAYER) { - if (dietime == -1) - dietime = ticks + 600 / PLAYERFUSE; - } - else { + if (nfree == MAXPLAYER) { + if (dietime == -1) { + if (status->gameup & GU_GAMEOK) { + dietime = ticks + 600 / PLAYERFUSE; + } else { + dietime = ticks + 10 / PLAYERFUSE; + } + } + } else { dietime = -1; } } @@ -2745,7 +2752,7 @@ arg[1] = j->p_no; arg[2] = l->pl_no; arg[3] = 0; - arg[4] = 0; + arg[4] = j->p_armies; #ifdef CHAIN_REACTION strcat(buf," [planet]"); arg[5] = KPLANET; Index: socket.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/socket.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- socket.c 6 May 2006 14:02:38 -0000 1.8 +++ socket.c 1 Jun 2006 03:17:25 -0000 1.9 @@ -1098,8 +1098,12 @@ packets_received ++; #endif if (handlers[(int)*bufptr].handler != NULL) { - if (((FD_ISSET(*bufptr, &inputMask)) && - (me==NULL || !(me->p_flags & (PFWAR|PFREFITTING + if (((FD_ISSET(*bufptr, &inputMask)) && + (me==NULL +#ifdef OBSERVERS + || (me->p_status == POBSERV) +#endif + || !(me->p_flags & (PFWAR|PFREFITTING #ifdef SB_TRANSWARP | PFTWARP #endif @@ -1325,7 +1329,7 @@ static void handleWarReq(struct war_cpacket *packet) { - declare_war(packet->newmask); + declare_war(packet->newmask, 1); } static void handlePlanlockReq(struct planlock_cpacket *packet) Index: interface.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/interface.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- interface.c 10 Apr 2006 10:56:32 -0000 1.4 +++ interface.c 1 Jun 2006 03:17:25 -0000 1.5 @@ -357,7 +357,7 @@ } -void declare_war(int mask) +void declare_war(int mask, int refitdelay) { int changes; int i; @@ -406,7 +406,7 @@ } } - if (mask & ~me->p_hostile) { + if (refitdelay && (mask & ~me->p_hostile)) { me->p_flags |= PFWAR; delay = me->p_updates + 100; new_warning(49,"Pausing ten seconds to re-program battle computers."); @@ -447,7 +447,7 @@ int i=0; struct ship_cap_spacket ShipFoo; - if (type<0 || type>=ATT) return; + if (type<0 || type>ATT) return; if (me->p_flags & PFORBIT) { if (!(planets[me->p_planet].pl_flags & PLHOME)) { new_warning(50,"You must orbit your HOME planet to apply for command reassignment!");