]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/tcpclient.cpp
Updated Changes file
[irc/gameservirc.git] / gameserv / tcpclient.cpp
index 1c00bbddf2e08680a8b610a6e430af00e8a48712..e276ae390a4e7c3ae034160c82bc0e2d287340ee 100644 (file)
@@ -36,12 +36,12 @@ using std::cerr;
 using std::endl;
 
 char *PACKAGE = "GameServ";
-char *VERSION = "1.1.8";
+char *VERSION = "1.2.0 +devel";
 
 int sock;
 int day;
 
-List<aClient> clients;
+List<aClient> clients[U_TABLE_SIZE];
 
 void save_day();
 void load_day();
@@ -56,10 +56,15 @@ void closeall(int fd);
 int main(int argc, char *argv[])
 {
   char buffer[1024], buf[1024];
-  int connected = 1;
+  int connected;
   char *cmd, *source = NULL, *conf = "gameserv.conf";
   srand(time(NULL));
 
+  /*
+   * This needs to be fixed to work for any number of arguments in any
+   * order
+   *
+   */
   if (argc > 1)
   {
        if ( argc > 2 || stricmp(argv[1], "--help") == 0)
@@ -90,6 +95,34 @@ int main(int argc, char *argv[])
         exit(2);
     }
 
+  init_masters();
+  load_gs_dbase();
+
+  if (load_monsters() == false)
+       goto end;
+
+   shuttingdown = false;
+
+  strcpy(boss.name, "Red Dragon");
+  strcpy(boss.weapon, "Breath of Unholy Fire");
+  boss.strength = 6667;
+  boss.gold = 2000000000;
+  boss.exp = 2000000000;
+  strcpy(boss.death, "You finally snuff out the deadly murderous "\
+    "dragon's dark flames. You have freed the land of its terror "\
+    "filled reign from above!");
+
+ // This loop will retry the connection 3 times
+ for (int retry = 0; retry < 3 && !shuttingdown; retry++)
+ {
+  connected = 1;
+  load_day();
+
+  long int loadtime = time(NULL);
+  long int currentTime;
+  long int oldTime = loadtime;
+  bool loaded = false;
+
   ignore_pipe();
   sock = make_connection(remoteport, SOCK_STREAM, remoteserver);
   if (sock == -1) {
@@ -146,17 +179,6 @@ int main(int argc, char *argv[])
       log("Server: %s",buffer);
   #endif
 
-  init_masters();
-  load_gs_dbase();
-  load_day();
-  long int loadtime = time(NULL);
-  long int currentTime;
-  long int oldTime = loadtime;
-  bool loaded = false;
-
-  if (load_monsters() == false)
-       goto end;
-
   while (connected) {
       if (sock_gets(sock,buffer,sizeof(buffer)) == -1) {
         connected = 0;
@@ -184,7 +206,10 @@ int main(int argc, char *argv[])
         if (!loaded)
        {
            if (time(NULL) >= welcomedelay + loadtime)
+           {
                loaded = true;
+               retry = 0; // Start the reconnection cycle over
+           }
        }
 
        // Save the player data every updateperiod seconds
@@ -224,8 +249,14 @@ int main(int argc, char *argv[])
                if ((tempPtr = find((source + 1))))
                {
                    char *nick;
+                   unsigned long oldhv, newhv;
                    nick = strtok(NULL, " ");
+                   oldhv = HASH((unsigned char *) tempPtr->getNick(),
+                               U_TABLE_SIZE);
+                   newhv = HASH((unsigned char *) nick, U_TABLE_SIZE);
                    tempPtr->setNick(nick);
+                   clients[oldhv].remove(tempPtr);
+                   clients[newhv].insertAtBack(tempPtr);
                }
            }
            else
@@ -275,8 +306,8 @@ int main(int argc, char *argv[])
                #else
                    notice(s_GameServ, nick, welcomemsg, nick);
                #endif
-
-               clients.insertAtBack(newuser);
+               unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+               clients[hv].insertAtBack(newuser);
                delete newuser;
            }
       #if defined(P10)
@@ -290,12 +321,29 @@ int main(int argc, char *argv[])
            if (z == ':')
                source++;
 
+           unsigned long hv = HASH((unsigned char *) source, U_TABLE_SIZE);
            if ((quitter = find(source)))
-               clients.remove(quitter);
+               clients[hv].remove(quitter);
            if ((quitter = findIRCplayer(source)))
            {
-               quitter->setNick("!NULL!");
-               quitter->stats->user = NULL; // Unidentify them
+               if (player_fight(quitter))
+               {
+                   // Stop the fight on the other client
+                   aClient *otherplayer = quitter->stats->battle;
+                   otherplayer->stats->battle = NULL;
+                   notice(s_GameServ, otherplayer->getNick(), "%s "\
+                          "has quit IRC. The fight stops here.",
+                          quitter->stats->name);
+               }
+               quitter->stats->battle = NULL;
+               quitter->stats->fight = NULL;
+               quitter->stats->master = NULL;
+
+               quitter->setNick("Not Playing");
+               #ifdef P10
+                   quitter->setRealNick("Not Playing");
+               #endif
+               quitter->stats->client = NULL; // Unidentify them
            }
 
            if (z == ':')
@@ -331,11 +379,39 @@ int main(int argc, char *argv[])
            else if (stricmp(dest, c_Forest) == 0)
                forest(source, rest);
       #endif
+      #if defined(P10)
+       } else if (stricmp(cmd, "J") == 0) {
+      #else
        } else if (stricmp(cmd, "JOIN") == 0) {
+      #endif
            char *channel;
+           aClient *joiner;
            channel = strtok(NULL, " ");
-           if (stricmp(channel, c_Forest) == 0 && is_playing(source + 1))
-               raw(":%S MODE %s +v %s", c_Forest, (source + 1));
+
+            char z = source[0];
+
+            if (z == ':')
+                source++;
+
+           joiner = find(source);
+
+           if (stricmp(channel, c_Forest) == 0 && is_playing(joiner))
+           {
+               #ifdef DEBUGMODE
+                   log("Player %s (IRC: %s) joined %s", 
+                       joiner->stats->name, 
+                       #ifdef P10
+                           joiner->getRealNick(),
+                       #else
+                           joiner->getNick(),
+                       #endif
+                       c_Forest);
+               #endif
+               raw(":%S MODE %s +v %s", c_Forest, (source));
+           }
+
+           if (z == ':')
+               source--;
 
        #if defined(BAHAMUT)
        } else if (stricmp(cmd, "SJOIN") == 0) {
@@ -369,6 +445,8 @@ int main(int argc, char *argv[])
        }
   }
 
+ } // for loop for connection retry
+
   end:
 
   save_gs_dbase();
@@ -401,7 +479,8 @@ aClient *find(const char *nick)
 aClient *findbyrealnick(char *realnick)
 {
    ListNode <aClient> *newPtr;
-    newPtr = clients.First();
+   unsigned long hv = HASH((unsigned char *) realnick, U_TABLE_SIZE);
+    newPtr = clients[hv].First();
 
     aClient *client = NULL;
 
@@ -428,7 +507,8 @@ aClient *findbyrealnick(char *realnick)
 aClient *findbynick(char *nick)
 {
     ListNode <aClient> *newPtr;
-    newPtr = clients.First();
+    unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+    newPtr = clients[hv].First();
 
     aClient *client = NULL;
 
@@ -452,7 +532,8 @@ aClient *findIRCplayer(const char *nick)
     ListNode <aClient> *newPtr;
     aClient *p = NULL;
 
-    for (newPtr = players.First(); newPtr; newPtr = newPtr->Next())
+    unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+    for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
        p = newPtr->getData();
        #ifdef P10
@@ -469,8 +550,8 @@ aClient *findplayer(const char *name)
 {
     ListNode <aClient> *newPtr;
     Player *p = NULL;
-
-    for (newPtr = players.First(); newPtr; newPtr = newPtr->Next())
+    unsigned long hv = HASH((unsigned char *) name, U_TABLE_SIZE);
+    for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
     {
        p = newPtr->getData()->stats;
        if (stricmp(p->name, name) == 0)
@@ -483,7 +564,8 @@ aClient *findplayer(const char *name)
 aClient *findbynick(const char *nick)
 {
     ListNode <aClient> *newPtr;
-    newPtr = clients.First();
+    unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+    newPtr = clients[hv].First();
 
     aClient *client = NULL;
 
@@ -582,9 +664,9 @@ int daemon(int nochdir, int noclose)
         case -1: return -1;
         default: 
                ofstream outfile;
-               outfile.open("gameserv.pid");
+               outfile.open(pidfile);
                if (outfile.fail())
-                   cerr << "Unable to open gameserv.pid" << endl;
+                   cerr << "Unable to open " << pidfile << endl;
                outfile << pid << endl;
                outfile.close();