]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/gameserv.cpp
updated the Change log w/ new additions
[irc/gameservirc.git] / gameserv / gameserv.cpp
index 454208d882098ba7a417b4c11019b4b692679fcd..05ac73953b5b33518fc5e1718163c5d05e633b1e 100644 (file)
@@ -4,7 +4,6 @@
 #include "player.h"
 #include "pouch.h"
 #include "flags.h"
-#include "list.h"
 #include "level.h"
 #include "sockhelp.h"
 #include "item.h"
@@ -429,61 +428,59 @@ int stricmp(const char *s1, const char *s2)
 
 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;
 }
 
@@ -682,6 +679,7 @@ void do_check(char *u)
 void do_list(char *u)
 {
   aClient *user;
+  Player *p;
   char *cmd = strtok(NULL, " ");
   
   if (!(user = find(u)))
@@ -697,19 +695,9 @@ void do_list(char *u)
          return;
     }
   
-  list<aClient*>::iterator iter;
+  list<Player*>::iterator iter;
   bool header = false;
 
-  if (isAdmin(user))
-       {
-         for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
-               {
-                 for (iter = clients[x].begin(); iter != clients[x].end(); iter++)
-                       {
-                         notice(s_GameServ, u, "Nick: %s", (*iter)->getNick());
-                       }               
-               }
-       }
   for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
        {
          iter = players[x].begin();
@@ -717,7 +705,8 @@ void do_list(char *u)
                {
                  while(iter != players[x].end())
                        {
-                         if (cmd || is_playing((*iter)))
+                         p = (*iter);
+                         if (cmd || is_playing(p->getClient()))
                                {
                                  if (!header)
                                        {
@@ -725,11 +714,11 @@ void do_list(char *u)
                                          header = true;
                                        }
 #ifdef P10
-                                 notice(s_GameServ, u, "IRC: %s     Game: %s", (*iter)->getRealNick(), 
-                                                (*iter)->stats->getName().c_str());
+                                 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", (*iter)->getNick(), 
-                                                (*iter)->stats->getName().c_str());
+                                 notice(s_GameServ, u, "IRC: %s     Game: %s", (p->getClient() ? p->getClient()->getNick() : "Not Playing"), 
+                                                p->getName().c_str());
 #endif
                                }
                          iter++;
@@ -744,7 +733,8 @@ void do_list(char *u)
 
 void do_set(char *u)
 {
-  aClient *user, *target;
+  aClient *user;
+  Player *p;
   char *name = strtok(NULL, " ");
   char *cmd = strtok(NULL, " ");
   char *cmd2;
@@ -767,12 +757,12 @@ void do_set(char *u)
       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))
                {
@@ -796,12 +786,12 @@ void do_set(char *u)
       // 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;
@@ -824,9 +814,9 @@ void do_set(char *u)
                  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)
     {
@@ -848,9 +838,9 @@ void do_set(char *u)
                          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)
@@ -874,9 +864,9 @@ void do_set(char *u)
                          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)
@@ -893,9 +883,9 @@ void do_set(char *u)
                          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;
                }
        }
@@ -914,9 +904,9 @@ void do_set(char *u)
                          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;
                }
        }
@@ -935,9 +925,9 @@ void do_set(char *u)
                          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;
                }
        }
@@ -955,9 +945,9 @@ void do_set(char *u)
                          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;
                }
        }
@@ -975,9 +965,9 @@ void do_set(char *u)
                          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;
                }
        }
@@ -996,9 +986,9 @@ void do_set(char *u)
                          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;
                }
        }
@@ -1016,9 +1006,9 @@ void do_set(char *u)
                          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;
                }
        }
@@ -1038,13 +1028,13 @@ void do_set(char *u)
                        }
                  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);
                        }
                }
        }
@@ -1070,13 +1060,13 @@ void do_set(char *u)
                        }
                  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);
                        }
                }         
     }
