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

📄 worldpackets.cpp.svn-base

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

// Send Characters information
void CWorldServer::pakPlayer( CPlayer *thisclient )
{    
	CRespawnPoint* thisrespawn = GetRespawnByID( thisclient->Position->respawn );   
	if(thisrespawn!=NULL)
	{
        thisclient->Position->destiny = thisrespawn->dest;
    	thisclient->Position->current = thisclient->Position->destiny;   	
    	thisclient->Position->Map = thisrespawn->destMap;
    }
    else
    {
        thisclient->Position->destiny.x = 5300;
        thisclient->Position->destiny.y = 5200;
        thisclient->Position->current = thisclient->Position->destiny;
        thisclient->Position->Map = 2;
    }
    CMap* map = MapList.Index[thisclient->Position->Map];
    map->AddPlayer( thisclient );
    BEGINPACKET( pak, 0x715 );
    ADDBYTE    ( pak, thisclient->CharInfo->Sex );                       // Sex
    ADDWORD    ( pak, thisclient->Position->Map );		                 // Map
    ADDFLOAT   ( pak, thisclient->Position->current.x*100 );	                 // Pos X
    ADDFLOAT   ( pak, thisclient->Position->current.y*100 );		             // Pos Y
    ADDWORD    ( pak, 0x0000 );
    ADDDWORD   ( pak, thisclient->CharInfo->Face );			             // Face
    ADDDWORD   ( pak, thisclient->CharInfo->Hair );	             // Hair
    ADDWORD    ( pak, thisclient->items[2].itemnum );	         // Cap
    ADDWORD    ( pak, BuildItemRefine( thisclient->items[2] ) ); // Cap Refine
    ADDWORD    ( pak, thisclient->items[3].itemnum );	         // Body
    ADDWORD    ( pak, BuildItemRefine( thisclient->items[3] ) ); // Body Refine
    ADDWORD    ( pak, thisclient->items[5].itemnum );	         // Gloves
    ADDWORD    ( pak, BuildItemRefine( thisclient->items[5] ) ); // Gloves Refine
    ADDWORD    ( pak, thisclient->items[6].itemnum );	         // Boots
    ADDWORD    ( pak, BuildItemRefine( thisclient->items[6] ));	 // Boots Refine
    ADDWORD    ( pak, thisclient->items[1].itemnum );	         // Face
    ADDWORD    ( pak, BuildItemRefine( thisclient->items[1] ) ); // Face Refine
    ADDWORD    ( pak, thisclient->items[4].itemnum );	         // Back
    ADDWORD    ( pak, BuildItemRefine( thisclient->items[4] ) ); // Back Refine
    ADDWORD    ( pak, thisclient->items[7].itemnum );	         // Weapon
    ADDWORD    ( pak, BuildItemRefine( thisclient->items[7] ) ); // Weapon Refine
    ADDWORD    ( pak, thisclient->items[8].itemnum );	         // SubWeapon
    ADDWORD    ( pak, BuildItemRefine( thisclient->items[8] ) ); // SubWeapon Refine
    ADDBYTE    ( pak, 0 );
    ADDWORD    ( pak, 0x140f );
	ADDWORD    ( pak, thisclient->CharInfo->Job );			         // Job
    ADDBYTE    ( pak, 0 );
    ADDWORD    ( pak, 0 );
    ADDWORD    ( pak, thisclient->Attr->Str );			             // Str
    ADDWORD    ( pak, thisclient->Attr->Dex );				         // Dex
    ADDWORD    ( pak, thisclient->Attr->Int );				         // Int
    ADDWORD    ( pak, thisclient->Attr->Con );				         // Con
    ADDWORD    ( pak, thisclient->Attr->Cha );				         // Cha
    ADDWORD    ( pak, thisclient->Attr->Sen );				         // Sen
	ADDWORD    ( pak, thisclient->Stats->HP );                 // Current HP
	ADDWORD    ( pak, thisclient->Stats->MP );                 // Current MP
	ADDWORD    ( pak, thisclient->CharInfo->Exp );                       // Exp
	ADDWORD    ( pak, 0 );			
	ADDWORD    ( pak, thisclient->Stats->Level );			         // Level
	ADDWORD    ( pak, thisclient->CharInfo->StatPoints );				 // Stat Points 
	ADDWORD    ( pak, thisclient->CharInfo->SkillPoints );               // Skill Points
	ADDWORD    ( pak, 0x6464 );
	for(int i=0; i<37; i++) ADDBYTE( pak, 0 );					 
	ADDWORD( pak, thisclient->CharInfo->stamina );						 // Stamina
	for(int i=0; i<326; i++) ADDBYTE( pak, 0 );					
	for(int i=0; i<MAX_SKILL; i++) // Class Skills   
        ADDWORD( pak, thisclient->cskills[i].id+thisclient->cskills[i].level-1 );
	for(int i=0; i<260; i++)  ADDWORD( pak, 0 );
	for(int i=0; i<42; i++)       // Basic Skills                               
		ADDWORD( pak, thisclient->bskills[i] );	
	for(int i=0; i<48; i++)       // QuickBar
        ADDWORD( pak, thisclient->quickbar[i] );
	ADDDWORD   ( pak, thisclient->CharInfo->charid );	                     // CharID
	for(int i=0; i<80;i++) ADDBYTE( pak, 0 );
	ADDSTRING  ( pak, thisclient->CharInfo->charname );                      // Char Name
	ADDBYTE    ( pak, 0 );
    thisclient->client->SendPacket( &pak );
}

// Send Inventory Information
void CWorldServer::pakInventory( CPlayer *thisclient )
{
	BEGINPACKET( pak, 0x716 );
	ADDQWORD( pak, thisclient->CharInfo->Zulies );
	//ADDWORD( pak, 0 );
	for(unsigned j=0; j<140; j++)
    {        
       	ADDDWORD( pak, BuildItemHead( thisclient->items[j] ) );
       	ADDDWORD( pak, BuildItemData( thisclient->items[j] ) ); 
        //Added 2 lines below for 139+ Clients - code on osRose Forum - Purple / Drakia
        // Disabled for now, problems in drops
//        ADDDWORD( pak, 0x00000000 );
//        ADDWORD ( pak, 0x0000 );   

	}
    thisclient->client->SendPacket( &pak );
}


// Send Quest information
void CWorldServer::pakQuestData( CPlayer *thisclient )
{
    BEGINPACKET( pak, 0x71b );   
/*    
    char buffer;                                  
    FILE *packet1 = fopen("packet/quest.dat","r");       //  I USE THIS FOR TEST!
    if(packet1==NULL)
    {
        cout << "file not founded: check pakQuestData function" << endl;
        return;                           
    }
    while((fscanf(packet1,"%c",&buffer))!=EOF)
        ADDBYTE(pak,buffer);      
    fclose(packet1);     
    thisclient->client->SendPacket( &pak );
    return;
*/

    //LMA: Quest Variables (50 bytes)
    for(int i=0;i<25;i++)
    {
         Log(MSG_INFO,"quest variable %i=%i",i,thisclient->QuestVariables[i]); 
        ADDBYTE( pak, thisclient->QuestVariables[i] );          
        ADDBYTE( pak, 0x00 );         
    }
    
    int b = 0;
    for(int i=0;i<thisclient->MyQuest.size( );i++)
    {
        
        QUESTS* myquest = thisclient->MyQuest.at( i );
     if( myquest->active )
        {
            ADDWORD( pak, myquest->thisquest->id );  //# Quest
            
            //LMA BEGIN
            //20060622, 163000
            //patch for healing hands, soil of purification and antidotes
            //or Clan wars or hunting practice.
            switch (myquest->thisquest->id)
            {
                   case 106:
                      {
                           ADDQWORD( pak, 180 ); //Time
                     }
                     break;                       
                   case 107:
                      {
                           ADDQWORD( pak, 180 ); //Time
                     }
                     break;                       
                   case 2813:
                       {
                           ADDQWORD( pak, 120 ); //Time
                     }
                     break;                      
                   case 5053:
                       {
                           ADDQWORD( pak, 60 ); //Time
                     }
                     break; 
                   case 957:
                       {
                           ADDQWORD( pak, 120 ); //Time
                     }
                     break; 
                   case 958:
                       {
                           ADDQWORD( pak, 150 ); //Time
                     }
                     break; 
                   case 959:
                       {
                           ADDQWORD( pak, 240 ); //Time
                     }
                     break;                                                                                     
                   default:
                     {
                           ADDQWORD( pak, 0x00000000 ); //Time
                     }
                     break;
            }
            //LMA END
            
            for(int j=0;j<0x14;j++)
                ADDBYTE( pak, 0x00 );

            for(int j=0;j<5;j++)
            {
                if( myquest->thisquest->CItem[j] != 0 && myquest->items[j]!= 0 )
                {
                    CItem item;
                    item.itemnum = myquest->thisquest->CItem[j];
                    item.itemtype = 13;
                    item.count = 1;
                    ADDDWORD( pak, BuildItemHead( item ) );
                    ADDDWORD( pak, myquest->items[j] );
                }
                else
                {
                    ADDQWORD( pak, 0x00000000 );
                }
            }
            ADDQWORD( pak, 0x00000000 ); 
                            
            b++;
            continue;
        }       
        if(b>=10)
            break;
    }
    for(int i=b;i<10;i++)
    {
        for(int j=0;j<0x4e;j++)
            ADDBYTE( pak, 0x00 );        
    } 
    //ADDBYTE( pak, 0x00 );
    
    ADDDWORD( pak, thisclient->speaksLuna ? 8 : 0 ); //Enable luna language (currently enabled for all b4 I make a proper quest for it)
    ADDDWORD( pak, thisclient->canUseFlyingVessel ? 32 : 0 ); //Enable flying vessel    

    for(int i=4;i<41;i++)
        ADDWORD( pak, 0 );
             
    ADDBYTE( pak, 0x00 );        
    for(int i=0;i<30;i++) // Wish list [Caali]
    {
        ADDDWORD( pak, 0x00000000 ); //Item Head
        ADDDWORD( pak, 0x00000000 ); //Item Data
    }  

    thisclient->client->SendPacket( &pak );
}

