Date: Monday February 16, 2004 @ 18:21 Author: cameron Update of /home/netrek/cvsroot/Vanilla/ntserv In directory swashbuckler.real-time.com:/var/tmp/cvs-serv6674/ntserv Modified Files: findslot.c main.c Log Message: add NO_DUPLICATE_HOSTS feature **************************************** Index: Vanilla/ntserv/findslot.c diff -u Vanilla/ntserv/findslot.c:1.2 Vanilla/ntserv/findslot.c:1.3 --- Vanilla/ntserv/findslot.c:1.2 Fri Apr 30 15:18:43 1999 +++ Vanilla/ntserv/findslot.c Mon Feb 16 18:21:20 2004 @@ -15,6 +15,20 @@ #include "data.h" #include "proto.h" +/* return true if the host is not already in the game */ +static int absent(int w_queue, char *host) { + int i, here = 0; + for (i=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; + } + return 1; +} /* * The following code for findslot() is really nice. @@ -30,7 +44,7 @@ * oldcount: (local) My position last time I looked. */ -int findslot(int w_queue) +int findslot(int w_queue, char *host) { u_int oldcount; /* My old number */ pid_t mypid = getpid(); @@ -41,6 +55,19 @@ /* 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 (;;) { + if (absent(w_queue, host)) 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) if ( (i=pickslot(w_queue)) >= 0 ) return (i); @@ -48,6 +75,7 @@ mywait = queue_add(w_queue); /* Get me into the queue */ if (mywait == -1) return (-1); /* The queue is full! */ + rep = 0; oldcount = waiting[mywait].count; for (;;) { Index: Vanilla/ntserv/main.c diff -u Vanilla/ntserv/main.c:1.27 Vanilla/ntserv/main.c:1.28 --- Vanilla/ntserv/main.c:1.27 Sat Aug 23 01:14:19 2003 +++ Vanilla/ntserv/main.c Mon Feb 16 18:21:20 2004 @@ -176,7 +176,8 @@ sendMotd(); - pno = findslot(w_queue); + /* wait for a slot to become free */ + pno = findslot(w_queue, host); if (pno < 0) { /* trigger client's "Sorry, but you cannot play xtrek now. Try again later." */ @@ -186,7 +187,6 @@ sendClientPacket (&packet); flushSockBuf (); ERROR(2,("ntserv/main.c: Quitting: No slot available on queue %d\n",w_queue)); - /* print some appropriate message */ exit(1); } _______________________________________________ vanilla-devel mailing list vanilla-devel at us.netrek.org https://mailman.real-time.com/mailman/listinfo/vanilla-devel