l2-unlegits/l2packets/l2world/L2Player.cpp
2012-02-01 05:25:08 +00:00

679 lines
29 KiB
C++

#include "stdafx.h"
#include "L2Player.h"
#include "../l2data/L2Data.h"
#include "../game/L2GamePacket.h"
#include "../os/os_abstraction.h"
L2Player::L2Player()
{
setUnused();
}
L2Player::~L2Player()
{
setUnused();
}
L2Player::L2Player( const L2Player& other ): L2Character()
{
setUnused();
this->operator=( other );
}
const L2Player& L2Player::operator=( const L2Player& other )
{
if( this == &other ) return (*this); // self-assign
L2Character::operator=( other );
//
int i;
//
classID = other.classID;
baseClassID = other.baseClassID;
race = other.race;
sex = other.sex;
hairStyle = other.hairStyle;
hairColor = other.hairColor;
face = other.face;
experience = other.experience;
skill_points = other.skill_points;
curLoad = other.curLoad;
maxLoad = other.maxLoad;
pkKills = other.pkKills;
pvpKills = other.pvpKills;
enchantEffect = other.enchantEffect;
relation = other.relation;
autoAttackable = other.autoAttackable;
for( i=0; i<32; i++ )
{
paperdoll_oid[i] = other.paperdoll_oid[i];
paperdoll_iid[i] = other.paperdoll_iid[i];
paperdoll_augid[i] = other.paperdoll_augid[i];
}
isFakeDeath = other.isFakeDeath;
isFishing = other.isFishing;
fishX = other.fishX;
fishY = other.fishY;
fishZ = other.fishZ;
privateStoreType = other.privateStoreType;
wcsncpy( privateStoreMsgBuy, other.privateStoreMsgBuy, 64 );
privateStoreMsgBuy[63] = 0;
wcsncpy( privateStoreMsgSell, other.privateStoreMsgSell, 64 );
privateStoreMsgSell[63] = 0;
wcsncpy( privateStoreMsgRecipe, other.privateStoreMsgRecipe, 64 );
privateStoreMsgRecipe[63] = 0;
mountType = other.mountType;
mountNpcId = other.mountNpcId;
recomLeft = other.recomLeft;
recomHave = other.recomHave;
isNoble = other.isNoble;
isHero = other.isHero;
nameColor = other.nameColor;
titleColor = other.titleColor;
pledgeClass = other.pledgeClass;
pledgeType = other.pledgeType;
cursedWeaponId = other.cursedWeaponId;
clanRepScore = other.clanRepScore;
transformId = other.transformId;
agathionId = other.agathionId;
vehicleObjectId = other.vehicleObjectId;
hasDwarvenCraft = other.hasDwarvenCraft;
numCubics = other.numCubics;
for( i=0; i<4; i++ ) cubicId[i] = other.cubicId[i];
clanPrivs = other.clanPrivs;
inventoryLimit = other.inventoryLimit;
elements = other.elements;
fame = other.fame;
vitalityLevel = other.vitalityLevel;
//
return (*this);
}
void L2Player::setUnused()
{
L2Character::setUnused();
classID = baseClassID = 0;
clanID = clanCrestID = clanCrestLargeID = allyID = allyCrestID = 0;
race = sex = 0;
hairStyle = hairColor = face = 0;
experience = 0;
skill_points = 0;
curLoad = maxLoad = 0;
pkKills = pvpKills = 0;
relation = RELATION_NONE;
autoAttackable = 0;
int i;
for( i=0; i<32; i++ )
{
paperdoll_oid[i] = 0;
paperdoll_iid[i] = 0;
paperdoll_augid[i] = 0;
}
isFishing = 0;
fishX = fishY = fishZ = 0;
privateStoreType = 0;
privateStoreMsgBuy[0] = privateStoreMsgSell[0] = privateStoreMsgRecipe[0] = 0;
mountType = mountNpcId = 0;
recomLeft = recomHave = 0;
isNoble = isHero = 0;
nameColor = titleColor = 0;
pledgeClass = pledgeType = 0;
cursedWeaponId = transformId = agathionId = 0;
clanRepScore = 0;
vehicleObjectId = 0;
hasDwarvenCraft = 0;
numCubics = 0;
for( i=0; i<4; i++ ) cubicId[i] = 0;
clanPrivs = 0;
inventoryLimit = 0;
elements.clear();
}
void L2Player::getRaceStr( wchar_t *out ) const
{
if( !out ) return;
out[0] = 0;
const char *ansi = L2Data_getRace( this->race );
#ifdef L2PACKETS_WINDOWS
_snwprintf( out, 32, L"%S", ansi );
#endif
#ifdef L2PACKETS_LINUX
swprintf( out, 32, L"%ls", ansi );
#endif
out[31] = 0;
}
void L2Player::getSexStr( wchar_t *out ) const
{
if( !out ) return;
out[0] = 0;
const char *ansi = L2Data_getSex( this->sex );
#ifdef L2PACKETS_WINDOWS
_snwprintf( out, 32, L"%S", ansi );
#endif
#ifdef L2PACKETS_LINUX
swprintf( out, 32, L"%ls", ansi );
#endif
out[31] = 0;
}
void L2Player::getClassStr( wchar_t *out ) const
{
if( !out ) return;
out[0] = 0;
const char *ansi = L2Data_getClass( this->classID );
#ifdef L2PACKETS_WINDOWS
_snwprintf( out, 32, L"%S", ansi );
#endif
#ifdef L2PACKETS_LINUX
swprintf( out, 32, L"%ls", ansi );
#endif
out[31] = 0;
}
void L2Player::getBaseClassStr( wchar_t *out ) const
{
if( !out ) return;
out[0] = 0;
const char *ansi = L2Data_getClass( this->baseClassID );
#ifdef L2PACKETS_WINDOWS
_snwprintf( out, 32, L"%S", ansi );
#endif
#ifdef L2PACKETS_LINUX
swprintf( out, 32, L"%ls", ansi );
#endif
}
bool L2Player::parse_CharInfo( void *l2_game_packet, L2_VERSION l2_version )
{
if( !l2_game_packet ) return false;
int i;
L2GamePacket *p = (L2GamePacket *)l2_game_packet;
// parse
unsigned char ptype = p->getPacketType(); // 0x31
if( ptype != 0x31 ) return false;
x = p->readInt(); // x
y = p->readInt(); // y
z = p->readInt(); // z
p->readUInt(); // 0x00
objectID = p->readUInt(); // objectID
setName( p->readUnicodeStringPtr() ); // name
race = p->readUInt(); // race
sex = p->readInt(); // sex (0-male)
baseClassID = p->readUInt(); // base class
// paperdoll item IDs
paperdoll_iid[L2_PAPERDOLL_UNDER] = p->readUInt(); // PAPERDOLL_UNDER
paperdoll_iid[L2_PAPERDOLL_HEAD] = p->readUInt(); // PAPERDOLL_HEAD
paperdoll_iid[L2_PAPERDOLL_RHAND] = p->readUInt(); // PAPERDOLL_RHAND
paperdoll_iid[L2_PAPERDOLL_LHAND] = p->readUInt(); // PAPERDOLL_LHAND
paperdoll_iid[L2_PAPERDOLL_GLOVES] = p->readUInt(); // PAPERDOLL_GLOVES
paperdoll_iid[L2_PAPERDOLL_CHEST] = p->readUInt(); // PAPERDOLL_CHEST
paperdoll_iid[L2_PAPERDOLL_LEGS] = p->readUInt(); // PAPERDOLL_LEGS
paperdoll_iid[L2_PAPERDOLL_FEET] = p->readUInt(); // PAPERDOLL_FEET
paperdoll_iid[L2_PAPERDOLL_BACK] = p->readUInt(); // PAPERDOLL_BACK
paperdoll_iid[L2_PAPERDOLL_LRHAND] = p->readUInt(); // PAPERDOLL_LRHAND
paperdoll_iid[L2_PAPERDOLL_HAIR] = p->readUInt(); // PAPERDOLL_HAIR
paperdoll_iid[L2_PAPERDOLL_HAIR2] = p->readUInt(); // PAPERDOLL_HAIR2
// kamael
paperdoll_iid[L2_PAPERDOLL_RBRACELET] = p->readUInt(); // PAPERDOLL_RBRACELET
paperdoll_iid[L2_PAPERDOLL_LBRACELET] = p->readUInt(); // PAPERDOLL_LBRACELET
paperdoll_iid[L2_PAPERDOLL_DECO1] = p->readUInt(); // PAPERDOLL_DECO1
paperdoll_iid[L2_PAPERDOLL_DECO2] = p->readUInt(); // PAPERDOLL_DECO2
paperdoll_iid[L2_PAPERDOLL_DECO3] = p->readUInt(); // PAPERDOLL_DECO3
paperdoll_iid[L2_PAPERDOLL_DECO4] = p->readUInt(); // PAPERDOLL_DECO4
paperdoll_iid[L2_PAPERDOLL_DECO5] = p->readUInt(); // PAPERDOLL_DECO5
paperdoll_iid[L2_PAPERDOLL_DECO6] = p->readUInt(); // PAPERDOLL_DECO6
//
if( l2_version >= L2_VERSION_T23 )
paperdoll_iid[L2_PAPERDOLL_BELT] = p->readUInt(); // PAPERDOLL_BELT
// paperdoll augmentation IDs
paperdoll_augid[L2_PAPERDOLL_UNDER] = p->readUInt(); // PAPERDOLL_UNDER
paperdoll_augid[L2_PAPERDOLL_HEAD] = p->readUInt(); // PAPERDOLL_HEAD
paperdoll_augid[L2_PAPERDOLL_RHAND] = p->readUInt(); // PAPERDOLL_RHAND
paperdoll_augid[L2_PAPERDOLL_LHAND] = p->readUInt(); // PAPERDOLL_LHAND
paperdoll_augid[L2_PAPERDOLL_GLOVES] = p->readUInt(); // PAPERDOLL_GLOVES
paperdoll_augid[L2_PAPERDOLL_CHEST] = p->readUInt(); // PAPERDOLL_CHEST
paperdoll_augid[L2_PAPERDOLL_LEGS] = p->readUInt(); // PAPERDOLL_LEGS
paperdoll_augid[L2_PAPERDOLL_FEET] = p->readUInt(); // PAPERDOLL_FEET
paperdoll_augid[L2_PAPERDOLL_BACK] = p->readUInt(); // PAPERDOLL_BACK
paperdoll_augid[L2_PAPERDOLL_LRHAND] = p->readUInt(); // PAPERDOLL_LRHAND
paperdoll_augid[L2_PAPERDOLL_HAIR] = p->readUInt(); // PAPERDOLL_HAIR
paperdoll_augid[L2_PAPERDOLL_HAIR2] = p->readUInt(); // PAPERDOLL_HAIR2
// kamael
paperdoll_augid[L2_PAPERDOLL_RBRACELET] = p->readUInt(); // PAPERDOLL_RBRACELET
paperdoll_augid[L2_PAPERDOLL_LBRACELET] = p->readUInt(); // PAPERDOLL_LBRACELET
paperdoll_augid[L2_PAPERDOLL_DECO1] = p->readUInt(); // PAPERDOLL_DECO1
paperdoll_augid[L2_PAPERDOLL_DECO2] = p->readUInt(); // PAPERDOLL_DECO2
paperdoll_augid[L2_PAPERDOLL_DECO3] = p->readUInt(); // PAPERDOLL_DECO3
paperdoll_augid[L2_PAPERDOLL_DECO4] = p->readUInt(); // PAPERDOLL_DECO4
paperdoll_augid[L2_PAPERDOLL_DECO5] = p->readUInt(); // PAPERDOLL_DECO5
paperdoll_augid[L2_PAPERDOLL_DECO6] = p->readUInt(); // PAPERDOLL_DECO6
//
if( l2_version >= L2_VERSION_T23 )
paperdoll_augid[L2_PAPERDOLL_BELT] = p->readUInt(); // PAPERDOLL_BELT
// Gracia Final 2.3
if( l2_version == L2_VERSION_T23 )
{
p->readD();
p->readD();
}
pvpFlag = p->readUInt(); // pvp flag
karma = p->readInt(); // karma
mAtkSpd = p->readInt(); // cast speed
pAtkSpd = p->readInt(); // atk speed
pvpFlag = p->readUInt(); // pvp flag
karma = p->readInt(); // karma
runSpeed = p->readInt(); // run spd
walkSpeed = p->readInt(); // walk spd
p->readInt(); // _swimRunSpd (?)
p->readInt(); // _swimWalkSpd (?)
p->readInt(); // _flRunSpd (?)
p->readInt(); // _flWalkSpd (?)
p->readInt(); // _flyRunSpd (?)
p->readInt(); // _flyWalkSpd (?)
double moveMult = p->readDouble(); // move spd mult
double atkMult = p->readDouble(); // atk spd mult
// apply multipliers
if( moveMult > 0 )
{
runSpeed = (int)( ((double)(runSpeed)) * moveMult );
walkSpeed = (int)( ((double)(walkSpeed)) * moveMult );
}
if( atkMult > 0 ) pAtkSpd = (int)( ((double)(pAtkSpd)) * atkMult );
collisionRadius = p->readF(); // collisionRadius
collisionHeight = p->readF(); // collisionHeight
hairStyle = p->readInt();
hairColor = p->readInt();
face = p->readInt();
setTitle( p->readUnicodeStringPtr() ); // title
clanID = p->readUInt();
clanCrestID = p->readInt();
allyID = p->readInt();
allyCrestID = p->readInt();
p->readInt(); // relation(?), which is always 0
isSitting = (int)(!p->readUChar()); // standing = 1 sitting = 0
isRunning = (int)p->readUChar(); // running = 1 walking = 0
isInCombat = (int)p->readUChar();
isAlikeDead = (int)p->readUChar();
p->readUChar(); // invisible = 1 visible =0
this->mountType = p->readUChar(); // 1-on Strider, 2-on Wyvern, 3-on Great Wolf, 0-no mount
this->privateStoreType = p->readUChar(); // 1 - sellshop
// cubics
numCubics = (int)p->readUShort(); // cubics count
if( numCubics > 4 ) numCubics = 4;
for( i=0; i<numCubics; i++ )
cubicId[i] = (unsigned int)p->readUShort(); // cubic ID
p->readUChar(); // find party members
abnormalEffect = p->readUInt(); // abnormalEffect
recomLeft = (int)p->readUChar();
recomHave = (int)p->readUShort(); // Blue value for name (0 = white, 255 = pure blue)
mountNpcId = p->readUInt() - 1000000; // mountNpcId + 1000000
classID = p->readUInt(); // class ID
p->readUInt(); // 0x00
enchantEffect = (unsigned int)p->readUChar();
p->readUChar(); // team circle around feet 1 = Blue, 2 = red
clanCrestLargeID = p->readUInt();
isNoble = p->readUChar();
isHero = p->readUChar(); // hero aura
isFishing = p->readUChar(); // 0x01: Fishing Mode (Cant be undone by setting back to 0)
fishX = p->readInt();
fishY = p->readInt();
fishZ = p->readInt();
nameColor = p->readInt();
heading = p->readUInt();
pledgeClass = p->readUInt(); // PledgeClass
pledgeType = p->readUInt(); // PledgeType
titleColor = p->readUInt(); // TitleColor
cursedWeaponId = p->readUInt(); // CursedWeaponEquippedId
clanRepScore = p->readInt(); // clan ReputationScore
// T1
transformId = p->readUInt(); // TransformationId
agathionId = p->readUInt(); // AgathionId
// T2
//writeD(0x01);
// T2.3
//writeD(0x00);
//writeD(0x00);
//writeD(0x00);
//writeD(0x00);
// set last time when char coordinates were known exactly
lastMoveTickTime = OS_GetTickCount();
return true;
}
bool L2Player::parse_UserInfo( void *l2_game_packet, L2_VERSION l2_version )
{
if( !l2_game_packet ) return false;
unsigned int tempUINT;
int i;
L2GamePacket *p = (L2GamePacket *)l2_game_packet;
unsigned char ptype = p->getPacketType();
if( ptype != 0x32 ) return false;
x = p->readInt();
y = p->readInt();
z = p->readInt();
if( l2_version <= L2_VERSION_T22 ) heading = p->readUInt();
else if( l2_version >= L2_VERSION_T23 ) vehicleObjectId = p->readUInt();
objectID = p->readUInt();
setName( p->readUnicodeStringPtr() );
race = p->readInt();
sex = p->readInt();
baseClassID = p->readUInt();
level = p->readInt();
experience = p->readUInt64();
s_STR = p->readInt(); // writeD(_activeChar.getSTR());
s_DEX = p->readInt(); // writeD(_activeChar.getDEX());
s_CON = p->readInt(); // writeD(_activeChar.getCON());
s_INT = p->readInt(); // writeD(_activeChar.getINT());
s_WIT = p->readInt(); // writeD(_activeChar.getWIT());
s_MEN = p->readInt(); // writeD(_activeChar.getMEN());
maxHp = (double)p->readInt(); // writeD(_activeChar.getMaxHp());
curHp = (double)p->readInt(); // writeD((int) _activeChar.getCurrentHp());
maxMp = (double)p->readInt(); // writeD(_activeChar.getMaxMp());
curMp = (double)p->readInt(); //writeD((int) _activeChar.getCurrentMp());
skill_points = p->readUInt(); // writeD(_activeChar.getSp());
curLoad = p->readUInt(); // writeD(_activeChar.getCurrentLoad());
maxLoad = p->readUInt(); // writeD(_activeChar.getMaxLoad());
//writeD(_activeChar.getActiveWeaponItem() != null ? 0x40 : 0x20); // 0x20 no weapon, 0x40 weapon equipped
bool isWeaponEquipped = false; // why?... cannot we check weapon paperdoll objectId/itemId?
tempUINT = p->readUInt();
if( tempUINT == 0x40 ) isWeaponEquipped = true;
// paperdoll and its augments
// paperdoll objectIDs (25 items)
paperdoll_oid[L2_PAPERDOLL_UNDER] = p->readUInt(); // Inventory.PAPERDOLL_UNDER));
paperdoll_oid[L2_PAPERDOLL_REAR] = p->readUInt(); // writeD(....PAPERDOLL_REAR));
paperdoll_oid[L2_PAPERDOLL_LEAR] = p->readUInt(); // writeD(....PAPERDOLL_LEAR));
paperdoll_oid[L2_PAPERDOLL_NECK] = p->readUInt(); // writeD(....PAPERDOLL_NECK));
paperdoll_oid[L2_PAPERDOLL_RFINGER] = p->readUInt(); // writeD(....PAPERDOLL_RFINGER));
paperdoll_oid[L2_PAPERDOLL_LFINGER] = p->readUInt(); // writeD(....PAPERDOLL_LFINGER));
paperdoll_oid[L2_PAPERDOLL_HEAD] = p->readUInt(); // writeD(....PAPERDOLL_HEAD));
paperdoll_oid[L2_PAPERDOLL_RHAND] = p->readUInt(); // writeD(....PAPERDOLL_RHAND));
paperdoll_oid[L2_PAPERDOLL_LHAND] = p->readUInt(); // writeD(....PAPERDOLL_LHAND));
paperdoll_oid[L2_PAPERDOLL_GLOVES] = p->readUInt(); // writeD(....PAPERDOLL_GLOVES));
paperdoll_oid[L2_PAPERDOLL_CHEST] = p->readUInt(); // writeD(....PAPERDOLL_CHEST));
paperdoll_oid[L2_PAPERDOLL_LEGS] = p->readUInt(); // writeD(....PAPERDOLL_LEGS));
paperdoll_oid[L2_PAPERDOLL_FEET] = p->readUInt(); // writeD(....PAPERDOLL_FEET));
paperdoll_oid[L2_PAPERDOLL_BACK] = p->readUInt(); // writeD(....PAPERDOLL_BACK));
paperdoll_oid[L2_PAPERDOLL_LRHAND] = p->readUInt(); // writeD(....PAPERDOLL_LRHAND));
paperdoll_oid[L2_PAPERDOLL_HAIR] = p->readUInt(); // writeD(....PAPERDOLL_HAIR));
paperdoll_oid[L2_PAPERDOLL_HAIR2] = p->readUInt(); // writeD(....PAPERDOLL_HAIR2));
// T1 new D's
paperdoll_oid[L2_PAPERDOLL_RBRACELET] = p->readUInt(); // writeD(....PAPERDOLL_RBRACELET));
paperdoll_oid[L2_PAPERDOLL_LBRACELET] = p->readUInt(); // writeD(....PAPERDOLL_LBRACELET));
paperdoll_oid[L2_PAPERDOLL_DECO1] = p->readUInt(); // writeD(....PAPERDOLL_DECO1));
paperdoll_oid[L2_PAPERDOLL_DECO2] = p->readUInt(); // writeD(....PAPERDOLL_DECO2));
paperdoll_oid[L2_PAPERDOLL_DECO3] = p->readUInt(); // writeD(....PAPERDOLL_DECO3));
paperdoll_oid[L2_PAPERDOLL_DECO4] = p->readUInt(); // writeD(....PAPERDOLL_DECO4));
paperdoll_oid[L2_PAPERDOLL_DECO5] = p->readUInt(); // writeD(....PAPERDOLL_DECO5));
paperdoll_oid[L2_PAPERDOLL_DECO6] = p->readUInt(); // writeD(....PAPERDOLL_DECO6));
if( l2_version >= L2_VERSION_T23 )
paperdoll_oid[L2_PAPERDOLL_BELT] = p->readUInt(); // PAPERDOLL_BELT
// paperdoll itemIDs (25 items)
paperdoll_iid[L2_PAPERDOLL_UNDER] = p->readUInt(); // Inventory.PAPERDOLL_UNDER));
paperdoll_iid[L2_PAPERDOLL_REAR] = p->readUInt(); // writeD(....PAPERDOLL_REAR));
paperdoll_iid[L2_PAPERDOLL_LEAR] = p->readUInt(); // writeD(....PAPERDOLL_LEAR));
paperdoll_iid[L2_PAPERDOLL_NECK] = p->readUInt(); // writeD(....PAPERDOLL_NECK));
paperdoll_iid[L2_PAPERDOLL_RFINGER] = p->readUInt(); // writeD(....PAPERDOLL_RFINGER));
paperdoll_iid[L2_PAPERDOLL_LFINGER] = p->readUInt(); // writeD(....PAPERDOLL_LFINGER));
paperdoll_iid[L2_PAPERDOLL_HEAD] = p->readUInt(); // writeD(....PAPERDOLL_HEAD));
paperdoll_iid[L2_PAPERDOLL_RHAND] = p->readUInt(); // writeD(....PAPERDOLL_RHAND));
paperdoll_iid[L2_PAPERDOLL_LHAND] = p->readUInt(); // writeD(....PAPERDOLL_LHAND));
paperdoll_iid[L2_PAPERDOLL_GLOVES] = p->readUInt(); // writeD(....PAPERDOLL_GLOVES));
paperdoll_iid[L2_PAPERDOLL_CHEST] = p->readUInt(); // writeD(....PAPERDOLL_CHEST));
paperdoll_iid[L2_PAPERDOLL_LEGS] = p->readUInt(); // writeD(....PAPERDOLL_LEGS));
paperdoll_iid[L2_PAPERDOLL_FEET] = p->readUInt(); // writeD(....PAPERDOLL_FEET));
paperdoll_iid[L2_PAPERDOLL_BACK] = p->readUInt(); // writeD(....PAPERDOLL_BACK));
paperdoll_iid[L2_PAPERDOLL_LRHAND] = p->readUInt(); // writeD(....PAPERDOLL_LRHAND));
paperdoll_iid[L2_PAPERDOLL_HAIR] = p->readUInt(); // writeD(....PAPERDOLL_HAIR));
paperdoll_iid[L2_PAPERDOLL_HAIR2] = p->readUInt(); // writeD(....PAPERDOLL_HAIR2));
// T1 new D's
paperdoll_iid[L2_PAPERDOLL_RBRACELET] = p->readUInt(); // writeD(....PAPERDOLL_RBRACELET));
paperdoll_iid[L2_PAPERDOLL_LBRACELET] = p->readUInt(); // writeD(....PAPERDOLL_LBRACELET));
paperdoll_iid[L2_PAPERDOLL_DECO1] = p->readUInt(); // writeD(....PAPERDOLL_DECO1));
paperdoll_iid[L2_PAPERDOLL_DECO2] = p->readUInt(); // writeD(....PAPERDOLL_DECO2));
paperdoll_iid[L2_PAPERDOLL_DECO3] = p->readUInt(); // writeD(....PAPERDOLL_DECO3));
paperdoll_iid[L2_PAPERDOLL_DECO4] = p->readUInt(); // writeD(....PAPERDOLL_DECO4));
paperdoll_iid[L2_PAPERDOLL_DECO5] = p->readUInt(); // writeD(....PAPERDOLL_DECO5));
paperdoll_iid[L2_PAPERDOLL_DECO6] = p->readUInt(); // writeD(....PAPERDOLL_DECO6));
if( l2_version >= L2_VERSION_T23 )
paperdoll_iid[L2_PAPERDOLL_BELT] = p->readUInt(); // PAPERDOLL_BELT
// paperdoll augmentation IDs (25 items)
//for( i=0; i<25; i++ ) p->readUInt();
paperdoll_augid[L2_PAPERDOLL_UNDER] = p->readUInt(); // Inventory.PAPERDOLL_UNDER));
paperdoll_augid[L2_PAPERDOLL_REAR] = p->readUInt(); // writeD(....PAPERDOLL_REAR));
paperdoll_augid[L2_PAPERDOLL_LEAR] = p->readUInt(); // writeD(....PAPERDOLL_LEAR));
paperdoll_augid[L2_PAPERDOLL_NECK] = p->readUInt(); // writeD(....PAPERDOLL_NECK));
paperdoll_augid[L2_PAPERDOLL_RFINGER] = p->readUInt(); // writeD(....PAPERDOLL_RFINGER));
paperdoll_augid[L2_PAPERDOLL_LFINGER] = p->readUInt(); // writeD(....PAPERDOLL_LFINGER));
paperdoll_augid[L2_PAPERDOLL_HEAD] = p->readUInt(); // writeD(....PAPERDOLL_HEAD));
paperdoll_augid[L2_PAPERDOLL_RHAND] = p->readUInt(); // writeD(....PAPERDOLL_RHAND));
paperdoll_augid[L2_PAPERDOLL_LHAND] = p->readUInt(); // writeD(....PAPERDOLL_LHAND));
paperdoll_augid[L2_PAPERDOLL_GLOVES] = p->readUInt(); // writeD(....PAPERDOLL_GLOVES));
paperdoll_augid[L2_PAPERDOLL_CHEST] = p->readUInt(); // writeD(....PAPERDOLL_CHEST));
paperdoll_augid[L2_PAPERDOLL_LEGS] = p->readUInt(); // writeD(....PAPERDOLL_LEGS));
paperdoll_augid[L2_PAPERDOLL_FEET] = p->readUInt(); // writeD(....PAPERDOLL_FEET));
paperdoll_augid[L2_PAPERDOLL_BACK] = p->readUInt(); // writeD(....PAPERDOLL_BACK));
paperdoll_augid[L2_PAPERDOLL_LRHAND] = p->readUInt(); // writeD(....PAPERDOLL_LRHAND));
paperdoll_augid[L2_PAPERDOLL_HAIR] = p->readUInt(); // writeD(....PAPERDOLL_HAIR));
paperdoll_augid[L2_PAPERDOLL_HAIR2] = p->readUInt(); // writeD(....PAPERDOLL_HAIR2));
// T1 new D's
paperdoll_augid[L2_PAPERDOLL_RBRACELET] = p->readUInt(); // writeD(....PAPERDOLL_RBRACELET));
paperdoll_augid[L2_PAPERDOLL_LBRACELET] = p->readUInt(); // writeD(....PAPERDOLL_LBRACELET));
paperdoll_augid[L2_PAPERDOLL_DECO1] = p->readUInt(); // writeD(....PAPERDOLL_DECO1));
paperdoll_augid[L2_PAPERDOLL_DECO2] = p->readUInt(); // writeD(....PAPERDOLL_DECO2));
paperdoll_augid[L2_PAPERDOLL_DECO3] = p->readUInt(); // writeD(....PAPERDOLL_DECO3));
paperdoll_augid[L2_PAPERDOLL_DECO4] = p->readUInt(); // writeD(....PAPERDOLL_DECO4));
paperdoll_augid[L2_PAPERDOLL_DECO5] = p->readUInt(); // writeD(....PAPERDOLL_DECO5));
paperdoll_augid[L2_PAPERDOLL_DECO6] = p->readUInt(); // writeD(....PAPERDOLL_DECO6));
if( l2_version >= L2_VERSION_T23 )
paperdoll_augid[L2_PAPERDOLL_BELT] = p->readUInt(); // PAPERDOLL_BELT
// T2.3 some 2 Ds
if( l2_version >= L2_VERSION_T23 )
{
p->readD();
p->readD();
}
pAtk = p->readInt(); // writeD(_activeChar.getPAtk(null));
pAtkSpd = p->readInt(); // writeD(_activeChar.getPAtkSpd());
pDef = p->readInt(); // writeD(_activeChar.getPDef(null));
evasion = p->readInt(); // writeD(_activeChar.getEvasionRate(null));
accuracy = p->readInt(); // writeD(_activeChar.getAccuracy());
critical = p->readInt(); // writeD(_activeChar.getCriticalHit(null, null));
mAtk = p->readInt(); // writeD(_activeChar.getMAtk(null, null));
mAtkSpd = p->readInt(); // writeD(_activeChar.getMAtkSpd());
pAtkSpd = p->readInt(); // writeD(_activeChar.getPAtkSpd());
mDef = p->readInt(); // writeD(_activeChar.getMDef(null, null));
pvpFlag = p->readInt(); // writeD(_activeChar.getPvpFlag()); // 0-non-pvp 1-pvp = violett name
karma = p->readInt(); // writeD(_activeChar.getKarma());
runSpeed = p->readInt(); // writeD(_runSpd);
walkSpeed = p->readInt(); // writeD(_walkSpd);
p->readInt(); // writeD(_swimRunSpd); // swimspeed
p->readInt(); // writeD(_swimWalkSpd); // swimspeed
p->readInt(); // writeD(_flRunSpd);
p->readInt(); // writeD(_flWalkSpd);
p->readInt(); // writeD(_flyRunSpd);
p->readInt(); // writeD(_flyWalkSpd);
double moveMultiplier = p->readDouble(); // writeF(_moveMultiplier);
double attackSpeedMultiplier = p->readDouble(); // writeF(_activeChar.getAttackSpeedMultiplier());
if( moveMultiplier > 0.0 )
{
runSpeed = (int)( ((double)(runSpeed)) * moveMultiplier + 0.5 );
walkSpeed = (int)( ((double)(walkSpeed)) * moveMultiplier + 0.5 );
}
if( attackSpeedMultiplier > 0.0 )
{
pAtkSpd = (int)( ((double)(pAtkSpd)) * attackSpeedMultiplier);
}
collisionRadius = p->readDouble(); // writeF(_activeChar.getBaseTemplate().collisionRadius);
collisionHeight = p->readDouble(); // writeF(_activeChar.getBaseTemplate().collisionHeight);
hairStyle = p->readInt(); // writeD(_activeChar.getAppearance().getHairStyle());
hairColor = p->readInt(); // writeD(_activeChar.getAppearance().getHairColor());
face = p->readInt(); // writeD(_activeChar.getAppearance().getFace());
/*isGm =*/ p->readInt(); // writeD(_activeChar.isGM() ? 1 : 0); // builder level
setTitle( p->readS() ); // writeS(title);
clanID = p->readUInt(); // writeD(_activeChar.getClanId());
clanCrestID = p->readUInt(); // writeD(_activeChar.getClanCrestId());
allyID = p->readUInt(); // writeD(_activeChar.getAllyId());
allyCrestID = p->readUInt(); // writeD(_activeChar.getAllyCrestId()); // ally crest id
// 0x40 leader rights
// siege flags: attacker - 0x180 sword over name, defender - 0x80 shield, 0xC0 crown (|leader), 0x1C0 flag (|leader)
relation = p->readUInt(); // writeD(_relation);
mountType = p->readUChar(); // writeC(_activeChar.getMountType()); // mount type
privateStoreType = (int)p->readUChar(); // writeC(_activeChar.getPrivateStoreType());
hasDwarvenCraft = p->readUChar(); // writeC(_activeChar.hasDwarvenCraft() ? 1 : 0);
pkKills = p->readInt(); // writeD(_activeChar.getPkKills());
pvpKills = p->readInt(); // writeD(_activeChar.getPvpKills());
numCubics = p->readUShort(); // writeH(_activeChar.getCubics().size());
if( numCubics > 4 ) numCubics = 4; // safe
for( i=0; i<numCubics; i++ )
cubicId[i] = p->readUShort(); //for (int id : _activeChar.getCubics().keySet()) writeH(id);
p->readUChar(); // writeC(0x00); //1-find party members
abnormalEffect = p->readUInt(); // writeD(_activeChar.getAbnormalEffect());
p->readChar(); // writeC(0x00);
clanPrivs = p->readUInt(); // writeD(_activeChar.getClanPrivileges());
recomLeft = p->readUShort(); // writeH(_activeChar.getRecomLeft());
recomHave = p->readUShort(); // writeH(_activeChar.getRecomHave());
mountNpcId = p->readUInt(); // writeD(_activeChar.getMountNpcId() + 1000000);
inventoryLimit = p->readUShort(); // writeH(_activeChar.getInventoryLimit());
classID = p->readUInt(); // writeD(_activeChar.getClassId().getId());
p->readUInt(); // writeD(0x00); // special effects? circles around player...
maxCp = (double)p->readInt(); // writeD(_activeChar.getMaxCp());
curCp = (double)p->readInt(); // writeD((int) _activeChar.getCurrentCp());
enchantEffect = p->readUChar(); // writeC(_activeChar.getEnchantEffect());
p->readUChar(); // writeC(0x00); //team circle around feet 1= Blue, 2 = red
clanCrestLargeID = p->readUInt(); // writeD(_activeChar.getClanCrestLargeId());
isNoble = p->readUChar(); // writeC(_activeChar.isNoble() ? 1 : 0);
isHero = p->readUChar(); // writeC(_activeChar.isHero()
isFishing = p->readUChar(); // writeC(_activeChar.isFishing() ? 1 : 0); //Fishing Mode
fishX = p->readUInt(); // writeD(_activeChar.getFishx()); //fishing x
fishY = p->readUInt(); // writeD(_activeChar.getFishy()); //fishing y
fishZ = p->readUInt(); // writeD(_activeChar.getFishz()); //fishing z
nameColor = p->readUInt(); // writeD(_activeChar.getAppearance().getNameColor());
//new c5
isRunning = (int)p->readUChar(); // writeC(_activeChar.isRunning() ? 0x01 : 0x00); //changes the Speed display on Status Window
pledgeClass = p->readUInt(); // writeD(_activeChar.getPledgeClass()); //changes the text above CP on Status Window
pledgeType = p->readUInt(); // writeD(_activeChar.getPledgeType());
titleColor = p->readUInt(); // writeD(_activeChar.getAppearance().getTitleColor());
// writeD(CursedWeaponsManager.getInstance().getLevel(_activeChar.getCursedWeaponEquippedId()));
cursedWeaponId = p->readUInt(); // cursedWeapon
// T1 Starts
transformId = p->readUInt(); // writeD(_activeChar.getTransformationId());
if( l2_version < L2_VERSION_T23 )
{
elements.attackElementType = p->readD(); // writeD(_activeChar.getAttackElement());
elements.attackElementValue = p->readD(); // writeD(_activeChar.getAttackElementValue());
elements.defAttrFire = p->readD(); // writeD(_activeChar.getDefAttrFire());
elements.defAttrWater = p->readD(); // writeD(_activeChar.getDefAttrWater());
elements.defAttrWind = p->readD(); // writeD(_activeChar.getDefAttrWind());
elements.defAttrEarth = p->readD(); // writeD(_activeChar.getDefAttrEarth());
elements.defAttrHoly = p->readD(); // writeD(_activeChar.getDefAttrHoly());
elements.defAttrUnholy = p->readD(); // writeD(_activeChar.getDefAttrUnholy());
}
else
{
elements.attackElementType = p->readH(); // writeH(attackAttribute);
elements.attackElementValue = p->readH(); // writeH(_activeChar.getAttackElementValue(attackAttribute));
elements.defAttrFire = p->readH(); // writeH(_activeChar.getDefenseElementValue(Elementals.FIRE));
elements.defAttrWater = p->readH(); // writeH(_activeChar.getDefenseElementValue(Elementals.WATER));
elements.defAttrWind = p->readH(); // writeH(_activeChar.getDefenseElementValue(Elementals.WIND));
elements.defAttrEarth = p->readH(); // writeH(_activeChar.getDefenseElementValue(Elementals.EARTH));
elements.defAttrHoly = p->readH(); // writeH(_activeChar.getDefenseElementValue(Elementals.HOLY));
elements.defAttrUnholy = p->readH(); // writeH(_activeChar.getDefenseElementValue(Elementals.DARK));
}
agathionId = p->readUInt(); // writeD(_activeChar.getAgathionId());
// T2
if( l2_version >= L2_VERSION_T2 )
{
fame = p->readUInt(); // writeD(_activeChar.getFame()); // Fame
p->readUInt(); // writeD(0x00); // Unknown // 0x01 in CT2.3
vitalityLevel = p->readUInt(); // writeD(_activeChar.getVitalityLevel()); // Vitality Level
}
// T2.3
//if( l2_version >= L2_VERSION_T23 )
//{
//writeD(0x00); // CT2.3
//writeD(0x00); // CT2.3
//writeD(0x00); // CT2.3
//writeD(0x00); // CT2.3
//}
// set last time when char coordinates were known exactly
lastMoveTickTime = OS_GetTickCount();
return true;
}