📄 worldpackets.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"
// 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 + -