#include "list.h"
#include "aClient.h"
#include "extern.h"
+#include "flags.h"
#include <stdio.h>
#include <unistd.h>
#include <string.h>
using std::endl;
char *PACKAGE = "GameServ";
-char *VERSION = "1.2.0 +devel";
+char *VERSION = "1.2.1 +devel";
int sock;
int day;
int main(int argc, char *argv[])
{
char buffer[1024], buf[1024];
+ memset(buffer, 0, 1024);
+ memset(buf, 0, 1024);
int connected;
long lastidlecheck;
char *cmd, *source = NULL, *conf = "gameserv.conf";
if (daemon(1,0) < 0)
{
perror("Could not turn into a daemon");
- exit(2);
+ exit(3);
}
-
init_masters();
load_gs_dbase();
if (load_monsters() == false)
goto end;
- shuttingdown = false;
+ shuttingdown = false;
+
+ char ignoreservers[32][256];
+ char *currentserver;
+ currentserver = strtok(ignoreserverslist, " ");
+ for (int server = 0; server < 32 && currentserver != NULL; server++)
+ {
+ strncpy(ignoreservers[server], currentserver, 255);
+ log("Placing %s on the server ignore list", currentserver);
+ currentserver = strtok(NULL, " ");
+ }
strcpy(boss.name, "Red Dragon");
strcpy(boss.weapon, "Breath of Unholy Fire");
"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();
+ connected = 1;
+ load_day();
- long int loadtime = time(NULL);
- long int currentTime;
- long int oldTime = loadtime;
- lastidlecheck = loadtime;
- bool loaded = false;
+ long int loadtime = time(NULL);
+ long int currentTime;
+ long int oldTime = loadtime;
- ignore_pipe();
- sock = make_connection(remoteport, SOCK_STREAM, remoteserver);
- if (sock == -1) {
- fprintf(stderr,"make_connection failed.\n");
+ 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;
}
+ log("%S socket connected.");
#ifdef UNREAL
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,
- servername, time(NULL), gshost, PACKAGE, VERSION);
+ raw("NICK %S 1 %d %S %s %s %d +w%s %s :%s v%s", time(NULL), gshost,
+ servername, time(NULL), (isBOper() ? "o" : ""), 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,
- servername);
- raw(":%s SJOIN %d %d %s +mnt :@%S", servername, time(NULL), time(NULL), c_Forest);
+ raw("NICK %S 1 %d +w%s %s %s %s 0 :GameServ", time(NULL), (isBOper() ? "o" : ""),
+ gsident, gshost, servername);
+ 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,
- servername);
- // Sending a timestamp of 1 to force ops.
- raw(":%s SJOIN 1 %s +ntm :@%S", servername, c_Forest);
+ 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(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("[] N %S 1 %d %s %s %s DAqAoB %s :%S", time(NULL), gsident, gshost,
+ (isBOper() ? "+o" : "") gsnum);
+ raw("[] B %s %d +tn %s:o", c_Forest, time(NULL) - 864000, gsnum);
#endif
#if defined(P10)
if (currentTime - oldTime >= updateperiod)
{
oldTime = currentTime;
+ log("Saving to %s", playerdata);
save_gs_dbase();
}
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);
+ oldhv = iHASH((unsigned char *) tempPtr->getNick());
+ newhv = iHASH((unsigned char *) nick);
tempPtr->setNick(nick);
clients[oldhv].remove(tempPtr);
clients[newhv].insertAtBack(tempPtr);
nick = strtok(NULL, " ");
}
#endif
- aClient *newuser;
+ aClient *newuser, *temp;
nick = strtok(NULL, " ");
#else
notice(s_GameServ, nick, welcomemsg, nick);
#endif
- unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
- clients[hv].insertAtBack(newuser);
+ #ifdef P10
+ unsigned long hv = sHASH((unsigned char *) nick)
+ #else
+ unsigned long hv = iHASH((unsigned char *) nick);
+ #endif
+
+ temp = clients[hv].insertAtBack(newuser);
+
+ #if defined(HYBRID) || defined(BAHAMUT)
+ char *nickserver;
+ strtok(NULL, " ");
+ strtok(NULL, " ");
+ nickserver = strtok(NULL, " ");
+ if (nickserver[0] == '+')
+ strtok(NULL, " ");
+ strtok(NULL, " ");
+
+ nickserver = strtok(NULL, " ");
+ for (int x = 0; x < 32; x++)
+ {
+ if (stricmp(ignoreservers[x], nickserver) == 0)
+ {
+ setIgnore(temp);
+ break;
+ }
+ }
+ #endif
delete newuser;
}
#if defined(P10)
} else if (stricmp(cmd, "Q") == 0) {
+// unsigned long hv = sHASH((unsigned char *) source);
#else
} else if (stricmp(cmd, "QUIT") == 0) {
+// unsigned long hv = iHASH((unsigned char *) source);
#endif
aClient *quitter;
char z = source[0];
if (z == ':')
source++;
- unsigned long hv = HASH((unsigned char *) source, U_TABLE_SIZE);
+ if (!(quitter = find(source)))
+ {
+ log("Fatal Error: could not find %s in the "\
+ "clients list", source);
+ goto end;
+ }
+
+ logout(quitter);
+
+ if (z == ':')
+ source--;
+
+ /* Attempting to use the logout() function
if ((quitter = find(source)))
clients[hv].remove(quitter);
if ((quitter = findIRCplayer(source)))
#endif
quitter->stats->client = NULL; // Unidentify them
}
-
- if (z == ':')
- source--;
+ */
#if defined(P10)
} else if (stricmp(cmd, "P") == 0) {
delete [] longname;
gameserv(source, rest);
}
- else if (stricmp(dest, c_Forest) == 0)
+ else if (stricmp(dest, c_Forest) == 0 && isListenOnCF())
{
delete [] longname;
forest(source, rest);
aClient *findbyrealnick(char *realnick)
{
ListNode <aClient> *newPtr;
- unsigned long hv = HASH((unsigned char *) realnick, U_TABLE_SIZE);
+ unsigned long hv = sHASH((unsigned char *) realnick);
newPtr = clients[hv].First();
aClient *client = NULL;
aClient *findbynick(char *nick)
{
ListNode <aClient> *newPtr;
- unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+ #ifdef P10
+ unsigned long hv = sHASH((unsigned char *) nick);
+ #else
+ unsigned long hv = iHASH((unsigned char *) nick);
+ #endif
+
newPtr = clients[hv].First();
aClient *client = NULL;
ListNode <aClient> *newPtr;
aClient *p = NULL;
- unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+ p = find(nick);
+
+ if (!is_playing(p))
+ return NULL;
+
+ unsigned long hv = iHASH((unsigned char *) p->stats->name);
+
for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
{
p = newPtr->getData();
{
ListNode <aClient> *newPtr;
Player *p = NULL;
- unsigned long hv = HASH((unsigned char *) name, U_TABLE_SIZE);
+ unsigned long hv = iHASH((unsigned char *) name);
for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next())
{
p = newPtr->getData()->stats;
aClient *findbynick(const char *nick)
{
ListNode <aClient> *newPtr;
- unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE);
+ #ifdef P10
+ unsigned long hv = sHASH((unsigned char *) nick);
+ #else
+ unsigned long hv = iHASH((unsigned char *) nick);
+ #endif
+
newPtr = clients[hv].First();
aClient *client = NULL;