X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/f2072f1a322a388903ce463f9cb736d6576cce4f..ff7d02f3a70d1531db8e22d5ea382d4dd774316a:/gameserv/tcpclient.cpp diff --git a/gameserv/tcpclient.cpp b/gameserv/tcpclient.cpp index 69d5dd7..7e92d58 100644 --- a/gameserv/tcpclient.cpp +++ b/gameserv/tcpclient.cpp @@ -41,11 +41,12 @@ char *VERSION = "1.2.0 +devel"; int sock; int day; -List clients; +List clients[U_TABLE_SIZE]; void save_day(); void load_day(); void prettyIntro(); +void check_idles(); // Make this a daemon int daemon(int nochdir, int noclose); @@ -56,7 +57,8 @@ void closeall(int fd); int main(int argc, char *argv[]) { char buffer[1024], buf[1024]; - int connected = 1; + int connected; + long lastidlecheck; char *cmd, *source = NULL, *conf = "gameserv.conf"; srand(time(NULL)); @@ -94,11 +96,44 @@ int main(int argc, char *argv[]) perror("Could not turn into a daemon"); 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!"); - ignore_pipe(); - sock = make_connection(remoteport, SOCK_STREAM, remoteserver); - if (sock == -1) { - fprintf(stderr,"make_connection failed.\n"); + // 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; + + lastidlecheck = loadtime; + + #ifdef DEBUGMODE + log("Setting primary Idle Check timestamp: %ld", lastidlecheck); + #endif + bool loaded = false; + + ignore_pipe(); + sock = make_connection(remoteport, SOCK_STREAM, remoteserver); + if (sock == -1) { + fprintf(stderr,"make_connection failed.\n"); unload_config_file(); return -1; } @@ -107,29 +142,28 @@ int main(int argc, char *argv[]) raw("PROTOCTL NICKv2 VHP"); raw("PASS :%s", remotepass); raw("SERVER %s 1 :%s", servername, servername); - raw("NICK %S 1 %d %S %s %s %d +owghraAxNt %s :%s v%s", time(NULL), gshost, + raw("NICK %S 1 %d %S %s %s %d +wghraAxNt %s :%s v%s", time(NULL), gshost, servername, time(NULL), gshost, PACKAGE, VERSION); raw(":%S JOIN %s", c_Forest); - raw(":%S MODE %s +mtn", c_Forest); + raw(":%S MODE %s +tn", c_Forest); #elif defined(BAHAMUT) raw("PASS %s :TS", remotepass); raw("SERVER %s 1 :%s", servername, servername); - raw("NICK %S 1 %d +o %s %s %s 0 :GameServ", time(NULL), gsident, gshost, + raw("NICK %S 1 %d +w %s %s %s 0 :GameServ", time(NULL), gsident, gshost, servername); - raw(":%s SJOIN %d %d %s +mnt :@%S", servername, time(NULL), time(NULL), c_Forest); + raw(":%s SJOIN %d %d %s +nt :@%S", servername, time(NULL), time(NULL), c_Forest); #elif defined(HYBRID) raw("PASS %s :TS", remotepass); raw("SERVER %s 1 :%s", servername, servername); - raw("NICK %S 1 %d +o %s %s %s :GameServ", time(NULL), gsident, gshost, + raw("NICK %S 1 %d +w %s %s %s :GameServ", time(NULL), gsident, gshost, servername); - // Sending a timestamp of 1 to force ops. - raw(":%s SJOIN 1 %s +ntm :@%S", servername, c_Forest); + raw(":%s SJOIN %ld %s +ntm :@%S", servername, time(NULL), c_Forest); #elif defined(P10) // Server numeric is: [] <-- must be unique raw("PASS :%s", remotepass); raw("SERVER %s 1 %d %d P10 []AAF :%s", servername, time(NULL), time(NULL), servername); raw("[] N %S 1 %d %s %s DAqAoB %s :%S", time(NULL), gsident, gshost, gsnum); - raw("[] B %s %d +tnm %s:o", c_Forest, time(NULL) - 864000, gsnum); + raw("[] B %s %d +tn %s:o", c_Forest, time(NULL) - 864000, gsnum); #endif #if defined(P10) @@ -151,26 +185,6 @@ int main(int argc, char *argv[]) log("Server: %s",buffer); #endif - 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!"); - - 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; @@ -198,7 +212,19 @@ int main(int argc, char *argv[]) if (!loaded) { if (time(NULL) >= welcomedelay + loadtime) + { loaded = true; + retry = 0; // Start the reconnection cycle over + } + } + else + { + long TIME = time(NULL); + if (TIME - lastidlecheck >= idlecheckperiod) + { + check_idles(); + lastidlecheck = TIME; + } } // Save the player data every updateperiod seconds @@ -206,6 +232,7 @@ int main(int argc, char *argv[]) if (currentTime - oldTime >= updateperiod) { oldTime = currentTime; + log("Saving to %s", playerdata); save_gs_dbase(); } @@ -238,8 +265,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 @@ -289,8 +322,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) @@ -304,8 +337,9 @@ 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))) { if (player_fight(quitter)) @@ -321,11 +355,11 @@ int main(int argc, char *argv[]) quitter->stats->fight = NULL; quitter->stats->master = NULL; - quitter->setNick("!NULL!"); + quitter->setNick("Not Playing"); #ifdef P10 - quitter->setRealNick("!NULL!"); + quitter->setRealNick("Not Playing"); #endif - quitter->stats->user = NULL; // Unidentify them + quitter->stats->client = NULL; // Unidentify them } if (z == ':') @@ -346,7 +380,7 @@ int main(int argc, char *argv[]) delete [] longname; gameserv(source, rest); } - else if (stricmp(dest, c_Forest) == 0) + else if (stricmp(dest, c_Forest) == 0 && listenonc_forest) { delete [] longname; forest(source, rest); @@ -427,6 +461,8 @@ int main(int argc, char *argv[]) } } + } // for loop for connection retry + end: save_gs_dbase(); @@ -459,7 +495,8 @@ aClient *find(const char *nick) aClient *findbyrealnick(char *realnick) { ListNode *newPtr; - newPtr = clients.First(); + unsigned long hv = HASH((unsigned char *) realnick, U_TABLE_SIZE); + newPtr = clients[hv].First(); aClient *client = NULL; @@ -486,7 +523,8 @@ aClient *findbyrealnick(char *realnick) aClient *findbynick(char *nick) { ListNode *newPtr; - newPtr = clients.First(); + unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE); + newPtr = clients[hv].First(); aClient *client = NULL; @@ -510,7 +548,8 @@ aClient *findIRCplayer(const char *nick) ListNode *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 @@ -523,12 +562,13 @@ aClient *findIRCplayer(const char *nick) } return NULL; } + aClient *findplayer(const char *name) { ListNode *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) @@ -538,10 +578,29 @@ aClient *findplayer(const char *name) return NULL; } +void check_idles() +{ + ListNode *newPtr; + Player *p = NULL; + + for (int x = 0; x < U_TABLE_SIZE; x++) + { + for (newPtr = players[x].First(); newPtr; newPtr = newPtr->Next()) + { + p = newPtr->getData()->stats; + if (timedOut(p)) + { + timeOutEvent(p); + } + } + } +} + aClient *findbynick(const char *nick) { ListNode *newPtr; - newPtr = clients.First(); + unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE); + newPtr = clients[hv].First(); aClient *client = NULL;