107 lines
2.7 KiB
C++
107 lines
2.7 KiB
C++
#include "pch.h"
|
|
#include "Log.h"
|
|
#include "l2c_utils.h"
|
|
#include "net/GameClient/GameClient.h"
|
|
#include "../ServerPackets.h"
|
|
#include "GS.h"
|
|
//
|
|
#include "world/model/base/ClassIdTree.h"
|
|
#include "datatables/CharTemplateTable.h"
|
|
|
|
/*
|
|
Server: Len 967 [NewCharacterSuccess]
|
|
C7 03
|
|
0D // opcode
|
|
0C 00 00 00 // number of templates
|
|
|
|
// [ for each template ]
|
|
|
|
00 00 00 00 // race
|
|
00 00 00 00 // class id
|
|
46 00 00 00 // 0x46
|
|
28 00 00 00 // base STR
|
|
0A 00 00 00 // 0x0A
|
|
46 00 00 00 // 0x46
|
|
1E 00 00 00 // base DEX
|
|
0A 00 00 00
|
|
46 00 00 00
|
|
2B 00 00 00 // base CON
|
|
0A 00 00 00
|
|
46 00 00 00
|
|
15 00 00 00 // base INT
|
|
0A 00 00 00
|
|
46 00 00 00
|
|
0B 00 00 00 // base WIT
|
|
0A 00 00 00
|
|
46 00 00 00
|
|
19 00 00 00 // base MEN
|
|
0A 00 00 00
|
|
*/
|
|
|
|
L2GamePacket *ServerPackets::NewCharacterSuccess( GameClient *pl )
|
|
{
|
|
pl = NULL; // reference to player is not needed here
|
|
//
|
|
unsigned int numTemplates = 0;
|
|
L2Game_NewCharacterTemplate tmpl[32];
|
|
int ic = 0;
|
|
ClassIdTree *cidtree = ClassIdTree::getInstance();
|
|
for( ic = 0; ic < ClassIdTree::NUM_CLASS_IDS; ic++ )
|
|
{
|
|
// no Inspector, though it's base class
|
|
if( ic == ClassId::CID_INSPECTOR ) continue;
|
|
// get ClassId if class
|
|
const ClassId *cid = cidtree->getClassId( ic );
|
|
if( cid )
|
|
{
|
|
// no parents, base classes
|
|
if( cid->getParentId() == ClassId::CID_NONE )
|
|
{
|
|
// get template base stats for class
|
|
const L2PlayerTemplate *plt = CharTemplateTable::getTemplate( ic );
|
|
if( plt )
|
|
{
|
|
tmpl[numTemplates].classID = ic;
|
|
tmpl[numTemplates].base_CON = plt->baseCON;
|
|
tmpl[numTemplates].base_DEX = plt->baseDEX;
|
|
tmpl[numTemplates].base_INT = plt->baseINT;
|
|
tmpl[numTemplates].base_MEN = plt->baseMEN;
|
|
tmpl[numTemplates].base_STR = plt->baseSTR;
|
|
tmpl[numTemplates].base_WIT = plt->baseWIT;
|
|
tmpl[numTemplates].race = (int)plt->race;
|
|
numTemplates++;
|
|
}
|
|
}
|
|
}
|
|
if( numTemplates >= 32 ) break;
|
|
}
|
|
//
|
|
L2GamePacket *p = new L2GamePacket();
|
|
p->setPacketType( 0x0D ); // NewCharacterSuccess
|
|
p->writeUInt( numTemplates );
|
|
for( ic = 0; ic < (int)numTemplates; ic++ )
|
|
{
|
|
p->writeD( tmpl[ic].race );
|
|
p->writeD( tmpl[ic].classID );
|
|
p->writeD( 0x46 );
|
|
p->writeD( tmpl[ic].base_STR );
|
|
p->writeD( 0x0A );
|
|
p->writeD( 0x46 );
|
|
p->writeD( tmpl[ic].base_DEX );
|
|
p->writeD( 0x0A );
|
|
p->writeD( 0x46 );
|
|
p->writeD( tmpl[ic].base_CON );
|
|
p->writeD( 0x0A );
|
|
p->writeD( 0x46 );
|
|
p->writeD( tmpl[ic].base_INT );
|
|
p->writeD( 0x0A );
|
|
p->writeD( 0x46 );
|
|
p->writeD( tmpl[ic].base_WIT );
|
|
p->writeD( 0x0A );
|
|
p->writeD( 0x46 );
|
|
p->writeD( tmpl[ic].base_MEN );
|
|
p->writeD( 0x0A );
|
|
}
|
|
return p;
|
|
}
|