Main.cpp
上传用户:jxpjxmjjw
上传日期:2009-12-07
资源大小:5877k
文件大小:24k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // Copyright (C) 2004 Team Python
  2. //  
  3. // This program is free software; you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation; either version 2 of the License, or
  6. // (at your option) any later version.
  7. // 
  8. // This program is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. // GNU General Public License for more details.
  12. // 
  13. // You should have received a copy of the GNU General Public License
  14. // along with this program; if not, write to the Free Software 
  15. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  16. #include "Server.h"
  17. #include "Network.h"
  18. #include "RealmListSrv.h"
  19. #include "WorldServer.h"
  20. #include "Log.h"
  21. #include "Threads.h"
  22. #include "Database.h"
  23. #include "stdio.h"
  24. #include <iostream>
  25. #include <time.h>
  26. #include "version.h"
  27. #if PLATFORM == PLATFORM_WIN32
  28. #  define WIN32_LEAN_AND_MEAN
  29. #  include <windows.h>
  30. #endif
  31. #include <string>
  32. using namespace::std;
  33. #define SERVERIP "localhost"
  34. #define LANIP "localhost"
  35. #define SERVERNAME "Server"
  36. #define PLAYER_LIMIT 30
  37. #define TEAM "WoWPython"
  38. #define SITW "Partys, Mana, Talents, you can select the Name of Realmlist."
  39. #define THANKS "The_Wizard, somebody, Priveteer."
  40. #define DBHOST "localhost"
  41. #define DBUSER "wow"
  42. #define DBPASS "wow"
  43. #define DBDB "wow"
  44. #define DEFAULT_LOOP_TIME 0 /* 0 millisecs - instant */
  45. std::string cHost, lHost, cName;
  46. std::string DBhost,DBuser,DBpass,DBdb;
  47. int playerlimit;
  48. /* method to launch the server */
  49. void launchWorld()
  50. {
  51.     string sTemp;
  52.     Database::getSingleton( ).Initialise( DBhost.c_str(), DBuser.c_str(), DBpass.c_str(), DBdb.c_str() );
  53.     WorldServer::getSingleton( ).Initialise( 8140, "World Server" );
  54.     sTemp="";
  55.     sTemp.append(cHost.c_str( ));
  56.     sTemp.append(":8140");
  57.     WorldServer::getSingleton( ).Start();
  58.     Threads::getSingleton( ).setCurrentPriority( Threads::TP_LOWER );
  59. WorldServer::getSingleton().LoadHelp();
  60.     printf("Team python server started...n");
  61. printf("World Logging is ");
  62. if (Network::getSingleton().IsLoggingWorld())
  63. printf("on.n");
  64. else
  65. printf("off.n");
  66. printf("Auto Account Creation is ");
  67. if (Database::getSingleton().isAutoCreateAccts())
  68. printf("on.n");
  69. else
  70. printf("off.n");
  71. printf("Firewall is ");
  72.     if (Database::getSingleton().isFirewall())
  73. printf("on.n");
  74. else
  75. printf("off.n");
  76. printf("Test Login/IP is now ");
  77. if (Database::getSingleton().isTestIP())
  78. printf("on.n");
  79. else
  80. printf("off.n");
  81.     //  memset(cTmpHost,NULL,sizeof(cTmpHost));
  82. //WorldServer::getSingleton().SetMotd("Welcome !!! ");
  83. }
  84. void launchServer(RealmListSrv *realms)
  85. {
  86.     string sTemp, lTemp, nTemp, oTemp, pTemp;
  87.     Database::getSingleton( ).Initialise( DBhost.c_str(), DBuser.c_str(), DBpass.c_str(), DBdb.c_str() );
  88.     WorldServer::getSingleton( ).Initialise( 8129, "World Server" );
  89.     // build string
  90.     sTemp="";
  91.     sTemp.append(cHost.c_str( ));
  92.     sTemp.append(":8129");
  93.     lTemp="";
  94.     lTemp.append(lHost.c_str( ));
  95.     lTemp.append(":8129");
  96.     printf("Host: %sn",sTemp.c_str());
  97.     printf("LanHost: %sn",lTemp.c_str());
  98.     printf("Database: %s on %s:%s@%sn",DBdb.c_str( ),DBuser.c_str(),DBpass.c_str(),DBhost.c_str() );
  99. realms->Initialise(3724, "RealmList Server");
  100.     realms->Start();
  101.     WorldServer::getSingleton( ).Start();
  102. // build string
  103.     sTemp="";
  104.     sTemp.append(cHost.c_str( ));
  105.     sTemp.append(":8129");
  106.     // Lanhost fix - Torg
  107.     lTemp="";
  108.     lTemp.append(lHost.c_str( ));
  109.     lTemp.append(":8129");
  110.     nTemp="";
  111.     oTemp="";
  112.     pTemp="";
  113.     nTemp.append(cName.c_str( ));
  114.     oTemp.append(cName.c_str( ));
  115.     pTemp.append(cName.c_str( ));
  116.     oTemp.append("(localhost mode)");
  117.     pTemp.append("(LAN mode)");
  118.     // Format: Realm_Name, Realm_IP, Icon (0 = Normal, 1 = PVP), Color (0 = Yellow, 1 = Red)
  119.     realms->addRealm( const_cast<char *>(nTemp.c_str()), const_cast<char *>(sTemp.c_str()), 0, 0 );
  120.     realms->addRealm( const_cast<char *>(oTemp.c_str()), "127.0.0.1:8129", 0, 0 );
  121.     realms->addRealm( const_cast<char *>(pTemp.c_str()), const_cast<char *>(lTemp.c_str()), 0, 0 );
  122.     Threads::getSingleton( ).setCurrentPriority( Threads::TP_LOWER );
  123. WorldServer::getSingleton().LoadHelp();
  124. printf("nnSERVER STARTED AND RUNNING...n");
  125. printf("World Logging is ");
  126. if (Network::getSingleton().IsLoggingWorld())
  127. printf("on.n");
  128. else
  129. printf("off.n");
  130. printf("Auto Account Creation is ");
  131. if (Database::getSingleton().isAutoCreateAccts())
  132. printf("on.n");
  133. else
  134. printf("off.n");
  135. printf("Firewall is ");
  136.     if (Database::getSingleton().isFirewall())
  137. printf("on.n");
  138. else
  139. printf("off.n");
  140. printf("Test Login/IP is now ");
  141. if (Database::getSingleton().isTestIP())
  142. printf("on.n");
  143. else
  144. printf("off.n");
  145. printf("Name: %sn",cName.c_str( ) );
  146. printf("Current message of the day is:n%sn", WorldServer::getSingleton().GetMotd());
  147.  
  148.     //  memset(cTmpHost,NULL,sizeof(cTmpHost));
  149.     //WorldServer::getSingleton().SetMotd("Welcome to the WoW emulation test server!nType !commands for a list of server commands");
  150. }
  151. void set_black_color()
  152. {
  153. #if PLATFORM == PLATFORM_WIN32
  154.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  155.         0);
  156. #endif
  157. }
  158. void set_gray_color()
  159. {
  160. #if PLATFORM == PLATFORM_WIN32
  161.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  162.         FOREGROUND_INTENSITY);
  163. #endif
  164. }
  165. void set_white_color()
  166. {
  167. #if PLATFORM == PLATFORM_WIN32
  168.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  169.         FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  170. #endif
  171. }
  172. void set_red_color()
  173. {
  174. #if PLATFORM == PLATFORM_WIN32
  175.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  176.         FOREGROUND_RED | FOREGROUND_INTENSITY);
  177. #endif
  178. }
  179. void set_green_color()
  180. {
  181. #if PLATFORM == PLATFORM_WIN32
  182.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  183.         FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  184. #endif
  185. }
  186. /* method to print the options menu */
  187. void printMenu()
  188. {
  189.     set_gray_color();
  190.     printf("n/------------------------------------------------------------------------\n");
  191.     printf("|%-34s","      ** SiTWulf'04 Version **");
  192.     set_green_color();
  193.     printf(" %-7s",FULLVERSION);
  194.     set_gray_color();
  195.     printf("  for build %-5i       |n",EXPECTED_WOW_CLIENT_BUILD);
  196.     printf("|"); set_white_color();
  197.     printf("                                  Commands                              ");
  198.     set_gray_color(); printf("|n|");
  199.     set_green_color();
  200.     printf(" start            ");
  201.     set_gray_color();
  202.     printf("starts the server                                     |n|");
  203.     set_green_color();
  204.     printf(" host [host]      ");
  205.     set_gray_color();
  206.     printf("Sets a new WAN Host                                   |n|");
  207.     set_green_color();
  208.     printf(" lanhost [host]   ");
  209.     set_gray_color();
  210.     printf("Sets a new LAN Host                                   |n|");
  211.     set_green_color();
  212.     printf(" db [host] [user] [pass] [database]");
  213.     set_gray_color();
  214.     printf("                                     |n|");
  215.     printf("                  ");
  216.     printf("Sets a new database server                            |n|");
  217. set_green_color();
  218.     printf(" name [name]      ");
  219.     set_gray_color();
  220.     printf("Sets a new Server Name                                |n|");
  221. set_green_color();
  222.     printf(" info             ");
  223.     set_gray_color();
  224.     printf("Show general server informations                      |n|");
  225.     set_green_color();
  226.     printf(" motd             ");
  227.     set_gray_color();
  228.     printf("Display the current motd                              |n|");
  229.     set_green_color();
  230.     printf(" motd [text]      ");
  231.     set_gray_color();
  232.     printf("Set the new motd (Write & for new lines)              |n|");
  233.     set_green_color();
  234.     printf(" worldtext [text] ");
  235.     set_gray_color();
  236.     printf("Send a system message to all the players in the world |n|");
  237.     set_green_color();
  238.     printf(" help             ");
  239.     set_gray_color();
  240.     printf("Show this help message                                |n|");
  241.     set_green_color();
  242.     printf(" delay            ");
  243.     set_gray_color();
  244.     printf("show and/or change console delay                      |n|");
  245.     set_green_color();
  246.     printf(" worldstart       ");
  247.     set_gray_color();
  248.     printf("start only the world server                           |n|");
  249.     set_green_color();
  250.     printf(" wlog             ");
  251.     set_gray_color();
  252.     printf("log packets sent and recv'd by the world server       |n|");
  253.     set_green_color();
  254.     printf(" autocreate       ");
  255.     set_gray_color();
  256.     printf("auto create new accounts                              |n|");
  257. //START OF LINA FIREWALL V4.1
  258. set_green_color();
  259.     printf(" fw/ban/allow/rmv ");
  260.     set_gray_color();
  261.     printf("toggle on/off (def off) - ban - allow - remove - IP   |n|");
  262.     set_green_color();
  263.     printf(" testip           ");
  264.     set_gray_color();
  265.     printf("active the test login/ip                              |n|");
  266. //END OF LINA FIREWALL V4.1
  267.     set_green_color();
  268.     printf(" realmlist        ");
  269.     set_gray_color();
  270.     printf("prints the realmlist                                  |n|");
  271. set_green_color();
  272.     printf(" limit [players]  ");
  273.     set_gray_color();
  274.     printf("sets the player limit (default %i)                    |n|", PLAYER_LIMIT);
  275. //START OF LINA SAVE SERVER COMMAND
  276.     set_green_color();
  277.     printf(" saveall          ");
  278.     set_gray_color();
  279.     printf("force to save all characters                          |n|");
  280. //END OF LINA SAVE SERVER COMMAND      
  281. //START OF LINA HELP SERVER COMMAND
  282.     set_green_color();
  283.     printf(" reloadhelp       ");
  284.     set_gray_color();
  285.     printf("reload help from db to server                         |n|");
  286. //END OF LINA HELP SERVER COMMAND  
  287. set_red_color(); printf(" exit"); set_gray_color(); printf("/");
  288.     set_red_color(); printf("quit"); set_gray_color(); printf("/");
  289.     set_red_color(); printf("stop");
  290.     set_gray_color();
  291.     printf("   Quit and shutdown server                              |n");
  292.     printf("\------------------------------------------------------------------------/nn");
  293. //Thanks List
  294.     set_green_color();
  295. printf("Thanks to: ");
  296.     set_gray_color();
  297.     printf(THANKS);
  298. printf("n");
  299. //End of Thanks
  300. //Lastest updates
  301.     set_green_color();
  302. printf("Lastest Fixes: ");
  303.     set_gray_color();
  304.     printf(SITW);
  305. printf("n");
  306. //End of Updates
  307. }
  308. /* method to clear screen */
  309. void clearScreen()
  310. {
  311. #if PLATFORM == PLATFORM_WIN32
  312.     COORD coordScreen = { 0, 0 };
  313.     DWORD cCharsWritten;
  314.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  315.     DWORD dwConSize;
  316.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  317.     GetConsoleScreenBufferInfo(hConsole, &csbi);
  318.     dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
  319.     FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize,
  320.         coordScreen, &cCharsWritten);
  321.     GetConsoleScreenBufferInfo(hConsole, &csbi);
  322.     FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize,
  323.         coordScreen, &cCharsWritten);
  324.     SetConsoleCursorPosition(hConsole, coordScreen);
  325. #endif
  326. }
  327. int main( void ) {
  328.    
  329.     DWORD dwTime; // System-clock time
  330.     DWORD dwLoopTime; // override default loop time
  331.     bool bRunning; // server running?
  332.     dwLoopTime = DEFAULT_LOOP_TIME; // set real loop time to default one
  333.     cHost = SERVERIP; // set the host to default host
  334.     lHost = LANIP;
  335. cName = SERVERNAME;
  336. playerlimit = PLAYER_LIMIT;
  337. DBhost = DBHOST;
  338.     DBuser = DBUSER;
  339.     DBpass = DBPASS;
  340.     DBdb = DBDB;
  341.     bRunning = false; // server is not running initially
  342. RealmListSrv * realms = RealmListSrv::getSingletonPtr( );
  343.     printMenu();
  344.     char data[512];
  345. for(int j = 0;j < 512;j++) data[j] = 0;
  346. FILE *conf;
  347. conf = fopen("WoWPython.conf","r");
  348.     while( strncmp(data,"exit",4)!=0 && strncmp(data,"quit",4)!=0 && strncmp(data,"stop",4)!=0 )
  349.     {
  350.         // moved to server loop
  351.         //if(bRunning){
  352.         //  // Server is running, update the world stuff here
  353.         //  WorldServer::getSingleton( ).Update();
  354.         //}
  355.         //if(!fgets(data, sizeof(data), stdin )) {
  356.         //    Threads::getSingleton( ).setCurrentPriority( Threads::TP_IDLE );
  357.         //    while(!fgets(data, sizeof(data), stdin ));
  358.         //}
  359.         //gets(data);
  360. if(conf == NULL || fgets(data,sizeof(data),conf) == NULL)
  361. {
  362.         if(!fgets(data, sizeof(data), stdin )) {
  363.             Threads::getSingleton( ).setCurrentPriority( Threads::TP_IDLE );
  364.             Threads::getSingleton( ).closeCurrentThread( );
  365.             while(!fgets(data, sizeof(data), stdin ));
  366.         }
  367. }
  368.     while( data[ strlen(data)-1 ] == 0x0d || data[ strlen(data)-1 ] == 0x0a )
  369.             data[ strlen(data)-1 ] = 0x00;
  370.         if( strncmp(data,"help",4)== 0)
  371.         {
  372.             clearScreen();
  373.             printMenu();
  374.         }
  375.         else if(!(strncmp(data,"start",5)))
  376.         {
  377.             if(!bRunning)
  378.             {
  379.                 launchServer(realms);
  380.                 bRunning=true;
  381.             }
  382.             else
  383.             {
  384.                 printf("Server already running.n");
  385.             }
  386.         }
  387.         else if(!(strncmp(data,"worldstart",10)))
  388.         {
  389.             if(!bRunning)
  390.             {
  391.                 launchWorld();
  392.                 bRunning=true;
  393.             }
  394.             else
  395.             {
  396.                 printf("Server already running.n");
  397.             }
  398.         }
  399.         else if(!(strncmp(data,"host ",5)))
  400.         {
  401.             if( data[5] )
  402.             {
  403.                 cHost = data+5;
  404.                 printf("Successfully set new host to: %sn",cHost.c_str( ) );
  405.             }
  406.             else
  407.             {
  408.                 printf("Please supply a valid host address.n");
  409.             }
  410. }
  411. else if(!(strncmp(data,"realmlist",9)))
  412. {
  413. realms->printRealms();
  414.         }
  415.         else if(!(strncmp(data,"name ",5)))
  416.         {
  417.             if( data[5] )
  418.             {
  419.                 cName = data+5;
  420.                 printf("Successfully set new realm server name to: %sn",cName.c_str( ) );
  421.             }
  422.             else
  423.             {
  424.                 printf("Please supply a valid realm server name.n");
  425.             }
  426. }
  427. else if(!(strncmp(data,"realmlist",9)))
  428. {
  429. realms->printRealms();
  430.         }
  431.         else if(!(strncmp(data,"lanhost ",8)))
  432.         {
  433.             if( data[5] )
  434.             {
  435.                 lHost = data+8;
  436.                 printf("Successfully set new lan host to: %sn",lHost.c_str( ) );
  437.             }
  438.             else
  439.             {
  440.                 printf("Please supply a valid host address.n");
  441.             }
  442.         }
  443.         else if(!(strncmp(data,"db ",3))) {
  444.             strtok((char*)data, " ");
  445.             char* host = strtok(NULL, " ");
  446.             char* user = strtok(NULL, " ");
  447.             char* pass = strtok(NULL, " ");
  448.             char* db = strtok(NULL, " ");
  449.             if( host ) DBhost = host;
  450.             if( user ) DBuser = user;
  451.             if( pass ) DBpass = pass;
  452.             if( db )  DBdb = db;
  453.         }
  454.         else if(!(strncmp(data,"host",4)))
  455.         {
  456.             printf("Current host set to: %sn",cHost.c_str( ) );
  457.         }
  458.         else if(!(strncmp(data,"name",4)))
  459.         {
  460.             printf("Current realm name set to: %sn",cName.c_str( ) );
  461.         }
  462.         else if(!(strncmp(data,"delay ",6)))
  463.         {
  464.             int dIndex=0;
  465.             /* Increment dIndex until blank key */
  466.             while((data[dIndex+6]!=0 && data[dIndex+6]!=' ')&& ++dIndex);
  467.             /* Copy selected part of data over to data */
  468.             memcpy(data,data+6,dIndex);
  469.             data[dIndex]=0;
  470.             /* if argument for delay is a number, convert it and set it
  471.             to be new looptime */
  472.             if(sscanf( data, "%d", &dwLoopTime )!=0 && dIndex>0)
  473.                 printf("Console delay successfully set to: %dn",dwLoopTime);
  474.             else
  475.             {
  476.                 /* else, if argument for delay is not a valid number,
  477.                 give a simple error message. */
  478.                 printf("Error setting new Console delay value.n");
  479.             }
  480.         }
  481.         else if(!(strncmp(data,"delay",5)))
  482.         {
  483.             printf("Console delay currently set to: %in",dwLoopTime);
  484.         }
  485.         else if(strncmp(data,"worldtext ",10)==0)
  486.         {
  487.             int textsize;
  488.             for( textsize=0; data[textsize+10]!=0; textsize++ )
  489.             {
  490.                 if(data[textsize+10]=='&')
  491.                     data[textsize+10]='n';
  492.             }
  493.             memcpy(data,data+10,textsize);
  494.             data[textsize]=0;
  495.             WorldServer::getSingleton().SendWorldText((uint8*)data);
  496.             printf("Message sent to all players:n(%s)n",data);
  497.         }
  498.         else if(strncmp(data,"info",4)==0)
  499.         {
  500. printf("Users connected: %in",WorldServer::getSingleton().GetClientsConnected());
  501.         }
  502.         else if(strncmp(data,"motd ",5)==0)
  503.         {
  504.             int textsize;
  505.             for( textsize=0; data[textsize+5]!=0; textsize++ )
  506.             {
  507.                 if(data[textsize+5]=='&')
  508.                     data[textsize+5]='n';
  509.             }
  510.             memcpy(data,data+5,textsize);
  511.             data[textsize]=0;
  512.             WorldServer::getSingleton().SetMotd(data);
  513.             printf("New motd has been set.n");
  514.         }
  515.         else if(strncmp(data,"motd",4)==0)
  516.         {
  517.             printf("Current message of the day is:n%sn", WorldServer::getSingleton().GetMotd());
  518.         }
  519.         else if(strncmp(data,"exit",4)==0 || strncmp(data,"quit",4)==0 || strncmp(data,"stop",4)==0)
  520.         {
  521.             bRunning=false;
  522.         }
  523.         else if(strncmp(data,"time",4)==0)
  524.         {
  525.             printf("Game Time is: %dn", WorldServer::getSingleton().updateGameTime());
  526.         }
  527.         else if(strncmp(data,"wlog",4)==0)
  528.         {
  529.             Network::getSingleton().toggleWorldLogging();
  530.             printf("World Logging is now ");
  531.             if (Network::getSingleton().IsLoggingWorld())
  532.                 printf("on.n");
  533.             else
  534.                 printf("off.n");
  535.         }
  536.         else if(strncmp(data,"autocreate",10)==0)
  537.         {
  538.             // Toggle Auto Create Accounts
  539.             Database::getSingleton().toggleAutoCreateAcct();
  540.             printf("Auto Account Creation is now ");
  541.             if (Database::getSingleton().isAutoCreateAccts())
  542.                 printf("on.n");
  543.             else
  544.                 printf("off.n");
  545.         }
  546. //START OF LINA FIREWALL SERVER COMMAND
  547. else if(strncmp(data,"fw",2)==0)
  548.         {
  549.             Database::getSingleton().toggleFirewall();
  550.             printf("Firewall is now ");
  551.             if (Database::getSingleton().isFirewall())
  552.                 printf("on.n");
  553.             else
  554.                 printf("off.n");
  555.         }
  556. else if(strncmp(data,"ban ",4)==0)
  557.         {
  558. int textsize;
  559.             for( textsize=0; data[textsize+4]!=0; textsize++ )
  560.             {
  561.                 if(data[textsize+4]=='&')
  562.                     data[textsize+4]='n';
  563.             }
  564.             memcpy(data,data+4,textsize);
  565.             data[textsize]=0;
  566. DatabaseInterface *dbi = Database::getSingleton().createDatabaseInterface( );
  567. dbi->BanIP((char*)data);
  568. Database::getSingleton( ).removeDatabaseInterface(dbi);
  569.         }
  570. else if(strncmp(data,"allow ",6)==0)
  571.         {
  572. int textsize;
  573.             for( textsize=0; data[textsize+6]!=0; textsize++ )
  574.             {
  575.                 if(data[textsize+6]=='&')
  576.                     data[textsize+6]='n';
  577.             }
  578.             memcpy(data,data+6,textsize);
  579.             data[textsize]=0;
  580. DatabaseInterface *dbi = Database::getSingleton().createDatabaseInterface( );
  581. dbi->AllowIP((char*)data);
  582. Database::getSingleton( ).removeDatabaseInterface(dbi);
  583.         }
  584. else if(strncmp(data,"rmv ",4)==0)
  585.         {
  586. int textsize;
  587.             for( textsize=0; data[textsize+4]!=0; textsize++ )
  588.             {
  589.                 if(data[textsize+4]=='&')
  590.                     data[textsize+4]='n';
  591.             }
  592.             memcpy(data,data+4,textsize);
  593.             data[textsize]=0;
  594. DatabaseInterface *dbi = Database::getSingleton().createDatabaseInterface( );
  595. dbi->RemoveIP((char*)data);
  596. Database::getSingleton( ).removeDatabaseInterface(dbi);
  597.         }
  598. else if(strncmp(data,"testip",7)==0)
  599.         {
  600.             Database::getSingleton().toggleTestIP();
  601.             printf("Test Login/IP is now ");
  602.             if (Database::getSingleton().isTestIP())
  603.                 printf("on.n");
  604.             else
  605.                 printf("off.n");
  606.         }
  607. //END OF LINA FIREWALL SERVER COMMAND
  608. //START OF LINA SAVE SERVER COMMAND
  609. else if(strncmp(data,"saveall",7)==0)
  610.         {
  611. if( WorldServer::getSingleton().GetClientsConnected() < 1 ) printf("No Character to save.n");
  612. else printf("Characters saved: %i/%in", WorldServer::getSingleton().Save("Server"),WorldServer::getSingleton().GetClientsConnected());
  613.         }
  614. //START OF LINA SAVE SERVER COMMAND
  615. //START OF LINA RELOAD HELP SERVER COMMAND
  616. else if(strncmp(data,"reloadhelp",10)==0)
  617.         {
  618. WorldServer::getSingleton().LoadHelp();
  619. printf("Help reloaded");
  620. }
  621. //START OF LINA RELOAD HELP SERVER COMMAND
  622. else if(strncmp(data,"sm ",3)==0)
  623.         {
  624. char* pGuid = strtok((char*)data, " ");
  625. uint32 Guid=(uint32)atoi(pGuid);
  626. Character * pChar = WorldServer::getSingleton().GetCharacter(Guid);
  627. if(pChar)
  628. {
  629. char* pOpcode = strtok(NULL, " ");
  630. uint32 Opcode=(uint32)atoi(pOpcode);
  631. char* pLength = strtok(NULL, " ");
  632. uint32 Length=(uint32)atoi(pLength);
  633. char* pData = strtok(NULL, " ");
  634. wowWData packets;
  635. packets.Initialise(Length, Opcode);
  636. packets << pData;
  637. pChar->pClient->SendMsg( &packets );
  638. }
  639. else printf("Unable to find Client with CharGuid: %in", Guid);
  640. }
  641. else if(!(strncmp(data,"limit ",6)))
  642.         {
  643.             if( data[6] )
  644.             {
  645.                 playerlimit = atoi(data+6);
  646.                 printf("Successfully set new player limit to: %in",playerlimit );
  647.             }
  648.         }
  649.         else if(!(strncmp(data,"limit",5)))
  650.         {
  651.             printf("Server limit currently set to: %in",playerlimit);
  652.         }
  653. else
  654.             printf("Unknown command (Type 'help' for a list of commands)n");
  655.         if(dwLoopTime>0)
  656.         {
  657.             dwTime=clock() * 1000 / CLOCKS_PER_SEC; // get current time
  658.             while((clock() * 1000 / CLOCKS_PER_SEC - dwTime) < dwLoopTime); // 'idle' for dwLoopTime ms
  659.         }
  660.     }
  661.     //Threads::getSingleton( ).setCurrentPriority( Threads::TP_LOWER );
  662.     Log::getSingleton( ).outString( "Stopping realm list server..." );
  663.     RealmListSrv::getSingleton( ).Stop( );
  664.     Log::getSingleton( ).outString( "Stopping world server..." );
  665.     WorldServer::getSingleton( ).Stop( );
  666.     Log::getSingleton( ).outString( "Disconnecting clients..." );
  667.     Network::getSingleton( ).disconnectAll( );
  668.     // doesn't work...
  669.     //Log::getSingleton( ).outString( "Stopping threads..." );
  670.     //Threads::getSingleton( ).closeAllThreads( );
  671.     Log::getSingleton( ).outString( "Halting process..." );
  672.     Threads::getSingleton( ).closeCurrentThread( );
  673.     return 0;
  674. }