X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/7cc338f616a11e910933a1d2206d8a0811544195..5c449fdefc6456ed1f53fb4488755826ac1d5198:/gameserv/tcpclient.cpp diff --git a/gameserv/tcpclient.cpp b/gameserv/tcpclient.cpp index 7230650..4e939d5 100644 --- a/gameserv/tcpclient.cpp +++ b/gameserv/tcpclient.cpp @@ -35,15 +35,15 @@ using std::cerr; using std::endl; char *PACKAGE = "GameServ"; -char *VERSION = "1.2.3 +devel"; +char *VERSION = "1.2.4 +devel"; int sock; -int day; +long lastrefresh; List clients[U_TABLE_SIZE]; -void save_day(); -void load_day(); +void save_lastrefresh(); +void load_lastrefresh(); void prettyIntro(); void check_idles(); @@ -103,13 +103,26 @@ int main(int argc, char *argv[]) exit(3); } - init_masters(); load_gs_dbase(); - cout << "Loading news" << endl; loadNews(newsdata, todaysnews); + if (load_masters() == false) + { + log("Error loading masters"); + goto end; + } + if (load_monsters() == false) + { + log("Error loading monsters"); goto end; + } + + if (load_levels() == false) + { + log("Error loading levels"); + goto end; + } shuttingdown = false; @@ -123,23 +136,23 @@ int main(int argc, char *argv[]) currentserver = strtok(NULL, " "); } - strcpy(boss.name, "Red Dragon"); - strcpy(boss.weapon, "Breath of Unholy Fire"); + boss.name = "Red Dragon"; + boss.weapon = "Breath of Unholy Fire"; boss.strength = 2500; boss.gold = 2000000000; boss.exp = 2000000000; boss.maxhp = 6667; boss.hp = 6667; - strcpy(boss.death, "You finally snuff out the deadly murderous "\ + 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!"); + "filled reign from above!"; // This loop will retry the connection 3 times for (int retry = 0; retry < 3 && !shuttingdown; retry++) { connected = 1; - load_day(); + load_lastrefresh(); long int loadtime = time(NULL); @@ -265,14 +278,33 @@ int main(int argc, char *argv[]) } } + // Refresh players and clear news if the time is up + currentTime = time(NULL); + if (currentTime - lastrefresh >= refreshperiod) + { + refreshall(); + clearNews(todaysnews); + saveNews(newsdata, todaysnews); + lastrefresh = currentTime; + save_lastrefresh(); + notice(s_GameServ, c_Forest, "Refreshing all players "\ + "and resetting news!"); + } + // Save the player data every updateperiod seconds currentTime = time(NULL); if (currentTime - oldTime >= updateperiod) { oldTime = currentTime; log("Saving to %s", playerdata); + save_gs_dbase(); saveNews(newsdata, todaysnews); + if (isSavedNotice()) + { + // Send notice to the channel of the update + notice(s_GameServ, c_Forest, "%S player data saved"); + } } @@ -508,7 +540,7 @@ int main(int argc, char *argv[]) { #ifdef DEBUGMODE log("Player %s (IRC: %s) joined %s", - joiner->stats->name, + joiner->stats->name.c_str(), #ifdef P10 joiner->getRealNick(), #else @@ -560,10 +592,8 @@ int main(int argc, char *argv[]) save_gs_dbase(); saveNews(newsdata, todaysnews); - save_day(); delete_monsters(); - delete_masters(); #ifdef DEBUGMODE log(""); @@ -652,7 +682,7 @@ aClient *findIRCplayer(const char *nick) if (!is_playing(p)) return NULL; - unsigned long hv = iHASH((unsigned char *) p->stats->name); + unsigned long hv = iHASH((unsigned char *) p->stats->name.c_str()); for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next()) { @@ -676,7 +706,7 @@ aClient *findplayer(const char *name) for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next()) { p = newPtr->getData()->stats; - if (stricmp(p->name, name) == 0) + if (stricmp(p->name.c_str(), name) == 0) return newPtr->getData(); p = NULL; } @@ -693,6 +723,26 @@ void check_idles() for (newPtr = players[x].First(); newPtr; newPtr = newPtr->Next()) { p = newPtr->getData()->stats; + switch(p->level) + { + case 1: + if ((time(NULL) - p->lastlogin) / 86400 >= level1expire) + { + logout(newPtr->getData()); + players[x].remove(newPtr->getData()); + return; + } + break; + + default: + if ((time(NULL) - p->lastlogin) / 86400 >= defaultexpire) + { + logout(newPtr->getData()); + players[x].remove(newPtr->getData()); + return; + } + break; + } if (timedOut(p)) { timeOutEvent(p); @@ -729,56 +779,6 @@ aClient *findbynick(const char *nick) return client; } -void load_day() -{ - ifstream infile; - - infile.open(".gsday"); - - if (infile.fail()) - { - #ifdef DEBUGMODE - log("Error opening .gsday"); - #endif - - generate: - #ifdef DEBUGMODE - log("Generating new day"); - #endif - struct tm *tm; - time_t ti; - time(&ti); - tm = localtime(&ti); - - day = tm->tm_mday; - - save_day(); - return; - } - - infile >> day; - infile.close(); - if (day < 1 || day > 31) - goto generate; -} - -void save_day() -{ - ofstream outfile; - - outfile.open(".gsday"); - - if (outfile.fail()) - { - log("Error creating new file .gsday"); - return; - } - - outfile << day << endl; - - outfile.close(); -} - /* daemon() - detach process from user and disappear into the background * returns -1 on failure, but you can't do much except exit in that case * since we may already have forked. This is based on the BSD version, @@ -853,3 +853,51 @@ cout << "G G AA AA MM MM EEEEEEE SSSSS EEEEEEE RR RR VVV" << en cout << " GGGGG V\n\n" << endl; cout << "Version: " << VERSION << endl; } + +void load_lastrefresh() +{ + ifstream infile; + infile.open(".gsrefresh"); + if (infile.fail()) + { + #ifdef DEBUGMODE + log("Error opening .gsrefresh"); + #endif + + generate: + long mytime = time(NULL); + #ifdef DEBUGMODE + log("Generating new refresh time"); + #endif + + // Just a safety measure... tho no one should + // get anywhere near the time as their refreshperiod + if (refreshperiod >= mytime) + refreshperiod = 86400; + + lastrefresh = mytime - (mytime % refreshperiod); + refreshall(); + save_lastrefresh(); + return; + } + infile >> lastrefresh; + infile.close(); + if (lastrefresh < 0) + goto generate; +} + +void save_lastrefresh() +{ + ofstream outfile; + + outfile.open(".gsrefresh"); + + if (outfile.fail()) + { + log("Error creating new file .gsrefresh"); + return; + } + outfile << lastrefresh << endl; + + outfile.close(); +}