@@ -1091,6 +1081,7 @@ void do_set(char *u)
 void do_logout(char *u)
 {
   aClient *user;
+  Player *p;
   char *name = strtok(NULL, " ");
   
   if (!(user = find(u)))
@@ -1115,14 +1106,14 @@ void do_logout(char *u)
                {
                  notice(s_GameServ, u, "You must be a %S admin to use this command!");
                }
-         else if (!(user = findplayer(name)))
+         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", user->stats->getName().c_str());
-                 logout(user);
+                 notice(s_GameServ, u, "Logging out %s", p->getName().c_str());
+                 logout(p->getClient());
                }
     }
   else if (!name)
@@ -1145,73 +1136,66 @@ void do_logout(char *u)
 
 void logout(aClient *user)
 {
-  if (is_playing(user))
+  if (user != NULL)
     {
-         list<aClient*>::iterator iter;
-         aClient *temp;
-         unsigned long hv = iHASH((unsigned char *) user->stats->getName().c_str());
-         iter = find(players[hv].begin(), players[hv].end(), user);
-         
-         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",
+         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()
+                                 user->getRealNick()
 #else 
-                         user->getNick()
+                                 user->getNick()
 #endif
-                         );
-                 return;
-        }
-         user->stats->delMonster();
-         user->stats->delMaster();
-         clearDragonFight(user->stats);
-         clearYourTurn(user->stats);     
-         
-         if (player_fight(user))
-               {
-                 clearYourTurn(user->stats->getBattle()->stats);
-                 user->stats->getBattle()->stats->delBattle();
-               }
-
-         user->stats->delBattle();
-
-         temp = new aClient;
-         temp->stats = new Player;
-         temp->stats->setData(user->stats);
-         user->stats->setClient(NULL);
-         
-         
-         delete user->stats;
-         user->stats = NULL;
-         temp->stats->setClient(NULL);
-
-#ifdef P10
-         temp->setRealNick("Not Playing");
-#endif
-         temp->setNick("Not Playing");
-         
-         players[hv].erase(iter);
-         players[hv].push_back(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, " ");
   
@@ -1227,7 +1211,15 @@ void do_register(char *u)
     {
          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!");
@@ -1236,10 +1228,6 @@ void do_register(char *u)
     {
          log("Fatal Error: Couldn't find %s in the clients list", u);
     }
-  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 (isIgnore(user))
     {
 #ifdef DEBUGMODE
@@ -1251,26 +1239,46 @@ void do_register(char *u)
          if (!is_playing(user))
         {
                  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);
-                 
+
                  // 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
 
-                 players[hv].push_back(user);
+                 // Add the player to the list
+                 players[hv].push_back(user->stats);
                }
          else
                {
@@ -1282,7 +1290,8 @@ void do_register(char *u)
 void do_identify(char *u)
 {
   char *password, *name;
-  aClient *user, *p;
+  aClient *user;
+  Player *p;
   name = strtok(NULL, " ");
   password = strtok(NULL, " ");
   if (!password || !name)
@@ -1301,13 +1310,15 @@ void do_identify(char *u)
 #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.");
     }
@@ -1317,8 +1328,8 @@ void do_identify(char *u)
     }
   else
        {
-         list<aClient*>::iterator iter;
-         unsigned long hv = iHASH((unsigned char *) p->stats->getName().c_str());
+         list<Player*>::iterator iter;
+         unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
 
          iter = find(players[hv].begin(), players[hv].end(), p);
 
@@ -1328,28 +1339,24 @@ void do_identify(char *u)
                                 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
+               //Set the playing flag
+               setPlaying(user);
                
                // Update the last login time
                user->stats->lastlogin = time(NULL);
 
-               players[hv].erase(iter);
-               players[hv].push_back(user);
-
                notice(s_GameServ, u, "Password Accepted. Identified.");
                showNews(u, todaysnews);
     }
@@ -1383,7 +1390,8 @@ void do_stats(char *u)
                }
          else
                {
-                 updateTS(user->stats);
+                 if (!is_fighting(user))
+                       updateTS(user->stats);
                  showstats(u, user->stats->getName().c_str());
                }
     }
@@ -1512,15 +1520,19 @@ bool is_playing(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;
     }
@@ -1560,9 +1572,9 @@ bool player_fight(aClient *user)
 {
   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;
 }
@@ -1615,7 +1627,8 @@ bool alphaNumeric(const char *str)
 
 void do_fight(char *u)
 {
-  aClient *ni, *battle;
+  aClient *ni;
+  Player *battle;
   
   char *nick = strtok(NULL, " ");
   
@@ -1658,7 +1671,7 @@ void do_fight(char *u)
     {
          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);
     }
@@ -1677,38 +1690,38 @@ void do_fight(char *u)
         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 (!isAdmin(ni) && isFairFights() && (ni->stats->getStrength()/2 - battle->stats->getDefense()) > battle->stats->getHP())
+  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->stats->getName().c_str());
+         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->stats->getLevel() > maxbfightdistance)
+  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)
@@ -1718,26 +1731,26 @@ void do_fight(char *u)
   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);
        }
 }
@@ -1775,7 +1788,8 @@ void do_equip(char *u)
       return;
     }
   id = stringtoint(item);
-  updateTS(user->stats);
+  if (!is_fighting(user))
+       updateTS(user->stats);
   p = user->stats->inventory;
 
 
@@ -1798,16 +1812,18 @@ void do_equip(char *u)
                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.");
@@ -1831,10 +1847,20 @@ void do_use(char *u)
          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())
@@ -1849,15 +1875,39 @@ void do_use(char *u)
        }
   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)
 {
@@ -2112,31 +2162,33 @@ long int stringtoint(char *number)
 
 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()
 {
-  list<aClient*>::iterator iter;
+  list<Player*>::iterator iter;
   Player *it;
   ofstream outfile;
   
@@ -2152,7 +2204,7 @@ int save_gs_dbase()
        {
          for(iter = players[x].begin(); iter != players[x].end(); iter++)
                {
-                 it = (*iter)->stats;
+                 it = (*iter);
                  clearYourTurn(it);
                  item *w, *a;
                  w = it->getWeapon();
@@ -2392,7 +2444,6 @@ int load_items()
 int load_gs_dbase()
 {
   ifstream infile;
-  aClient *temp;
   Player *p;
   char *tempname, *buf, *password;
   int tempnum;
@@ -2405,35 +2456,32 @@ int load_gs_dbase()
          log("Error opening %s", playerdata);
          return 0;
     }
-
+  
+  
   for (int x = 0; x < U_TABLE_SIZE; x++)
     {
-         list<aClient*>::iterator iter;
-
+         list<Player*>::iterator iter;
+         
          for (iter = players[x].begin(); iter != players[x].end(); iter++)
                {
-                 if ((*iter)->stats->getClient())
-                       {
-                         logout((*iter)->stats->getClient());
-                       }
+                 logout((*iter)->getClient());
+                 delete (*iter);
                }
          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, " ")));
@@ -2441,70 +2489,65 @@ int load_gs_dbase()
          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);
-  item *tempitem;
-  if (tempnum != 0)
-       {
-         tempitem = findItemByID(tempnum);
-         p->setWeapon(*tempitem);
-       }
-  
-  tempname = strtok(NULL, " ");
-  tempnum = stringtoint(tempname);
-  
-  if (tempnum != 0)
-       {
-         tempitem = findItemByID(tempnum);
-         p->setArmor(*tempitem);
-       }
-  
-  
-  unsigned long hv = iHASH((unsigned char *) temp->stats->getName().c_str());
-  
-  temp->stats->setClient(NULL);
-
-  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, " ");
-         uses = stringtoint(tempname);
          
-         item_iter = Items.begin();
-         while (item_iter != Items.end())
+         if (tempname)
+               p->lastlogin = stringtoint(tempname);
+         else
+               p->lastlogin = time(NULL);
+         
+         tempname = strtok(NULL, " ");
+         tempnum = stringtoint(tempname);
+         item *tempitem;
+         if (tempnum != 0)
                {
-                 if ((*item_iter)->getID() == id)
+                 tempitem = findItemByID(tempnum);
+                 p->setWeapon(*tempitem);
+               }
+         
+         tempname = strtok(NULL, " ");
+         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);
+         
+         for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " "))
+               {
+                 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);
-                         log("Inventory Count: %d", p->inventory->getCount());
+                         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();
-  players[hv].push_back(temp);
-  log("Inventory Count: %d", p->inventory->getCount());
-}
-  // Can't delete the temporary ptr to the aClient because we're using it
-delete [] buf;
-infile.close();
-return 1;
+
+  delete [] buf;
+  infile.close();
+  return 1;
 }
 
 bool passcmp(const char *encrypted, char *plaintext)
@@ -2531,13 +2574,13 @@ 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);
     }
 }
 
@@ -2735,7 +2778,8 @@ void do_inventory(char *u)
          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);
 }
 
@@ -2900,7 +2944,6 @@ void do_tavern(char *u)
                                {
                                  notice(s_GameServ, u, "One %s coming right up!", tempItem->getItem()->getName().c_str());
                                  user->stats->subtractGold(tempItem->getItem()->price());
-                                 notice(s_GameServ, u, "%d", user->stats->inventory->getCount());
                                }
                        }
                }
@@ -3141,7 +3184,7 @@ void do_dragon(char *u)
   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);
 }
@@ -3286,11 +3329,9 @@ void see_master(char *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(temp);
+         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
     }
 }
@@ -3344,23 +3385,23 @@ void showBankBalance(const char *u)
 
 void rolloverall()
 {
-  list<aClient*>::iterator iter;
+  list<Player*>::iterator iter;
   for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
     {
       for (iter = players[x].begin(); iter != players[x].end(); iter++)
                {
-                 rollover((*iter)->stats);
+                 rollover((*iter));
                }
     }
 }
 void refreshall()
 {
-  list<aClient*>::iterator iter;
+  list<Player*>::iterator iter;
   for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
     {
       for (iter = players[x].begin(); iter != players[x].end(); iter++)
                {
-                 refresh((*iter)->stats);
+                 refresh((*iter));
                }
     }
 }
@@ -3395,8 +3436,9 @@ void refresh(Player *p)
 
 void do_refresh(char *u)
 {
-  char *nick = strtok(NULL, " ");
+  char *name = strtok(NULL, " ");
   aClient *user;
+  Player *p;
   
   if (!(user = find(u)))
     {
@@ -3416,39 +3458,24 @@ void do_refresh(char *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;
     }
 }
@@ -3456,12 +3483,12 @@ void do_refresh(char *u)
 
 void resetall()
 {
-  list<aClient*>::iterator iter;
+  list<Player*>::iterator iter;
   for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
        {
          for (iter = players[x].begin(); iter != players[x].end(); iter++)
                {
-                 reset((*iter)->stats);
+                 reset((*iter));
                }
        }
 }
@@ -3469,14 +3496,15 @@ void resetall()
 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)
@@ -3491,6 +3519,7 @@ void updateTS(Player *p)
 #ifdef DEBUGMODE
   log("New timestamp for %s: %ld", p->getName().c_str(), p->lastcommand);
 #endif
+  PF_cleartimedout(p);
   
 }
 
@@ -3511,18 +3540,16 @@ bool timedOut(Player *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
@@ -3537,7 +3564,7 @@ void timeOutEvent(Player *p)
                  // 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;
                }
@@ -3547,18 +3574,18 @@ void timeOutEvent(Player *p)
                                 "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
@@ -3568,7 +3595,7 @@ void timeOutEvent(Player *p)
                  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 "\
@@ -3576,32 +3603,32 @@ void timeOutEvent(Player *p)
                                  "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());
     }
 }
 
@@ -3609,6 +3636,7 @@ void do_reset(char *u)
 {
   char *nick = strtok(NULL, " ");
   aClient *user;
+  Player *p;
   
   if (!(user = find(u)))
     {
@@ -3625,35 +3653,21 @@ void do_reset(char *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)
@@ -3768,12 +3782,16 @@ bool load_levels()
     {
          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;
@@ -3790,6 +3808,8 @@ bool load_monsters()
          if (!infile)
                {
                  log("Error opening %s", filename);
+                 delete []filename;
+                 delete []buf;
                  return false;
                }