using std::endl;
char *PACKAGE = "GameServ";
-char *VERSION = "1.2.3 +devel";
+char *VERSION = "1.2.5 +devel";
int sock;
-int day;
+long lastrefresh;
List<aClient> clients[U_TABLE_SIZE];
-void save_day();
-void load_day();
+void save_lastrefresh();
+void load_lastrefresh();
void prettyIntro();
void check_idles();
delete []conf;
// Turn into a daemon
-/*
if (daemon(1,0) < 0)
{
perror("Could not turn into a daemon");
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_dragon())
+ {
+ log("Error loading dragon");
goto end;
+ }
+
+ if (load_levels() == false)
+ {
+ log("Error loading levels");
+ goto end;
+ }
shuttingdown = false;
currentserver = strtok(NULL, " ");
}
- strcpy(boss.name, "Red Dragon");
- strcpy(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 "\
- "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();
+ load_lastrefresh();
long int loadtime = time(NULL);
raw("NICK %S 1 %d +w%s %s %s %s :GameServ", time(NULL), (isBOper() ? "o" : ""),
gsident, gshost, servername);
raw(":%s SJOIN %ld %s +nt :@%S", servername, time(NULL), c_Forest);
+#elif defined(ULTIMATE2)
+ raw("PASS %s :TS", remotepass);
+ raw("SERVER %s 1 :%s", servername, servername);
+ raw("NICK %S 1 %d %s %s %s 0 :GameServ",
+ time(NULL), gsident, gshost, servername);
+ if (isBOper())
+ raw(":%S mode %S +o");
+ raw(":%S JOIN %s", c_Forest);
#elif defined(P10)
// Server numeric is: [] <-- must be unique
raw("PASS :%s", remotepass);
raw("%s T %s :%s", gsnum, c_Forest, c_ForestTopic);
raw("[] EB"); // End burst
#else
-#ifndef HYBRID
- raw(":%S MODE %s +o %S", c_Forest);
-#endif
+ #ifndef HYBRID
+ #if defined(ULTIMATE2)
+ raw(":%s MODE %s +o %S %ld", servername, c_Forest,
+ time(NULL));
+ #else
+ raw(":%S MODE %s +o %S", c_Forest);
+ #endif
+ #endif
raw(":%S TOPIC %s :%s", c_Forest, c_ForestTopic);
#endif
+ #ifndef P10
+ if (isUseNickServ())
+ {
+ raw(":%S PRIVMSG %s :IDENTIFY %s", nsname, nspass);
+ }
+ #endif
sock_gets(sock,buffer,sizeof(buffer)-1); /* -1 added thanks to
David Duchene <dave@ltd.com> for pointing out the possible
buffer overflow resulting from the linefeed added below. */
}
}
+ // 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");
+ }
}
temp = clients[hv].insertAtBack(newuser);
- #if defined(HYBRID) || defined(BAHAMUT)
+ #if defined(HYBRID) || defined(BAHAMUT) || defined(ULTIMATE2)
char *nickserver;
strtok(NULL, " ");
strtok(NULL, " ");
if (nickserver[0] == '+')
strtok(NULL, " ");
strtok(NULL, " ");
-
nickserver = strtok(NULL, " ");
for (int x = 0; x < 32; x++)
{
{
#ifdef DEBUGMODE
log("Player %s (IRC: %s) joined %s",
- joiner->stats->name,
+ joiner->stats->name.c_str(),
#ifdef P10
joiner->getRealNick(),
#else
end:
save_gs_dbase();
+ save_dragon();
saveNews(newsdata, todaysnews);
- save_day();
delete_monsters();
- delete_masters();
#ifdef DEBUGMODE
log("<CLOSED>");
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())
{
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;
}
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);
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,
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();
+}