// Get this user set up with the encryption and stuff
bool CWorldServer::pakDoIdentify( CPlayer *thisclient, CPacket *P )
{
	MYSQL_ROW row;
	thisclient->Session->userid = GETDWORD((*P), 0);
	memcpy( thisclient->Session->password, &P->Buffer[4], 32 );
	MYSQL_RES *result = DB->QStore("SELECT username,lastchar,accesslevel,zulystorage FROM accounts WHERE id=%i AND password='%s'", thisclient->Session->userid, thisclient->Session->password);
    if(result==NULL) return false;
	if (mysql_num_rows( result ) != 1) 
    {
		Log( MSG_HACK, "Someone tried to connect to world server with an invalid account" );
		DB->QFree( );
		return false;
	}
	row = mysql_fetch_row(result);
	strncpy( thisclient->Session->username, row[0],16 );
	strncpy( thisclient->CharInfo->charname, row[1],16 );
	thisclient->Session->accesslevel = atoi(row[2]);
	thisclient->CharInfo->Storage_Zulies = atoi( row[3] );
	DB->QFree( );
	if(!thisclient->loaddata( )) return false;
	Log( MSG_INFO, "User '%s'(#%i) logged in with character '%s'", thisclient->Session->username, thisclient->Session->userid, thisclient->CharInfo->charname);
	BEGINPACKET( pak, 0x070c );
	ADDBYTE    ( pak, 0 );
	ADDDWORD   ( pak, 0x87654321 );
	ADDDWORD   ( pak, 0x00000000 );
	thisclient->client->SendPacket( &pak );
    pakPlayer(thisclient);
    pakInventory(thisclient);
    pakQuestData(thisclient);
	RESETPACKET( pak, 0x7de );
	ADDDWORD   ( pak, 0x000c1003 );
	ADDDWORD   ( pak, 0xffff0000 );
	ADDDWORD   ( pak, 0x00000000 );
	ADDDWORD   ( pak, 0x9b000038 );
	ADDDWORD   ( pak, 0x7272656a );
	ADDDWORD   ( pak, 0x3c3c3479 );
	ADDDWORD   ( pak, 0x534d5547 );
	ADDWORD    ( pak, 0x3e3e );
	ADDBYTE    ( pak, 0x00 );
	thisclient->client->SendPacket( &pak );
	RESETPACKET( pak, 0x702 );
	ADDSTRING  ( pak, Config.WELCOME_MSG );
	ADDBYTE    ( pak, 0 );
	thisclient->client->SendPacket( &pak );	
	//SendSysMsg( thisclient, "Open Source Rose Online Private Server" );
	
	thisclient->SetStats( );
	return true;
}

// Give the user an ID
bool CWorldServer::pakDoID( CPlayer* thisclient, CPacket* P )
{
	// Assign a new id to this person
   	thisclient->clientid = GetNewClientID();    
	if (thisclient->clientid <= 0) 
    {
		Log( MSG_WARNING, "User '%s'(#%i) denied access. Server is full.", thisclient->Session->username, thisclient->Session->userid );
		return false;
	}
	Log( MSG_INFO, "User '%s'(#%i) assigned id #%i", thisclient->Session->username, thisclient->Session->userid, thisclient->clientid );
    if( thisclient->Party->party )
    {
        BEGINPACKET( pak, 0x7d5 );
        ADDDWORD   ( pak, thisclient->CharInfo->charid );
        ADDWORD    ( pak, thisclient->clientid );
        ADDWORD    ( pak, thisclient->GetMaxHP( ) );
        ADDWORD    ( pak, thisclient->Stats->HP );
        ADDDWORD   ( pak, 0x01000000 );
        ADDDWORD   ( pak, 0x0000000f );
        ADDWORD    ( pak, 0x1388 );
        thisclient->Party->party->SendToMembers( &pak, thisclient );
    }   
	BEGINPACKET( pak, 0x721 );
    ADDWORD    ( pak, 0x0022 );
    ADDWORD    ( pak, 0x0002 );
    ADDWORD    ( pak, 0x0000 );			
    thisclient->client->SendPacket( &pak );
    
	RESETPACKET( pak, 0x730 );
    ADDWORD    ( pak, 0x0005 );			
    ADDDWORD   ( pak, 0x40b3a24d );		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -