// This function is called just before the server starts bool CWorldServer::OnServerReady( ) { ServerOnline = true; GServer = this; clock_t timer = clock(); LastUpdateTime = clock(); ATTK_SPEED_MODIF = 120; HIT_DELAY_MODIF = 0; MOVE_SPEED_MODIF = 100000; //LMA: We init ObjVar, just in case. for (int k=0;k<MAX_NPC;k++) { for (int j=0;j<20;j++) { ObjVar[k][j]=0; } } //Load our Server Info LoadConfig( ); //LoadLTB( ); LoadSTBData( ); LoadIfoObjects(); //LMA: init default values. InitDefaultValues(); LoadZoneData( ); LoadGrids( ); //resetting grids... LoadConsItem( ); LoadSellData( ); LoadProductItem( ); LoadPatItem( ); LoadNaturalItem( ); LoadJemItem( ); LoadEquip( ); LoadItemStats( ); // PY new Stat Lookup table LoadStatLookup( ); // PY end //LoadBreakList( ); // geo edit for disassemble // 22 oct 07 LoadBreakChestBlueList(); //LMA: loading chests, breaks from STB... LoadSkillData( ); //LMA: Forcing Union Wars. UWForceFrom=0; //deactivated. UWNbPlayers=0; //deactivated //In t + 5 minutes (deactivated, use gm command instead). //pakGMForceUW(NULL,5); //LMA: for debug (load old skill system and compares to new one). /* LoadSkillDataOld( ); LMACheckSkills(); LMACheckStuff(); */ //End debug. //Load our Server Info LoadQuestSTB(); //hidden // LoadDropsData( ); // new drops routine load LoadPYDropsData( ); LoadSkillBookDropsData( ); // end of new drops data //LoadChestData( ); //LMA: loaded now by STB in LoadBreakChestBlueList. // PY custom events start LoadCustomTeleGate( ); LoadCustomEvents( ); // PY custom events end LoadNPCData( ); LoadQuestItemData( ); LoadTeleGateData( ); LoadRespawnData( ); LoadMobGroups( ); LoadMobGroupsSpecial( ); //LMA: Special spawns (Halloween for example). LoadNPCs( ); LoadNPCsSpecial( ); //Special NPC load LoadMonsters( ); LoadUpgrade( ); LoadLTB(); //LMA: Loading LTB for AIP. LoadQuestData( ); LoadAipData(); //LMA: loading AIP. CleanConnectedList( ); Log(MSG_INFO, "Database Loaded " ); pthread_create( &WorldThread[WORLD_THREAD], &at, WorldProcess, NULL); pthread_create( &WorldThread[VISUALITY_THREAD], &at, VisibilityProcess, NULL); pthread_create( &MapThread[0], &at, MapProcess, NULL); Log (MSG_INFO, "osRose Revision %s", Config.osRoseVer ); Log( MSG_INFO, "Process Loaded. WorldDelay %i | MapDelay %i | VisualDelay %i",Config.WorldDelay,Config.MapDelay,Config.VisualDelay); DB->QExecute( "DELETE FROM channels WHERE id=%u and type=%i", Config.ServerID, Config.ServerType ); if(!DB->QExecute("INSERT INTO channels (id,type,name,host,port,lanip,lansubmask,connected,maxconnections,owner) VALUES (%i,%i,'%s','%s',%u,'%s','%s',0,%i,%i)", Config.ServerID, Config.ServerType, Config.ServerName, Config.WorldIP, Config.WorldPort, Config.LanIP, Config.LanSubnet, Config.MaxConnections, Config.ParentID)) { Log(MSG_WARNING, "Error accessing to database, the other server will not connect to WorldServer" ); } MYSQL_ROW row; bool pflag = false; //Get IP and Port from Charserver MYSQL_RES *result = DB->QStore( "SELECT host,port,lanip FROM channels WHERE id=%u and type=1", Config.ParentID ); if(result==NULL) return false; if (mysql_num_rows( result ) == 1) { row = mysql_fetch_row( result ); switch(Config.Connection) { case 0://wanip Config.CharIP = row[0]; break; case 1://lanip Config.CharIP = row[2]; break; default://localhost Config.CharIP = "127.0.0.1"; break; } Config.CharPort = atoi(row[1]); pflag = true; } DB->QFree( ); if(pflag) { Log( MSG_INFO, "Initialized Charserver connection" ); // Connect To LoginServer csock = socket( AF_INET, SOCK_STREAM, 0 ); if (csock == INVALID_SOCKET) { Log( MSG_WARNING, "Could not access login server" ); } struct sockaddr_in ain; ain.sin_family = AF_INET; ain.sin_addr.s_addr = inet_addr( Config.CharIP ); ain.sin_port = htons( Config.CharPort ); if ( connect( csock, (SOCKADDR*) &ain, sizeof(ain) ) == SOCKET_ERROR ) Log( MSG_WARNING, "Could not access charserver" ); BEGINPACKET( pak, 0x500 ); ADDDWORD ( pak, Config.CharPass ); ADDDWORD ( pak, Config.ServerID ); ADDWORD ( pak, Config.WorldPort ); cryptPacket( (char*)&pak, NULL ); send( csock, (char*)&pak, pak.Size, 0 ); } float loadtime = (float)( clock() - timer ) / CLOCKS_PER_SEC; Log( MSG_INFO, "Server took %.4f seconds to load", loadtime ); return true; }
// This function is called just before the server starts bool CWorldServer::OnServerReady( ) { ServerOnline = true; GServer = this; clock_t timer = clock(); LastUpdateTime = clock(); ATTK_SPEED_MODIF = 120; HIT_DELAY_MODIF = 0; MOVE_SPEED_MODIF = 100000; //Load our Server Info LoadZoneData( ); LoadGrids( ); //resetting grids... LoadConsItem( ); LoadSellData( ); LoadProductItem( ); LoadPatItem( ); LoadNaturalItem( ); LoadJemItem( ); LoadEquip( ); LoadItemStats( ); LoadBreakList( ); // geo edit for disassemble // 22 oct 07 LoadSkillData( ); LoadDropsData( ); LoadChestData( ); LoadQuestData( ); LoadNPCData( ); LoadTeleGateData( ); LoadRespawnData( ); LoadMonsterSpawn( ); LoadNPCs( ); LoadMonsters( ); LoadUpgrade( ); CleanConnectedList( ); Log(MSG_INFO, "Database Loaded " ); pthread_create( &WorldThread[WORLD_THREAD], &at, WorldProcess, NULL); pthread_create( &WorldThread[VISUALITY_THREAD], &at, VisibilityProcess, NULL); pthread_create( &MapThread[0], &at, MapProcess, NULL); Log( MSG_INFO, "Process Loaded. WorldDelay %i | MapDelay %i | VisualDelay %i",Config.WorldDelay,Config.MapDelay,Config.VisualDelay); DB->QExecute( "DELETE FROM channels WHERE id=%u and type=%i", Config.ServerID, Config.ServerType ); if(!DB->QExecute("INSERT INTO channels (id,type,name,host,port,lanip,lansubmask,connected,maxconnections,owner) VALUES (%i,%i,'%s','%s',%u,'%s','%s',0,%i,%i)", Config.ServerID, Config.ServerType, Config.ServerName, Config.WorldIP, Config.WorldPort, Config.LanIP, Config.LanSubnet, Config.MaxConnections, Config.ParentID)) { Log(MSG_WARNING, "Error accessing to database, the other server will not connect to WorldServer" ); } MYSQL_ROW row; bool pflag = false; //Get IP and Port from Charserver MYSQL_RES *result = DB->QStore( "SELECT host,port,lanip FROM channels WHERE id=%u and type=1", Config.ParentID ); if(result==NULL) return false; if (mysql_num_rows( result ) == 1) { row = mysql_fetch_row( result ); switch(Config.Connection) { case 0://wanip Config.CharIP = row[0]; break; case 1://lanip Config.CharIP = row[2]; break; default://localhost Config.CharIP = "127.0.0.1"; break; } Config.CharPort = atoi(row[1]); pflag = true; } DB->QFree( ); if(pflag) { Log( MSG_INFO, "Initialized Charserver connection" ); // Connect To LoginServer csock = socket( AF_INET, SOCK_STREAM, 0 ); if (csock == INVALID_SOCKET) { Log( MSG_WARNING, "Could not access login server" ); } struct sockaddr_in ain; ain.sin_family = AF_INET; ain.sin_addr.s_addr = inet_addr( Config.CharIP ); ain.sin_port = htons( Config.CharPort ); if ( connect( csock, (SOCKADDR*) &ain, sizeof(ain) ) == SOCKET_ERROR ) Log( MSG_WARNING, "Could not access charserver" ); BEGINPACKET( pak, 0x500 ); ADDDWORD ( pak, Config.CharPass ); ADDDWORD ( pak, Config.ServerID ); ADDWORD ( pak, Config.WorldPort ); cryptPacket( (char*)&pak, NULL ); send( csock, (char*)&pak, pak.Size, 0 ); } float loadtime = (float)( clock() - timer ) / CLOCKS_PER_SEC; Log( MSG_INFO, "Server took %.4f seconds to load", loadtime ); return true; }