Merged and updated to latest PTR build 9704

This commit is contained in:
tomrus88 2009-03-19 14:18:17 +03:00
commit a2d3941588
22 changed files with 376 additions and 454 deletions

View file

@ -16,7 +16,23 @@
#include "loadlib/adt.h" #include "loadlib/adt.h"
#include "loadlib/wdt.h" #include "loadlib/wdt.h"
#include <fcntl.h>
#if defined( __GNUC__ )
#define _open open
#define _close close
#ifndef O_BINARY
#define O_BINARY 0
#endif
#else
#include <io.h>
#endif
#ifdef O_LARGEFILE
#define OPEN_FLAGS (O_RDONLY | O_BINARY | O_LARGEFILE)
#else
#define OPEN_FLAGS (O_RDONLY | O_BINARY)
#endif
extern ArchiveSet gOpenArchives; extern ArchiveSet gOpenArchives;
typedef struct typedef struct
@ -81,9 +97,10 @@ void CreateDir( const std::string& Path )
bool FileExists( const char* FileName ) bool FileExists( const char* FileName )
{ {
if(FILE* fp = fopen( FileName, "rb" )) int fp = _open(FileName, OPEN_FLAGS);
if(fp != -1)
{ {
fclose(fp); _close(fp);
return true; return true;
} }

View file

@ -55,6 +55,7 @@ GameObject::GameObject() : WorldObject()
m_goInfo = NULL; m_goInfo = NULL;
m_DBTableGuid = 0; m_DBTableGuid = 0;
m_rotation = 0;
} }
GameObject::~GameObject() GameObject::~GameObject()
@ -120,8 +121,8 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
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+3, rotation3); UpdateRotationFields(rotation2,rotation3); // GAMEOBJECT_FACING, GAMEOBJECT_ROTATION, GAMEOBJECT_PARENTROTATION+2/3
SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size); SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size);
@ -1296,3 +1297,31 @@ const char* GameObject::GetNameForLocaleIdx(int32 loc_idx) const
return GetName(); return GetName();
} }
void GameObject::UpdateRotationFields(float rotation2 /*=0.0f*/, float rotation3 /*=0.0f*/)
{
int64 rotation = 0;
double f_rot1 = sin(GetOrientation() / 2.0f);
int64 i_rot1 = int64(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;
m_rotation = rotation;
if(rotation2==0.0f && rotation3==0.0f)
{
rotation2 = sin(GetOrientation()/2);
rotation3 = cos(GetOrientation()/2);
}
SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rotation2);
SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rotation3);
}

View file

@ -441,6 +441,8 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
uint32 GetDBTableGUIDLow() const { return m_DBTableGuid; } uint32 GetDBTableGUIDLow() const { return m_DBTableGuid; }
void UpdateRotationFields(float rotation2 = 0.0f, float rotation3 = 0.0f);
void Say(int32 textId, uint32 language, uint64 TargetGuid) { MonsterSay(textId,language,TargetGuid); } void Say(int32 textId, uint32 language, uint64 TargetGuid) { MonsterSay(textId,language,TargetGuid); }
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); } void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); } void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
@ -577,6 +579,7 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
GridReference<GameObject> &GetGridRef() { return m_gridRef; } GridReference<GameObject> &GetGridRef() { return m_gridRef; }
bool isActiveObject() const { return false; } bool isActiveObject() const { return false; }
uint64 GetRotation() const { return m_rotation; }
protected: protected:
uint32 m_charges; // Spell charges for GAMEOBJECT_TYPE_SPELLCASTER (22) uint32 m_charges; // Spell charges for GAMEOBJECT_TYPE_SPELLCASTER (22)
uint32 m_spellId; uint32 m_spellId;
@ -593,6 +596,7 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
uint32 m_DBTableGuid; ///< For new or temporary gameobjects is 0 for saved it is lowguid uint32 m_DBTableGuid; ///< For new or temporary gameobjects is 0 for saved it is lowguid
GameObjectInfo const* m_goInfo; GameObjectInfo const* m_goInfo;
uint64 m_rotation;
private: private:
void SwitchDoorOrButton(bool activate); void SwitchDoorOrButton(bool activate);

View file

@ -156,7 +156,7 @@ void InstanceSave::SaveToDB()
// save instance data too // save instance data too
std::string data; std::string data;
Map *map = MapManager::Instance().FindMap(m_instanceid, GetMapId()); Map *map = MapManager::Instance().FindMap(GetMapId(),m_instanceid);
if(map) if(map)
{ {
assert(map->IsDungeon()); assert(map->IsDungeon());

View file

@ -511,7 +511,7 @@ bool ChatHandler::HandleGonameCommand(const char* args)
// remember current position as entry point for return at bg end teleportation // remember current position as entry point for return at bg end teleportation
_player->SetBattleGroundEntryPoint(_player->GetMapId(),_player->GetPositionX(),_player->GetPositionY(),_player->GetPositionZ(),_player->GetOrientation()); _player->SetBattleGroundEntryPoint(_player->GetMapId(),_player->GetPositionX(),_player->GetPositionY(),_player->GetPositionZ(),_player->GetOrientation());
} }
else if(cMap->IsDungeon() && cMap->Instanceable()) else if(cMap->IsDungeon())
{ {
// we have to go to instance, and can go to player only if: // we have to go to instance, and can go to player only if:
// 1) we are in his group (either as leader or as member) // 1) we are in his group (either as leader or as member)

View file

@ -1787,16 +1787,11 @@ bool ChatHandler::HandleTurnObjectCommand(const char* args)
o = chr->GetOrientation(); o = chr->GetOrientation();
} }
float rot2 = sin(o/2);
float rot3 = cos(o/2);
Map* map = obj->GetMap(); Map* map = obj->GetMap();
map->Remove(obj,false); map->Remove(obj,false);
obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o); obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o);
obj->UpdateRotationFields();
obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rot2);
obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rot3);
map->Add(obj); map->Add(obj);
@ -3653,13 +3648,10 @@ bool ChatHandler::HandleGameObjectCommand(const char* args)
float o = float(chr->GetOrientation()); float o = float(chr->GetOrientation());
Map *map = chr->GetMap(); Map *map = chr->GetMap();
float rot2 = sin(o/2);
float rot3 = cos(o/2);
GameObject* pGameObj = new GameObject; GameObject* pGameObj = new GameObject;
uint32 db_lowGUID = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT); uint32 db_lowGUID = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT);
if(!pGameObj->Create(db_lowGUID, goI->id, map, chr->GetPhaseMaskForSpawn(), x, y, z, o, 0, 0, rot2, rot3, 0, 1)) if(!pGameObj->Create(db_lowGUID, goI->id, map, chr->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, 1))
{ {
delete pGameObj; delete pGameObj;
return false; return false;

View file

@ -2137,6 +2137,9 @@ bool InstanceMap::Add(Player *player)
if(!CanEnter(player)) if(!CanEnter(player))
return false; return false;
// Dungeon only code
if(IsDungeon())
{
// get or create an instance save for the map // get or create an instance save for the map
InstanceSave *mapSave = sInstanceSaveManager.GetInstanceSave(GetInstanceId()); InstanceSave *mapSave = sInstanceSaveManager.GetInstanceSave(GetInstanceId());
if(!mapSave) if(!mapSave)
@ -2209,6 +2212,7 @@ bool InstanceMap::Add(Player *player)
assert(playerBind->save == mapSave); assert(playerBind->save == mapSave);
} }
} }
}
if(i_data) i_data->OnPlayerEnter(player); if(i_data) i_data->OnPlayerEnter(player);
// for normal instances cancel the reset schedule when the // for normal instances cancel the reset schedule when the
@ -2327,6 +2331,9 @@ bool InstanceMap::Reset(uint8 method)
void InstanceMap::PermBindAllPlayers(Player *player) void InstanceMap::PermBindAllPlayers(Player *player)
{ {
if(!IsDungeon())
return;
InstanceSave *save = sInstanceSaveManager.GetInstanceSave(GetInstanceId()); InstanceSave *save = sInstanceSaveManager.GetInstanceSave(GetInstanceId());
if(!save) if(!save)
{ {
@ -2356,12 +2363,6 @@ void InstanceMap::PermBindAllPlayers(Player *player)
} }
} }
time_t InstanceMap::GetResetTime()
{
InstanceSave *save = sInstanceSaveManager.GetInstanceSave(GetInstanceId());
return save ? save->GetDifficulty() : DIFFICULTY_NORMAL;
}
void InstanceMap::UnloadAll(bool pForce) void InstanceMap::UnloadAll(bool pForce)
{ {
if(HavePlayers()) if(HavePlayers())
@ -2391,7 +2392,7 @@ void InstanceMap::SetResetSchedule(bool on)
// only for normal instances // only for normal instances
// the reset time is only scheduled when there are no payers inside // the reset time is only scheduled when there are no payers inside
// it is assumed that the reset time will rarely (if ever) change while the reset is scheduled // it is assumed that the reset time will rarely (if ever) change while the reset is scheduled
if(!HavePlayers() && !IsRaid() && !IsHeroic()) if(IsDungeon() && !HavePlayers() && !IsRaid() && !IsHeroic())
{ {
InstanceSave *save = sInstanceSaveManager.GetInstanceSave(GetInstanceId()); InstanceSave *save = sInstanceSaveManager.GetInstanceSave(GetInstanceId());
if(!save) sLog.outError("InstanceMap::SetResetSchedule: cannot turn schedule %s, no save available for instance %d of %d", on ? "on" : "off", GetInstanceId(), GetId()); if(!save) sLog.outError("InstanceMap::SetResetSchedule: cannot turn schedule %s, no save available for instance %d of %d", on ? "on" : "off", GetInstanceId(), GetId());

View file

@ -530,7 +530,6 @@ class MANGOS_DLL_SPEC InstanceMap : public Map
uint32 GetScriptId() { return i_script_id; } uint32 GetScriptId() { return i_script_id; }
InstanceData* GetInstanceData() { return i_data; } InstanceData* GetInstanceData() { return i_data; }
void PermBindAllPlayers(Player *player); void PermBindAllPlayers(Player *player);
time_t GetResetTime();
void UnloadAll(bool pForce); void UnloadAll(bool pForce);
bool CanEnter(Player* player); bool CanEnter(Player* player);
void SendResetWarnings(uint32 timeLeft) const; void SendResetWarnings(uint32 timeLeft) const;

View file

@ -902,7 +902,7 @@ void WorldSession::HandleUpdateAccountData(WorldPacket &recv_data)
if(decompressedSize == 0) // erase if(decompressedSize == 0) // erase
{ {
SetAccountData(type, timestamp, ""); SetAccountData(type, 0, "");
WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4); WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4);
data << uint32(type); data << uint32(type);

View file

@ -585,22 +585,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags, uint32 flags2
// 0x200 // 0x200
if(flags & UPDATEFLAG_UNK2) if(flags & UPDATEFLAG_UNK2)
{ {
// may be precalculate it? *data << uint64(((GameObject*)this)->GetRotation());
int64 rotation = 0;
float ang = ((WorldObject *)this)->GetOrientation();
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;
*data << uint64(rotation);
} }
} }

View file

@ -1076,6 +1076,24 @@ void ObjectMgr::LoadGameobjects()
int16 gameEvent = fields[16].GetInt16(); int16 gameEvent = fields[16].GetInt16();
int16 PoolId = fields[17].GetInt16(); int16 PoolId = fields[17].GetInt16();
if(data.rotation2 < -1.0f || data.rotation2 > 1.0f)
{
sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with invalid rotation2 (%f) value, skip",guid,data.id,data.rotation2 );
continue;
}
if(data.rotation3 < -1.0f || data.rotation3 > 1.0f)
{
sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with invalid rotation3 (%f) value, skip",guid,data.id,data.rotation3 );
continue;
}
if(!MapManager::IsValidMapCoord(data.mapid,data.posX,data.posY,data.posZ,data.orientation))
{
sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with invalid coordinates, skip",guid,data.id );
continue;
}
if(data.phaseMask==0) if(data.phaseMask==0)
{ {
sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with `phaseMask`=0 (not visible for anyone), set to 1.",guid,data.id ); sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with `phaseMask`=0 (not visible for anyone), set to 1.",guid,data.id );
@ -2710,7 +2728,14 @@ void ObjectMgr::LoadGroups()
} }
} }
InstanceSave *save = sInstanceSaveManager.AddInstanceSave(fields[1].GetUInt32(), fields[2].GetUInt32(), fields[4].GetUInt8(), (time_t)fields[5].GetUInt64(), (fields[6].GetUInt32() == 0), true); MapEntry const* mapEntry = sMapStore.LookupEntry(fields[1].GetUInt32());
if(!mapEntry || !mapEntry->IsDungeon())
{
sLog.outErrorDb("Incorrect entry in group_instance table : no dungeon map %d", fields[1].GetUInt32());
continue;
}
InstanceSave *save = sInstanceSaveManager.AddInstanceSave(mapEntry->MapID, fields[2].GetUInt32(), fields[4].GetUInt8(), (time_t)fields[5].GetUInt64(), (fields[6].GetUInt32() == 0), true);
group->BindToInstance(save, fields[3].GetBool(), true); group->BindToInstance(save, fields[3].GetBool(), true);
}while( result->NextRow() ); }while( result->NextRow() );
delete result; delete result;

View file

