int Patch::OnRegisterZone(pGame__RegisterZone reg, int max_zone_id, void *self, int expansion, int zone_id, char *short_name, char *long_name, int string_id, int flag, int g, int h, int i) { Log::Get().Write(Log::Debug, StringFormat("%i^%i^%s^%s^%i^%i^%i^%i^%i", expansion, zone_id, short_name, long_name, string_id, flag, g, h, i)); if(zone_id == 1) { //load zone data Log::Get().Write(Log::Debug, StringFormat("Loading zone data...")); LoadZoneData(); } if(zone_id == max_zone_id) { auto iter = zone_data_.find(zone_id); int ret = 0; if(iter != zone_data_.end()) { auto zde = iter->second; zone_data_.erase(iter); ret = reg(self, zde.expansion, zone_id, zde.short_name.c_str(), zde.long_name.c_str(), zde.string_id, zde.flag, zde.g, zde.h, zde.i); } else { ret = reg(self, expansion, zone_id, short_name, long_name, string_id, flag, g, h, i); } iter = zone_data_.begin(); while(iter != zone_data_.end()) { auto zid = iter->first; auto zde = iter->second; iter = zone_data_.erase(iter); reg(self, zde.expansion, zid, zde.short_name.c_str(), zde.long_name.c_str(), zde.string_id, zde.flag, zde.g, zde.h, zde.i); } return ret; } else { auto iter = zone_data_.find(zone_id); if(iter != zone_data_.end()) { auto zde = iter->second; zone_data_.erase(iter); return reg(self, zde.expansion, zone_id, zde.short_name.c_str(), zde.long_name.c_str(), zde.string_id, zde.flag, zde.g, zde.h, zde.i); } else { return reg(self, expansion, zone_id, short_name, long_name, string_id, flag, g, h, i); } } return reg(self, expansion, zone_id, short_name, long_name, string_id, flag, g, h, i); }
// 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; }