In world with 3.1

This commit is contained in:
tomrus88 2009-02-25 20:52:47 +03:00
parent 5aad1e0169
commit d3872fa572
12 changed files with 156 additions and 152 deletions

View file

@ -85,10 +85,6 @@ bool Corpse::Create( uint32 guidlow, Player *owner)
} }
SetFloatValue( OBJECT_FIELD_SCALE_X, 1 ); SetFloatValue( OBJECT_FIELD_SCALE_X, 1 );
SetFloatValue( CORPSE_FIELD_POS_X, GetPositionX() );
SetFloatValue( CORPSE_FIELD_POS_Y, GetPositionY() );
SetFloatValue( CORPSE_FIELD_POS_Z, GetPositionZ() );
SetFloatValue( CORPSE_FIELD_FACING, GetOrientation() );
SetUInt64Value( CORPSE_FIELD_OWNER, owner->GetGUID() ); SetUInt64Value( CORPSE_FIELD_OWNER, owner->GetGUID() );
m_grid = MaNGOS::ComputeGridPair(GetPositionX(), GetPositionY()); m_grid = MaNGOS::ComputeGridPair(GetPositionX(), GetPositionY());

View file

@ -120,27 +120,6 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
return false; return false;
} }
SetFloatValue(GAMEOBJECT_POS_X, x);
SetFloatValue(GAMEOBJECT_POS_Y, y);
SetFloatValue(GAMEOBJECT_POS_Z, z);
SetFloatValue(GAMEOBJECT_FACING, ang); //this is not facing angle
int64 rotation = 0;
float f_rot1 = sin(ang / 2.0f);
int64 i_rot1 = f_rot1 / atan(pow(2.0f, -20.0f));
rotation |= (i_rot1 << 43 >> 43) & 0x00000000001FFFFF;
//float f_rot2 = sin(0.0f / 2.0f);
//int64 i_rot2 = f_rot2 / atan(pow(2.0f, -20.0f));
//rotation |= (((i_rot2 << 22) >> 32) >> 11) & 0x000003FFFFE00000;
//float f_rot3 = sin(0.0f / 2.0f);
//int64 i_rot3 = f_rot3 / atan(pow(2.0f, -21.0f));
//rotation |= (i_rot3 >> 42) & 0x7FFFFC0000000000;
SetUInt64Value(GAMEOBJECT_ROTATION, rotation);
SetFloatValue(GAMEOBJECT_PARENTROTATION+0, rotation0); SetFloatValue(GAMEOBJECT_PARENTROTATION+0, rotation0);
SetFloatValue(GAMEOBJECT_PARENTROTATION+1, rotation1); SetFloatValue(GAMEOBJECT_PARENTROTATION+1, rotation1);
SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rotation2); SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rotation2);
@ -533,10 +512,10 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
data.id = GetEntry(); data.id = GetEntry();
data.mapid = mapid; data.mapid = mapid;
data.phaseMask = phaseMask; data.phaseMask = phaseMask;
data.posX = GetFloatValue(GAMEOBJECT_POS_X); data.posX = GetPositionX();
data.posY = GetFloatValue(GAMEOBJECT_POS_Y); data.posY = GetPositionY();
data.posZ = GetFloatValue(GAMEOBJECT_POS_Z); data.posZ = GetPositionZ();
data.orientation = GetFloatValue(GAMEOBJECT_FACING); data.orientation = GetOrientation();
data.rotation0 = GetFloatValue(GAMEOBJECT_PARENTROTATION+0); data.rotation0 = GetFloatValue(GAMEOBJECT_PARENTROTATION+0);
data.rotation1 = GetFloatValue(GAMEOBJECT_PARENTROTATION+1); data.rotation1 = GetFloatValue(GAMEOBJECT_PARENTROTATION+1);
data.rotation2 = GetFloatValue(GAMEOBJECT_PARENTROTATION+2); data.rotation2 = GetFloatValue(GAMEOBJECT_PARENTROTATION+2);
@ -554,10 +533,10 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
<< mapid << ", " << mapid << ", "
<< (uint32)spawnMask << ", " << (uint32)spawnMask << ", "
<< (uint32)GetPhaseMask() << "," << (uint32)GetPhaseMask() << ","
<< GetFloatValue(GAMEOBJECT_POS_X) << ", " << GetPositionX() << ", "
<< GetFloatValue(GAMEOBJECT_POS_Y) << ", " << GetPositionY() << ", "
<< GetFloatValue(GAMEOBJECT_POS_Z) << ", " << GetPositionZ() << ", "
<< GetFloatValue(GAMEOBJECT_FACING) << ", " << GetOrientation() << ", "
<< GetFloatValue(GAMEOBJECT_PARENTROTATION) << ", " << GetFloatValue(GAMEOBJECT_PARENTROTATION) << ", "
<< GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ", " << GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ", "
<< GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ", " << GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ", "

View file

@ -1046,7 +1046,6 @@ bool ChatHandler::HandleTurnObjectCommand(const char* args)
obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o); obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o);
obj->SetFloatValue(GAMEOBJECT_FACING, o);
obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rot2); obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rot2);
obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rot3); obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rot3);
@ -1176,9 +1175,6 @@ bool ChatHandler::HandleMoveObjectCommand(const char* args)
map->Remove(obj,false); map->Remove(obj,false);
obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation()); obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation());
obj->SetFloatValue(GAMEOBJECT_POS_X, chr->GetPositionX());
obj->SetFloatValue(GAMEOBJECT_POS_Y, chr->GetPositionY());
obj->SetFloatValue(GAMEOBJECT_POS_Z, chr->GetPositionZ());
map->Add(obj); map->Add(obj);
} }
@ -1202,9 +1198,6 @@ bool ChatHandler::HandleMoveObjectCommand(const char* args)
map->Remove(obj,false); map->Remove(obj,false);
obj->Relocate(x, y, z, obj->GetOrientation()); obj->Relocate(x, y, z, obj->GetOrientation());
obj->SetFloatValue(GAMEOBJECT_POS_X, x);
obj->SetFloatValue(GAMEOBJECT_POS_Y, y);
obj->SetFloatValue(GAMEOBJECT_POS_Z, z);
map->Add(obj); map->Add(obj);
} }

View file

@ -142,7 +142,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
} }
uint8 updatetype = UPDATETYPE_CREATE_OBJECT; uint8 updatetype = UPDATETYPE_CREATE_OBJECT;
uint8 flags = m_updateFlag; uint16 flags = m_updateFlag;
uint32 flags2 = 0; uint32 flags2 = 0;
/** lower flag1 **/ /** lower flag1 **/
@ -256,7 +256,7 @@ void Object::DestroyForPlayer(Player *target) const
target->GetSession()->SendPacket( &data ); target->GetSession()->SendPacket( &data );
} }
void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) const void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags, uint32 flags2) const
{ {
uint16 unk_flags = ((GetTypeId() == TYPEID_PLAYER) ? ((Player*)this)->m_movementInfo.unk1 : 0); uint16 unk_flags = ((GetTypeId() == TYPEID_PLAYER) ? ((Player*)this)->m_movementInfo.unk1 : 0);
@ -264,7 +264,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
if(((Creature*)this)->isVehicle()) if(((Creature*)this)->isVehicle())
unk_flags |= 0x20; // always allow pitch unk_flags |= 0x20; // always allow pitch
*data << (uint8)flags; // update flags *data << (uint16)flags; // update flags
// 0x20 // 0x20
if (flags & UPDATEFLAG_LIVING) if (flags & UPDATEFLAG_LIVING)
@ -300,31 +300,13 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
*data << uint32(flags2); // movement flags *data << uint32(flags2); // movement flags
*data << uint16(unk_flags); // unknown 2.3.0 *data << uint16(unk_flags); // unknown 2.3.0
*data << uint32(getMSTime()); // time (in milliseconds) *data << uint32(getMSTime()); // time (in milliseconds)
}
// 0x40 // position
if (flags & UPDATEFLAG_HAS_POSITION) *data << ((WorldObject *)this)->GetPositionX();
{ *data << ((WorldObject *)this)->GetPositionY();
// 0x02 *data << ((WorldObject *)this)->GetPositionZ();
if(flags & UPDATEFLAG_TRANSPORT && ((GameObject*)this)->GetGoType() == GAMEOBJECT_TYPE_MO_TRANSPORT) *data << ((WorldObject *)this)->GetOrientation();
{
*data << (float)0;
*data << (float)0;
*data << (float)0;
*data << ((WorldObject *)this)->GetOrientation();
}
else
{
*data << ((WorldObject *)this)->GetPositionX();
*data << ((WorldObject *)this)->GetPositionY();
*data << ((WorldObject *)this)->GetPositionZ();
*data << ((WorldObject *)this)->GetOrientation();
}
}
// 0x20
if(flags & UPDATEFLAG_LIVING)
{
// 0x00000200 // 0x00000200
if(flags2 & MOVEMENTFLAG_ONTRANSPORT) if(flags2 & MOVEMENTFLAG_ONTRANSPORT)
{ {
@ -412,23 +394,23 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
FlightPathMovementGenerator *fmg = (FlightPathMovementGenerator*)(((Player*)this)->GetMotionMaster()->top()); FlightPathMovementGenerator *fmg = (FlightPathMovementGenerator*)(((Player*)this)->GetMotionMaster()->top());
uint32 flags3 = 0x00000300; uint16 flags3 = 0x0000;
*data << uint32(flags3); // splines flag? *data << uint16(flags3); // splines flag?
if(flags3 & 0x10000) // probably x,y,z coords there if(flags3 & 0x80) // probably x,y,z coords there
{ {
*data << (float)0; *data << (float)0;
*data << (float)0; *data << (float)0;
*data << (float)0; *data << (float)0;
} }
if(flags3 & 0x20000) // probably guid there if(flags3 & 0x100) // probably guid there
{ {
*data << uint64(0); *data << uint64(0);
} }
if(flags3 & 0x40000) // may be orientation if(flags3 & 0x200) // may be orientation
{ {
*data << (float)0; *data << (float)0;
} }
@ -441,12 +423,20 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
uint32 inflighttime = uint32(path.GetPassedLength(fmg->GetCurrentNode(), x, y, z) * 32); uint32 inflighttime = uint32(path.GetPassedLength(fmg->GetCurrentNode(), x, y, z) * 32);
uint32 traveltime = uint32(path.GetTotalLength() * 32); uint32 traveltime = uint32(path.GetTotalLength() * 32);
*data << uint8(0); // added in 3.1
*data << uint8(0); // added in 3.1
*data << uint32(inflighttime); // passed move time? *data << uint32(inflighttime); // passed move time?
*data << uint32(traveltime); // full move time? *data << uint32(traveltime); // full move time?
*data << uint32(0); // ticks count? *data << uint32(0); // ticks count?
uint32 poscount = uint32(path.Size()); *data << float(0); // added in 3.1
*data << float(0); // added in 3.1
*data << float(0); // added in 3.1
*data << uint32(0); // added in 3.1
uint32 poscount = uint32(path.Size());
*data << uint32(poscount); // points count *data << uint32(poscount); // points count
for(uint32 i = 0; i < poscount; ++i) for(uint32 i = 0; i < poscount; ++i)
@ -460,10 +450,10 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
/*for(uint32 i = 0; i < poscount; i++) /*for(uint32 i = 0; i < poscount; i++)
{ {
// path points // path points
*data << (float)0; *data << (float)0;
*data << (float)0; *data << (float)0;
*data << (float)0; *data << (float)0;
}*/ }*/
*data << path.GetNodes()[poscount-1].x; *data << path.GetNodes()[poscount-1].x;
@ -472,8 +462,45 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
// target position (path end) // target position (path end)
/**data << ((Unit*)this)->GetPositionX(); /**data << ((Unit*)this)->GetPositionX();
*data << ((Unit*)this)->GetPositionY(); *data << ((Unit*)this)->GetPositionY();
*data << ((Unit*)this)->GetPositionZ();*/ *data << ((Unit*)this)->GetPositionZ();*/
}
}
else
{
if(flags & UPDATEFLAG_UNK1)
{
*data << uint8(0); // PGUID
*data << float(0);
*data << float(0);
*data << float(0);
*data << float(0);
*data << float(0);
*data << float(0);
*data << float(0);
*data << float(0);
}
else
{
// 0x40
if (flags & UPDATEFLAG_HAS_POSITION)
{
// 0x02
if(flags & UPDATEFLAG_TRANSPORT && ((GameObject*)this)->GetGoType() == GAMEOBJECT_TYPE_MO_TRANSPORT)
{
*data << (float)0;
*data << (float)0;
*data << (float)0;
*data << ((WorldObject *)this)->GetOrientation();
}
else
{
*data << ((WorldObject *)this)->GetPositionX();
*data << ((WorldObject *)this)->GetPositionY();
*data << ((WorldObject *)this)->GetPositionZ();
*data << ((WorldObject *)this)->GetOrientation();
}
}
} }
} }
@ -554,6 +581,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
*data << uint32(((Vehicle*)this)->GetVehicleId()); // vehicle id *data << uint32(((Vehicle*)this)->GetVehicleId()); // vehicle id
*data << float(0); // facing adjustment *data << float(0); // facing adjustment
} }
// 0x200
if(flags & UPDATEFLAG_UNK2)
{
*data << uint64(0);
}
} }
void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *updateMask, Player *target) const void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *updateMask, Player *target) const

View file

@ -310,13 +310,13 @@ class MANGOS_DLL_SPEC Object
virtual void _SetUpdateBits(UpdateMask *updateMask, Player *target) const; virtual void _SetUpdateBits(UpdateMask *updateMask, Player *target) const;
virtual void _SetCreateBits(UpdateMask *updateMask, Player *target) const; virtual void _SetCreateBits(UpdateMask *updateMask, Player *target) const;
void _BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2 ) const; void _BuildMovementUpdate(ByteBuffer * data, uint16 flags, uint32 flags2 ) const;
void _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask *updateMask, Player *target ) const; void _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask *updateMask, Player *target ) const;
uint16 m_objectType; uint16 m_objectType;
uint8 m_objectTypeId; uint8 m_objectTypeId;
uint8 m_updateFlag; uint16 m_updateFlag;
union union
{ {

View file

@ -1215,12 +1215,34 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x4A2*/ { "CMSG_CHECK_LOGIN_CRITERIA", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A2*/ { "CMSG_CHECK_LOGIN_CRITERIA", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4A3*/ { "SMSG_SERVER_BUCK_DATA_START", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A3*/ { "SMSG_SERVER_BUCK_DATA_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4A4*/ { "CMSG_QUERY_VEHICLE_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A4*/ { "CMSG_QUERY_VEHICLE_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4A5*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A5*/ { "UMSG_UNKNOWN_1189", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4A6*/ { "SMSG_CLIENTCACHE_VERSION", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A6*/ { "SMSG_UNKNOWN_1190", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4A7*/ { "UMSG_UNKNOWN_1191", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A7*/ { "SMSG_UNKNOWN_1191", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4A8*/ { "UMSG_UNKNOWN_1192", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A8*/ { "CMSG_UNKNOWN_1192", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4A9*/ { "UMSG_UNKNOWN_1193", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A9*/ { "CMSG_EJECT_PASSENGER", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4AA*/ { "UMSG_UNKNOWN_1194", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4AA*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4AB*/ { "UMSG_UNKNOWN_1195", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4AB*/ { "SMSG_CLIENTCACHE_VERSION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4AC*/ { "UMSG_UNKNOWN_1196", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4AC*/ { "UMSG_UNKNOWN_1196", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4AD*/ { "UMSG_UNKNOWN_1197", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4AE*/ { "UMSG_UNKNOWN_1198", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4AF*/ { "UMSG_UNKNOWN_1199", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B0*/ { "UMSG_UNKNOWN_1200", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B1*/ { "UMSG_UNKNOWN_1201", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B2*/ { "CMSG_UNKNOWN_1202", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B3*/ { "SMSG_UNKNOWN_1203", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4B4*/ { "CMSG_LFG_SET_ROLES", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B5*/ { "UMSG_UNKNOWN_1205", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B6*/ { "CMSG_UNKNOWN_1206", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B7*/ { "SMSG_UNKNOWN_1207", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4B8*/ { "SMSG_UNKNOWN_1208", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4B9*/ { "CMSG_UNKNOWN_1209", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4BA*/ { "CMSG_UNKNOWN_1210", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4BB*/ { "SMSG_UNKNOWN_1211", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4BC*/ { "SMSG_UNKNOWN_1212", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4BD*/ { "CMSG_UNKNOWN_1213", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4BE*/ { "CMSG_UNKNOWN_1214", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4BF*/ { "UMSG_UNKNOWN_1215", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4C0*/ { "UMSG_UNKNOWN_1216", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4C1*/ { "UMSG_UNKNOWN_1217", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4C2*/ { "UMSG_UNKNOWN_1218", STATUS_NEVER, &WorldSession::Handle_NULL },
}; };

View file

@ -1238,7 +1238,7 @@ enum Opcodes
UMSG_UNKNOWN_1201 = 0x4B1, // not found UMSG_UNKNOWN_1201 = 0x4B1, // not found
CMSG_UNKNOWN_1202 = 0x4B2, // CMSG, uint32 CMSG_UNKNOWN_1202 = 0x4B2, // CMSG, uint32
SMSG_UNKNOWN_1203 = 0x4B3, // SMSG, string+float SMSG_UNKNOWN_1203 = 0x4B3, // SMSG, string+float
CMSG_UNKNOWN_1204 = 0x4B4, // CMSG, empty, lua: SetLFGRoles CMSG_LFG_SET_ROLES = 0x4B4, // CMSG, empty, lua: SetLFGRoles
UMSG_UNKNOWN_1205 = 0x4B5, // not found UMSG_UNKNOWN_1205 = 0x4B5, // not found
CMSG_UNKNOWN_1206 = 0x4B6, // CMSG, uint64, lua: CalendarContextEventSignUp CMSG_UNKNOWN_1206 = 0x4B6, // CMSG, uint64, lua: CalendarContextEventSignUp
SMSG_UNKNOWN_1207 = 0x4B7, // SMSG, calendar related SMSG_UNKNOWN_1207 = 0x4B7, // SMSG, calendar related

View file

@ -1419,7 +1419,7 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
for (uint8 slot = 0; slot < EQUIPMENT_SLOT_END; slot++) for (uint8 slot = 0; slot < EQUIPMENT_SLOT_END; slot++)
{ {
uint32 visualbase = PLAYER_VISIBLE_ITEM_1_0 + (slot * MAX_VISIBLE_ITEM_OFFSET); uint32 visualbase = PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2);
uint32 item_id = GetUInt32Value(visualbase); uint32 item_id = GetUInt32Value(visualbase);
const ItemPrototype * proto = objmgr.GetItemPrototype(item_id); const ItemPrototype * proto = objmgr.GetItemPrototype(item_id);
SpellItemEnchantmentEntry const *enchant = NULL; SpellItemEnchantmentEntry const *enchant = NULL;
@ -3452,23 +3452,12 @@ void Player::InitVisibleBits()
// Players visible items are not inventory stuff // Players visible items are not inventory stuff
for(uint16 i = 0; i < EQUIPMENT_SLOT_END; ++i) for(uint16 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{ {
uint32 offset = i * MAX_VISIBLE_ITEM_OFFSET; uint32 offset = i * 2;
// item creator
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 0 + offset);
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 1 + offset);
// item entry // item entry
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 0 + offset); updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENTRYID + offset);
// enchant
// item enchantments updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PERMANENTENCHANTMENT + offset);
for(uint8 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 1 + j + offset);
// random properties
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PROPERTIES + offset);
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_SEED + offset);
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PAD + offset);
} }
updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE); updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE);
@ -10626,30 +10615,13 @@ void Player::SetVisibleItemSlot(uint8 slot, Item *pItem)
if(pItem) if(pItem)
{ {
SetUInt64Value(PLAYER_VISIBLE_ITEM_1_CREATOR + (slot * MAX_VISIBLE_ITEM_OFFSET), pItem->GetUInt64Value(ITEM_FIELD_CREATOR)); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), pItem->GetEntry());
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PERMANENTENCHANTMENT + (slot * 2), pItem->GetEnchantmentId(EnchantmentSlot(0)));
int VisibleBase = PLAYER_VISIBLE_ITEM_1_0 + (slot * MAX_VISIBLE_ITEM_OFFSET);
SetUInt32Value(VisibleBase + 0, pItem->GetEntry());
for(int i = 0; i < MAX_INSPECTED_ENCHANTMENT_SLOT; ++i)
SetUInt32Value(VisibleBase + 1 + i, pItem->GetEnchantmentId(EnchantmentSlot(i)));
// Use SetInt16Value to prevent set high part to FFFF for negative value
SetInt16Value( PLAYER_VISIBLE_ITEM_1_PROPERTIES + (slot * MAX_VISIBLE_ITEM_OFFSET), 0, pItem->GetItemRandomPropertyId());
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 1 + (slot * MAX_VISIBLE_ITEM_OFFSET), pItem->GetItemSuffixFactor());
} }
else else
{ {
SetUInt64Value(PLAYER_VISIBLE_ITEM_1_CREATOR + (slot * MAX_VISIBLE_ITEM_OFFSET), 0); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), 0);
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PERMANENTENCHANTMENT + (slot * 2), 0);
int VisibleBase = PLAYER_VISIBLE_ITEM_1_0 + (slot * MAX_VISIBLE_ITEM_OFFSET);
SetUInt32Value(VisibleBase + 0, 0);
for(int i = 0; i < MAX_INSPECTED_ENCHANTMENT_SLOT; ++i)
SetUInt32Value(VisibleBase + 1 + i, 0);
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 0 + (slot * MAX_VISIBLE_ITEM_OFFSET), 0);
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 1 + (slot * MAX_VISIBLE_ITEM_OFFSET), 0);
} }
} }
@ -12133,10 +12105,9 @@ void Player::ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool a
} /*for*/ } /*for*/
// visualize enchantment at player and equipped items // visualize enchantment at player and equipped items
if(slot < MAX_INSPECTED_ENCHANTMENT_SLOT) if(slot == PERM_ENCHANTMENT_SLOT)
{ {
int VisibleBase = PLAYER_VISIBLE_ITEM_1_0 + (item->GetSlot() * MAX_VISIBLE_ITEM_OFFSET); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PERMANENTENCHANTMENT + (item->GetSlot() * 2), apply ? item->GetEnchantmentId(slot) : 0);
SetUInt32Value(VisibleBase + 1 + slot, apply? item->GetEnchantmentId(slot) : 0);
} }
if(apply_dur) if(apply_dur)

View file

@ -33,15 +33,17 @@ enum OBJECT_UPDATE_TYPE
enum OBJECT_UPDATE_FLAGS enum OBJECT_UPDATE_FLAGS
{ {
UPDATEFLAG_NONE = 0x00, UPDATEFLAG_NONE = 0x0000,
UPDATEFLAG_SELF = 0x01, UPDATEFLAG_SELF = 0x0001,
UPDATEFLAG_TRANSPORT = 0x02, UPDATEFLAG_TRANSPORT = 0x0002,
UPDATEFLAG_HAS_TARGET = 0x04, UPDATEFLAG_HAS_TARGET = 0x0004,
UPDATEFLAG_LOWGUID = 0x08, UPDATEFLAG_LOWGUID = 0x0008,
UPDATEFLAG_HIGHGUID = 0x10, UPDATEFLAG_HIGHGUID = 0x0010,
UPDATEFLAG_LIVING = 0x20, UPDATEFLAG_LIVING = 0x0020,
UPDATEFLAG_HAS_POSITION = 0x40, UPDATEFLAG_HAS_POSITION = 0x0040,
UPDATEFLAG_VEHICLE = 0x80 UPDATEFLAG_VEHICLE = 0x0080,
UPDATEFLAG_UNK1 = 0x0100,
UPDATEFLAG_UNK2 = 0x0200
}; };
class UpdateData class UpdateData

View file

@ -503,13 +503,13 @@ void LoadDBCStores(const std::string& dataPath)
} }
// Check loaded DBC files proper version // Check loaded DBC files proper version
if( !sSpellStore.LookupEntry(62735) || // last added spell in 3.0.9 if( !sSpellStore.LookupEntry(100034) || // last added spell in 3.1.0
!sMapStore.LookupEntry(624) || // last map added in 3.0.8a/3.0.9 !sMapStore.LookupEntry(624) || // last map added in 3.1.0
!sGemPropertiesStore.LookupEntry(1557) || // last gem property added in 3.0.8a/3.0.9 !sGemPropertiesStore.LookupEntry(1557) || // last gem property added in 3.1.0
!sItemExtendedCostStore.LookupEntry(2589) || // last item extended cost added in 3.0.8a/3.0.9 !sItemExtendedCostStore.LookupEntry(2595) || // last item extended cost added in 3.1.0
!sCharTitlesStore.LookupEntry(144) || // last char title added in 3.0.8a/3.0.9 !sCharTitlesStore.LookupEntry(154) || // last char title added in 3.1.0
!sAreaStore.LookupEntry(2769) || // last area (areaflag) added in 3.0.8a/3.0.9 !sAreaStore.LookupEntry(2833) || // last area (areaflag) added in 3.1.0
!sItemStore.LookupEntry(45037) ) // last client known item added in 3.0.9 !sItemStore.LookupEntry(45704) ) // last client known item added in 3.1.0
{ {
sLog.outError("\nYou have _outdated_ DBC files. Please extract correct versions from current using client."); sLog.outError("\nYou have _outdated_ DBC files. Please extract correct versions from current using client.");
exit(1); exit(1);

View file

@ -555,6 +555,7 @@ struct BattlemasterListEntry
char* name[16]; // 16-31 char* name[16]; // 16-31
// 32 string flag, unused // 32 string flag, unused
// 33 unused // 33 unused
//uint32 unk; // 34 new 3.1
}; };
#define MAX_OUTFIT_ITEMS 24 #define MAX_OUTFIT_ITEMS 24
@ -1086,6 +1087,7 @@ struct SoundEntriesEntry
// 26 m_minDistance // 26 m_minDistance
// 27 m_distanceCutoff // 27 m_distanceCutoff
// 28 m_EAXDef // 28 m_EAXDef
// 29 new in 3.1
}; };
struct SpellEntry struct SpellEntry
@ -1197,6 +1199,7 @@ struct SpellEntry
uint32 SchoolMask; // 228 m_schoolMask uint32 SchoolMask; // 228 m_schoolMask
uint32 runeCostID; // 229 m_runeCostID uint32 runeCostID; // 229 m_runeCostID
//uint32 spellMissileID; // 230 m_spellMissileID not used //uint32 spellMissileID; // 230 m_spellMissileID not used
//uint32 PowerDisplayId; // 231 PowerDisplay.dbc, new in 3.1
private: private:
// prevent creating custom entries (copy data from original in fact) // prevent creating custom entries (copy data from original in fact)
@ -1300,6 +1303,7 @@ struct SpellItemEnchantmentEntry
uint32 EnchantmentCondition; // 34 m_condition_id uint32 EnchantmentCondition; // 34 m_condition_id
//uint32 requiredSkill; // 35 m_requiredSkillID //uint32 requiredSkill; // 35 m_requiredSkillID
//uint32 requiredSkillValue; // 36 m_requiredSkillRank //uint32 requiredSkillValue; // 36 m_requiredSkillRank
// 37 new in 3.1
}; };
struct SpellItemEnchantmentConditionEntry struct SpellItemEnchantmentConditionEntry
@ -1417,8 +1421,8 @@ struct VehicleEntry
float m_cameraFadeDistScalarMin; // 15 float m_cameraFadeDistScalarMin; // 15
float m_cameraFadeDistScalarMax; // 16 float m_cameraFadeDistScalarMax; // 16
float m_cameraPitchOffset; // 17 float m_cameraPitchOffset; // 17
int m_powerType[3]; // 18-20 //int m_powerType[3]; // 18-20 removed in 3.1
int m_powerToken[3]; // 21-23 //int m_powerToken[3]; // 21-23 removed in 3.1
float m_facingLimitRight; // 24 float m_facingLimitRight; // 24
float m_facingLimitLeft; // 25 float m_facingLimitLeft; // 25
float m_msslTrgtTurnLingering; // 26 float m_msslTrgtTurnLingering; // 26
@ -1436,6 +1440,9 @@ struct VehicleEntry
uint32 m_uiLocomotionType; // 40 uint32 m_uiLocomotionType; // 40
float m_msslTrgtImpactTexRadius; // 41 float m_msslTrgtImpactTexRadius; // 41
uint32 m_uiSeatIndicatorType; // 42 uint32 m_uiSeatIndicatorType; // 42
// 37, new in 3.1
// 38, new in 3.1
// 39, new in 3.1
}; };
struct VehicleSeatEntry struct VehicleSeatEntry
@ -1486,6 +1493,7 @@ struct VehicleSeatEntry
uint32 m_exitUISoundID; // 43 uint32 m_exitUISoundID; // 43
int32 m_uiSkin; // 44 int32 m_uiSkin; // 44
uint32 m_flagsB; // 45 uint32 m_flagsB; // 45
// 46-57 added in 3.1, floats mostly
}; };
struct WorldMapAreaEntry struct WorldMapAreaEntry

View file

@ -24,7 +24,7 @@ const char AreaTriggerEntryfmt[]="niffffffff";
const char AuctionHouseEntryfmt[]="niiixxxxxxxxxxxxxxxxx"; const char AuctionHouseEntryfmt[]="niiixxxxxxxxxxxxxxxxx";
const char BankBagSlotPricesEntryfmt[]="ni"; const char BankBagSlotPricesEntryfmt[]="ni";
const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii"; const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii";
const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxx"; const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxxx";
const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi";
const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx"; const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx";
@ -70,12 +70,12 @@ const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiii";
const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiii"; const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiii";
const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxx"; const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxx";
const char SkillLineAbilityfmt[]="niiiixxiiiiixx"; const char SkillLineAbilityfmt[]="niiiixxiiiiixx";
const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char SpellCastTimefmt[]="nixx"; const char SpellCastTimefmt[]="nixx";
const char SpellDurationfmt[]="niii"; const char SpellDurationfmt[]="niii";
const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiix"; const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiixx";
const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx"; const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx";
const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixx"; const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixxx";
const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX"; const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX";
const char SpellRadiusfmt[]="nfxf"; const char SpellRadiusfmt[]="nfxf";
const char SpellRangefmt[]="nfxfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SpellRangefmt[]="nfxfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
@ -89,8 +89,8 @@ const char TaxiNodesEntryfmt[]="nifffxxxxxxxxxxxxxxxxxii";
const char TaxiPathEntryfmt[]="niii"; const char TaxiPathEntryfmt[]="niii";
const char TaxiPathNodeEntryfmt[]="diiifffiixx"; const char TaxiPathNodeEntryfmt[]="diiifffiixx";
const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii"; const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii";
const char VehicleEntryfmt[]="niffffiiiiiiiiffffiiiiiifffffffffffssssfifi"; const char VehicleEntryfmt[]="niffffiiiiiiiifffffffffffffffssssfifixxx";
const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiii"; const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiixxxxxxxxxxxx";
const char WorldMapAreaEntryfmt[]="xinxffffix"; const char WorldMapAreaEntryfmt[]="xinxffffix";
const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxxxxxxxxxx"; const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxxxxxxxxxx";
const char WorldMapOverlayEntryfmt[]="nxixxxxxxxxxxxxxx"; const char WorldMapOverlayEntryfmt[]="nxixxxxxxxxxxxxxx";