@ -1251,4 +1251,6 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x4C6*/ { "UMSG_UNKNOWN_1222", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4C6*/ { "UMSG_UNKNOWN_1222", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4C7*/ { "SMSG_UNKNOWN_1223", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4C7*/ { "SMSG_UNKNOWN_1223", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4C8*/ { "SMSG_UNKNOWN_1224", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4C8*/ { "SMSG_UNKNOWN_1224", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4C9*/ { "UMSG_UNKNOWN_1225", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4CA*/ { "UMSG_UNKNOWN_1226", STATUS_NEVER, &WorldSession::Handle_NULL },
}; };

View file

@ -1257,9 +1257,11 @@ enum Opcodes
UMSG_UNKNOWN_1220 = 0x4C4, // not found UMSG_UNKNOWN_1220 = 0x4C4, // not found
UMSG_UNKNOWN_1221 = 0x4C5, // not found UMSG_UNKNOWN_1221 = 0x4C5, // not found
UMSG_UNKNOWN_1222 = 0x4C6, // not found UMSG_UNKNOWN_1222 = 0x4C6, // not found
SMSG_UNKNOWN_1223 = 0x4C7, // arena pet? SMSG_UNKNOWN_1223 = 0x4C7, // uint64, arena pet?
SMSG_UNKNOWN_1224 = 0x4C8, // uint32 "Can't change arena team..." SMSG_UNKNOWN_1224 = 0x4C8, // uint32 "Can't change arena team..."
NUM_MSG_TYPES = 0x4C9 UMSG_UNKNOWN_1225 = 0x4C9, // not found
UMSG_UNKNOWN_1226 = 0x4CA, // not found
NUM_MSG_TYPES = 0x4CB
}; };
/// Player state /// Player state

View file

@ -3529,7 +3529,7 @@ void Player::InitVisibleBits()
// item entry // item entry
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENTRYID + offset); updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENTRYID + offset);
// enchant // enchant
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PERMANENTENCHANTMENT + offset); updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + offset);
} }
updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE); updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE);
@ -3554,7 +3554,7 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target )
m_items[i]->BuildCreateUpdateBlockForPlayer( data, target ); m_items[i]->BuildCreateUpdateBlockForPlayer( data, target );
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
{ {
if(m_items[i] == NULL) if(m_items[i] == NULL)
continue; continue;
@ -3587,7 +3587,7 @@ void Player::DestroyForPlayer( Player *target ) const
m_items[i]->DestroyForPlayer( target ); m_items[i]->DestroyForPlayer( target );
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
{ {
if(m_items[i] == NULL) if(m_items[i] == NULL)
continue; continue;
@ -8315,10 +8315,10 @@ uint8 Player::FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap
slots[0] = EQUIPMENT_SLOT_RANGED; slots[0] = EQUIPMENT_SLOT_RANGED;
break; break;
case INVTYPE_BAG: case INVTYPE_BAG:
slots[0] = INVENTORY_SLOT_BAG_1; slots[0] = INVENTORY_SLOT_BAG_START + 0;
slots[1] = INVENTORY_SLOT_BAG_2; slots[1] = INVENTORY_SLOT_BAG_START + 1;
slots[2] = INVENTORY_SLOT_BAG_3; slots[2] = INVENTORY_SLOT_BAG_START + 2;
slots[3] = INVENTORY_SLOT_BAG_4; slots[3] = INVENTORY_SLOT_BAG_START + 3;
break; break;
case INVTYPE_RELIC: case INVTYPE_RELIC:
{ {
@ -8420,7 +8420,7 @@ uint8 Player::CanUnequipItems( uint32 item, uint32 count ) const
return EQUIP_ERR_OK; return EQUIP_ERR_OK;
} }
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
{ {
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item ) if( pItem && pItem->GetEntry() == item )
@ -8462,7 +8462,7 @@ uint32 Player::GetItemCount( uint32 item, bool inBankAlso, Item* skipItem ) cons
if( pItem && pItem != skipItem && pItem->GetEntry() == item ) if( pItem && pItem != skipItem && pItem->GetEntry() == item )
count += pItem->GetCount(); count += pItem->GetCount();
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
{ {
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem != skipItem && pItem->GetEntry() == item ) if( pItem && pItem != skipItem && pItem->GetEntry() == item )
@ -8522,7 +8522,7 @@ Item* Player::GetItemByGuid( uint64 guid ) const
if( pItem && pItem->GetGUID() == guid ) if( pItem && pItem->GetGUID() == guid )
return pItem; return pItem;
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
{ {
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetGUID() == guid ) if( pItem && pItem->GetGUID() == guid )
@ -8568,7 +8568,7 @@ Item* Player::GetItemByPos( uint16 pos ) const
Item* Player::GetItemByPos( uint8 bag, uint8 slot ) const Item* Player::GetItemByPos( uint8 bag, uint8 slot ) const
{ {
if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || slot >= KEYRING_SLOT_START && slot < QUESTBAG_SLOT_END ) ) if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END ) )
return m_items[slot]; return m_items[slot];
else if(bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END else if(bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END
|| bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END ) || bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END )
@ -8646,7 +8646,7 @@ bool Player::IsInventoryPos( uint8 bag, uint8 slot )
return true; return true;
if( bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END ) if( bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END )
return true; return true;
if( bag == INVENTORY_SLOT_BAG_0 && ( slot >= KEYRING_SLOT_START && slot < QUESTBAG_SLOT_END ) ) if( bag == INVENTORY_SLOT_BAG_0 && ( slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END ) )
return true; return true;
return false; return false;
} }
@ -8767,7 +8767,7 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const
return true; return true;
} }
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
{ {
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item ) if( pItem && pItem->GetEntry() == item )
@ -8934,7 +8934,7 @@ bool Player::HasItemTotemCategory( uint32 TotemCategory ) const
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory )) if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
return true; return true;
} }
for(uint8 i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(uint8 i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
{ {
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory )) if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
@ -8974,18 +8974,10 @@ uint8 Player::_CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountV
if(slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START+GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS)) if(slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START+GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
// vanitypet case (not use, vanity pets stored as spells)
if(slot >= VANITYPET_SLOT_START && slot < VANITYPET_SLOT_END)
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
// currencytoken case (disabled until proper implement) // currencytoken case (disabled until proper implement)
if(slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(false /*pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS*/)) if(slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(false /*pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS*/))
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
// guestbag case (disabled until proper implement)
if(slot >= QUESTBAG_SLOT_START && slot < QUESTBAG_SLOT_END && !(false /*pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS*/))
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
// prevent cheating // prevent cheating
if(slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END || slot >= PLAYER_SLOT_END) if(slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END || slot >= PLAYER_SLOT_END)
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
@ -9231,7 +9223,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
{ {
if( bag == INVENTORY_SLOT_BAG_0 ) // inventory if( bag == INVENTORY_SLOT_BAG_0 ) // inventory
{ {
res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot); res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,CURRENCYTOKEN_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK) if(res!=EQUIP_ERR_OK)
{ {
if(no_space_count) if(no_space_count)
@ -9319,8 +9311,6 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
} }
} }
// Vanity pet case skipped as not used
/* until proper implementation /* until proper implementation
else if(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS) else if(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)
{ {
@ -9343,28 +9333,6 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
} }
} }
*/ */
/* until proper implementation
else if(pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS)
{
res = _CanStoreItem_InInventorySlots(QUESTBAG_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
{
if(no_space_count)
*no_space_count = count + no_similar_count;
return res;
}
if(count==0)
{
if(no_similar_count==0)
return EQUIP_ERR_OK;
if(no_space_count)
*no_space_count = count + no_similar_count;
return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
}
}
*/
res = _CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START,INVENTORY_SLOT_ITEM_END,dest,pProto,count,false,pItem,bag,slot); res = _CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START,INVENTORY_SLOT_ITEM_END,dest,pProto,count,false,pItem,bag,slot);
if(res!=EQUIP_ERR_OK) if(res!=EQUIP_ERR_OK)
@ -9414,7 +9382,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
// search stack for merge to // search stack for merge to
if( pProto->Stackable != 1 ) if( pProto->Stackable != 1 )
{ {
res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot); res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,CURRENCYTOKEN_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK) if(res!=EQUIP_ERR_OK)
{ {
if(no_space_count) if(no_space_count)
@ -9513,8 +9481,6 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
} }
} }
// Vanity pet case skipped as not used
/* until proper implementation /* until proper implementation
else if(false pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS) else if(false pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)
{ {
@ -9537,28 +9503,6 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
} }
} }
*/ */
/* until proper implementation
else if(false pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS)
{
res = _CanStoreItem_InInventorySlots(QUESTBAG_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
{
if(no_space_count)
*no_space_count = count + no_similar_count;
return res;
}
if(count==0)
{
if(no_similar_count==0)
return EQUIP_ERR_OK;
if(no_space_count)
*no_space_count = count + no_similar_count;
return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
}
}
*/
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++) for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
{ {
@ -9630,13 +9574,11 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
int inv_bags[INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START][MAX_BAG_SIZE]; int inv_bags[INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START][MAX_BAG_SIZE];
int inv_keys[KEYRING_SLOT_END-KEYRING_SLOT_START]; int inv_keys[KEYRING_SLOT_END-KEYRING_SLOT_START];
int inv_tokens[CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START]; int inv_tokens[CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START];
int inv_quests[QUESTBAG_SLOT_END-QUESTBAG_SLOT_START];
memset(inv_slot_items,0,sizeof(int)*(INVENTORY_SLOT_ITEM_END-INVENTORY_SLOT_ITEM_START)); memset(inv_slot_items,0,sizeof(int)*(INVENTORY_SLOT_ITEM_END-INVENTORY_SLOT_ITEM_START));
memset(inv_bags,0,sizeof(int)*(INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START)*MAX_BAG_SIZE); memset(inv_bags,0,sizeof(int)*(INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START)*MAX_BAG_SIZE);
memset(inv_keys,0,sizeof(int)*(KEYRING_SLOT_END-KEYRING_SLOT_START)); memset(inv_keys,0,sizeof(int)*(KEYRING_SLOT_END-KEYRING_SLOT_START));
memset(inv_tokens,0,sizeof(int)*(CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START)); memset(inv_tokens,0,sizeof(int)*(CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START));
memset(inv_quests,0,sizeof(int)*(QUESTBAG_SLOT_END-QUESTBAG_SLOT_START));
for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++) for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++)
{ {
@ -9658,8 +9600,6 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
} }
} }
// Vanity pet case skipped as not used
for(int i = CURRENCYTOKEN_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++) for(int i = CURRENCYTOKEN_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
{ {
pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
@ -9670,16 +9610,6 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
} }
} }
for(int i = QUESTBAG_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if (pItem2 && !pItem2->IsInTrade())
{
inv_quests[i-QUESTBAG_SLOT_START] = pItem2->GetCount();
}
}
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++) for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
{ {
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i )) if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
@ -9739,8 +9669,6 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
} }
if (b_found) continue; if (b_found) continue;
// Vanity pet case skipped as not used
for(int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; t++) for(int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; t++)
{ {
pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t ); pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
@ -9753,18 +9681,6 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
} }
if (b_found) continue; if (b_found) continue;
for(int t = QUESTBAG_SLOT_START; t < QUESTBAG_SLOT_END; t++)
{
pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_quests[t-QUESTBAG_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
{
inv_quests[t-QUESTBAG_SLOT_START] += pItem->GetCount();
b_found = true;
break;
}
}
if (b_found) continue;
for(int t = INVENTORY_SLOT_ITEM_START; t < INVENTORY_SLOT_ITEM_END; t++) for(int t = INVENTORY_SLOT_ITEM_START; t < INVENTORY_SLOT_ITEM_END; t++)
{ {
pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t ); pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
@ -9817,8 +9733,6 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
if (b_found) continue; if (b_found) continue;
// Vanity pet case skipped as not used
/* until proper implementation /* until proper implementation
if(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS) if(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)
{ {
@ -9833,22 +9747,6 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
} }
} }
if (b_found) continue;
*/
/* until proper implementation
if(pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS)
{
for(uint32 t = QUESTBAG_SLOT_START; t < QUESTBAG_SLOT_END; ++t)
{
if( inv_quests[t-QUESTBAG_SLOT_START] == 0 )
{
inv_quests[t-QUESTBAG_SLOT_START] = 1;
b_found = true;
break;
}
}
}
if (b_found) continue; if (b_found) continue;
*/ */
@ -10708,12 +10606,12 @@ void Player::SetVisibleItemSlot(uint8 slot, Item *pItem)
if(pItem) if(pItem)
{ {
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), pItem->GetEntry()); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), pItem->GetEntry());
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PERMANENTENCHANTMENT + (slot * 2), pItem->GetEnchantmentId(EnchantmentSlot(0))); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), pItem->GetEnchantmentId(EnchantmentSlot(0)));
} }
else else
{ {
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), 0); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), 0);
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PERMANENTENCHANTMENT + (slot * 2), 0); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 0);
} }
} }
@ -10949,7 +10847,8 @@ void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool uneq
} }
} }
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
{ {
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i )) if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
{ {
@ -11054,7 +10953,7 @@ void Player::DestroyZoneLimitedItem( bool update, uint32 new_zone )
if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone)) if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone))
DestroyItem( INVENTORY_SLOT_BAG_0, i, update); DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i )) if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone)) if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone))
DestroyItem( INVENTORY_SLOT_BAG_0, i, update); DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
@ -12172,7 +12071,7 @@ void Player::ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool a
// visualize enchantment at player and equipped items // visualize enchantment at player and equipped items
if(slot == PERM_ENCHANTMENT_SLOT) if(slot == PERM_ENCHANTMENT_SLOT)
{ {
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PERMANENTENCHANTMENT + (item->GetSlot() * 2), apply ? item->GetEnchantmentId(slot) : 0); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), apply ? item->GetEnchantmentId(slot) : 0);
} }
if(apply_dur) if(apply_dur)
@ -15446,6 +15345,14 @@ void Player::_LoadBoundInstances(QueryResult *result)
// so the value read from the DB may be wrong here but only if the InstanceSave is loaded // so the value read from the DB may be wrong here but only if the InstanceSave is loaded
// and in that case it is not used // and in that case it is not used
MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
if(!mapEntry || !mapEntry->IsDungeon())
{
sLog.outError("_LoadBoundInstances: player %s(%d) has bind to not existed or not dungeon map %d", GetName(), GetGUIDLow(), mapId);
CharacterDatabase.PExecute("DELETE FROM character_instance WHERE guid = '%d' AND instance = '%d'", GetGUIDLow(), instanceId);
continue;
}
if(!perm && group) if(!perm && group)
{ {
sLog.outError("_LoadBoundInstances: player %s(%d) is in group %d but has a non-permanent character bind to map %d,%d,%d", GetName(), GetGUIDLow(), GUID_LOPART(group->GetLeaderGUID()), mapId, instanceId, difficulty); sLog.outError("_LoadBoundInstances: player %s(%d) is in group %d but has a non-permanent character bind to map %d,%d,%d", GetName(), GetGUIDLow(), GUID_LOPART(group->GetLeaderGUID()), mapId, instanceId, difficulty);

View file

@ -560,11 +560,13 @@ enum PlayerSlots
// first slot for item stored (in any way in player m_items data) // first slot for item stored (in any way in player m_items data)
PLAYER_SLOT_START = 0, PLAYER_SLOT_START = 0,
// last+1 slot for item stored (in any way in player m_items data) // last+1 slot for item stored (in any way in player m_items data)
PLAYER_SLOT_END = 200, PLAYER_SLOT_END = 150,
PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START)
}; };
enum EquipmentSlots #define INVENTORY_SLOT_BAG_0 255
enum EquipmentSlots // 19 slots
{ {
EQUIPMENT_SLOT_START = 0, EQUIPMENT_SLOT_START = 0,
EQUIPMENT_SLOT_HEAD = 0, EQUIPMENT_SLOT_HEAD = 0,
@ -591,119 +593,45 @@ enum EquipmentSlots
enum InventorySlots enum InventorySlots
{ {
INVENTORY_SLOT_BAG_0 = 255, INVENTORY_SLOT_BAG_START = 19, // 4 slots
INVENTORY_SLOT_BAG_START = 19, INVENTORY_SLOT_BAG_END = 23
INVENTORY_SLOT_BAG_1 = 19, };
INVENTORY_SLOT_BAG_2 = 20,
INVENTORY_SLOT_BAG_3 = 21,
INVENTORY_SLOT_BAG_4 = 22,
INVENTORY_SLOT_BAG_END = 23,
INVENTORY_SLOT_ITEM_START = 23, enum InventoryPackSlots
INVENTORY_SLOT_ITEM_1 = 23, {
INVENTORY_SLOT_ITEM_2 = 24, INVENTORY_SLOT_ITEM_START = 23, // 16 slots
INVENTORY_SLOT_ITEM_3 = 25,
INVENTORY_SLOT_ITEM_4 = 26,
INVENTORY_SLOT_ITEM_5 = 27,
INVENTORY_SLOT_ITEM_6 = 28,
INVENTORY_SLOT_ITEM_7 = 29,
INVENTORY_SLOT_ITEM_8 = 30,
INVENTORY_SLOT_ITEM_9 = 31,
INVENTORY_SLOT_ITEM_10 = 32,
INVENTORY_SLOT_ITEM_11 = 33,
INVENTORY_SLOT_ITEM_12 = 34,
INVENTORY_SLOT_ITEM_13 = 35,
INVENTORY_SLOT_ITEM_14 = 36,
INVENTORY_SLOT_ITEM_15 = 37,
INVENTORY_SLOT_ITEM_16 = 38,
INVENTORY_SLOT_ITEM_END = 39 INVENTORY_SLOT_ITEM_END = 39
}; };
enum BankSlots enum BankItemSlots
{ {
BANK_SLOT_ITEM_START = 39, BANK_SLOT_ITEM_START = 39, // 28 slots
BANK_SLOT_ITEM_1 = 39, BANK_SLOT_ITEM_END = 67
BANK_SLOT_ITEM_2 = 40, };
BANK_SLOT_ITEM_3 = 41,
BANK_SLOT_ITEM_4 = 42,
BANK_SLOT_ITEM_5 = 43,
BANK_SLOT_ITEM_6 = 44,
BANK_SLOT_ITEM_7 = 45,
BANK_SLOT_ITEM_8 = 46,
BANK_SLOT_ITEM_9 = 47,
BANK_SLOT_ITEM_10 = 48,
BANK_SLOT_ITEM_11 = 49,
BANK_SLOT_ITEM_12 = 50,
BANK_SLOT_ITEM_13 = 51,
BANK_SLOT_ITEM_14 = 52,
BANK_SLOT_ITEM_15 = 53,
BANK_SLOT_ITEM_16 = 54,
BANK_SLOT_ITEM_17 = 55,
BANK_SLOT_ITEM_18 = 56,
BANK_SLOT_ITEM_19 = 57,
BANK_SLOT_ITEM_20 = 58,
BANK_SLOT_ITEM_21 = 59,
BANK_SLOT_ITEM_22 = 60,
BANK_SLOT_ITEM_23 = 61,
BANK_SLOT_ITEM_24 = 62,
BANK_SLOT_ITEM_25 = 63,
BANK_SLOT_ITEM_26 = 64,
BANK_SLOT_ITEM_27 = 65,
BANK_SLOT_ITEM_28 = 66,
BANK_SLOT_ITEM_END = 67,
BANK_SLOT_BAG_START = 67, enum BankBagSlots
BANK_SLOT_BAG_1 = 67, {
BANK_SLOT_BAG_2 = 68, BANK_SLOT_BAG_START = 67, // 7 slots
BANK_SLOT_BAG_3 = 69,
BANK_SLOT_BAG_4 = 70,
BANK_SLOT_BAG_5 = 71,
BANK_SLOT_BAG_6 = 72,
BANK_SLOT_BAG_7 = 73,
BANK_SLOT_BAG_END = 74 BANK_SLOT_BAG_END = 74
}; };
enum BuyBackSlots enum BuyBackSlots // 12 slots
{ {
// stored in m_buybackitems // stored in m_buybackitems
BUYBACK_SLOT_START = 74, BUYBACK_SLOT_START = 74,
BUYBACK_SLOT_1 = 74,
BUYBACK_SLOT_2 = 75,
BUYBACK_SLOT_3 = 76,
BUYBACK_SLOT_4 = 77,
BUYBACK_SLOT_5 = 78,
BUYBACK_SLOT_6 = 79,
BUYBACK_SLOT_7 = 80,
BUYBACK_SLOT_8 = 81,
BUYBACK_SLOT_9 = 82,
BUYBACK_SLOT_10 = 83,
BUYBACK_SLOT_11 = 84,
BUYBACK_SLOT_12 = 85,
BUYBACK_SLOT_END = 86 BUYBACK_SLOT_END = 86
}; };
enum KeyRingSlots enum KeyRingSlots // 32 slots
{ {
KEYRING_SLOT_START = 86, KEYRING_SLOT_START = 86,
KEYRING_SLOT_END = 118 KEYRING_SLOT_END = 118
}; };
enum VanityPetSlots enum CurrencyTokenSlots // 32 slots
{ {
VANITYPET_SLOT_START = 118, // not use, vanity pets stored as spells CURRENCYTOKEN_SLOT_START = 118,
VANITYPET_SLOT_END = 136 // not alloed any content in. CURRENCYTOKEN_SLOT_END = 150
};
enum CurrencyTokenSlots
{
CURRENCYTOKEN_SLOT_START = 136,
CURRENCYTOKEN_SLOT_END = 168
};
enum QuestBagSlots
{
QUESTBAG_SLOT_START = 168,
QUESTBAG_SLOT_END = 200
}; };
enum EquipmentSetUpdateState enum EquipmentSetUpdateState
@ -751,15 +679,19 @@ enum TradeSlots
enum TransferAbortReason enum TransferAbortReason
{ {
TRANSFER_ABORT_ERROR = 0x00, TRANSFER_ABORT_NONE = 0x00,
TRANSFER_ABORT_MAX_PLAYERS = 0x01, // Transfer Aborted: instance is full TRANSFER_ABORT_ERROR = 0x01,
TRANSFER_ABORT_NOT_FOUND = 0x02, // Transfer Aborted: instance not found TRANSFER_ABORT_MAX_PLAYERS = 0x02, // Transfer Aborted: instance is full
TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x03, // You have entered too many instances recently. TRANSFER_ABORT_NOT_FOUND = 0x03, // Transfer Aborted: instance not found
TRANSFER_ABORT_ZONE_IN_COMBAT = 0x05, // Unable to zone in while an encounter is in progress. TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x04, // You have entered too many instances recently.
TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x06, // You must have <TBC,WotLK> expansion installed to access this area. TRANSFER_ABORT_ZONE_IN_COMBAT = 0x06, // Unable to zone in while an encounter is in progress.
TRANSFER_ABORT_DIFFICULTY = 0x07, // <Normal,Heroic,Epic> difficulty mode is not available for %s. TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x07, // You must have <TBC,WotLK> expansion installed to access this area.
TRANSFER_ABORT_UNIQUE_MESSAGE = 0x08, // Until you've escaped TLK's grasp, you cannot leave this place! TRANSFER_ABORT_DIFFICULTY = 0x08, // <Normal,Heroic,Epic> difficulty mode is not available for %s.
TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x09 // Additional instances cannot be launched, please try again later. TRANSFER_ABORT_UNIQUE_MESSAGE = 0x09, // Until you've escaped TLK's grasp, you cannot leave this place!
TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x0A, // Additional instances cannot be launched, please try again later.
TRANSFER_ABORT_NEED_GROUP = 0x0B, // 3.1
TRANSFER_ABORT_NOT_FOUND2 = 0x0C, // 3.1
TRANSFER_ABORT_NOT_FOUND3 = 0x0D, // 3.1
}; };
enum InstanceResetWarningType enum InstanceResetWarningType
@ -799,11 +731,6 @@ struct MovementInfo
x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f; x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0; t_guid = 0;
} }
void SetMovementFlags(uint32 _flags)
{
flags = _flags;
}
}; };
// flags that use in movement check for example at spell casting // flags that use in movement check for example at spell casting

View file

@ -1489,8 +1489,13 @@ void Aura::TriggerSpell()
// case 27746: break; // case 27746: break;
// // Steam Tank Passive // // Steam Tank Passive
// case 27747: break; // case 27747: break;
// // Frost Blast // Frost Blast
// case 27808: break; case 27808:
{
int32 bpDamage = target->GetMaxHealth()*26/100;
caster->CastCustomSpell(target,29879,&bpDamage,NULL,NULL,true,NULL,this);
return;
}
// // Detonate Mana // // Detonate Mana
// case 27819: break; // case 27819: break;
// // Controller Timer // // Controller Timer

View file

@ -796,7 +796,7 @@ void Spell::EffectDummy(uint32 i)
// create before death for get proper coordinates // create before death for get proper coordinates
if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), 179644, map, m_caster->GetPhaseMask(), if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), 179644, map, m_caster->GetPhaseMask(),
creatureTarget->GetPositionX(), creatureTarget->GetPositionY(), creatureTarget->GetPositionZ(), creatureTarget->GetPositionX(), creatureTarget->GetPositionY(), creatureTarget->GetPositionZ(),
creatureTarget->GetOrientation(), 0, 0, 0, 0, 100, 1) ) creatureTarget->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 100, 1) )
{ {
delete pGameObj; delete pGameObj;
return; return;
@ -4590,7 +4590,7 @@ void Spell::EffectSummonObjectWild(uint32 i)
Map *map = target->GetMap(); Map *map = target->GetMap();
if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), gameobject_id, map, if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), gameobject_id, map,
m_caster->GetPhaseMask(), x, y, z, target->GetOrientation(), 0, 0, 0, 0, 100, 1)) m_caster->GetPhaseMask(), x, y, z, target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 100, 1))
{ {
delete pGameObj; delete pGameObj;
return; return;
@ -4638,7 +4638,7 @@ void Spell::EffectSummonObjectWild(uint32 i)
{ {
GameObject* linkedGO = new GameObject; GameObject* linkedGO = new GameObject;
if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, map, if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, map,
m_caster->GetPhaseMask(), x, y, z, target->GetOrientation(), 0, 0, 0, 0, 100, 1)) m_caster->GetPhaseMask(), x, y, z, target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 100, 1))
{ {
linkedGO->SetRespawnTime(duration > 0 ? duration/IN_MILISECONDS : 0); linkedGO->SetRespawnTime(duration > 0 ? duration/IN_MILISECONDS : 0);
linkedGO->SetSpellId(m_spellInfo->Id); linkedGO->SetSpellId(m_spellInfo->Id);
@ -5263,7 +5263,7 @@ void Spell::EffectDuel(uint32 i)
m_caster->GetPositionX()+(unitTarget->GetPositionX()-m_caster->GetPositionX())/2 , m_caster->GetPositionX()+(unitTarget->GetPositionX()-m_caster->GetPositionX())/2 ,
m_caster->GetPositionY()+(unitTarget->GetPositionY()-m_caster->GetPositionY())/2 , m_caster->GetPositionY()+(unitTarget->GetPositionY()-m_caster->GetPositionY())/2 ,
m_caster->GetPositionZ(), m_caster->GetPositionZ(),
m_caster->GetOrientation(), 0, 0, 0, 0, 0, 1)) m_caster->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0, 1))
{ {
delete pGameObj; delete pGameObj;
return; return;
@ -5639,9 +5639,6 @@ void Spell::EffectSummonObject(uint32 i)
GameObject* pGameObj = new GameObject; GameObject* pGameObj = new GameObject;
float rot2 = sin(m_caster->GetOrientation()/2);
float rot3 = cos(m_caster->GetOrientation()/2);
float x,y,z; float x,y,z;
// If dest location if present // If dest location if present
if (m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION) if (m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION)
@ -5656,7 +5653,7 @@ void Spell::EffectSummonObject(uint32 i)
Map *map = m_caster->GetMap(); Map *map = m_caster->GetMap();
if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), go_id, map, if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), go_id, map,
m_caster->GetPhaseMask(), x, y, z, m_caster->GetOrientation(), 0, 0, rot2, rot3, 0, 1)) m_caster->GetPhaseMask(), x, y, z, m_caster->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0, 1))
{ {
delete pGameObj; delete pGameObj;
return; return;
@ -6246,7 +6243,7 @@ void Spell::EffectTransmitted(uint32 effIndex)
GameObject* pGameObj = new GameObject; GameObject* pGameObj = new GameObject;
if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), name_id, cMap, if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), name_id, cMap,
m_caster->GetPhaseMask(), fx, fy, fz, m_caster->GetOrientation(), 0, 0, 0, 0, 100, 1)) m_caster->GetPhaseMask(), fx, fy, fz, m_caster->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 100, 1))
{ {
delete pGameObj; delete pGameObj;
return; return;
@ -6259,10 +6256,6 @@ void Spell::EffectTransmitted(uint32 effIndex)
case GAMEOBJECT_TYPE_FISHINGNODE: case GAMEOBJECT_TYPE_FISHINGNODE:
{ {
m_caster->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT,pGameObj->GetGUID()); m_caster->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT,pGameObj->GetGUID());
// Orientation3
pGameObj->SetFloatValue(GAMEOBJECT_PARENTROTATION + 2, 0.88431775569915771 );
// Orientation4
pGameObj->SetFloatValue(GAMEOBJECT_PARENTROTATION + 3, -0.4668855369091033 );
m_caster->AddGameObject(pGameObj); // will removed at spell cancel m_caster->AddGameObject(pGameObj); // will removed at spell cancel
// end time of range when possible catch fish (FISHING_BOBBER_READY_TIME..GetDuration(m_spellInfo)) // end time of range when possible catch fish (FISHING_BOBBER_READY_TIME..GetDuration(m_spellInfo))
@ -6317,7 +6310,7 @@ void Spell::EffectTransmitted(uint32 effIndex)
{ {
GameObject* linkedGO = new GameObject; GameObject* linkedGO = new GameObject;
if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, cMap, if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, cMap,
m_caster->GetPhaseMask(), fx, fy, fz, m_caster->GetOrientation(), 0, 0, 0, 0, 100, 1)) m_caster->GetPhaseMask(), fx, fy, fz, m_caster->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 100, 1))
{ {
linkedGO->SetRespawnTime(duration > 0 ? duration/IN_MILISECONDS : 0); linkedGO->SetRespawnTime(duration > 0 ? duration/IN_MILISECONDS : 0);
linkedGO->SetUInt32Value(GAMEOBJECT_LEVEL, m_caster->getLevel() ); linkedGO->SetUInt32Value(GAMEOBJECT_LEVEL, m_caster->getLevel() );
@ -6386,12 +6379,40 @@ void Spell::EffectSkill(uint32 /*i*/)
void Spell::EffectSummonDemon(uint32 i) void Spell::EffectSummonDemon(uint32 i)
{ {
float px = m_targets.m_destX; // select center of summon position
float py = m_targets.m_destY; float center_x = m_targets.m_destX;
float pz = m_targets.m_destZ; float center_y = m_targets.m_destY;
float center_z = m_targets.m_destZ;
Creature* Charmed = m_caster->SummonCreature(m_spellInfo->EffectMiscValue[i], px, py, pz, m_caster->GetOrientation(),TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,3600000); float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
if (!Charmed)
int32 amount = damage > 0 ? damage : 1;
for(int32 count = 0; count < amount; ++count)
{
float px, py, pz;
// If dest location if present
if (m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION)
{
// Summon 1 unit in dest location
if (count == 0)
{
px = m_targets.m_destX;
py = m_targets.m_destY;
pz = m_targets.m_destZ;
}
// Summon in random point all other units if location present
else
m_caster->GetRandomPoint(center_x,center_y,center_z,radius,px,py,pz);
}
// Summon if dest location not present near caster
else
m_caster->GetClosePoint(px,py,pz,3.0f);
int32 duration = GetSpellDuration(m_spellInfo);
Creature* Charmed = m_caster->SummonCreature(m_spellInfo->EffectMiscValue[i], px, py, pz, m_caster->GetOrientation(),TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,duration);
if (!Charmed) // something fatal, not attempt more
return; return;
// might not always work correctly, maybe the creature that dies from CoD casts the effect on itself and is therefore the caster? // might not always work correctly, maybe the creature that dies from CoD casts the effect on itself and is therefore the caster?
@ -6408,6 +6429,7 @@ void Spell::EffectSummonDemon(uint32 i)
Charmed->CastSpell(Charmed, 22703, true, 0); Charmed->CastSpell(Charmed, 22703, true, 0);
} }
} }
}
/* There is currently no need for this effect. We handle it in BattleGround.cpp /* There is currently no need for this effect. We handle it in BattleGround.cpp
If we would handle the resurrection here, the spiritguide would instantly disappear as the If we would handle the resurrection here, the spiritguide would instantly disappear as the

View file

@ -19,7 +19,7 @@
#ifndef _UPDATEFIELDS_AUTO_H #ifndef _UPDATEFIELDS_AUTO_H
#define _UPDATEFIELDS_AUTO_H #define _UPDATEFIELDS_AUTO_H
// Auto generated for version 0, 1, 0, 9684 // Auto generated for version 0, 1, 0, 9704
enum EObjectFields enum EObjectFields
{ {
@ -285,43 +285,43 @@ enum EUnitFields
PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x006C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x006C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_25_4 = UNIT_END + 0x006D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_25_4 = UNIT_END + 0x006D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_1_ENTRYID = UNIT_END + 0x006E, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_1_ENTRYID = UNIT_END + 0x006E, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_1_PERMANENTENCHANTMENT = UNIT_END + 0x006F, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_1_ENCHANTMENT = UNIT_END + 0x006F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_ENTRYID = UNIT_END + 0x0070, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_2_ENTRYID = UNIT_END + 0x0070, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_PERMANENTENCHANTMENT = UNIT_END + 0x0071, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_2_ENCHANTMENT = UNIT_END + 0x0071, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_ENTRYID = UNIT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_3_ENTRYID = UNIT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_PERMANENTENCHANTMENT = UNIT_END + 0x0073, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_3_ENCHANTMENT = UNIT_END + 0x0073, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_ENTRYID = UNIT_END + 0x0074, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_4_ENTRYID = UNIT_END + 0x0074, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_PERMANENTENCHANTMENT = UNIT_END + 0x0075, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_4_ENCHANTMENT = UNIT_END + 0x0075, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_ENTRYID = UNIT_END + 0x0076, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_5_ENTRYID = UNIT_END + 0x0076, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_PERMANENTENCHANTMENT = UNIT_END + 0x0077, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_5_ENCHANTMENT = UNIT_END + 0x0077, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_ENTRYID = UNIT_END + 0x0078, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_6_ENTRYID = UNIT_END + 0x0078, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_PERMANENTENCHANTMENT = UNIT_END + 0x0079, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_6_ENCHANTMENT = UNIT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_ENTRYID = UNIT_END + 0x007A, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_7_ENTRYID = UNIT_END + 0x007A, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_PERMANENTENCHANTMENT = UNIT_END + 0x007B, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_7_ENCHANTMENT = UNIT_END + 0x007B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_ENTRYID = UNIT_END + 0x007C, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_8_ENTRYID = UNIT_END + 0x007C, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_PERMANENTENCHANTMENT = UNIT_END + 0x007D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_8_ENCHANTMENT = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_9_ENTRYID = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_9_ENTRYID = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_9_PERMANENTENCHANTMENT = UNIT_END + 0x007F, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_9_ENCHANTMENT = UNIT_END + 0x007F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_10_ENTRYID = UNIT_END + 0x0080, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_10_ENTRYID = UNIT_END + 0x0080, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_10_PERMANENTENCHANTMENT = UNIT_END + 0x0081, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_10_ENCHANTMENT = UNIT_END + 0x0081, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_11_ENTRYID = UNIT_END + 0x0082, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_11_ENTRYID = UNIT_END + 0x0082, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_11_PERMANENTENCHANTMENT = UNIT_END + 0x0083, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_11_ENCHANTMENT = UNIT_END + 0x0083, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_12_ENTRYID = UNIT_END + 0x0084, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_12_ENTRYID = UNIT_END + 0x0084, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_12_PERMANENTENCHANTMENT = UNIT_END + 0x0085, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_12_ENCHANTMENT = UNIT_END + 0x0085, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_13_ENTRYID = UNIT_END + 0x0086, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_13_ENTRYID = UNIT_END + 0x0086, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_13_PERMANENTENCHANTMENT = UNIT_END + 0x0087, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_13_ENCHANTMENT = UNIT_END + 0x0087, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_14_ENTRYID = UNIT_END + 0x0088, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_14_ENTRYID = UNIT_END + 0x0088, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_14_PERMANENTENCHANTMENT = UNIT_END + 0x0089, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_14_ENCHANTMENT = UNIT_END + 0x0089, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_15_ENTRYID = UNIT_END + 0x008A, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_15_ENTRYID = UNIT_END + 0x008A, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_15_PERMANENTENCHANTMENT = UNIT_END + 0x008B, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_15_ENCHANTMENT = UNIT_END + 0x008B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_16_ENTRYID = UNIT_END + 0x008C, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_16_ENTRYID = UNIT_END + 0x008C, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_16_PERMANENTENCHANTMENT = UNIT_END + 0x008D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_16_ENCHANTMENT = UNIT_END + 0x008D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_17_ENTRYID = UNIT_END + 0x008E, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_17_ENTRYID = UNIT_END + 0x008E, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_17_PERMANENTENCHANTMENT = UNIT_END + 0x008F, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_17_ENCHANTMENT = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_18_ENTRYID = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_18_ENTRYID = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_18_PERMANENTENCHANTMENT = UNIT_END + 0x0091, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_18_ENCHANTMENT = UNIT_END + 0x0091, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_19_ENTRYID = UNIT_END + 0x0092, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_19_ENTRYID = UNIT_END + 0x0092, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_19_PERMANENTENCHANTMENT = UNIT_END + 0x0093, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_19_ENCHANTMENT = UNIT_END + 0x0093, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_CHOSEN_TITLE = UNIT_END + 0x0094, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_CHOSEN_TITLE = UNIT_END + 0x0094, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_FIELD_PAD_0 = UNIT_END + 0x0095, // Size: 1, Type: INT, Flags: NONE PLAYER_FIELD_PAD_0 = UNIT_END + 0x0095, // Size: 1, Type: INT, Flags: NONE
PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x0096, // Size: 46, Type: LONG, Flags: PRIVATE PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x0096, // Size: 46, Type: LONG, Flags: PRIVATE
@ -330,64 +330,62 @@ enum EUnitFields
PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x011C, // Size: 14, Type: LONG, Flags: PRIVATE PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x011C, // Size: 14, Type: LONG, Flags: PRIVATE
PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x012A, // Size: 24, Type: LONG, Flags: PRIVATE PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x012A, // Size: 24, Type: LONG, Flags: PRIVATE
PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0142, // Size: 64, Type: LONG, Flags: PRIVATE PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0142, // Size: 64, Type: LONG, Flags: PRIVATE
PLAYER_FIELD_VANITYPET_SLOT_1 = UNIT_END + 0x0182, // Size: 36, Type: LONG, Flags: PRIVATE PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x0182, // Size: 64, Type: LONG, Flags: PRIVATE
PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x01A6, // Size: 64, Type: LONG, Flags: PRIVATE PLAYER_FARSIGHT = UNIT_END + 0x01C2, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER_FIELD_QUESTBAG_SLOT_1 = UNIT_END + 0x01E6, // Size: 64, Type: LONG, Flags: PRIVATE PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x01C4, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER_FARSIGHT = UNIT_END + 0x0226, // Size: 2, Type: LONG, Flags: PRIVATE PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x01C6, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x0228, // Size: 2, Type: LONG, Flags: PRIVATE PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x01C8, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x022A, // Size: 2, Type: LONG, Flags: PRIVATE PLAYER_XP = UNIT_END + 0x01CA, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x022C, // Size: 2, Type: LONG, Flags: PRIVATE PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x01CB, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_XP = UNIT_END + 0x022E, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x01CC, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE
PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x022F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x034C, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x0230, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x034D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x03B0, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_TRACK_CREATURES = UNIT_END + 0x034E, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x03B1, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_TRACK_RESOURCES = UNIT_END + 0x034F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_TRACK_CREATURES = UNIT_END + 0x03B2, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x0350, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_TRACK_RESOURCES = UNIT_END + 0x03B3, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x0351, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x03B4, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x0352, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x03B5, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_EXPERTISE = UNIT_END + 0x0353, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x03B6, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x0354, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_EXPERTISE = UNIT_END + 0x03B7, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x0355, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x03B8, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0356, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x03B9, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0357, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x03BA, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x0358, // Size: 7, Type: FLOAT, Flags: PRIVATE
PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x03BB, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_SHIELD_BLOCK = UNIT_END + 0x035F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x03BC, // Size: 7, Type: FLOAT, Flags: PRIVATE PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x0360, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_SHIELD_BLOCK = UNIT_END + 0x03C3, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x0361, // Size: 128, Type: BYTES, Flags: PRIVATE
PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x03C4, // Size: 1, Type: FLOAT, Flags: PRIVATE PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x03E1, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x03C5, // Size: 128, Type: BYTES, Flags: PRIVATE PLAYER_FIELD_COINAGE = UNIT_END + 0x03E2, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x0445, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x03E3, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_FIELD_COINAGE = UNIT_END + 0x0446, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x03EA, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x0447, // Size: 7, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x03F1, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x044E, // Size: 7, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x03F8, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x0455, // Size: 7, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x03F9, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x045C, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x03FA, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x045D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_BYTES = UNIT_END + 0x03FB, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x045E, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_AMMO_ID = UNIT_END + 0x03FC, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BYTES = UNIT_END + 0x045F, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_SELF_RES_SPELL = UNIT_END + 0x03FD, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_AMMO_ID = UNIT_END + 0x0460, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x03FE, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_SELF_RES_SPELL = UNIT_END + 0x0461, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x03FF, // Size: 12, Type: INT, Flags: PRIVATE
PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0462, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x040B, // Size: 12, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0463, // Size: 12, Type: INT, Flags: PRIVATE PLAYER_FIELD_KILLS = UNIT_END + 0x0417, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x046F, // Size: 12, Type: INT, Flags: PRIVATE PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x0418, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_KILLS = UNIT_END + 0x047B, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x0419, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x047C, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x041A, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x047D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_BYTES2 = UNIT_END + 0x041B, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x047E, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x041C, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BYTES2 = UNIT_END + 0x047F, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x041D, // Size: 25, Type: INT, Flags: PRIVATE
PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x0480, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0436, // Size: 18, Type: INT, Flags: PRIVATE
PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x0481, // Size: 25, Type: INT, Flags: PRIVATE PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x0448, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x049A, // Size: 18, Type: INT, Flags: PRIVATE PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x0449, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x04AC, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x044A, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x04AD, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x044B, // Size: 25, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x04AE, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0464, // Size: 4, Type: FLOAT, Flags: PRIVATE
PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x04AF, // Size: 25, Type: INT, Flags: PRIVATE PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x0468, // Size: 3, Type: INT, Flags: PRIVATE
PLAYER_RUNE_REGEN_1 = UNIT_END + 0x04C8, // Size: 4, Type: FLOAT, Flags: PRIVATE PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x046B, // Size: 6, Type: INT, Flags: PRIVATE
PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x04CC, // Size: 3, Type: INT, Flags: PRIVATE PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0471, // Size: 6, Type: INT, Flags: PRIVATE
PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x04CF, // Size: 6, Type: INT, Flags: PRIVATE PLAYER_GLYPHS_ENABLED = UNIT_END + 0x0477, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x04D5, // Size: 6, Type: INT, Flags: PRIVATE PLAYER_END = UNIT_END + 0x0478,
PLAYER_GLYPHS_ENABLED = UNIT_END + 0x04DB, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_END = UNIT_END + 0x04DC,
}; };
enum EGameObjectFields enum EGameObjectFields

View file

@ -25,11 +25,15 @@ ConfVersion=2008080101
# WorldDatabaseInfo # WorldDatabaseInfo
# CharacterDatabaseInfo # CharacterDatabaseInfo
# Database connection settings for the world server. # Database connection settings for the world server.
# Default: hostname;port;username;password;database # Default:
# ---MYSQL---
# hostname;port;username;password;database
# .;somenumber;username;password;database - use named pipes at Windows # .;somenumber;username;password;database - use named pipes at Windows
# Named pipes: mySQL required adding "enable-named-pipe" to [mysqld] section my.ini # Named pipes: mySQL required adding "enable-named-pipe" to [mysqld] section my.ini
# .;/path/to/unix_socket;username;password;database - use Unix sockets at Unix/Linux # .;/path/to/unix_socket;username;password;database - use Unix sockets at Unix/Linux
# Unix sockets: experimental, not tested # ---PGSQL---
# hostname;port;username;password;database
# .;/path/to/unix_socket/DIRECTORY or . for default path;username;password;database - use Unix sockets at Unix/Linux
# #
# MaxPingTime # MaxPingTime
# Settings for maximum database-ping interval (minutes between pings) # Settings for maximum database-ping interval (minutes between pings)

View file

@ -66,8 +66,8 @@ enum LoginResult
// we need to stick to 1 version or half of the stuff will work for someone // we need to stick to 1 version or half of the stuff will work for someone
// others will not and opposite // others will not and opposite
// will only support WoW, WoW:TBC and WoW:WotLK 3.1.0 client build 9684... // will only support WoW, WoW:TBC and WoW:WotLK 3.1.0 client build 9704...
#define EXPECTED_MANGOS_CLIENT_BUILD {9684, 0} #define EXPECTED_MANGOS_CLIENT_BUILD {9704, 0}
#endif #endif

View file

@ -77,14 +77,14 @@ bool DatabasePostgre::Initialize(const char *infoString)
Tokens::iterator iter; Tokens::iterator iter;
std::string host, port_or_socket, user, password, database; std::string host, port_or_socket_dir, user, password, database;
iter = tokens.begin(); iter = tokens.begin();
if(iter != tokens.end()) if(iter != tokens.end())
host = *iter++; host = *iter++;
if(iter != tokens.end()) if(iter != tokens.end())
port_or_socket = *iter++; port_or_socket_dir = *iter++;
if(iter != tokens.end()) if(iter != tokens.end())
user = *iter++; user = *iter++;
if(iter != tokens.end()) if(iter != tokens.end())
@ -92,7 +92,10 @@ bool DatabasePostgre::Initialize(const char *infoString)
if(iter != tokens.end()) if(iter != tokens.end())
database = *iter++; database = *iter++;
mPGconn = PQsetdbLogin(host.c_str(), port_or_socket.c_str(), NULL, NULL, database.c_str(), user.c_str(), password.c_str()); if (host == ".")
mPGconn = PQsetdbLogin(NULL, port_or_socket_dir == "." ? NULL : port_or_socket_dir.c_str(), NULL, NULL, database.c_str(), user.c_str(), password.c_str());
else
mPGconn = PQsetdbLogin(host.c_str(), port_or_socket_dir.c_str(), NULL, NULL, database.c_str(), user.c_str(), password.c_str());
/* check to see that the backend connection was successfully made */ /* check to see that the backend connection was successfully made */
if (PQstatus(mPGconn) != CONNECTION_OK) if (PQstatus(mPGconn) != CONNECTION_OK)

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "7483" #define REVISION_NR "7490"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__