#include "player.h"
#include "pouch.h"
#include "flags.h"
-#include "list.h"
#include "level.h"
#include "sockhelp.h"
#include "item.h"
+#include <algorithm>
#include <cctype>
#include <fstream>
#include <stdlib.h>
bool passcmp(const char *encrypted, char *plaintext); // Compares an encrypted pass with a plain text one
bool check_password(char *name, char *plaintext); // Finds a password for the given name, and checks it with passcmp against the plaintext password given.
-
+
/********** Password functions **********/
bool dragon_fight(char *u); // True if the player is fighting the dragon.
bool dragon_fight(aClient *user);
+bool alphaNumeric(const char *str); // Returns true if all of the characters in str are alphanumeric non-special chars
/********** GameServ Booleans **********/
void display_help(char *u, char *file = NULL);
void gameserv(char *source, char *buf)
{
- char *cmd, z;
- cmd = strtok(buf, " ");
-
- #ifndef P10
- source++; // Get rid of that : at the beginning of a :Nick privmsg Gameserv :text
- #endif
-
- z = cmd[0];
- if (z == ':')
- cmd++; // Get rid of that : at the beginning of the :text (command)
-
- #ifdef DEBUGMODE
- log("Source: %s Command: %s", source, cmd);
- #endif
-
- if (strnicmp(cmd, "\1PING", 6) == 0)
+ char *cmd, z;
+ cmd = strtok(buf, " ");
+
+#ifndef P10
+ source++; // Get rid of that : at the beginning of a :Nick privmsg Gameserv :text
+#endif
+
+ z = cmd[0];
+ if (z == ':')
+ cmd++; // Get rid of that : at the beginning of the :text (command)
+
+#ifdef DEBUGMODE
+ log("Source: %s Command: %s", source, cmd);
+#endif
+
+ if (strnicmp(cmd, "\1PING", 6) == 0)
{
- char *ts;
- ts = strtok(NULL, "\1");
- notice(s_GameServ, source, "\1PING %s\1", ts);
- } else if (stricmp(cmd, "\1VERSION\1") == 0) {
- notice(s_GameServ, source, "\1VERSION %s %s\1", PACKAGE, VERSION);
- } else if (stricmp(cmd, "SEARCH") == 0) {
- cmd = strtok(NULL, " ");
-
- if (!cmd)
+ char *ts;
+ ts = strtok(NULL, "\1");
+ notice(s_GameServ, source, "\1PING %s\1", ts);
+ }
+ else if (stricmp(cmd, "\1VERSION\1") == 0)
+ {
+ notice(s_GameServ, source, "\1VERSION %s %s\1", PACKAGE, VERSION);
+ }
+ else if (stricmp(cmd, "SEARCH") == 0)
+ {
+ cmd = strtok(NULL, " ");
+
+ if (!cmd)
notice(s_GameServ, source, "SYNTAX: /msg %S SEARCH FOREST");
- else
+ else
do_forest(source);
-
- } else if (stricmp(cmd, "ADMIN") == 0) {
- do_admin(source);
- } else if (stricmp(cmd, "ATTACK") == 0) {
- do_attack(source);
- } else if (stricmp(cmd, "BANK") == 0) {
- do_bank(source);
- } else if (stricmp(cmd, "CHECK") == 0) {
- do_check(source);
- } else if (stricmp(cmd, "DRAGON") == 0) {
- do_dragon(source);
- } else if (stricmp(cmd, "EQUIP") == 0) {
+
+ }
+ else if (stricmp(cmd, "ADMIN") == 0)
+ {
+ do_admin(source);
+ }
+ else if (stricmp(cmd, "ATTACK") == 0)
+ {
+ do_attack(source);
+ }
+ else if (stricmp(cmd, "BANK") == 0)
+ {
+ do_bank(source);
+ }
+ else if (stricmp(cmd, "CHECK") == 0)
+ {
+ do_check(source);
+ }
+ else if (stricmp(cmd, "DRAGON") == 0)
+ {
+ do_dragon(source);
+ }
+ else if (stricmp(cmd, "EQUIP") == 0)
+ {
do_equip(source);
- } else if (stricmp(cmd, "FIGHT") == 0) {
- do_fight(source);
- } else if (stricmp(cmd, "HEAL") == 0) {
- do_heal(source);
- } else if (stricmp(cmd, "HELP") == 0) {
- do_help(source);
- } else if (stricmp(cmd, "IDENTIFY") == 0) {
- do_identify(source);
- } else if (stricmp(cmd, "INVENTORY") == 0) {
- do_inventory(source);
- } else if (stricmp(cmd, "LIST") == 0) {
- do_list(source);
- } else if (stricmp(cmd, "LOGOUT") == 0) {
- do_logout(source);
- } else if (stricmp(cmd, "MASTER") == 0) {
- do_master(source);
- } else if (stricmp(cmd, "NEWS") == 0) {
- do_news(source);
- } else if (stricmp(cmd, "REGISTER") == 0) {
- do_register(source);
- } else if (stricmp(cmd, "REFRESH") == 0) {
- do_refresh(source);
- } else if (stricmp(cmd, "RESET") == 0) {
- do_reset(source);
- } else if (stricmp(cmd, "RUN") == 0) {
- do_run(source);
- } else if (stricmp(cmd, "SET") == 0) {
- do_set(source);
- } else if (stricmp(cmd, "STATS") == 0) {
- do_stats(source);
- } else if (stricmp(cmd, "STORE") == 0) {
- do_store(source);
- } else if (stricmp(cmd, "TAVERN") == 0) {
- do_tavern(source);
- } else if (stricmp(cmd, "USE") == 0) {
- do_use(source);
- } else if (stricmp(cmd, "SHUTDOWN") == 0) {
- aClient *user;
-
- if (!(user = find(source)))
- {
- notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
- log("Error: aClient not found: %s", source);
- }
- else if (!isAdmin(user))
+ }
+ else if (stricmp(cmd, "FIGHT") == 0)
{
- notice(s_GameServ, source, "You must be a %S admin to use this command!");
- }
- else
+ do_fight(source);
+ }
+ else if (stricmp(cmd, "HEAL") == 0)
{
- save_gs_dbase();
- #ifdef P10
- raw("[] SQ %s 0 :leaving: %s used the Shutdown command.", servername, user->getRealNick());
- #else
- raw("SQUIT %s :leaving: %s used the Shutdown command.", servername, source);
- #endif
- shuttingdown = true;
- }
- } else if (stricmp(cmd, "SAVE") == 0) {
- aClient *user;
-
- if (!(user = find(source)))
+ do_heal(source);
+ }
+ else if (stricmp(cmd, "HELP") == 0)
{
- notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
- log("Error: aClient not found: %s", source);
- }
- else if (!isAdmin(user))
+ do_help(source);
+ }
+ else if (stricmp(cmd, "IDENTIFY") == 0)
{
- notice(s_GameServ, source, "You must be a %S admin to use this command!");
- }
- else
- {
- save_gs_dbase();
- }
- } else if (stricmp(cmd, "LOAD") == 0) {
- aClient *user;
-
- if (!(user = find(source)))
+ do_identify(source);
+ }
+ else if (stricmp(cmd, "INVENTORY") == 0)
{
- notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
- log("Error: aClient not found: %s", source);
- }
- else if (!isAdmin(user))
+ do_inventory(source);
+ }
+ else if (stricmp(cmd, "LIST") == 0)
{
- notice(s_GameServ, source, "You must be a %S admin to use this command!");
- }
- else
+ do_list(source);
+ }
+ else if (stricmp(cmd, "LOGOUT") == 0)
+ {
+ do_logout(source);
+ }
+ else if (stricmp(cmd, "MASTER") == 0)
+ {
+ do_master(source);
+ }
+ else if (stricmp(cmd, "NEWS") == 0)
+ {
+ do_news(source);
+ }
+ else if (stricmp(cmd, "REGISTER") == 0)
+ {
+ do_register(source);
+ }
+ else if (stricmp(cmd, "REFRESH") == 0)
+ {
+ do_refresh(source);
+ }
+ else if (stricmp(cmd, "RESET") == 0)
+ {
+ do_reset(source);
+ }
+ else if (stricmp(cmd, "RUN") == 0)
+ {
+ do_run(source);
+ }
+ else if (stricmp(cmd, "SET") == 0)
+ {
+ do_set(source);
+ }
+ else if (stricmp(cmd, "STATS") == 0)
+ {
+ do_stats(source);
+ }
+ else if (stricmp(cmd, "STORE") == 0)
+ {
+ do_store(source);
+ }
+ else if (stricmp(cmd, "TAVERN") == 0)
+ {
+ do_tavern(source);
+ }
+ else if (stricmp(cmd, "USE") == 0)
+ {
+ do_use(source);
+ }
+ else if (stricmp(cmd, "SHUTDOWN") == 0)
+ {
+ aClient *user;
+
+ if (!(user = find(source)))
+ {
+ notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
+ log("Error: aClient not found: %s", source);
+ }
+ else if (!isAdmin(user))
+ {
+ notice(s_GameServ, source, "You must be a %S admin to use this command!");
+ }
+ else
+ {
+ save_gs_dbase();
+#ifdef P10
+ raw("[] SQ %s 0 :leaving: %s used the Shutdown command.", servername, user->getRealNick());
+#else
+ raw("SQUIT %s :leaving: %s used the Shutdown command.", servername, source);
+#endif
+ shuttingdown = true;
+ }
+ }
+ else if (stricmp(cmd, "SAVE") == 0)
+ {
+ aClient *user;
+
+ if (!(user = find(source)))
+ {
+ notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
+ log("Error: aClient not found: %s", source);
+ }
+ else if (!isAdmin(user))
+ {
+ notice(s_GameServ, source, "You must be a %S admin to use this command!");
+ }
+ else
{
- char *cmd2 = strtok(NULL, " ");
- if (!cmd2)
- {
- notice(s_GameServ, source, "Loading player data from %s", playerdata);
- load_gs_dbase();
- }
- else if (stricmp(cmd2, "MONSTERS") == 0)
- {
- notice(s_GameServ, source, "Loading monster data");
- load_monsters();
- }
- else
- display_help(source, cmd);
- }
- #ifdef DEBUGMODE
- } else if (stricmp(cmd, "RAW") == 0) {
- aClient *user;
-
- if (!(user = find(source)))
+ save_gs_dbase();
+ }
+ }
+ else if (stricmp(cmd, "LOAD") == 0)
{
- notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
- log("Error: aClient not found: %s", source);
+ aClient *user;
+
+ if (!(user = find(source)))
+ {
+ notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
+ log("Error: aClient not found: %s", source);
+ }
+ else if (!isAdmin(user))
+ {
+ notice(s_GameServ, source, "You must be a %S admin to use this command!");
+ }
+ else
+ {
+ char *cmd2 = strtok(NULL, " ");
+ if (!cmd2)
+ {
+ notice(s_GameServ, source, "Loading player data from %s", playerdata);
+ load_gs_dbase();
+ }
+ else if (stricmp(cmd2, "MONSTERS") == 0)
+ {
+ notice(s_GameServ, source, "Loading monster data");
+ load_monsters();
+ }
+ else
+ {
+ display_help(source, cmd);
+ }
+ }
}
- else if (!isAdmin(user))
+#ifdef DEBUGMODE
+ else if (stricmp(cmd, "RAW") == 0)
{
- notice(s_GameServ, source, "You must be a %S admin to use this command!");
- }
- else
+ aClient *user;
+
+ if (!(user = find(source)))
+ {
+ notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
+ log("Error: aClient not found: %s", source);
+ }
+ else if (!isAdmin(user))
+ {
+ notice(s_GameServ, source, "You must be a %S admin to use this command!");
+ }
+ else
{
- char *rest = strtok(NULL, "");
- raw("%s", rest);
- }
- } else if (stricmp(cmd, "PRINT") == 0) {
- for (int x = 0; x < LEVELS; x++)
- levels[x].monsters.print();
- } else if (stricmp(cmd, "RANDOM") == 0) {
- char *rstr = strtok(NULL, "");
- range trange;
- trange.setRange(rstr);
- notice(s_GameServ, source, "Random number in that range: %d", trange.random());
- #endif
- } else {
- aClient *user;
- if ((user = find(source)))
+ char *rest = strtok(NULL, "");
+ raw("%s", rest);
+ }
+ }
+ else if (stricmp(cmd, "RANDOM") == 0)
{
- if (isIgnore(user))
- {
- #ifdef DEBUGMODE
- log("Ignoring %s.", user->getNick());
- #endif
- }
- else
- {
- notice(s_GameServ, source, "Unknown command \002%s\002. Type /msg %S \002HELP\002 to get a list of commands.", cmd);
- }
+ char *rstr = strtok(NULL, "");
+ range trange;
+ trange.setRange(rstr);
+ notice(s_GameServ, source, "Random number in that range: %d", trange.random());
}
- }
+#endif
+ else
+ {
+ aClient *user;
+ if ((user = find(source)))
+ {
+ if (isIgnore(user))
+ {
+#ifdef DEBUGMODE
+ log("Ignoring %s.", user->getNick());
+#endif
+ }
+ else
+ {
+ notice(s_GameServ, source, "Unknown command \002%s\002. Type /msg %S \002HELP\002 to get a list of commands.", cmd);
+ }
+ }
+ }
- #ifndef P10
- source--; // Bring the ':' back so we don't leak memory
- #endif
- if (z == ':')
+#ifndef P10
+ source--; // Bring the ':' back so we don't leak memory
+#endif
+ if (z == ':')
cmd--; // Same thing :)
}
void showstats(const char *u, const char *nick)
{
- aClient *ni, *sender = find(u);
+ aClient *sender = find(u);
+ Player *p;
char *buf;
buf = new char[50];
char *space;
- if (!(ni = findplayer(nick)))
+ if (!(p = findplayer(nick)))
{
notice(s_GameServ, u, "%s not found", nick);
}
- else if (ni->stats)
+ else
{
- notice(s_GameServ, sender->getNick(), "Stats for %s:", ni->stats->getName().c_str());
+ notice(s_GameServ, sender->getNick(), "Stats for %s:", p->getName().c_str());
- sprintf(buf, "Experience: %ld", ni->stats->getExp());
+ sprintf(buf, "Experience: %ld", p->getExp());
space = spaces(strlen(buf), " ");
notice(s_GameServ, sender->getNick(), "%s%sLevel: %d", buf, space,
- ni->stats->getLevel());
+ p->getLevel());
delete [] space;
- sprintf(buf, "Gold: %ld", ni->stats->getGold());
+ sprintf(buf, "Gold: %ld", p->getGold());
space = spaces(strlen(buf), " ");
- notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, ni->stats->getBank());
+ notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, p->getBank());
delete [] space;
- notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", ni->stats->getHP(),
- ni->stats->getMaxHP());
+ notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", p->getHP(),
+ p->getMaxHP());
- sprintf(buf, "Strength: %d", ni->stats->getStrength());
+ sprintf(buf, "Strength: %d", p->getStrength());
space = spaces(strlen(buf), " ");
notice(s_GameServ, sender->getNick(), "%s%sDefense: %d",
- buf, space, ni->stats->getDefense());
+ buf, space, p->getDefense());
delete [] space;
- sprintf(buf, "Armor: %s", (ni->stats->getArmor() ? ni->stats->getArmor()->getName().c_str() : "Nothing"));
+ sprintf(buf, "Armor: %s", (p->getArmor() ? p->getArmor()->getName().c_str() : "Nothing"));
space = spaces(strlen(buf), " ");
notice(s_GameServ, sender->getNick(), "%s%sWeapon: %s", buf, space,
- (ni->stats->getWeapon() ? ni->stats->getWeapon()->getName().c_str() : "Fists"));
+ (p->getWeapon() ? p->getWeapon()->getName().c_str() : "Fists"));
delete [] space;
- sprintf(buf, "Forest Fights: %d", ni->stats->getForestFights());
+ sprintf(buf, "Forest Fights: %d", p->getForestFights());
space = spaces(strlen(buf), " ");
- notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, ni->stats->getPlayerFights());
+ notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, p->getPlayerFights());
delete [] space;
- if (ni == sender || isAdmin(sender))
+ if (p->getClient() == sender || isAdmin(sender))
{
- showinventory(ni->stats, sender);
+ showinventory(p, sender);
}
}
- else
- {
- notice(s_GameServ, u, "%s is not playing!", ni->stats->getName().c_str());
- }
+
delete [] buf;
}
void do_list(char *u)
{
- aClient *user;
- char *cmd = strtok(NULL, " ");
-
- if (!(user = find(u)))
+ aClient *user;
+ Player *p;
+ char *cmd = strtok(NULL, " ");
+
+ if (!(user = find(u)))
{
- log("Fatal Error: Couldn't find %s in the client list", u);
- return;
+ log("Fatal Error: Couldn't find %s in the client list", u);
+ return;
}
- else if (isIgnore(user))
+ else if (isIgnore(user))
{
- #ifdef DEBUGMODE
- log("Ignoring %s. Command LIST", user->getNick());
- #endif
- return;
+#ifdef DEBUGMODE
+ log("Ignoring %s. Command LIST", user->getNick());
+#endif
+ return;
}
-
- ListNode<aClient> *temp;
- bool header = false;
+
+ list<Player*>::iterator iter;
+ bool header = false;
for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
- {
- temp = players[x].First();
- if (!players[x].isEmpty())
- {
- while(temp)
{
- if (cmd || is_playing(temp->getData()))
- {
- if (!header)
- {
- notice(s_GameServ, u, "Players:");
- header = true;
- }
- #ifdef P10
- notice(s_GameServ, u, "IRC: %s Game: %s", temp->getData()->getRealNick(),
- temp->getData()->stats->getName().c_str());
- #else
- notice(s_GameServ, u, "IRC: %s Game: %s", temp->getData()->getNick(),
- temp->getData()->stats->getName().c_str());
- #endif
- }
-
- temp = temp->Next();
+ iter = players[x].begin();
+ if (!players[x].empty())
+ {
+ while(iter != players[x].end())
+ {
+ p = (*iter);
+ if (cmd || is_playing(p->getClient()))
+ {
+ if (!header)
+ {
+ notice(s_GameServ, u, "Players:");
+ header = true;
+ }
+#ifdef P10
+ notice(s_GameServ, u, "IRC: %s Game: %s", (p->getClient() ? p->getClient()->getRealNick() : "Not Playing"),
+ p->getName().c_str());
+#else
+ notice(s_GameServ, u, "IRC: %s Game: %s", (p->getClient() ? p->getClient()->getNick() : "Not Playing"),
+ p->getName().c_str());
+#endif
+ }
+ iter++;
+ }
+ }
}
- }
- }
- if (!header)
+ if (!header)
notice(s_GameServ, u, "No one is playing");
- else
- notice(s_GameServ, u, "End of List");
-
+ else
+ notice(s_GameServ, u, "End of List");
}
+
void do_set(char *u)
{
- aClient *user, *target;
+ aClient *user;
+ Player *p;
char *name = strtok(NULL, " ");
char *cmd = strtok(NULL, " ");
char *cmd2;
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}");
return;
}
- else if (!(target = findplayer(name)))
+ else if (!(p = findplayer(name)))
{
// Back the pointers up... they didn't send a name probably
cmd2 = cmd;
cmd = name;
- target = user;
+ p = user->stats;
if (!is_playing(user))
{
// Person is looking to change their password
// If they're an admin, or it's theirself, allow it
// cmd2 is pointing to the password now
- if (isAdmin(user) || user == target)
+ if (isAdmin(user) || user == p->getClient())
{
- target->stats->setPassword(cmd2);
+ p->setPassword(cmd2);
notice(s_GameServ, u, "Password successfully changed");
}
- else if (user != target && !isAdmin(user))
+ else if (user != p->getClient() && !isAdmin(user))
{
notice(s_GameServ, u, "You must be a %S admin to set other peoples' passwords.");
return;
return;
}
- target->stats->setBank(stringtoint(cmd2));
+ p->setBank(stringtoint(cmd2));
- notice(s_GameServ, u, "Bank balance changed to %ld!", target->stats->getBank());
+ notice(s_GameServ, u, "Bank balance changed to %ld!", p->getBank());
}
else if (stricmp(cmd, "PLAYER") == 0)
{
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
return;
}
- target->stats->setPlayerFights(stringtoint(cmd2));
+ p->setPlayerFights(stringtoint(cmd2));
- notice(s_GameServ, u, "Player fights changed to %d!", target->stats->getPlayerFights());
+ notice(s_GameServ, u, "Player fights changed to %d!", p->getPlayerFights());
}
}
else if (stricmp(cmd, "FOREST") == 0)
return;
}
- target->stats->setForestFights(stringtoint(cmd2));
+ p->setForestFights(stringtoint(cmd2));
- notice(s_GameServ, u, "Forest fights changed to %d!", target->stats->getForestFights());
+ notice(s_GameServ, u, "Forest fights changed to %d!", p->getForestFights());
}
}
else if (stricmp(cmd, "GOLD") == 0)
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] GOLD <NUMBER>");
return;
}
- target->stats->setGold(stringtoint(cmd2));
+ p->setGold(stringtoint(cmd2));
- notice(s_GameServ, u, "Gold set to %ld", target->stats->getGold());
+ notice(s_GameServ, u, "Gold set to %ld", p->getGold());
return;
}
}
return;
}
- target->stats->setStrength(stringtoint(cmd2));
+ p->setStrength(stringtoint(cmd2));
- notice(s_GameServ, u, "Strength set to %d", target->stats->getStrength());
+ notice(s_GameServ, u, "Strength set to %d", p->getStrength());
return;
}
}
return;
}
- target->stats->setDefense(stringtoint(cmd2));
+ p->setDefense(stringtoint(cmd2));
- notice(s_GameServ, u, "Defense set to %d", target->stats->getDefense());
+ notice(s_GameServ, u, "Defense set to %d", p->getDefense());
return;
}
}
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP <NUMBER>");
return;
}
- target->stats->setHP(stringtoint(cmd2));
+ p->setHP(stringtoint(cmd2));
- notice(s_GameServ, u, "HP set to %d", target->stats->getHP());
+ notice(s_GameServ, u, "HP set to %d", p->getHP());
return;
}
}
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] MAXHP <NUMBER>");
return;
}
- target->stats->setMaxHP(stringtoint(cmd2));
+ p->setMaxHP(stringtoint(cmd2));
- notice(s_GameServ, u, "MaxHP set to %d", target->stats->getMaxHP());
+ notice(s_GameServ, u, "MaxHP set to %d", p->getMaxHP());
return;
}
}
return;
}
- target->stats->setExp(stringtoint(cmd2));
+ p->setExp(stringtoint(cmd2));
- notice(s_GameServ, u, "Exp set to %ld", target->stats->getExp());
+ notice(s_GameServ, u, "Exp set to %ld", p->getExp());
return;
}
}
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] LEVEL <NUMBER>");
return;
}
- target->stats->setLevel(stringtoint(cmd2));
+ p->setLevel(stringtoint(cmd2));
- notice(s_GameServ, u, "Level set to %d", target->stats->getLevel());
+ notice(s_GameServ, u, "Level set to %d", p->getLevel());
return;
}
}
}
else if (stricmp(cmd2, "TRUE") == 0)
{
- notice(s_GameServ, u, "%s has been Resurrected!", target->stats->getName().c_str());
- setAlive(target->stats);
+ notice(s_GameServ, u, "%s has been Resurrected!", p->getName().c_str());
+ setAlive(p);
}
else
{
- notice(s_GameServ, u, "%s is now dead!", target->stats->getName().c_str());
- clearAlive(target->stats);
+ notice(s_GameServ, u, "%s is now dead!", p->getName().c_str());
+ clearAlive(p);
}
}
}
}
else if (stricmp(cmd2, "TRUE") == 0)
{
- notice(s_GameServ, u, "%s has seen their master now.", target->stats->getName().c_str());
- target->stats->addFlag(FLAG_MASTER);
+ notice(s_GameServ, u, "%s has seen their master now.", p->getName().c_str());
+ p->addFlag(FLAG_MASTER);
}
else
{
- notice(s_GameServ, u, "%s has not seen their master now.", target->stats->getName().c_str());
- target->stats->remFlag(FLAG_MASTER);
+ notice(s_GameServ, u, "%s has not seen their master now.", p->getName().c_str());
+ p->remFlag(FLAG_MASTER);
}
}
}
void do_logout(char *u)
{
- aClient *user;
- char *name = strtok(NULL, " ");
-
- if (!(user = find(u)))
+ aClient *user;
+ Player *p;
+ char *name = strtok(NULL, " ");
+
+ if (!(user = find(u)))
{
- notice(s_GameServ, u, "Fatal error. Cannot find aClient. "\
- "Buf: %s LOGOUT", u);
- log("Could not find aClient Buf: %s LOGOUT",
- u);
- return;
+ notice(s_GameServ, u, "Fatal error. Cannot find aClient. "\
+ "Buf: %s LOGOUT", u);
+ log("Could not find aClient Buf: %s LOGOUT",
+ u);
+ return;
}
- else if (isIgnore(user))
+ else if (isIgnore(user))
{
- #ifdef DEBUGMODE
- log("Ignoring %s.", user->getNick());
- #endif
- return;
+#ifdef DEBUGMODE
+ log("Ignoring %s.", user->getNick());
+#endif
+ return;
}
-
- if (name)
+
+ if (name)
{
- if (!isAdmin(user))
- {
- notice(s_GameServ, u, "You must be a %S admin to use this command!");
- }
- else if (!(user = findplayer(name)))
- {
- notice(s_GameServ, u, "Couldn't find a player named %s", name);
- }
- else
- {
- notice(s_GameServ, u, "Logging out %s", user->stats->getName().c_str());
- logout(user);
- }
+ if (!isAdmin(user))
+ {
+ notice(s_GameServ, u, "You must be a %S admin to use this command!");
+ }
+ else if (!(p = findplayer(name)))
+ {
+ notice(s_GameServ, u, "Couldn't find a player named %s", name);
+ }
+ else
+ {
+ notice(s_GameServ, u, "Logging out %s", p->getName().c_str());
+ logout(p->getClient());
+ }
}
- else if (!name)
+ else if (!name)
{
- if (!is_playing(user))
- {
- notice(s_GameServ, u, "You're not logged in!");
- }
- else if (is_fighting(user))
- {
- notice(s_GameServ, u, "You can't logout while fighting!");
- }
- else
- {
- notice(s_GameServ, u, "You have left the fields. You have lived to kill another day!");
- logout(user);
- }
+ if (!is_playing(user))
+ {
+ notice(s_GameServ, u, "You're not logged in!");
+ }
+ else if (is_fighting(user))
+ {
+ notice(s_GameServ, u, "You can't logout while fighting!");
+ }
+ else
+ {
+ notice(s_GameServ, u, "You have left the fields. You have lived to kill another day!");
+ logout(user);
+ }
}
}
void logout(aClient *user)
{
- if (is_playing(user))
+ if (user != NULL)
{
- ListNode<aClient> *it;
- aClient *temp;
- unsigned long hv = iHASH((unsigned char *) user->stats->getName().c_str());
- it = players[hv].Find(user);
-
- if (!it)
- {
- notice(s_GameServ, user->getNick(), "Fatal error. Contact "\
- "%S Admin. Cannot find you in the players list.");
- log("Error on logout(). Can't find %s in the players list",
- #ifdef P10
- user->getRealNick()
- #else
- user->getNick()
- #endif
- );
- return;
- }
-
- temp = new aClient;
- temp->stats = new Player;
- temp->stats->setData(user->stats);
- user->stats->setClient(NULL);
-
- if (player_fight(user))
- user->stats->getBattle()->stats->delBattle();
-
- delete user->stats;
- user->stats = NULL;
- temp->stats->setClient(NULL);
-#ifdef P10
- temp->setRealNick("Not Playing");
+ if (user->stats != NULL)
+ {
+
+ list<Player*>::iterator iter;
+ unsigned long hv = iHASH((unsigned char *) user->stats->getName().c_str());
+ iter = find(players[hv].begin(), players[hv].end(), user->stats);
+
+ if (iter == players[hv].end())
+ {
+ notice(s_GameServ, user->getNick(), "Fatal error. Contact "\
+ "%S Admin. Cannot find you in the players list. This should NEVER happen");
+ log("Error on logout(). Can't find %s in the players list",
+#ifdef P10
+ user->getRealNick()
+#else
+ user->getNick()
#endif
- temp->setNick("Not Playing");
-
- it->setNewPtr(temp);
+ );
+ user->stats = NULL;
+
+ return;
+ }
+ user->stats->delMonster();
+ user->stats->delMaster();
+ user->stats->delBattle();
+ clearDragonFight(user->stats);
+ clearYourTurn(user->stats);
+ clearPlaying(user);
+
+ user->stats->setClient(NULL);
+
+
+ if (player_fight(user))
+ {
+ clearYourTurn(user->stats->getBattle()->stats);
+ user->stats->getBattle()->stats->delBattle();
+ }
+
#ifdef DEBUGMODE
- log("Logged out player %s",
+ log("Logged out player %s",
#ifdef P10
- user->getRealNick()
+ user->getRealNick()
#else
- user->getNick()
+ user->getNick()
#endif
- );
+ );
#endif
- }
- clearPlaying(user);
+ }
+ }
+ if (user)
+ user->stats = NULL;
}
void do_register(char *u)
{
char *password, *name;
aClient *user;
+ Player *p;
name = strtok(NULL, " ");
password = strtok(NULL, " ");
else if (stricmp(name, s_GameServ) == 0)
{
notice(s_GameServ, u, "You can't use %S as a name!");
- return;
}
else if (!password)
{
notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD");
}
- else if ((user = findplayer(name)))
+ else if (strlen(name) > maxnicklen)
+ {
+ notice(s_GameServ, u, "Name too long. Maximum length: %d", maxnicklen);
+ }
+ else if (!alphaNumeric(name))
+ {
+ notice(s_GameServ, u, "That is not a valid name. Please use only AlphaNumeric (A-Z, 0-9) characters!");
+ }
+ else if ((p = findplayer(name)))
{
notice(s_GameServ, u, "%s is already registered!", name);
notice(s_GameServ, u, "Choose another name!");
#ifdef DEBUGMODE
log("Ignoring %s.", user->getNick());
#endif
- return;
}
else
{
if (!is_playing(user))
{
- ListNode<aClient> *temp;
item *tempItem;
+ unsigned long hv = iHASH((unsigned char *) name);
+
+ // First create the Player
user->stats = new Player();
- user->stats->setClient(user); // Set the backwards pointer
- user->stats->reset(); // set the user up
+
+ // Set the backwards pointer
+ user->stats->setClient(user);
+
+ // Set the player's password
user->stats->setPassword(password);
+
+ // Set the player's name
user->stats->setName(name);
- unsigned long hv = iHASH((unsigned char *) name);
+
+ // Make sure they have a proper time stamp
updateTS(user->stats);
- temp = players[hv].insertAtBack_RLN(user);
- temp->setPtr(user); // This is an extra step, but necessary for now
-
+
// Update the last login time
user->stats->lastlogin = time(NULL);
+ // Send notification of success
notice(s_GameServ, u, "Player %s registered with password %s.", user->stats->getName().c_str(), password);
notice(s_GameServ, u, "Write this password down. If you lose it, there is no way to retrieve it!");
+
+ // Log the new player
log("Nickname %s registered player %s.", u, user->stats->getName().c_str());
- setPlaying(user); // set the playing flag
+
+ // Log the player in
+ setPlaying(user);
+
+ // Start the player at the beginning
+ reset(user->stats);
+
+ // Add the stick and clothes
tempItem = findItemByID(3001);
user->stats->inventory->addItem((*Items.begin()))->use(user->stats); // Add the stick
user->stats->inventory->addItem(tempItem)->use(user->stats); // Add Clothes
+
+ // Add the player to the list
+ players[hv].push_back(user->stats);
}
else
{
void do_identify(char *u)
{
char *password, *name;
- aClient *user, *p;
+ aClient *user;
+ Player *p;
name = strtok(NULL, " ");
password = strtok(NULL, " ");
if (!password || !name)
#endif
return;
}
- else if (!(p = findplayer(name)) || !p->stats)
- notice(s_GameServ, u, "Player %s not found", name);
+ else if (!(p = findplayer(name)))
+ {
+ notice(s_GameServ, u, "Player %s not found", name);
+ }
else if (is_playing(user))
{
notice(s_GameServ, u, "You are already playing!");
}
- else if (p->stats->getClient() != NULL && !isAdmin(user))
+ else if (is_playing(p->getClient()) && !isAdmin(user))
{
notice(s_GameServ, u, "That player has already identified.");
}
}
else
{
- ListNode<aClient> *temp;
- unsigned long hv = iHASH((unsigned char *) p->stats->getName().c_str());
- temp = players[hv].Find(p);
- if (!temp)
+ list<Player*>::iterator iter;
+ unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
+
+ iter = find(players[hv].begin(), players[hv].end(), p);
+
+ if (iter == players[hv].end())
{
notice(s_GameServ, u, "Fatal error. Contact %S Admin. Buf: %s",
strtok(NULL, ""));
return;
}
- user->stats = new Player(p->stats->getName());
-#ifdef DEBUGMODE
- log("Setting data for identified");
-#endif
- user->stats->setData(p->stats);
- user->stats->setClient(user);
- updateTS(user->stats);
+ // Make sure the other user is logged out
+ logout(p->getClient());
+
+ user->stats = p;
+ p->setClient(user);
+ updateTS(p);
#ifdef DEBUGMODE
log("Player %s IRC: %s Identified", user->stats->getName().c_str(),
user->getNick());
#endif
-
- setPlaying(user); // set the playing flag
-
- temp->setPtr(user);
+ //Set the playing flag
+ setPlaying(user);
// Update the last login time
user->stats->lastlogin = time(NULL);
-
+
notice(s_GameServ, u, "Password Accepted. Identified.");
showNews(u, todaysnews);
}
}
else
{
- updateTS(user->stats);
+ if (!is_fighting(user))
+ updateTS(user->stats);
showstats(u, user->stats->getName().c_str());
}
}
void delete_monsters()
{
for (int x = 0; x < LEVELS; x++)
- levels[x].monsters.deleteNodes();
+ levels[x].monsters.clear();
}
void display_monster(char *u)
bool is_playing(aClient *user)
{
- if (user->stats == NULL)
+ if (!user)
{
return false;
}
- else if (user->stats->getClient() == NULL)
+ else if (!user->stats)
+ {
+ return false;
+ }
+ else if (!FL_is_playing(user))
{
return false;
}
- else if (!FL_is_playing(user))
+ else if (user->stats->getClient() != user)
{
return false;
}
{
if (!is_playing(user))
return false;
- else if (user->stats->getBattle() != NULL && is_playing(user->stats->getBattle()))
+ else if (is_playing(user->stats->getBattle()))
{
- return user->stats->getBattle()->stats != NULL;
+ return true;
}
return false;
}
return (isDragonFight(user->stats));
}
+bool alphaNumeric(const char *str)
+{
+ int len = strlen(str);
+ for (int x = 0; x < len; x++)
+ {
+ if (!((int(str[x]) >= 65 && int(str[x]) <= 90) || (int(str[x]) >= 97 && int(str[x]) <= 122) || (int(str[x]) >= 48 && int(str[x]) <= 57) || int(str[x]) == 95))
+ return false;
+ }
+ return true;
+}
+
void do_fight(char *u)
{
- aClient *ni, *battle;
+ aClient *ni;
+ Player *battle;
char *nick = strtok(NULL, " ");
{
notice(s_GameServ, u, "You are dead. Wait until tomorrow to fight others!");
}
- else if (!is_playing(battle))
+ else if (!is_playing(battle->getClient()))
{
notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick);
}
display_players(u);
}
*/
- else if (stricmp(ni->stats->getName().c_str(), battle->stats->getName().c_str()) == 0)
+ else if (stricmp(ni->stats->getName().c_str(), battle->getName().c_str()) == 0)
{
notice(s_GameServ, u, "Are you trying to commit suicide!?");
}
- else if (!isAlive(battle->stats))
+ else if (!isAlive(battle))
{
notice(s_GameServ, u, "They are dead. Cannot fight dead players!");
}
- else if (player_fight(battle))
+ else if (player_fight(battle->getClient()))
{
- notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->getName().c_str(), battle->stats->getBattle()->stats->getName().c_str());
+ notice(s_GameServ, u, "%s is fighting %s already!", battle->getName().c_str(), battle->getBattle()->stats->getName().c_str());
}
- else if (master_fight(battle))
+ else if (master_fight(battle->getClient()))
{
- notice(s_GameServ, u, "%s is fighting their master!", battle->stats->getName().c_str());
+ notice(s_GameServ, u, "%s is fighting their master!", battle->getName().c_str());
}
- else if (is_fighting(battle))
+ else if (is_fighting(battle->getClient()))
{
- notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->getName().c_str(), battle->stats->getMonster()->name.c_str());
+ notice(s_GameServ, u, "%s is fighting %s already!", battle->getName().c_str(), battle->getMonster()->name.c_str());
}
- else if (ni->stats->getLevel() - battle->stats->getLevel() > maxbfightdistance)
+ else if (!isAdmin(ni) && isFairFights() && (ni->stats->getStrength()/2 - battle->getDefense()) > battle->getHP())
+ {
+ notice(s_GameServ, u, "Fair fighting is enabled, and you're too strong for %s!", battle->getName().c_str());
+ }
+ else if (ni->stats->getLevel() - battle->getLevel() > maxbfightdistance)
{
// You can't fight someone below you by more than X level(s)
// level 12 can fight level (12 - X) but not < (12 - X)
notice(s_GameServ, u, "You may not fight %s. You're too strong!",
- battle->stats->getName().c_str());
+ battle->getName().c_str());
}
- else if (battle->stats->getLevel() - ni->stats->getLevel() > maxafightdistance)
+ else if (battle->getLevel() - ni->stats->getLevel() > maxafightdistance)
{
// You can't fight someone above you by more than X level(S)
// level 1 can fight level (1 + X), but not > (1 + X)
else
{
// Set your battle pointer to the other player
- ni->stats->setBattle(battle);
+ ni->stats->setBattle(battle->getClient());
// Set the other player's battle pointer to you
- battle->stats->setBattle(ni);
+ battle->setBattle(ni);
// The initiator gets the first move (perhaps this should be 50/50)
setYourTurn(ni->stats);
- clearYourTurn(battle->stats);
+ clearYourTurn(battle);
// Initiate Battle sequence!
ni->stats->subtractPlayerFights(1);
- notice(s_GameServ, u, "You challenge %s to an online duel!", battle->stats->getName().c_str());
+ notice(s_GameServ, u, "You challenge %s to an online duel!", battle->getName().c_str());
notice(s_GameServ, c_Forest, "%s walks up and hits %s in the face! Let's see who will bite the dust.",
- ni->stats->getName().c_str(), battle->stats->getName().c_str()); /* DrLnet - Modified by Kain*/
+ ni->stats->getName().c_str(), battle->getName().c_str()); /* DrLnet - Modified by Kain*/
- notice(s_GameServ, battle->getNick(), "%s has challenged you to an online duel!", ni->stats->getName().c_str());
- notice(s_GameServ, battle->getNick(), "%s gets to go first "\
+ notice(s_GameServ, battle->getClient()->getNick(), "%s has challenged you to an online duel!", ni->stats->getName().c_str());
+ notice(s_GameServ, battle->getClient()->getNick(), "%s gets to go first "\
"because they initiated!", ni->stats->getName().c_str());
- notice(s_GameServ, battle->getNick(), "Please wait while %s decides what to do.", ni->stats->getName().c_str());
+ notice(s_GameServ, battle->getClient()->getNick(), "Please wait while %s decides what to do.", ni->stats->getName().c_str());
display_players(ni);
}
}
return;
}
id = stringtoint(item);
- updateTS(user->stats);
+ if (!is_fighting(user))
+ updateTS(user->stats);
p = user->stats->inventory;
equip->use(user->stats);
}
}
+
void do_use(char *u)
{
aClient *user;
pouch *p;
char *item = strtok(NULL, " ");
- int id;
+ char *numuse = strtok(NULL, " ");
+ int id, num;
itemContainer *used;
- if (!item || int(item[0]) < 48 || int(item[0]) > 57)
+ if (!item || int(item[0]) < 48 || int(item[0]) > 57 || (numuse && (int(numuse[0]) < 48 || int(numuse[0]) > 57)))
{
notice(s_GameServ, u, "SYNTAX: USE ####");
notice(s_GameServ, u, "Type /msg %S HELP USE for more information.");
return;
}
id = stringtoint(item);
+
+ if (!numuse)
+ {
+ num = 1;
+ }
+ else
+ {
+ num = stringtoint(numuse);
+ }
+
updateTS(user->stats);
p = user->stats->inventory;
-
+
if (!(used = p->Find(id)))
{
if (!p->isEmpty())
}
else
{
- // Use the item
- notice(s_GameServ, u, "You used %s.", used->getItem()->getName().c_str());
- used->use(user->stats);
- if (used->getUses() == 0)
+ // Use the item(s)
+ if (num <= 1 || is_fighting(user))
+ {
+ notice(s_GameServ, u, "You used %s.", used->getItem()->getName().c_str());
+ used->use(user->stats);
+ if (used->getUses() <= 0)
+ {
+ p->deleteItem(used->getItem());
+ }
+ end_turn(user);
+ }
+ else if (num > 1)
{
- p->deleteItem(used->getItem());
+ int count;
+ const char *name = used->getItem()->getName().c_str();
+ for (count = 0; count < num; count++)
+ {
+ if (!(used = p->Find(id)))
+ {
+ break;
+ }
+ else
+ {
+ used->use(user->stats);
+ if (used->getUses() == 0)
+ {
+ p->deleteItem(used->getItem());
+ }
+ }
+ }
+ notice(s_GameServ, u, "You used %d %s's", count, name);
}
- end_turn(user);
- }
+ }
}
void do_run(char *u)
{
long int pow(int x, int y)
{
- long int value = 0;
- int count = 0;
- value += x;
-
- if (x != 0 && y != 0)
+ long int value = 0;
+ int count = 0;
+ value += x;
+
+ if (x != 0 && y != 0)
{
- for (count = 1; count <= y - 1; count++)
- value *= x;
+ for (count = 1; count <= y - 1; count++)
+ value *= x;
}
- else
- return 1;
-return value;
+ else
+ {
+ return 1;
+ }
+ return value;
}
long int chartoint(char ch)
{
- if (int(ch) >= 48 && int(ch) <= 57)
- return int(ch) - 48;
- else
- return 0;
+ if (int(ch) >= 48 && int(ch) <= 57)
+ return int(ch) - 48;
+ else
+ return 0;
}
int save_gs_dbase()
{
- ListNode<aClient> *ptr;
- Player *it;
- ofstream outfile;
-
- outfile.open(playerdata);
-
- if (!outfile)
- {
- log("Error opening %s", playerdata);
- return 0;
- }
-
- for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
- {
- ptr = players[x].First();
- while(ptr)
+ list<Player*>::iterator iter;
+ Player *it;
+ ofstream outfile;
+
+ outfile.open(playerdata);
+
+ if (!outfile)
{
- it = ptr->getData()->stats;
- clearYourTurn(it);
- item *w, *a;
- w = it->getWeapon();
- a = it->getArmor();
-
- outfile << it->getName().c_str() << ' ' << it->getLevel() << ' ' << it->getExp() << ' ' << it->getGold() << ' ' << it->getBank() << ' '<< it->getHP() << ' ' << it->getMaxHP() << ' ' << it->getStrength() << ' ' << it->getDefense() << ' ' << it->getForestFights() << ' ' << it->getPlayerFights() << ' ' << it->getFlags() << ' ' << it->getPassword().c_str() << ' ' << it->lastlogin << ' ' << (w ? w->getID() : 0) << ' ' << (a ? a->getID() : 0);
-
- // Traverse the list and write out each item ID and how many uses are left
- if (!it->inventory->isEmpty())
- {
- list<itemContainer> *myitems;
- list<itemContainer>::iterator item_iter;
- myitems = it->inventory->getItems();
-
- for(item_iter = myitems->begin();item_iter != myitems->end();item_iter++)
- {
- outfile << ' ' << (*item_iter).getItem()->getID() << ' ' << (*item_iter).getUses();
- }
- }
- outfile << endl;
- ptr = ptr->Next();
+ log("Error opening %s", playerdata);
+ return 0;
}
- }
-outfile.close();
-return 1;
+
+ for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
+ {
+ for(iter = players[x].begin(); iter != players[x].end(); iter++)
+ {
+ it = (*iter);
+ clearYourTurn(it);
+ item *w, *a;
+ w = it->getWeapon();
+ a = it->getArmor();
+
+ outfile << it->getName().c_str() << ' ' << it->getLevel() << ' ' << it->getExp() << ' ' << it->getGold() << ' ' << it->getBank() << ' '<< it->getHP() << ' ' << it->getMaxHP() << ' ' << it->getStrength() << ' ' << it->getDefense() << ' ' << it->getForestFights() << ' ' << it->getPlayerFights() << ' ' << it->getFlags() << ' ' << it->getPassword().c_str() << ' ' << it->lastlogin << ' ' << (w ? w->getID() : 0) << ' ' << (a ? a->getID() : 0);
+
+ // Traverse the list and write out each item ID and how many uses are left
+ if (!it->inventory->isEmpty())
+ {
+ list<itemContainer> *myitems;
+ list<itemContainer>::iterator item_iter;
+ myitems = it->inventory->getItems();
+
+ for(item_iter = myitems->begin();item_iter != myitems->end();item_iter++)
+ {
+ outfile << ' ' << (*item_iter).getItem()->getID() << ' ' << (*item_iter).getUses();
+ }
+ }
+ outfile << endl;
+ }
+ }
+ outfile.close();
+ return 1;
}
int load_dragon()
ifstream infile;
char *buf;
item *tempItem;
-
-
+
buf = new char[1024];
-
+
infile.open(itemdata);
-
+
if (infile.fail())
{
log("Error opening %s", itemdata);
return 0;
}
-
+
while (infile.getline(buf, 1024, '\n'))
{
if (buf[0] == '^')
- break;
+ break;
try
- {
- if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
- {
- switch(buf[0])
{
- case '1':
- tempItem = new weapon();
- break;
- case '2':
- tempItem = new armor();
- break;
- case '3':
- tempItem = new potion();
- break;
- default:
- log("Invalid Item Type %c in %s", buf[0], itemdata);
- delete []buf;
- return 0;
- break;
+ if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
+ {
+ switch(buf[0])
+ {
+ case '1':
+ tempItem = new weapon();
+ break;
+ case '2':
+ tempItem = new armor();
+ break;
+ case '3':
+ tempItem = new potion();
+ break;
+ default:
+ log("Invalid Item Type %c in %s", buf[0], itemdata);
+ delete []buf;
+ return 0;
+ break;
+ }
+ if(tempItem->setData(buf))
+ {
+ Items.push_back(tempItem);
+ }
+ }
}
- if(tempItem->setData(buf))
+ catch (char *str)
{
- Items.push_back(tempItem);
+ log("Exception loading items: %s", str);
+ delete []buf;
+ return 0;
}
- }
- }
- catch (char *str)
- {
- log("Exception loading items: %s", str);
- delete []buf;
- return 0;
- }
}
delete []buf;
return 1;
int load_gs_dbase()
{
ifstream infile;
- aClient *temp;
Player *p;
char *tempname, *buf, *password;
int tempnum;
return 0;
}
+
for (int x = 0; x < U_TABLE_SIZE; x++)
{
- ListNode<aClient> *tempNode;
- tempNode = players[x].First();
- while (tempNode)
+ list<Player*>::iterator iter;
+
+ for (iter = players[x].begin(); iter != players[x].end(); iter++)
{
- if (tempNode->getData()->stats->getClient())
- {
- logout(tempNode->getData()->stats->getClient());
- }
- tempNode = tempNode->Next();
+ logout((*iter)->getClient());
+ delete (*iter);
}
- players[x].deleteNodes();
+ players[x].clear();
}
while (infile.getline(buf, 100000, '\n'))
{
- temp = new aClient;
tempname = strtok(buf, " ");
- temp->stats = new Player(tempname);
- p = temp->stats;
+ p = new Player(tempname);
p->setLevel(stringtoint(strtok(NULL, " ")));
p->setExp(stringtoint(strtok(NULL, " ")));
p->setGold(stringtoint(strtok(NULL, " ")));
p->setBank(stringtoint(strtok(NULL, " ")));
- p->setHP(stringtoint(strtok(NULL, " ")));
+ tempnum = stringtoint(strtok(NULL, " "));
p->setMaxHP(stringtoint(strtok(NULL, " ")));
+ p->setHP(tempnum);
p->setStrength(stringtoint(strtok(NULL, " ")));
p->setDefense(stringtoint(strtok(NULL, " ")));
p->setForestFights(stringtoint(strtok(NULL, " ")));
p->setFlags(stringtoint(strtok(NULL, " ")));
-
- password = strtok(NULL, " ");
- p->setRawPassword(password);
- temp->setNick("Not Playing");
-#ifdef P10
- temp->setRealNick("Not Playing");
-#endif
- tempname = strtok(NULL, " ");
- if (tempname)
- p->lastlogin = stringtoint(tempname);
- else
- p->lastlogin = time(NULL);
-
- tempname = strtok(NULL, " ");
- tempnum = stringtoint(tempname);
- if (tempnum != 0)
- {
- p->setWeapon(*findItemByID(tempnum));
- }
-
- tempname = strtok(NULL, " ");
- tempnum = stringtoint(tempname);
-
- if (tempnum != 0)
- {
- p->setArmor(*findItemByID(tempnum));
- }
-
-
- for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " "))
- {
- long int id, uses;
- list<item*>::iterator item_iter;
- id = stringtoint(tempname);
+
+ password = strtok(NULL, " ");
+ p->setRawPassword(password);
+ tempname = strtok(NULL, " ");
+
+ if (tempname)
+ p->lastlogin = stringtoint(tempname);
+ else
+ p->lastlogin = time(NULL);
+
+ tempname = strtok(NULL, " ");
+ tempnum = stringtoint(tempname);
+ item *tempitem;
+ if (tempnum != 0)
+ {
+ tempitem = findItemByID(tempnum);
+ p->setWeapon(*tempitem);
+ }
+
tempname = strtok(NULL, " ");
- uses = stringtoint(tempname);
+ tempnum = stringtoint(tempname);
+
+ if (tempnum != 0)
+ {
+ tempitem = findItemByID(tempnum);
+ p->setArmor(*tempitem);
+ }
+
+
+ unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
+
+ p->setClient(NULL);
- item_iter = Items.begin();
- while (item_iter != Items.end())
+ for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " "))
{
- if ((*item_iter)->getID() == id)
+ long int id, uses;
+ list<item*>::iterator item_iter;
+ id = stringtoint(tempname);
+ tempname = strtok(NULL, " ");
+ uses = stringtoint(tempname);
+
+ item_iter = Items.begin();
+ while (item_iter != Items.end())
{
- // Don't sort every time you add an item or it eats CPU
- p->inventory->addItemNoChecks((*item_iter))->setUses(uses);
+ if ((*item_iter)->getID() == id)
+ {
+ // Don't sort every time you add an item or it eats CPU
+ p->inventory->addItemNoChecks((*item_iter))->setUses(uses);
+ }
+ item_iter++;
}
- item_iter++;
}
+ p->inventory->sort();
+ players[hv].push_back(p);
}
- p->inventory->sort();
-
- unsigned long hv = iHASH((unsigned char *) temp->stats->getName().c_str());
-
- temp->stats->setClient(NULL);
- players[hv].insertAtBack(temp);
- delete temp;
-}
-delete [] buf;
-infile.close();
-return 1;
+
+ delete [] buf;
+ infile.close();
+ return 1;
}
bool passcmp(const char *encrypted, char *plaintext)
bool check_password(char *name, char *plaintext)
{
- aClient *client;
+ Player *p;
- if (!(client = findplayer(name)))
+ if (!(p = findplayer(name)))
return false;
else
{
- return passcmp(client->stats->getPassword().c_str(), plaintext);
+ return passcmp(p->getPassword().c_str(), plaintext);
}
}
notice(s_GameServ, u, "You can't afford to buy %s", tempItem->getName().c_str());
return;
}
- else
+ else if (p->inventory->addItem(tempItem))
{
notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", tempItem->getName().c_str());
p->subtractGold(tempItem->price());
- p->inventory->addItem(tempItem);
notice(s_GameServ, u, "Don't forget to type /msg %S equip %ld", tempItem->getID());
}
+ else
+ {
+ notice(s_GameServ, u, "You can't carry any more!");
+ }
}
else if (stricmp(cmd, "SELL" ) == 0)
{
notice(s_GameServ, u, "You must be playing to check your inventory!");
return;
}
- updateTS(user->stats);
+ if (!is_fighting(user))
+ updateTS(user->stats);
showinventory(user->stats, user);
}
else if (user->stats->inventory->addItem(tempItem->getItem(), amt) == NULL)
{
notice(s_GameServ, u, "You can't carry that many!");
- return;
}
- notice(s_GameServ, u, "%d %s's coming right up!", amt, tempItem->getItem()->getName().c_str());
- user->stats->subtractGold(tempItem->getItem()->price() * amt);
+ else
+ {
+ notice(s_GameServ, u, "%d %s's coming right up!", amt, tempItem->getItem()->getName().c_str());
+ user->stats->subtractGold(tempItem->getItem()->price() * amt);
+ }
}
else
{
if (user->stats->inventory->addItem(tempItem->getItem()) == NULL)
{
notice(s_GameServ, u, "You can't carry any more!");
- return;
}
- notice(s_GameServ, u, "One %s coming right up!", tempItem->getItem()->getName().c_str());
- user->stats->subtractGold(tempItem->getItem()->price());
+ else
+ {
+ notice(s_GameServ, u, "One %s coming right up!", tempItem->getItem()->getName().c_str());
+ user->stats->subtractGold(tempItem->getItem()->price());
+ }
}
}
}
notice(s_GameServ, u, "Just then you notice the eye begin to "\
"glare orange! The tooth is moving... but it is still too "\
"dark for you to make out.... THE DRAGON! You see it!");
- p->setMonster(new Monster(dragon));
+ p->setMonster(&dragon);
setDragonFight(p);
display_monster(u);
}
if (!is_fighting(user) && is_playing(user))
{
- Monster *temp;
Player *p = user->stats;
- temp = new Monster(levels[p->getLevel() - 1].master);
- p->setMyMaster(temp);
- p->setMonster(p->getMaster());
+ p->setMyMaster(&levels[p->getLevel() - 1].master);
+ p->setMonster(&levels[p->getLevel() - 1].master);
display_monster(u); // Since master is the same structure, use this function
}
}
void rolloverall()
{
- ListNode <aClient> *it;
- Player *p;
+ list<Player*>::iterator iter;
for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
{
- it = players[x].First();
- while (it)
+ for (iter = players[x].begin(); iter != players[x].end(); iter++)
{
- p = it->getData()->stats;
- rollover(p);
- it = it->Next();
+ rollover((*iter));
}
}
}
void refreshall()
{
- ListNode <aClient> *it;
- Player *p;
+ list<Player*>::iterator iter;
for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
{
- it = players[x].First();
-
- while (it)
+ for (iter = players[x].begin(); iter != players[x].end(); iter++)
{
- p = it->getData()->stats;
- refresh(p);
- it = it->Next();
+ refresh((*iter));
}
}
}
void do_refresh(char *u)
{
- char *nick = strtok(NULL, " ");
+ char *name = strtok(NULL, " ");
aClient *user;
+ Player *p;
if (!(user = find(u)))
{
notice(s_GameServ, u, "You must be a %S admin to use this command!");
return;
}
- if (!nick)
+ if (!name)
{
notice(s_GameServ, u, "SYNTAX: REFRESH {ALL | NICK}");
return;
}
- else if (stricmp(nick, "ALL") == 0)
+ else if (stricmp(name, "ALL") == 0)
{
notice(s_GameServ, u, "Refreshing everyone's stats!");
refreshall();
}
- else if ((user = findplayer(nick)))
+ else if ((p = findplayer(name)))
{
- if (is_playing(user))
- {
-#ifdef P10
- notice(s_GameServ, u, "Refreshing %s.", user->getRealNick());
-#else
- notice(s_GameServ, u, "Refreshing %s.", user->getNick());
-#endif
- refresh(user->stats);
- }
- else
- {
-#ifdef P10
- notice(s_GameServ, u, "%s is not playing.", user->getRealNick());
-#else
- notice(s_GameServ, u, "%s is not playing.", user->getNick());
-#endif
- }
- }
+ notice(s_GameServ, u, "Refreshing %s.", p->getName().c_str());
+ refresh(p);
+ }
else
{
- notice(s_GameServ, u, "Nick %s not found.", nick);
+ notice(s_GameServ, u, "Player %s not found.", name);
return;
}
}
void resetall()
{
- ListNode <aClient> *it;
- Player *p;
-
+ list<Player*>::iterator iter;
for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
{
- it = players[x].First();
-
- while (it)
+ for (iter = players[x].begin(); iter != players[x].end(); iter++)
{
- p = it->getData()->stats;
- reset(p);
- it = it->Next();
+ reset((*iter));
}
}
}
void reset(Player *p)
{
item *tempItem;
+
if (!p)
return;
p->reset();
+ // Add the stick and clothes
tempItem = findItemByID(3001);
p->inventory->addItem((*Items.begin()))->use(p); // Add the stick
- p->inventory->addItem(tempItem)->use(p); // Add Clothes
+ p->inventory->addItem(tempItem)->use(p); // Add Clothes
}
void updateTS(Player *p)
#ifdef DEBUGMODE
log("New timestamp for %s: %ld", p->getName().c_str(), p->lastcommand);
#endif
+ PF_cleartimedout(p);
}
void timeOutEvent(Player *p)
{
- aClient *user = findplayer(p->getName().c_str());
-
- if (!user || !p->getClient()) // then they're not playing
+ if (!p || !is_playing(p->getClient())) // then they're not playing
return;
- char *nick = user->getNick();
-
- if (player_fight(user) && isYourTurn(p))
+ char *nick = p->getClient()->getNick();
+
+ if (player_fight(p->getClient()) && isYourTurn(p))
{
// Check to see if they were the idler or if it was the other
// person
- if (p->lastcommand != p->getBattle()->stats->lastcommand)
+ if (!PF_timedout(p->getBattle()->stats))
{
// This person's last command was given earlier,
// so this person is the idler
// Chance to wake up, but if the other player doesn't
// Attack now, they both get logged out.
updateTS(p);
- p->getBattle()->stats->lastcommand = p->lastcommand;
+ PF_settimedout(p);
display_players(p->getBattle());
return;
}
"You and %s timed out at the same time."\
" Don't fight if you're just going to "\
"sit there!", p->getName().c_str());
- notice(s_GameServ, user->getNick(),
+ notice(s_GameServ, p->getClient()->getNick(),
"You and %s timed out at the same time."\
" Don't fight if you're just going to "\
"sit there!", p->getBattle()->stats->getName().c_str());
logout(p->getBattle());
- logout(user);
+ logout(p->getClient());
return;
}
}
- else if (!player_fight(user))
+ else if (!player_fight(p->getClient()))
{
- if (isAlive(user->stats) && user->stats->getGold() > 0)
+ if (isAlive(p) && p->getGold() > 0)
{
// Place fun stuff here :)
int randnum = 1 + rand() % 100; // 1-100
if (randnum < 50)
{
// 35-100% of your gold goes pffft - kain
- int stolen = (35 + (rand() % 66)) * (user->stats->getGold() / 100);
+ int stolen = (35 + (rand() % 66)) * (p->getGold() / 100);
GSN("You stop for a moment to rest on the "\
"street corner. All of a sudden, you "\
"of knife wielding thugs.");
GSN2("The thugs beat you into utter submission "\
"and steal %ld gold from you!", stolen);
- user->stats->subtractGold(stolen);
+ p->subtractGold(stolen);
}
else if (randnum >= 50 && randnum < 75)
{
// 25-65% of your gold goes pffft - kain
- int stolen = (25 + (rand() % 41)) * (user->stats->getGold() / 100);
+ int stolen = (25 + (rand() % 41)) * (p->getGold() / 100);
GSN("While dilly dallying around, you lose "\
"your sense of time. Little did you know, "\
"but thieves lifted your gold while you "\
"weren't watching.");
GSN2("Better luck next time... you lose %d gold", stolen);
- user->stats->subtractGold(stolen);
+ p->subtractGold(stolen);
}
else if (randnum >= 75)
{
// 25-75% of your gold goes pffft - kain
- int stolen = (25 + (rand() % 51)) * (user->stats->getGold() / 100);
+ int stolen = (25 + (rand() % 51)) * (p->getGold() / 100);
GSN("Good grief! A gaggle of gooey green ghostlike "\
"goblins grabbed your gold!");
GSN2("They stole %d gold from you!", stolen);
- user->stats->subtractGold(stolen);
+ p->subtractGold(stolen);
}
}
// Always log out the user
- logout(user);
+ logout(p->getClient());
}
}
{
char *nick = strtok(NULL, " ");
aClient *user;
+ Player *p;
if (!(user = find(u)))
{
if (!nick)
{
notice(s_GameServ, u, "SYNTAX: RESET {ALL | NICK}");
- return;
}
else if (stricmp(nick, "ALL") == 0)
{
notice(s_GameServ, u, "Resetting everyone's stats!");
resetall();
}
- else if ((user = findplayer(nick)))
- {
- if (is_playing(user))
- {
-#ifdef P10
- notice(s_GameServ, u, "Resetting %s.", user->getRealNick());
-#else
- notice(s_GameServ, u, "Resetting %s.", user->getNick());
-#endif
- reset(user->stats);
- }
- else
- {
- notice(s_GameServ, u, "Resetting %s", user->stats->getName().c_str());
- reset(user->stats);
- }
- }
+ else if (!(p = findplayer(nick)))
+ {
+ notice(s_GameServ, u, "Nick %s not found.", nick);
+ }
else
{
- notice(s_GameServ, u, "Nick %s not found.", nick);
- return;
- }
+ notice(s_GameServ, u, "Resetting %s.", p->getName().c_str());
+ reset(p);
+ }
}
void do_help(char *u)
{
sprintf(filename, "data/levels/level%d.dat", x);
if (levels[x - 1].loadLevel(filename) == false)
- return false;
+ {
+ delete []filename;
+ return false;
+ }
}
delete []filename;
return true;
}
+
bool load_monsters()
{
char *filename;
if (!infile)
{
log("Error opening %s", filename);
+ delete []filename;
+ delete []buf;
return false;
}
temp->weapon = strtok(NULL, "~");
temp->death = strtok(NULL, "~");
- levels[level - 1].monsters.insertAtBack_RLN(temp);
- delete temp;
+ levels[level - 1].monsters.push_back(temp);
+
}
delete [] filename;
infile.close();