⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 worldserver.cpp.svn-base

📁 ROSE的源代码。了解的自己研究,编译通过
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
/*
    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 + -