📄 worldserver.cpp.svn-base
字号:
/*
Rose Online Server Emulator
Copyright (C) 2006,2007 OSRose Team http://www.osrose.net
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
depeloped with Main erose/hrose source server + some change from the original eich source
*/
#include "worldserver.h"
// Constructor
CWorldServer::CWorldServer( string fn )
{
filename = fn;
LoadConfigurations( (char*)fn.c_str() );
for(unsigned i=0; i<0xffff; i++)
ClientIDList[i] = 1;
//Clear or Vector list
PartyList.clear();
MDropList.clear();
SkillList.clear();
QuestList.clear();
FairyList.clear();
TeleGateList.clear();
//
CEquip* nullequip = new CEquip;
nullequip->id = 0;
nullequip->equiptype = 0;
nullequip->type = 0;
nullequip->price = 0;
nullequip->pricerate = 0;
nullequip->weight = 0;
nullequip->quality = 0;
nullequip->level = 0;
nullequip->material = 0;
nullequip->defense = 0;
nullequip->magicresistence = 0;
nullequip->attackdistance = 0;
nullequip->movespeed = 0;
nullequip->attackpower = 0;
nullequip->attackspeed =0;
nullequip->itemgrade = 0;
for(int i=0;i<3;i++)
{
nullequip->occupation[i] = 0;
nullequip->condition1[i] = 0;
nullequip->condition2[i] = 0;
}
for(int i=0;i<2;i++)
{
nullequip->stat1[i] = 0;
nullequip->stat2[i] = 0;
}
for(int i=0;i<10;i++)
{
EquipList[i].nullequip = nullequip;
for(UINT j=0;j<5000;j++)
EquipList[i].Index[j] = nullequip;
}
CNaturalData* nullnatural = new CNaturalData;
nullnatural->id = 0;
nullnatural->type = 0;
nullnatural->price = 0;
nullnatural->pricerate = 0;
nullnatural->weight = 0;
nullnatural->quality = 0;
nullnatural->pricevalue = 0;
NaturalList.nullnatural = nullnatural;
CPatData* nullpat = new CPatData;
nullpat->id = 0;
nullpat->type = 0;
nullpat->price = 0;
nullpat->pricerate = 0;
nullpat->weight = 0;
nullpat->quality = 0;
nullpat->material = 0;
nullpat->partversion = 0;
nullpat->maxfuel = 0;
nullpat->fuelcons = 0;
nullpat->speed = 0;
nullpat->attackdistance = 0;
nullpat->attackpower = 0;
nullpat->attackspeed = 0;
PatList.nullpat = nullpat;
CCSellData* nullsell = new CCSellData;
nullsell->id = 0;
for(UINT i=0;i<48;i++)
nullsell->item[i] = 0;
SellList.nullsell = nullsell ;
for(UINT i=0;i<1000;i++)
{
NaturalList.Index[i] = nullnatural;
PatList.Index[i] = nullpat;
SellList.Index[i] = nullsell;
}
CMap* nullzone = new CMap( );
nullzone->id =0;
nullzone->dayperiod = 1;
nullzone->morningtime = 0;
nullzone->daytime = 0;
nullzone->eveningtime = 0;
nullzone->nighttime = 0;
nullzone->allowpvp = 0;
nullzone->allowpat = 0;
nullzone->MapTime = 0;
nullzone->LastUpdate = 0;
nullzone->CurrentTime = 0;
for(UINT i=0;i<300;i++)
MapList.Index[i] = nullzone;
MapList.nullzone = nullzone;
CUseData* nulluse = new CUseData;
nulluse->id = 0;
nulluse->restriction = 0;
nulluse->type = 0;
nulluse->price = 0;
nulluse->pricerate = 0;
nulluse->weight = 0;
nulluse->quality = 0;
nulluse->pricevalue = 0;
for(int i=0;i<2;i++)
{
nulluse->usecondition[i] = 0;
nulluse->useeffect[i] = 0;
}
UseList.nulluse = nulluse;
CProductData* nullproduct = new CProductData;
nullproduct->id = 0;
for(UINT i=0;i<50;i++)
{
nullproduct->item[i];
nullproduct->amount[i];
}
ProductList.nullproduct = nullproduct;
for(UINT i=0;i<2000;i++)
{
UseList.Index[i] = nulluse;
ProductList.Index[i] = nullproduct;
}
CJemData* nulljem = new CJemData;
nulljem->id = 0;
nulljem->type = 0;
nulljem->price = 0;
nulljem->pricerate = 0;
nulljem->weight = 0;
nulljem->quality = 0;
nulljem->material = 0;
for(int i=0;i<2;i++)
{
nulljem->stat1[i] = 0;
nulljem->stat2[i] = 0;
}
JemList.nulljem = nulljem ;
for(UINT i=0;i<4000;i++)
JemList.Index[i] = nulljem;
for(UINT i=0;i<500;i++)
{
StatsList[i].stat[0] = 0;
StatsList[i].stat[1] = 0;
StatsList[i].value[0] = 0;
StatsList[i].value[1] = 0;
}
MapMutex = PTHREAD_MUTEX_INITIALIZER; //fast mutex
SQLMutex = PTHREAD_MUTEX_INITIALIZER;
PlayerMutex = PTHREAD_MUTEX_INITIALIZER;
}
// Destructor
CWorldServer::~CWorldServer( )
{
// free memory
for(UINT i=0;i<FairyList.size();i++)
delete FairyList.at(i);
for(UINT i=0;i<PartyList.size();i++)
delete PartyList.at(i);
for(UINT i=0;i<TeleGateList.size();i++)
delete TeleGateList.at(i);
for(UINT i=0;i<QuestList.size();i++)
delete QuestList.at(i);
for(UINT i=0;i<SkillList.size();i++)
delete SkillList.at(i);
for(UINT i=0;i<MDropList.size();i++)
delete MDropList.at(i);
for(UINT i=0;i<NPCData.size();i++)
delete NPCData.at(i);
for(UINT i=0;i<JemList.Data.size();i++)
delete JemList.Data.at(i);
for(UINT i=0;i<NaturalList.Data.size();i++)
delete NaturalList.Data.at(i);
for(UINT i=0;i<PatList.Data.size();i++)
delete PatList.Data.at(i);
for(UINT i=0;i<ProductList.Data.size();i++)
delete ProductList.Data.at(i);
for(UINT i=0;i<SellList.Data.size();i++)
delete SellList.Data.at(i);
for(UINT i=0;i<UseList.Data.size();i++)
delete UseList.Data.at(i);
for(UINT i=0;i<MapList.Map.size();i++)
delete MapList.Map.at(i);
for(UINT i=0;i<10;i++)
for(UINT j=0;j<EquipList[i].Data.size();j++)
delete EquipList[i].Data.at(j);
for(UINT i=0;i<ClientList.size();i++)
{
delete (CPlayer*)ClientList.at(i)->player;
delete ClientList.at(i);
}
delete EquipList[0].nullequip;
delete JemList.nulljem;
delete NaturalList.nullnatural;
delete PatList.nullpat;
delete ProductList.nullproduct;
delete SellList.nullsell;
delete UseList.nulluse;
delete MapList.nullzone;
delete DB;
}
//LMA BEGIN
//20070623, 224500
bool CWorldServer::Ping()
{
//Bogus request (checking if quest 1 exists).
if(DB->QStore( "SELECT id FROM quest_data WHERE id='1'")==NULL)
{
Log( MSG_INFO, "MySQL Ping Time Error on port %u",DB->Port);
}
else
{
Log( MSG_INFO, "MySQL Ping Time Ok on port %u",DB->Port);
DB->QFree( );
}
return true;
}
//LMA END
// This cleans up our clients mess :P
void CWorldServer::OnClientDisconnect( CClientSocket* thisclient )
{
if(thisclient->player==NULL) return;
CPlayer* player = (CPlayer*)thisclient->player;
if(!player->Session->isLoggedIn) return;
if(!player->Saved)
{
player->savedata();
player->Session->isLoggedIn = false;
//send packet to change messenger status (offline)
BEGINPACKET( pak, 0x7e1 );
ADDBYTE ( pak, 0xfa );
ADDWORD ( pak, player->CharInfo->charid );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -