aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp2
-rw-r--r--src/game/BattleGroundHandler.cpp16
-rw-r--r--src/game/BattleGroundMgr.cpp12
-rw-r--r--src/game/BattleGroundMgr.h2
-rw-r--r--src/game/CalendarHandler.cpp93
-rw-r--r--src/game/CharacterHandler.cpp129
-rw-r--r--src/game/Chat.cpp1
-rw-r--r--src/game/Corpse.cpp8
-rw-r--r--src/game/Creature.cpp2
-rw-r--r--src/game/Creature.h4
-rw-r--r--src/game/DBCStores.cpp79
-rw-r--r--src/game/DBCStores.h2
-rw-r--r--src/game/DBCStructure.h47
-rw-r--r--src/game/DBCfmt.h14
-rw-r--r--src/game/DynamicObject.cpp4
-rw-r--r--src/game/GameObject.cpp40
-rw-r--r--src/game/GameObject.h47
-rw-r--r--src/game/GossipDef.cpp6
-rw-r--r--src/game/Item.cpp4
-rw-r--r--src/game/Item.h2
-rw-r--r--src/game/ItemHandler.cpp17
-rw-r--r--src/game/ItemPrototype.h3
-rw-r--r--src/game/LFGHandler.cpp174
-rw-r--r--src/game/Level2.cpp6
-rw-r--r--src/game/MiscHandler.cpp86
-rw-r--r--src/game/MovementHandler.cpp1
-rw-r--r--src/game/Object.cpp151
-rw-r--r--src/game/Object.h4
-rw-r--r--src/game/ObjectAccessor.cpp42
-rw-r--r--src/game/ObjectMgr.cpp18
-rw-r--r--src/game/ObjectMgr.h2
-rw-r--r--src/game/Opcodes.cpp54
-rw-r--r--src/game/Opcodes.h78
-rw-r--r--src/game/Pet.cpp9
-rw-r--r--src/game/PetHandler.cpp28
-rw-r--r--src/game/Player.cpp610
-rw-r--r--src/game/Player.h137
-rw-r--r--src/game/QueryHandler.cpp51
-rw-r--r--src/game/QuestDef.h16
-rw-r--r--src/game/QuestHandler.cpp23
-rw-r--r--src/game/RandomMovementGenerator.cpp12
-rw-r--r--src/game/SharedDefines.h9
-rw-r--r--src/game/SkillHandler.cpp25
-rw-r--r--src/game/Spell.cpp3
-rw-r--r--src/game/SpellAuraDefines.h8
-rw-r--r--src/game/SpellAuras.cpp595
-rw-r--r--src/game/SpellEffects.cpp6
-rw-r--r--src/game/TargetedMovementGenerator.cpp1
-rw-r--r--src/game/Transports.cpp3
-rw-r--r--src/game/Traveller.h2
-rw-r--r--src/game/Unit.cpp30
-rw-r--r--src/game/Unit.h36
-rw-r--r--src/game/UpdateData.cpp6
-rw-r--r--src/game/UpdateFields.h445
-rw-r--r--src/game/Vehicle.cpp2
-rw-r--r--src/game/World.cpp2
-rw-r--r--src/game/WorldSession.cpp68
-rw-r--r--src/game/WorldSession.h25
-rw-r--r--src/game/WorldSocket.cpp4
-rw-r--r--src/shared/Auth/AuthCrypt.cpp80
-rw-r--r--src/shared/Auth/AuthCrypt.h15
-rw-r--r--src/shared/Auth/CMakeLists.txt2
-rw-r--r--src/shared/Auth/Hmac.cpp22
-rw-r--r--src/shared/Auth/Hmac.h9
-rw-r--r--src/shared/Auth/Makefile.am2
-rw-r--r--src/shared/Auth/SARC4.cpp52
-rw-r--r--src/shared/Auth/SARC4.h36
-rw-r--r--src/shared/Database/SQLStorage.cpp12
-rw-r--r--src/trinityrealm/AuthCodes.h5
74 files changed, 2182 insertions, 1369 deletions
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
index e8b57f78e9c..55625b18eb6 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
@@ -2003,7 +2003,7 @@ void boss_illidan_stormrageAI::CastEyeBlast()
if(!Trigger) return;
Trigger->SetSpeed(MOVE_WALK, 3);
- Trigger->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
+ Trigger->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
Trigger->GetMotionMaster()->MovePoint(0, final.x, final.y, final.z);
//Trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
index 587d9934a51..ed6bc3dcf15 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
@@ -674,7 +674,7 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
{
ShadeHasDied = true;
WayPointId = 0;
- m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
+ m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->GetMotionMaster()->MovePoint(WayPointId, AkamaWP[0].x, AkamaWP[0].y, AkamaWP[0].z);
}
if(Shade && Shade->isAlive())
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
index 8e5ed16688c..ea7745ce6ec 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
@@ -638,7 +638,7 @@ struct TRINITY_DLL_DECL mob_enchanted_elementalAI : public ScriptedAI
if(move < diff)
{
- m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
+ m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
if (phase == 1)
{
m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp
index 99130528eb8..03b99e0ef36 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp
@@ -128,7 +128,7 @@ struct TRINITY_DLL_DECL boss_omor_the_unscarredAI : public Scripted_NoMovementAI
{
if (ShadowWhip_Timer < diff)
{
- if (Unit* temp = Unit::GetUnit(*m_creature,playerGUID))
+ if (Player* temp = Unit::GetPlayer(playerGUID))
{
//if unit dosen't have this flag, then no pulling back (script will attempt cast, even if orbital strike was resisted)
if (temp->HasUnitMovementFlag(MOVEMENTFLAG_FALLING))
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp
index 7f4e6f7fdcd..d06873bc0bf 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp
@@ -195,7 +195,7 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
break;
case 3:
DoCast(m_creature, SPELL_INTRO_FROST_BLAST);
- Madrigosa->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
+ Madrigosa->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
IntroFrostBoltTimer = 3000;
IntroPhaseTimer = 28000;
++IntroPhase;
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp
index cb0ee4b7f78..caf39318dd7 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp
@@ -1046,7 +1046,7 @@ struct TRINITY_DLL_DECL mob_shield_orbAI : public ScriptedAI
float x, y, r, c, mx, my;
void InitializeAI(){
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
+ m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
PointReached = true;
Timer = 500+ rand()%500;
CheckTimer = 1000;
diff --git a/src/game/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp
index 7a772fce8f1..6d16abfd5ea 100644
--- a/src/game/BattleGroundHandler.cpp
+++ b/src/game/BattleGroundHandler.cpp
@@ -68,7 +68,7 @@ void WorldSession::HandleBattlemasterHelloOpcode( WorldPacket & recv_data )
void WorldSession::SendBattlegGroundList( uint64 guid, BattleGroundTypeId bgTypeId )
{
WorldPacket data;
- sBattleGroundMgr.BuildBattleGroundListPacket(&data, guid, _player, bgTypeId);
+ sBattleGroundMgr.BuildBattleGroundListPacket(&data, guid, _player, bgTypeId, 0);
SendPacket( &data );
}
@@ -105,13 +105,6 @@ void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket & recv_data )
if (_player->InBattleGround())
return;
- Creature *unit = GetPlayer()->GetMap()->GetCreature(guid);
- if (!unit)
- return;
-
- if(!unit->isBattleMaster()) // it's not battlemaster
- return;
-
// get bg instance or bg template if instance not found
BattleGround *bg = NULL;
if (instanceId)
@@ -290,13 +283,16 @@ void WorldSession::HandlePVPLogDataOpcode( WorldPacket & /*recv_data*/ )
void WorldSession::HandleBattlefieldListOpcode( WorldPacket &recv_data )
{
- CHECK_PACKET_SIZE(recv_data, 4);
+ CHECK_PACKET_SIZE(recv_data, 4 + 1);
sLog.outDebug( "WORLD: Recvd CMSG_BATTLEFIELD_LIST Message");
uint32 bgTypeId;
recv_data >> bgTypeId; // id from DBC
+ uint8 fromWhere;
+ recv_data >> fromWhere; // 0 - battlemaster, 1 - UI
+
BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
if (!bl)
{
@@ -305,7 +301,7 @@ void WorldSession::HandleBattlefieldListOpcode( WorldPacket &recv_data )
}
WorldPacket data;
- sBattleGroundMgr.BuildBattleGroundListPacket(&data, _player->GetGUID(), _player, BattleGroundTypeId(bgTypeId));
+ sBattleGroundMgr.BuildBattleGroundListPacket(&data, 0, _player, BattleGroundTypeId(bgTypeId), fromWhere);
SendPacket( &data );
}
diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp
index ba94f5917c1..1a761895b0f 100644
--- a/src/game/BattleGroundMgr.cpp
+++ b/src/game/BattleGroundMgr.cpp
@@ -1305,7 +1305,8 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg)
for(int i = 1; i >= 0; --i)
{
*data << uint32(bg->m_ArenaTeamRatingChanges[i]);
- *data << uint32(3999); // huge thanks for TOM_RUS for this!
+ *data << uint32(3999); // huge thanks for TOM_RUS for this!
+ *data << uint32(0); // added again in 3.1
sLog.outDebug("rating change: %d", bg->m_ArenaTeamRatingChanges[i]);
}
for(int i = 1; i >= 0; --i)
@@ -1821,7 +1822,7 @@ void BattleGroundMgr::DistributeArenaPoints()
sWorld.SendWorldText(LANG_DIST_ARENA_POINTS_END);
}
-void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player* plr, BattleGroundTypeId bgTypeId)
+void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player* plr, BattleGroundTypeId bgTypeId, uint8 fromWhere)
{
if (!plr)
return;
@@ -1831,15 +1832,16 @@ void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint6
data->Initialize(SMSG_BATTLEFIELD_LIST);
*data << uint64(guid); // battlemaster guid
+ *data << uint8(fromWhere); // from where you joined
*data << uint32(bgTypeId); // battleground id
if(bgTypeId == BATTLEGROUND_AA) // arena
{
- *data << uint8(5); // unk
- *data << uint32(0); // unk
+ *data << uint8(4); // unk
+ *data << uint32(0); // unk (count?)
}
else // battleground
{
- *data << uint8(0x00); // unk
+ *data << uint8(0x00); // unk, different for each bg type
size_t count_pos = data->wpos();
uint32 count = 0;
diff --git a/src/game/BattleGroundMgr.h b/src/game/BattleGroundMgr.h
index 8d6bd06b020..9c38fea1ad4 100644
--- a/src/game/BattleGroundMgr.h
+++ b/src/game/BattleGroundMgr.h
@@ -188,7 +188,7 @@ class BattleGroundMgr
/* Packet Building */
void BuildPlayerJoinedBattleGroundPacket(WorldPacket *data, Player *plr);
void BuildPlayerLeftBattleGroundPacket(WorldPacket *data, const uint64& guid);
- void BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player *plr, BattleGroundTypeId bgTypeId);
+ void BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player *plr, BattleGroundTypeId bgTypeId, uint8 fromWhere);
void BuildGroupJoinedBattlegroundPacket(WorldPacket *data, BattleGroundTypeId bgTypeId);
void BuildUpdateWorldStatePacket(WorldPacket *data, uint32 field, uint32 value);
void BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg);
diff --git a/src/game/CalendarHandler.cpp b/src/game/CalendarHandler.cpp
index 348cd5297c9..0ba22304fb5 100644
--- a/src/game/CalendarHandler.cpp
+++ b/src/game/CalendarHandler.cpp
@@ -75,78 +75,171 @@ void WorldSession::HandleCalendarGetEvent(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_GET_EVENT");
recv_data.hexlike();
+ //uint64 unk1;
+ //recv_data >> (uint64)unk1;
}
void WorldSession::HandleCalendarGuildFilter(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_GUILD_FILTER");
recv_data.hexlike();
+ //uint32 unk1, unk2, unk3;
+ //recv_data >> (uint32)unk1;
+ //recv_data >> (uint32)unk2;
+ //recv_data >> (uint32)unk3;
}
void WorldSession::HandleCalendarArenaTeam(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_ARENA_TEAM");
recv_data.hexlike();
+ //uint32 unk;
+ //recv_data >> (uint32)unk;
+
}
void WorldSession::HandleCalendarAddEvent(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_ADD_EVENT");
recv_data.hexlike();
+
+ //std::string unk1, unk2;
+ //recv_data >> (std::string)unk1;
+ //recv_data >> (std::string)unk2;
+
+ //uint8 unk3, unk4;
+ //uint32 unk5, unk6, unk7, unk8, unk9, count = 0;
+ //recv_data >> (uint8)unk3;
+ //recv_data >> (uint8)unk4;
+ //recv_data >> (uint32)unk5;
+ //recv_data >> (uint32)unk6;
+ //recv_data >> (uint32)unk7;
+ //recv_data >> (uint32)unk8;
+ //recv_data >> (uint32)unk9;
+ //if (!((unk9 >> 6) & 1))
+ //{
+ // recv_data >> (uint32)count;
+ // if (count)
+ // {
+ // uint8 unk12,unk13;
+ // uint64 guid;
+ // for (int i=0;i<count;i++)
+ // {
+ // recv_data.readPackGUID(guid);
+ // recv_data >> (uint8)unk12;
+ // recv_data >> (uint8)unk13;
+ // }
+ // }
+ //}
}
void WorldSession::HandleCalendarUpdateEvent(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_UPDATE_EVENT");
recv_data.hexlike();
+
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> std::string
+ //recv_data >> std::string
+ //recv_data >> uint8
+ //recv_data >> uint8
+ //recv_data >> uint32
+ //recv_data >> uint32
+ //recv_data >> uint32
+ //recv_data >> uint32
+ //recv_data >> uint32
}
void WorldSession::HandleCalendarRemoveEvent(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_REMOVE_EVENT");
recv_data.hexlike();
+
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> uint32
+
}
void WorldSession::HandleCalendarCopyEvent(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_COPY_EVENT");
recv_data.hexlike();
+
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> uint32
+
}
void WorldSession::HandleCalendarEventInvite(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_INVITE");
recv_data.hexlike();
+
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> std::string
+ //recv_data >> uint8
+ //recv_data >> uint8
+
}
void WorldSession::HandleCalendarEventRsvp(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_RSVP");
recv_data.hexlike();
+
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> uint32
+
}
void WorldSession::HandleCalendarEventRemoveInvite(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_REMOVE_INVITE");
recv_data.hexlike();
+
+ //recv_data.readPackGUID(guid)
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> uint64
}
void WorldSession::HandleCalendarEventStatus(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_STATUS");
recv_data.hexlike();
+
+ //recv_data.readPackGUID(guid)
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> uint32
}
void WorldSession::HandleCalendarEventModeratorStatus(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_MODERATOR_STATUS");
recv_data.hexlike();
+
+ //recv_data.readPackGUID(guid)
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> uint32
}
void WorldSession::HandleCalendarComplain(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: CMSG_CALENDAR_COMPLAIN");
recv_data.hexlike();
+
+ //recv_data >> uint64
+ //recv_data >> uint64
+ //recv_data >> uint64
}
void WorldSession::HandleCalendarGetNumPending(WorldPacket &recv_data)
diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp
index e8a0e2b6bf1..7e4b047b095 100644
--- a/src/game/CharacterHandler.cpp
+++ b/src/game/CharacterHandler.cpp
@@ -71,7 +71,6 @@ bool LoginQueryHolder::Initialize()
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADSPELLS, "SELECT spell,active,disabled FROM character_spell WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS, "SELECT quest,status,rewarded,explored,timer,mobcount1,mobcount2,mobcount3,mobcount4,itemcount1,itemcount2,itemcount3,itemcount4 FROM character_queststatus WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS,"SELECT quest,time FROM character_queststatus_daily WHERE guid = '%u'", GUID_LOPART(m_guid));
- res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADTUTORIALS, "SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u' AND realmid = '%u'", GetAccountId(), realmID);
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADREPUTATION, "SELECT faction,standing,flags FROM character_reputation WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADINVENTORY, "SELECT data,bag,slot,item,item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '%u' ORDER BY bag,slot", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACTIONS, "SELECT button,action,type,misc FROM character_action WHERE guid = '%u' ORDER BY button", GUID_LOPART(m_guid));
@@ -87,6 +86,7 @@ bool LoginQueryHolder::Initialize()
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, personal_rating FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS,"SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = '%u'", GUID_LOPART(m_guid));
+ res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid));
return res;
}
@@ -735,7 +735,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
ObjectAccessor::Instance().AddObject(pCurrChar);
//sLog.outDebug("Player %s added to Map.",pCurrChar->GetName());
- pCurrChar->GetSocial()->SendSocialList();
pCurrChar->SendInitialPacketsAfterAddToMap();
@@ -904,9 +903,7 @@ void WorldSession::HandleMeetingStoneInfo( WorldPacket & /*recv_data*/ )
{
DEBUG_LOG( "WORLD: Received CMSG_MEETING_STONE_INFO" );
- WorldPacket data(SMSG_MEETINGSTONE_SETQUEUE, 5);
- data << uint32(0) << uint8(6);
- SendPacket(&data);
+ SendLfgUpdate(0, 0, 0);
}
void WorldSession::HandleTutorialFlag( WorldPacket & recv_data )
@@ -924,9 +921,9 @@ void WorldSession::HandleTutorialFlag( WorldPacket & recv_data )
}
uint32 rInt = (iFlag % 32);
- uint32 tutflag = GetPlayer()->GetTutorialInt( wInt );
+ uint32 tutflag = GetTutorialInt( wInt );
tutflag |= (1 << rInt);
- GetPlayer()->SetTutorialInt( wInt, tutflag );
+ SetTutorialInt( wInt, tutflag );
//sLog.outDebug("Received Tutorial Flag Set {%u}.", iFlag);
}
@@ -934,13 +931,13 @@ void WorldSession::HandleTutorialFlag( WorldPacket & recv_data )
void WorldSession::HandleTutorialClear( WorldPacket & /*recv_data*/ )
{
for (int i = 0; i < 8; ++i)
- GetPlayer()->SetTutorialInt( i, 0xFFFFFFFF );
+ SetTutorialInt( i, 0xFFFFFFFF );
}
void WorldSession::HandleTutorialReset( WorldPacket & /*recv_data*/ )
{
for (int i = 0; i < 8; ++i)
- GetPlayer()->SetTutorialInt( i, 0x00000000 );
+ SetTutorialInt( i, 0x00000000 );
}
void WorldSession::HandleSetWatchedFactionOpcode(WorldPacket & recv_data)
@@ -1219,6 +1216,7 @@ void WorldSession::HandleRemoveGlyph( WorldPacket & recv_data )
{
_player->RemoveAurasDueToSpell(gp->SpellId);
_player->SetGlyph(slot, 0);
+ _player->SendTalentsInfoData(false);
}
}
}
@@ -1317,3 +1315,116 @@ void WorldSession::HandleCharCustomize(WorldPacket& recv_data)
data << uint8(facialHair);
SendPacket(&data);
}
+
+void WorldSession::HandleEquipmentSetSave(WorldPacket &recv_data)
+{
+ sLog.outDebug("CMSG_EQUIPMENT_SET_SAVE");
+
+ uint64 setGuid;
+ if(!recv_data.readPackGUID(setGuid))
+ return;
+
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos() + 4);
+
+ uint32 index;
+ recv_data >> index;
+ if(index >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount
+ return;
+
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos() + 1);
+ std::string name;
+ recv_data >> name;
+
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos() + 1);
+ std::string iconName;
+ recv_data >> iconName;
+
+ EquipmentSet eqSet;
+
+ eqSet.Guid = setGuid;
+ eqSet.Name = name;
+ eqSet.IconName = iconName;
+ eqSet.state = EQUIPMENT_SET_NEW;
+
+ for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ {
+ uint64 itemGuid;
+ if(!recv_data.readPackGUID(itemGuid))
+ return;
+
+ Item *item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
+
+ if(!item && itemGuid) // cheating check 1
+ return;
+
+ if(item && item->GetGUID() != itemGuid) // cheating check 2
+ return;
+
+ eqSet.Items[i] = GUID_LOPART(itemGuid);
+ }
+
+ _player->SetEquipmentSet(index, eqSet);
+}
+
+void WorldSession::HandleEquipmentSetDelete(WorldPacket &recv_data)
+{
+ sLog.outDebug("CMSG_EQUIPMENT_SET_DELETE");
+
+ uint64 setGuid;
+ if(!recv_data.readPackGUID(setGuid))
+ return;
+
+ _player->DeleteEquipmentSet(setGuid);
+}
+
+void WorldSession::HandleEquipmentSetUse(WorldPacket &recv_data)
+{
+ sLog.outDebug("CMSG_EQUIPMENT_SET_USE");
+ recv_data.hexlike();
+
+ for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ {
+ uint64 itemGuid;
+ if(!recv_data.readPackGUID(itemGuid))
+ return;
+
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1+1);
+
+ uint8 srcbag, srcslot;
+ recv_data >> srcbag >> srcslot;
+
+ sLog.outDebug("Item " I64FMT ": srcbag %u, srcslot %u", itemGuid, srcbag, srcslot);
+
+ Item *item = _player->GetItemByGuid(itemGuid);
+
+ uint16 dstpos = i | (INVENTORY_SLOT_BAG_0 << 8);
+
+ if(!item)
+ {
+ Item *uItem = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
+ if(!uItem)
+ continue;
+
+ ItemPosCountVec sDest;
+ uint8 msg = _player->CanStoreItem( NULL_BAG, NULL_SLOT, sDest, uItem, false );
+ if(msg == EQUIP_ERR_OK)
+ {
+ _player->RemoveItem(INVENTORY_SLOT_BAG_0, i, true);
+ _player->StoreItem( sDest, uItem, true );
+ }
+ else
+ _player->SendEquipError(msg, uItem, NULL);
+
+ continue;
+ }
+
+ if(item->GetPos() == dstpos)
+ continue;
+
+ _player->SwapItem(item->GetPos(), dstpos);
+ }
+
+ WorldPacket data(SMSG_EQUIPMENT_SET_USE_RESULT, 1);
+ data << uint8(0); // 4 - equipment swap failed - inventory is full
+ SendPacket(&data);
+}
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 527406a76d1..6c40999d652 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -1203,6 +1203,7 @@ void ChatHandler::FillMessageData( WorldPacket *data, WorldSession* session, uin
case CHAT_MSG_MONSTER_EMOTE:
case CHAT_MSG_RAID_BOSS_WHISPER:
case CHAT_MSG_RAID_BOSS_EMOTE:
+ case CHAT_MSG_BN:
{
*data << uint64(speaker->GetGUID());
*data << uint32(0); // 2.1.0
diff --git a/src/game/Corpse.cpp b/src/game/Corpse.cpp
index 5ed90eaf411..9fe54be1bec 100644
--- a/src/game/Corpse.cpp
+++ b/src/game/Corpse.cpp
@@ -32,8 +32,8 @@ Corpse::Corpse(CorpseType type) : WorldObject()
{
m_objectType |= TYPEMASK_CORPSE;
m_objectTypeId = TYPEID_CORPSE;
- // 2.3.2 - 0x58
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
+
+ m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION);
m_valuesCount = CORPSE_END;
@@ -88,10 +88,6 @@ bool Corpse::Create( uint32 guidlow, Player *owner)
}
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() );
m_grid = Trinity::ComputeGridPair(GetPositionX(), GetPositionY());
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index f31dcbf4df7..f540c099c3b 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -151,8 +151,8 @@ m_creatureInfo(NULL), m_reactState(REACT_AGGRESSIVE), m_formation(NULL), m_summo
m_CreatureSpellCooldowns.clear();
m_CreatureCategoryCooldowns.clear();
m_GlobalCooldown = 0;
- m_unit_movement_flags = MOVEMENTFLAG_WALK_MODE;
DisableReputationGain = false;
+ //m_unit_movement_flags = MONSTER_MOVE_WALK;
}
Creature::~Creature()
diff --git a/src/game/Creature.h b/src/game/Creature.h
index 7ec203d8f3b..c1825441b63 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -177,6 +177,8 @@ struct CreatureInfo
{
uint32 Entry;
uint32 HeroicEntry;
+ uint32 unk1;
+ uint32 unk2;
uint32 Modelid_A1;
uint32 Modelid_A2;
uint32 Modelid_H1;
@@ -237,6 +239,8 @@ struct CreatureInfo
float unk16;
float unk17;
bool RacialLeader;
+ uint32 questItems[4];
+ uint32 movementId;
bool RegenHealth;
uint32 equipmentId;
uint32 MechanicImmuneMask;
diff --git a/src/game/DBCStores.cpp b/src/game/DBCStores.cpp
index ff193abaad6..639489b1173 100644
--- a/src/game/DBCStores.cpp
+++ b/src/game/DBCStores.cpp
@@ -133,9 +133,6 @@ TalentSpellPosMap sTalentSpellPosMap;
DBCStorage <TalentTabEntry> sTalentTabStore(TalentTabEntryfmt);
// store absolute bit position for first rank for talent inspect
-typedef std::map<uint32,uint32> TalentInspectMap;
-static TalentInspectMap sTalentPosInInspect;
-static TalentInspectMap sTalentTabSizeInInspect;
static uint32 sTalentTabPages[12/*MAX_CLASSES*/][3];
DBCStorage <TaxiNodesEntry> sTaxiNodesStore(TaxiNodesEntryfmt);
@@ -390,34 +387,6 @@ void LoadDBCStores(const std::string& dataPath)
// prepare fast data access to bit pos of talent ranks for use at inspecting
{
- // fill table by amount of talent ranks and fill sTalentTabBitSizeInInspect
- // store in with (row,col,talent)->size key for correct sorting by (row,col)
- typedef std::map<uint32,uint32> TalentBitSize;
- TalentBitSize sTalentBitSize;
- for(uint32 i = 1; i < sTalentStore.GetNumRows(); ++i)
- {
- TalentEntry const *talentInfo = sTalentStore.LookupEntry(i);
- if (!talentInfo) continue;
-
- TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry( talentInfo->TalentTab );
- if(!talentTabInfo)
- continue;
-
- // find talent rank
- uint32 curtalent_maxrank = 0;
- for(uint32 k = MAX_TALENT_RANK; k > 0; --k)
- {
- if(talentInfo->RankID[k-1])
- {
- curtalent_maxrank = k;
- break;
- }
- }
-
- sTalentBitSize[(talentInfo->Row<<24) + (talentInfo->Col<<16)+talentInfo->TalentID] = curtalent_maxrank;
- sTalentTabSizeInInspect[talentInfo->TalentTab] += curtalent_maxrank;
- }
-
// now have all max ranks (and then bit amount used for store talent ranks in inspect)
for(uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
{
@@ -434,22 +403,6 @@ void LoadDBCStores(const std::string& dataPath)
for(uint32 m=1;!(m & talentTabInfo->ClassMask) && cls < MAX_CLASSES;m <<=1, ++cls) {}
sTalentTabPages[cls][talentTabInfo->tabpage]=talentTabId;
-
- // add total amount bits for first rank starting from talent tab first talent rank pos.
- uint32 pos = 0;
- for(TalentBitSize::iterator itr = sTalentBitSize.begin(); itr != sTalentBitSize.end(); ++itr)
- {
- uint32 talentId = itr->first & 0xFFFF;
- TalentEntry const *talentInfo = sTalentStore.LookupEntry( talentId );
- if(!talentInfo)
- continue;
-
- if(talentInfo->TalentTab != talentTabId)
- continue;
-
- sTalentPosInInspect[talentId] = pos;
- pos+= itr->second;
- }
}
}
@@ -553,13 +506,13 @@ void LoadDBCStores(const std::string& dataPath)
}
// Check loaded DBC files proper version
- if( !sSpellStore.LookupEntry(62735) || // last added spell in 3.0.9
- !sMapStore.LookupEntry(624) || // last map added in 3.0.8a/3.0.9
- !sGemPropertiesStore.LookupEntry(1557) || // last gem property added in 3.0.8a/3.0.9
- !sItemExtendedCostStore.LookupEntry(2589) || // last item extended cost added in 3.0.8a/3.0.9
- !sCharTitlesStore.LookupEntry(144) || // last char title added in 3.0.8a/3.0.9
- !sAreaStore.LookupEntry(2769) || // last area (areaflag) added in 3.0.8a/3.0.9
- !sItemStore.LookupEntry(45037) ) // last client known item added in 3.0.9
+ if( !sSpellStore.LookupEntry(66530) || // last added spell in 3.1.3
+ !sMapStore.LookupEntry(624) || // last map added in 3.1.3
+ !sGemPropertiesStore.LookupEntry(1609) || // last gem property added in 3.1.3
+ !sItemExtendedCostStore.LookupEntry(2671) || // last item extended cost added in 3.1.3
+ !sCharTitlesStore.LookupEntry(166) || // last char title added in 3.1.3
+ !sAreaStore.LookupEntry(2905) || // last area (areaflag) added in 3.1.3
+ !sItemStore.LookupEntry(46894) ) // last client known item added in 3.1.3
{
sLog.outError("\nYou have _outdated_ DBC files. Please extract correct versions from current using client.");
exit(1);
@@ -729,24 +682,6 @@ void Map2ZoneCoordinates(float& x,float& y,uint32 zone)
std::swap(x,y); // client have map coords swapped
}
-uint32 GetTalentInspectBitPosInTab(uint32 talentId)
-{
- TalentInspectMap::const_iterator itr = sTalentPosInInspect.find(talentId);
- if(itr == sTalentPosInInspect.end())
- return 0;
-
- return itr->second;
-}
-
-uint32 GetTalentTabInspectBitSize(uint32 talentTabId)
-{
- TalentInspectMap::const_iterator itr = sTalentTabSizeInInspect.find(talentTabId);
- if(itr == sTalentTabSizeInInspect.end())
- return 0;
-
- return itr->second;
-}
-
uint32 const* GetTalentTabPages(uint32 cls)
{
return sTalentTabPages[cls];
diff --git a/src/game/DBCStores.h b/src/game/DBCStores.h
index 4da1911a0b7..a423cd0bfc8 100644
--- a/src/game/DBCStores.h
+++ b/src/game/DBCStores.h
@@ -54,8 +54,6 @@ bool IsTotemCategoryCompatiableWith(uint32 itemTotemCategoryId, uint32 requiredT
void Zone2MapCoordinates(float& x,float& y,uint32 zone);
void Map2ZoneCoordinates(float& x,float& y,uint32 zone);
-uint32 GetTalentInspectBitPosInTab(uint32 talentId);
-uint32 GetTalentTabInspectBitSize(uint32 talentTabId);
uint32 const* /*[3]*/ GetTalentTabPages(uint32 cls);
extern DBCStorage <AchievementEntry> sAchievementStore;
diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h
index a19fa059715..cfc12510095 100644
--- a/src/game/DBCStructure.h
+++ b/src/game/DBCStructure.h
@@ -592,6 +592,7 @@ struct BattlemasterListEntry
char* name[16]; // 16-31
// 32 string flag, unused
// 33 unused
+ //uint32 unk; // 34 new 3.1
};
#define MAX_OUTFIT_ITEMS 24
@@ -979,6 +980,7 @@ struct HolidaysEntry
//uint32 unk51; // 51
//uint32 unk52; // 52
//uint32 unk53; // 53
+ //uint32 unk54; // 54
};
struct ItemEntry
@@ -1310,6 +1312,7 @@ struct SoundEntriesEntry
// 26 m_minDistance
// 27 m_distanceCutoff
// 28 m_EAXDef
+ // 29 new in 3.1
};
#define MAX_SPELL_EFFECTS 3
@@ -1420,6 +1423,7 @@ struct SpellEntry
uint32 SchoolMask; // 228 m_schoolMask
uint32 runeCostID; // 229 m_runeCostID
//uint32 spellMissileID; // 230 m_spellMissileID not used
+ //uint32 PowerDisplayId; // 231 PowerDisplay.dbc, new in 3.1
// helpers
int32 CalculateSimpleValue(uint8 eff) const { return EffectBasePoints[eff]+int32(EffectBaseDice[eff]); }
@@ -1529,6 +1533,7 @@ struct SpellItemEnchantmentEntry
uint32 EnchantmentCondition; // 34 m_condition_id
//uint32 requiredSkill; // 35 m_requiredSkillID
//uint32 requiredSkillValue; // 36 m_requiredSkillRank
+ // 37 new in 3.1
};
struct SpellItemEnchantmentConditionEntry
@@ -1648,25 +1653,28 @@ struct VehicleEntry
float m_cameraFadeDistScalarMin; // 15
float m_cameraFadeDistScalarMax; // 16
float m_cameraPitchOffset; // 17
- int m_powerType[3]; // 18-20
- int m_powerToken[3]; // 21-23
- float m_facingLimitRight; // 24
- float m_facingLimitLeft; // 25
- float m_msslTrgtTurnLingering; // 26
- float m_msslTrgtPitchLingering; // 27
- float m_msslTrgtMouseLingering; // 28
- float m_msslTrgtEndOpacity; // 29
- float m_msslTrgtArcSpeed; // 30
- float m_msslTrgtArcRepeat; // 31
- float m_msslTrgtArcWidth; // 32
- float m_msslTrgtImpactRadius[2]; // 33-34
- char* m_msslTrgtArcTexture; // 35
- char* m_msslTrgtImpactTexture; // 36
- char* m_msslTrgtImpactModel[2]; // 37-38
- float m_cameraYawOffset; // 39
- uint32 m_uiLocomotionType; // 40
- float m_msslTrgtImpactTexRadius; // 41
- uint32 m_uiSeatIndicatorType; // 42
+ //int m_powerType[3]; // removed in 3.1
+ //int m_powerToken[3]; // removed in 3.1
+ float m_facingLimitRight; // 18
+ float m_facingLimitLeft; // 19
+ float m_msslTrgtTurnLingering; // 20
+ float m_msslTrgtPitchLingering; // 21
+ float m_msslTrgtMouseLingering; // 22
+ float m_msslTrgtEndOpacity; // 23
+ float m_msslTrgtArcSpeed; // 24
+ float m_msslTrgtArcRepeat; // 25
+ float m_msslTrgtArcWidth; // 26
+ float m_msslTrgtImpactRadius[2]; // 27-28
+ char* m_msslTrgtArcTexture; // 29
+ char* m_msslTrgtImpactTexture; // 30
+ char* m_msslTrgtImpactModel[2]; // 31-32
+ float m_cameraYawOffset; // 33
+ uint32 m_uiLocomotionType; // 34
+ float m_msslTrgtImpactTexRadius; // 35
+ uint32 m_uiSeatIndicatorType; // 36
+ // 37, new in 3.1
+ // 38, new in 3.1
+ // 39, new in 3.1
};
struct VehicleSeatEntry
@@ -1717,6 +1725,7 @@ struct VehicleSeatEntry
uint32 m_exitUISoundID; // 43
int32 m_uiSkin; // 44
uint32 m_flagsB; // 45
+ // 46-57 added in 3.1, floats mostly
bool IsUsable() const { return m_flags & 0x2000000; }
};
diff --git a/src/game/DBCfmt.h b/src/game/DBCfmt.h
index a6a4c1027d2..6522a85406a 100644
--- a/src/game/DBCfmt.h
+++ b/src/game/DBCfmt.h
@@ -30,7 +30,7 @@ const char AreaTriggerEntryfmt[]="niffffffff";
const char AuctionHouseEntryfmt[]="niiixxxxxxxxxxxxxxxxx";
const char BankBagSlotPricesEntryfmt[]="ni";
const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii";
-const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxx";
+const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxxx";
const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi";
const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx";
@@ -63,7 +63,7 @@ const char GtOCTRegenHPfmt[]="f";
//const char GtOCTRegenMPfmt[]="f";
const char GtRegenHPPerSptfmt[]="f";
const char GtRegenMPPerSptfmt[]="f";
-const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char Itemfmt[]="niiiiiii";
const char ItemBagFamilyfmt[]="nxxxxxxxxxxxxxxxxx";
//const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx";
@@ -83,12 +83,12 @@ const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiii";
const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiii";
const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxi";
const char SkillLineAbilityfmt[]="niiiixxiiiiixx";
-const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char SpellCastTimefmt[]="nixx";
const char SpellDurationfmt[]="niii";
-const char SpellEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiix";
+const char SpellEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiixx";
const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx";
-const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixx";
+const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixxx";
const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX";
const char SpellRadiusfmt[]="nfxf";
const char SpellRangefmt[]="nffffixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
@@ -102,8 +102,8 @@ const char TaxiNodesEntryfmt[]="nifffssssssssssssssssxii";
const char TaxiPathEntryfmt[]="niii";
const char TaxiPathNodeEntryfmt[]="diiifffiixx";
const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii";
-const char VehicleEntryfmt[]="niffffiiiiiiiiffffiiiiiifffffffffffssssfifi";
-const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiii";
+const char VehicleEntryfmt[]="niffffiiiiiiiifffffffffffffffssssfifixxx";
+const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiixxxxxxxxxxxx";
const char WorldMapAreaEntryfmt[]="xinxffffix";
const char WorldMapOverlayEntryfmt[]="nxiiiixxxxxxxxxxx";
const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxxxxxxxxxx";
diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp
index f5fe91a3e11..dc2b05e8d6a 100644
--- a/src/game/DynamicObject.cpp
+++ b/src/game/DynamicObject.cpp
@@ -32,8 +32,8 @@ DynamicObject::DynamicObject() : WorldObject()
{
m_objectType |= TYPEMASK_DYNAMICOBJECT;
m_objectTypeId = TYPEID_DYNAMICOBJECT;
- // 2.3.2 - 0x58
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
+
+ m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
m_valuesCount = DYNAMICOBJECT_END;
}
diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp
index 106c41f720e..30d84ac4291 100644
--- a/src/game/GameObject.cpp
+++ b/src/game/GameObject.cpp
@@ -44,8 +44,8 @@ GameObject::GameObject() : WorldObject(), m_goValue(new GameObjectValue)
{
m_objectType |= TYPEMASK_GAMEOBJECT;
m_objectTypeId = TYPEID_GAMEOBJECT;
- // 2.3.2 - 0x58
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
+
+ m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION | UPDATEFLAG_ROTATION);
m_valuesCount = GAMEOBJECT_END;
m_respawnTime = 0;
@@ -60,6 +60,7 @@ GameObject::GameObject() : WorldObject(), m_goValue(new GameObjectValue)
m_goData = NULL;
m_DBTableGuid = 0;
+ m_rotation = 0;
}
GameObject::~GameObject()
@@ -144,10 +145,6 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
return false;
}
- SetFloatValue(GAMEOBJECT_POS_X, x);
- SetFloatValue(GAMEOBJECT_POS_Y, y);
- SetFloatValue(GAMEOBJECT_POS_Z, z);
-
SetFloatValue(GAMEOBJECT_PARENTROTATION+0, rotation0);
SetFloatValue(GAMEOBJECT_PARENTROTATION+1, rotation1);
@@ -530,10 +527,10 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
data.id = GetEntry();
data.mapid = mapid;
data.phaseMask = phaseMask;
- data.posX = GetFloatValue(GAMEOBJECT_POS_X);
- data.posY = GetFloatValue(GAMEOBJECT_POS_Y);
- data.posZ = GetFloatValue(GAMEOBJECT_POS_Z);
- data.orientation = GetFloatValue(GAMEOBJECT_FACING);
+ data.posX = GetPositionX();
+ data.posY = GetPositionY();
+ data.posZ = GetPositionZ();
+ data.orientation = GetOrientation();
data.rotation0 = GetFloatValue(GAMEOBJECT_PARENTROTATION+0);
data.rotation1 = GetFloatValue(GAMEOBJECT_PARENTROTATION+1);
data.rotation2 = GetFloatValue(GAMEOBJECT_PARENTROTATION+2);
@@ -552,10 +549,10 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
<< mapid << ", "
<< uint32(spawnMask) << "," // cast to prevent save as symbol
<< uint16(GetPhaseMask()) << "," // prevent out of range error
- << GetFloatValue(GAMEOBJECT_POS_X) << ", "
- << GetFloatValue(GAMEOBJECT_POS_Y) << ", "
- << GetFloatValue(GAMEOBJECT_POS_Z) << ", "
- << GetFloatValue(GAMEOBJECT_FACING) << ", "
+ << GetPositionX() << ", "
+ << GetPositionY() << ", "
+ << GetPositionZ() << ", "
+ << GetOrientation() << ", "
<< GetFloatValue(GAMEOBJECT_PARENTROTATION) << ", "
<< GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ", "
<< GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ", "
@@ -662,8 +659,6 @@ uint32 GameObject::GetLootId(GameObjectInfo const* ginfo)
return ginfo->chest.lootId;
case GAMEOBJECT_TYPE_FISHINGHOLE:
return ginfo->fishinghole.lootId;
- case GAMEOBJECT_TYPE_FISHINGNODE:
- return ginfo->fishnode.lootId;
default:
return 0;
}
@@ -1503,14 +1498,21 @@ void GameObject::UpdateRotationFields(float rotation2 /*=0.0f*/, float rotation3
{
static double const atan_pow = atan(pow(2.0f, -20.0f));
- SetFloatValue(GAMEOBJECT_FACING, GetOrientation());
-
double f_rot1 = sin(GetOrientation() / 2.0f);
double f_rot2 = cos(GetOrientation() / 2.0f);
int64 i_rot1 = int64(f_rot1 / atan_pow *(f_rot2 >= 0 ? 1.0f : -1.0f));
int64 rotation = (i_rot1 << 43 >> 43) & 0x00000000001FFFFF;
- SetUInt64Value(GAMEOBJECT_ROTATION, rotation);
+
+ //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)
{
diff --git a/src/game/GameObject.h b/src/game/GameObject.h
index bcfdd93c99d..43f8fb0ea5f 100644
--- a/src/game/GameObject.h
+++ b/src/game/GameObject.h
@@ -43,9 +43,11 @@ struct GameObjectInfo
char *name;
char *IconName;
char *castBarCaption;
+ char *unk1;
uint32 faction;
uint32 flags;
float size;
+ uint32 questItems[4];
union // different GO types have different data field
{
//0 GAMEOBJECT_TYPE_DOOR
@@ -57,6 +59,7 @@ struct GameObjectInfo
uint32 noDamageImmune; //3 break opening whenever you recieve damage?
uint32 openTextID; //4 can be used to replace castBarCaption?
uint32 closeTextID; //5
+ uint32 ignoredByPathing; //6
} door;
//1 GAMEOBJECT_TYPE_BUTTON
struct
@@ -104,6 +107,7 @@ struct GameObjectInfo
uint32 logLoot; //13
uint32 openTextID; //14 can be used to replace castBarCaption?
uint32 groupLootRules; //15
+ uint32 floatingTooltip; //16
} chest;
//4 GAMEOBJECT_TYPE_BINDER - empty
//5 GAMEOBJECT_TYPE_GENERIC
@@ -133,6 +137,7 @@ struct GameObjectInfo
uint32 stealthAffected; //11
uint32 openTextID; //12 can be used to replace castBarCaption?
uint32 closeTextID; //13
+ uint32 ignoreTotems; //14
} trap;
//7 GAMEOBJECT_TYPE_CHAIR
struct
@@ -140,6 +145,7 @@ struct GameObjectInfo
uint32 slots; //0
uint32 height; //1
uint32 onlyCreatorUse; //2
+ uint32 triggeredEvent; //3
} chair;
//8 GAMEOBJECT_TYPE_SPELL_FOCUS
struct
@@ -150,6 +156,7 @@ struct GameObjectInfo
uint32 serverOnly; //3
uint32 questID; //4
uint32 large; //5
+ uint32 floatingTooltip; //6
} spellFocus;
//9 GAMEOBJECT_TYPE_TEXT
struct
@@ -180,6 +187,9 @@ struct GameObjectInfo
uint32 closeTextID; //15
uint32 losOK; //16 isBattlegroundObject
uint32 allowMounted; //17
+ uint32 floatingTooltip; //18
+ uint32 gossipID; //19
+ uint32 WorldStateSetsState; //20
} goober;
//11 GAMEOBJECT_TYPE_TRANSPORT
struct
@@ -187,6 +197,8 @@ struct GameObjectInfo
uint32 pause; //0
uint32 startOpen; //1
uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
+ uint32 pause1EventID; //3
+ uint32 pause2EventID; //4
} transport;
//12 GAMEOBJECT_TYPE_AREADAMAGE
struct
@@ -219,14 +231,10 @@ struct GameObjectInfo
uint32 stopEventID; //4
uint32 transportPhysics; //5
uint32 mapID; //6
+ uint32 worldState1; //7
} moTransport;
//16 GAMEOBJECT_TYPE_DUELFLAG - empty
- //17 GAMEOBJECT_TYPE_FISHINGNODE
- struct
- {
- uint32 _data0; //0
- uint32 lootId; //1
- } fishnode;
+ //17 GAMEOBJECT_TYPE_FISHINGNODE - empty
//18 GAMEOBJECT_TYPE_SUMMONING_RITUAL
struct
{
@@ -240,11 +248,7 @@ struct GameObjectInfo
uint32 ritualNoTargetCheck; //7
} summoningRitual;
//19 GAMEOBJECT_TYPE_MAILBOX - empty
- //20 GAMEOBJECT_TYPE_AUCTIONHOUSE
- struct
- {
- uint32 actionHouseID; //0
- } auctionhouse;
+ //20 GAMEOBJECT_TYPE_DONOTUSE - empty
//21 GAMEOBJECT_TYPE_GUARDPOST
struct
{
@@ -257,6 +261,8 @@ struct GameObjectInfo
uint32 spellId; //0
uint32 charges; //1
uint32 partyOnly; //2
+ uint32 allowMounted; //3
+ uint32 large; //4
} spellcaster;
//23 GAMEOBJECT_TYPE_MEETINGSTONE
struct
@@ -323,6 +329,8 @@ struct GameObjectInfo
uint32 maxTime; //17
uint32 large; //18
uint32 highlight; //19
+ uint32 startingValue; //20
+ uint32 unidirectional; //21
} capturePoint;
//30 GAMEOBJECT_TYPE_AURA_GENERATOR
struct
@@ -361,6 +369,19 @@ struct GameObjectInfo
uint32 empty5; //8
uint32 damagedEvent; //9
uint32 destroyedDisplayId; //10
+ uint32 empty7; //11
+ uint32 empty8; //12
+ uint32 empty9; //13
+ uint32 destroyedEvent; //14
+ uint32 empty10; //15
+ uint32 debuildingTimeSecs; //16
+ uint32 empty11; //17
+ uint32 destructibleData; //18
+ uint32 rebuildingEvent; //19
+ uint32 empty12; //20
+ uint32 empty13; //21
+ uint32 damageEvent; //22
+ uint32 empty14; //23
} building;
//34 GAMEOBJECT_TYPE_GUILDBANK - empty
//35 GAMEOBJECT_TYPE_TRAPDOOR
@@ -651,6 +672,8 @@ class TRINITY_DLL_SPEC GameObject : public WorldObject
void Rebuild();
void EventInform(uint32 eventId);
+
+ uint64 GetRotation() const { return m_rotation; }
protected:
uint32 m_charges; // Spell charges for GAMEOBJECT_TYPE_SPELLCASTER (22)
uint32 m_spellId;
@@ -669,6 +692,8 @@ class TRINITY_DLL_SPEC GameObject : public WorldObject
GameObjectInfo const* m_goInfo;
GameObjectData const* m_goData;
GameObjectValue * const m_goValue;
+
+ uint64 m_rotation;
private:
void SwitchDoorOrButton(bool activate, bool alternative = false);
diff --git a/src/game/GossipDef.cpp b/src/game/GossipDef.cpp
index 2e98e8c4e06..cd633f6ab8b 100644
--- a/src/game/GossipDef.cpp
+++ b/src/game/GossipDef.cpp
@@ -130,7 +130,7 @@ void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID )
data << uint64(npcGUID);
data << uint32(0); // new 2.4.0
data << uint32( TitleTextId );
- data << uint32( mGossipMenu.MenuItemCount() ); // max count 0x0F
+ data << uint32( mGossipMenu.MenuItemCount() ); // max count 0x10
for (uint32 iI = 0; iI < mGossipMenu.MenuItemCount(); ++iI )
{
@@ -454,6 +454,7 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID
data << uint32(ActivateAccept);
data << uint32(pQuest->GetSuggestedPlayers());
data << uint8(0); // new wotlk
+ data << uint8(0); // new 3.1
if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
{
@@ -749,8 +750,7 @@ void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID
}
}
- // We may wish a better check, perhaps checking the real quest requirements
- if (RequestItemsText.empty())
+ if (!pQuest->GetReqItemsCount() && Completable)
{
SendQuestGiverOfferReward(pQuest, npcGUID, true);
return;
diff --git a/src/game/Item.cpp b/src/game/Item.cpp
index 3be555cbaba..bffd3c0d335 100644
--- a/src/game/Item.cpp
+++ b/src/game/Item.cpp
@@ -236,8 +236,8 @@ Item::Item( )
{
m_objectType |= TYPEMASK_ITEM;
m_objectTypeId = TYPEID_ITEM;
- // 2.3.2 - 0x18
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID);
+
+ m_updateFlag = UPDATEFLAG_HIGHGUID;
m_valuesCount = ITEM_END;
m_slot = 0;
diff --git a/src/game/Item.h b/src/game/Item.h
index 9cae8f67105..b70134fbb63 100644
--- a/src/game/Item.h
+++ b/src/game/Item.h
@@ -169,7 +169,7 @@ enum EnchantmentSlot
MAX_ENCHANTMENT_SLOT = 12
};
-#define MAX_VISIBLE_ITEM_OFFSET 18 // 18 fields per visible item (creator(2) + enchantments(13) + properties(1) + seed(1) + pad(1))
+#define MAX_VISIBLE_ITEM_OFFSET 2 // 2 fields per visible item (entry+enchantment)
#define MAX_GEM_SOCKETS MAX_ITEM_PROTO_SOCKETS// (BONUS_ENCHANTMENT_SLOT-SOCK_ENCHANTMENT_SLOT) and item proto size, equal value expected
diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp
index fe291783d38..65c587ed79f 100644
--- a/src/game/ItemHandler.cpp
+++ b/src/game/ItemHandler.cpp
@@ -441,6 +441,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->ArmorDamageModifier;
data << pProto->Duration; // added in 2.4.2.8209, duration (seconds)
data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory
+ data << pProto->HolidayId; // Holiday.dbc?
SendPacket( &data );
}
else
@@ -664,28 +665,28 @@ void WorldSession::HandleBuybackItem(WorldPacket & recv_data)
void WorldSession::HandleBuyItemInSlotOpcode( WorldPacket & recv_data )
{
- CHECK_PACKET_SIZE(recv_data,8+4+8+1+1);
+ CHECK_PACKET_SIZE(recv_data,8+4+4+8+1+4);
sLog.outDebug( "WORLD: Received CMSG_BUY_ITEM_IN_SLOT" );
uint64 vendorguid, bagguid;
- uint32 item;
- uint8 slot, count;
+ uint32 item, slot, count;
+ uint8 bagslot;
- recv_data >> vendorguid >> item >> bagguid >> slot >> count;
+ recv_data >> vendorguid >> item >> slot >> bagguid >> bagslot >> count;
GetPlayer()->BuyItemFromVendor(vendorguid,item,count,bagguid,slot);
}
void WorldSession::HandleBuyItemOpcode( WorldPacket & recv_data )
{
- CHECK_PACKET_SIZE(recv_data,8+4+1+1);
+ CHECK_PACKET_SIZE(recv_data,8+4+4+4+1);
sLog.outDebug( "WORLD: Received CMSG_BUY_ITEM" );
uint64 vendorguid;
- uint32 item;
- uint8 count, unk1;
+ uint32 item, slot, count;
+ uint8 unk1;
- recv_data >> vendorguid >> item >> count >> unk1;
+ recv_data >> vendorguid >> item >> slot >> count >> unk1;
GetPlayer()->BuyItemFromVendor(vendorguid,item,count,NULL_BAG,NULL_SLOT);
}
diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h
index 68e275ed963..ac61d1be670 100644
--- a/src/game/ItemPrototype.h
+++ b/src/game/ItemPrototype.h
@@ -500,7 +500,7 @@ struct _Socket
uint32 Content;
};
-#define MAX_ITEM_PROTO_DAMAGES 5
+#define MAX_ITEM_PROTO_DAMAGES 2 // changed in 3.1.0
#define MAX_ITEM_PROTO_SOCKETS 3
#define MAX_ITEM_PROTO_SPELLS 5
#define MAX_ITEM_PROTO_STATS 10
@@ -574,6 +574,7 @@ struct ItemPrototype
float ArmorDamageModifier;
int32 Duration; // negative = realtime, positive = ingame time
uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc
+ uint32 HolidayId; // id from Holidays.dbc
uint32 ScriptId;
uint32 DisenchantID;
uint32 FoodType;
diff --git a/src/game/LFGHandler.cpp b/src/game/LFGHandler.cpp
index 6df5fc77532..51735c01e02 100644
--- a/src/game/LFGHandler.cpp
+++ b/src/game/LFGHandler.cpp
@@ -186,6 +186,8 @@ void WorldSession::HandleLfgClearOpcode( WorldPacket & /*recv_data */ )
if( sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && _player->GetSession()->GetSecurity() == SEC_PLAYER )
_player->LeaveLFGChannel();
+
+ SendLfgUpdate(0, 0, 0);
}
void WorldSession::HandleLfmClearOpcode( WorldPacket & /*recv_data */)
@@ -198,16 +200,18 @@ void WorldSession::HandleLfmClearOpcode( WorldPacket & /*recv_data */)
void WorldSession::HandleSetLfmOpcode( WorldPacket & recv_data )
{
- CHECK_PACKET_SIZE(recv_data,4);
+ CHECK_PACKET_SIZE(recv_data, 4+1+1+1+1);
sLog.outDebug("CMSG_SET_LOOKING_FOR_MORE");
//recv_data.hexlike();
uint32 temp, entry, type;
+ uint8 unk1;
+ uint8 unk2[3];
- recv_data >> temp;
+ recv_data >> temp >> unk1 >> unk2[0] >> unk2[1] >> unk2[2];
- entry = ( temp & 0xFFFF);
- type = ( (temp >> 24) & 0xFFFF);
+ entry = ( temp & 0x00FFFFFF);
+ type = ( (temp >> 24) & 0x000000FF);
_player->m_lookingForGroup.more.Set(entry,type);
sLog.outDebug("LFM set: temp %u, zone %u, type %u", temp, entry, type);
@@ -250,18 +254,53 @@ void WorldSession::HandleLookingForGroup(WorldPacket& recv_data)
AttemptJoin(_player);
SendLfgResult(type, entry, 0);
+ SendLfgUpdate(0, 1, 0);
}
void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type)
{
uint32 number = 0;
- // start prepare packet;
WorldPacket data(MSG_LOOKING_FOR_GROUP);
data << uint32(type); // type
data << uint32(entry); // entry from LFGDungeons.dbc
- data << uint32(0); // count, placeholder
- data << uint32(0); // count again, strange, placeholder
+
+ data << uint8(0);
+ /*if(uint8)
+ {
+ uint32 count1;
+ for(count1)
+ {
+ uint64; // player guid
+ }
+ }*/
+
+ data << uint32(0); // count2
+ data << uint32(0);
+ /*for(count2)
+ {
+ uint64 // not player guid
+ uint32 flags;
+ if(flags & 0x2)
+ {
+ string
+ }
+ if(flags & 0x10)
+ {
+ uint8
+ }
+ if(flags & 0x20)
+ {
+ for(3)
+ {
+ uint8
+ }
+ }
+ }*/
+
+ size_t count3_pos = data.wpos();
+ data << uint32(0); // count3
+ data << uint32(0); // unk
//TODO: Guard Player map
HashMapHolder<Player>::MapType const& players = ObjectAccessor::Instance().GetPlayers();
@@ -272,71 +311,128 @@ void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type)
if(!plr || plr->GetTeam() != _player->GetTeam())
continue;
- if(!plr->m_lookingForGroup.HaveInSlot(entry,type))
+ if(!plr->m_lookingForGroup.HaveInSlot(entry, type))
continue;
++number;
- data.append(plr->GetPackGUID()); // packed guid
- data << plr->getLevel(); // level
- data << plr->GetZoneId(); // current zone
- data << lfg_type; // 0x00 - LFG, 0x01 - LFM
+ data << uint64(plr->GetGUID()); // guid
+
+ uint32 flags = 0x1FF;
+ data << uint32(flags); // flags
- for(uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j)
+ if(flags & 0x1)
{
- data << uint32( plr->m_lookingForGroup.slots[j].entry | (plr->m_lookingForGroup.slots[j].type << 24) );
+ data << uint8(plr->getLevel());
+ data << uint8(plr->getClass());
+ data << uint8(plr->getRace());
+
+ for(int i = 0; i < 3; ++i)
+ data << uint8(0); // spent talents count in specific tab
+
+ data << uint32(0); // resistances1
+ data << uint32(0); // spd/heal
+ data << uint32(0); // spd/heal
+ data << uint32(0); // combat_rating9
+ data << uint32(0); // combat_rating10
+ data << uint32(0); // combat_rating11
+ data << float(0); // mp5
+ data << float(0); // unk
+ data << uint32(0); // attack power
+ data << uint32(0); // stat1
+ data << uint32(0); // maxhealth
+ data << uint32(0); // maxpower1
+ data << uint32(0); // unk
+ data << float(0); // unk
+ data << uint32(0); // unk
+ data << uint32(0); // unk
+ data << uint32(0); // unk
+ data << uint32(0); // unk
+ data << uint32(0); // combat_rating20
+ data << uint32(0); // unk
}
- data << plr->m_lookingForGroup.comment;
- Group *group = plr->GetGroup();
- if(group)
+ if(flags & 0x2)
+ data << plr->m_lookingForGroup.comment; // comment
+
+ if(flags & 0x4)
+ data << uint8(0); // unk
+
+ if(flags & 0x8)
+ data << uint64(0); // guid from count2 block, not player guid
+
+ if(flags & 0x10)
+ data << uint8(0); // unk
+
+ if(flags & 0x20)
+ data << uint8(plr->m_lookingForGroup.roles); // roles
+
+ if(flags & 0x40)
+ data << uint32(plr->GetZoneId()); // areaid
+
+ if(flags & 0x100)
+ data << uint8(0); // LFG/LFM flag?
+
+ if(flags & 0x80)
{
- data << group->GetMembersCount()-1; // count of group members without group leader
- for(GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
+ for(uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j)
{
- Player *member = itr->getSource();
- if(member && member->GetGUID() != plr->GetGUID())
- {
- data.append(member->GetPackGUID()); // packed guid
- data << member->getLevel(); // player level
- }
+ data << uint32(plr->m_lookingForGroup.slots[j].entry | (plr->m_lookingForGroup.slots[j].type << 24));
}
}
- else
- {
- data << uint32(0x00);
- }
}
- // fill count placeholders
- data.put<uint32>(4+4, number);
- data.put<uint32>(4+4+4,number);
+ data.put<uint32>(count3_pos, number); // fill count placeholder
SendPacket(&data);
}
void WorldSession::HandleSetLfgOpcode( WorldPacket & recv_data )
{
- CHECK_PACKET_SIZE(recv_data,4+4);
+ CHECK_PACKET_SIZE(recv_data, 4+4+1+1);
sLog.outDebug("CMSG_SET_LOOKING_FOR_GROUP");
- //recv_data.hexlike();
+ recv_data.hexlike();
uint32 slot, temp, entry, type;
+ uint8 roles, unk1;
- recv_data >> slot >> temp;
+ recv_data >> slot >> temp >> roles >> unk1;
- entry = ( temp & 0xFFFF);
- type = ( (temp >> 24) & 0xFFFF);
+ entry = ( temp & 0x00FFFFFF);
+ type = ( (temp >> 24) & 0x000000FF);
if(slot >= MAX_LOOKING_FOR_GROUP_SLOT)
return;
- _player->m_lookingForGroup.slots[slot].Set(entry,type);
+ _player->m_lookingForGroup.slots[slot].Set(entry, type);
+ _player->m_lookingForGroup.roles = roles;
sLog.outDebug("LFG set: looknumber %u, temp %X, type %u, entry %u", slot, temp, type, entry);
if(LookingForGroup_auto_join)
AttemptJoin(_player);
- SendLfgResult(type, entry, 0);
+ //SendLfgResult(type, entry, 0);
+ SendLfgUpdate(0, 1, 0);
+}
+
+void WorldSession::HandleLfgSetRoles(WorldPacket &recv_data)
+{
+ CHECK_PACKET_SIZE(recv_data, 1);
+
+ sLog.outDebug("CMSG_LFG_SET_ROLES");
+
+ uint8 roles;
+ recv_data >> roles;
+
+ _player->m_lookingForGroup.roles = roles;
+}
+
+void WorldSession::SendLfgUpdate(uint8 unk1, uint8 unk2, uint8 unk3)
+{
+ WorldPacket data(SMSG_LFG_UPDATE, 3);
+ data << uint8(unk1);
+ data << uint8(unk2);
+ data << uint8(unk3);
+ SendPacket(&data);
}
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp
index 12727bd6f82..1c79a875e14 100644
--- a/src/game/Level2.cpp
+++ b/src/game/Level2.cpp
@@ -694,9 +694,6 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args)
map->Remove(obj,false);
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);
}
@@ -720,9 +717,6 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args)
map->Remove(obj,false);
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);
}
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index c204b8e9d34..043397f9c48 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -360,7 +360,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ )
GetPlayer()->duel || //...is in Duel
GetPlayer()->HasAura(9454) || //...is frozen by GM via freeze command
//...is jumping ...is falling
- GetPlayer()->HasUnitMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING))
+ GetPlayer()->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING))
{
WorldPacket data( SMSG_LOGOUT_RESPONSE, (2+4) ) ;
data << (uint8)0xC;
@@ -1057,6 +1057,11 @@ void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recv_data)
sLog.outDetail( "MISC: Added Macro %u into button %u", action, button );
GetPlayer()->addActionButton(button,action,type,misc);
}
+ else if(type==ACTION_BUTTON_EQSET)
+ {
+ sLog.outDetail( "MISC: Added EquipmentSet %u into button %u", action, button );
+ GetPlayer()->addActionButton(button,action,type,misc);
+ }
else if(type==ACTION_BUTTON_SPELL)
{
sLog.outDetail( "MISC: Added Spell %u into button %u", action, button );
@@ -1210,9 +1215,10 @@ void WorldSession::HandlePlayedTime(WorldPacket& /*recv_data*/)
uint32 TotalTimePlayed = GetPlayer()->GetTotalPlayedTime();
uint32 LevelPlayedTime = GetPlayer()->GetLevelPlayedTime();
- WorldPacket data(SMSG_PLAYED_TIME, 8);
+ WorldPacket data(SMSG_PLAYED_TIME, 9);
data << TotalTimePlayed;
data << LevelPlayedTime;
+ data << uint8(0);
SendPacket(&data);
}
@@ -1234,72 +1240,18 @@ void WorldSession::HandleInspectOpcode(WorldPacket& recv_data)
uint32 guid_size = plr->GetPackGUID().wpos();
WorldPacket data(SMSG_INSPECT_TALENT, guid_size+4+talent_points);
data.append(plr->GetPackGUID());
- data << uint32(talent_points);
-
- // fill by 0 talents array
- for(uint32 i = 0; i < talent_points; ++i)
- data << uint8(0);
if(sWorld.getConfig(CONFIG_TALENTS_INSPECTING) || _player->isGameMaster())
{
- // find class talent tabs (all players have 3 talent tabs)
- uint32 const* talentTabIds = GetTalentTabPages(plr->getClass());
-
- uint32 talentTabPos = 0; // pos of first talent rank in tab including all prev tabs
- for(uint32 i = 0; i < 3; ++i)
- {
- uint32 talentTabId = talentTabIds[i];
-
- // fill by real data
- for(uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
- {
- TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
- if(!talentInfo)
- continue;
-
- // skip another tab talents
- if(talentInfo->TalentTab != talentTabId)
- continue;
-
- // find talent rank
- uint32 curtalent_maxrank = 0;
- for(uint32 k = MAX_TALENT_RANK; k > 0; --k)
- {
- if(talentInfo->RankID[k-1] && plr->HasSpell(talentInfo->RankID[k-1]))
- {
- curtalent_maxrank = k;
- break;
- }
- }
-
- // not learned talent
- if(!curtalent_maxrank)
- continue;
-
- // 1 rank talent bit index
- uint32 curtalent_index = talentTabPos + GetTalentInspectBitPosInTab(talentId);
-
- uint32 curtalent_rank_index = curtalent_index+curtalent_maxrank-1;
-
- // slot/offset in 7-bit bytes
- uint32 curtalent_rank_slot7 = curtalent_rank_index / 7;
- uint32 curtalent_rank_offset7 = curtalent_rank_index % 7;
-
- // rank pos with skipped 8 bit
- uint32 curtalent_rank_index2 = curtalent_rank_slot7 * 8 + curtalent_rank_offset7;
-
- // slot/offset in 8-bit bytes with skipped high bit
- uint32 curtalent_rank_slot = curtalent_rank_index2 / 8;
- uint32 curtalent_rank_offset = curtalent_rank_index2 % 8;
-
- // apply mask
- uint32 val = data.read<uint8>(guid_size + 4 + curtalent_rank_slot);
- val |= (1 << curtalent_rank_offset);
- data.put<uint8>(guid_size + 4 + curtalent_rank_slot, val & 0xFF);
- }
-
- talentTabPos += GetTalentTabInspectBitSize(talentTabId);
- }
+ plr->BuildPlayerTalentsInfoData(&data);
+ plr->BuildEnchantmentsInfoData(&data);
+ }
+ else
+ {
+ data << uint32(0); // unspentTalentPoints
+ data << uint8(0); // talentGroupCount
+ data << uint8(0); // talentGroupIndex
+ data << uint32(0); // slotUsedMask
}
SendPacket(&data);
@@ -1536,7 +1488,7 @@ void WorldSession::HandleSetTitleOpcode( WorldPacket & recv_data )
recv_data >> title;
// -1 at none
- if(title > 0 && title < 128)
+ if(title > 0 && title < 192)
{
if(!GetPlayer()->HasTitle(title))
return;
@@ -1657,7 +1609,7 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode( WorldPacket & recv_data )
recv_data >> guid >> unk >> flags;
- _player->SetUnitMovementFlags(flags);
+ _player->m_movementInfo.flags = flags;
}
void WorldSession::HandleRequestPetInfoOpcode( WorldPacket & /*recv_data */)
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp
index b155459305d..c30e8198850 100644
--- a/src/game/MovementHandler.cpp
+++ b/src/game/MovementHandler.cpp
@@ -278,7 +278,6 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
movementInfo.t_seat = -1;
}
- // Aura removal may remove mover
// fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
if (opcode == MSG_MOVE_FALL_LAND && plMover && !plMover->isInFlight())
plMover->HandleFall(movementInfo);
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index f94ee52efdb..df5db7fb9c0 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -98,8 +98,6 @@ Object::~Object( )
//DEBUG_LOG("Object desctr 1 check (%p)",(void*)this);
delete [] m_uint32Values;
delete [] m_uint32Values_mirror;
- m_uint32Values = NULL;
- m_uint32Values_mirror = NULL;
//DEBUG_LOG("Object desctr 2 check (%p)",(void*)this);
}
}
@@ -128,7 +126,7 @@ void Object::_Create( uint32 guidlow, uint32 entry, HighGuid guidhigh )
void Object::BuildMovementUpdateBlock(UpdateData * data, uint32 flags ) const
{
- ByteBuffer buf(50);
+ ByteBuffer buf(500);
buf << uint8( UPDATETYPE_MOVEMENT );
buf.append(GetPackGUID());
@@ -144,7 +142,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
return;
uint8 updatetype = UPDATETYPE_CREATE_OBJECT;
- uint8 flags = m_updateFlag;
+ uint16 flags = m_updateFlag;
/** lower flag1 **/
if(target == this) // building packet for yourself
@@ -188,7 +186,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
//sLog.outDebug("BuildCreateUpdate: update-type: %u, object-type: %u got flags: %X, flags2: %X", updatetype, m_objectTypeId, flags, flags2);
- ByteBuffer buf(50);
+ ByteBuffer buf(500);
buf << (uint8)updatetype;
buf.append(GetPackGUID());
buf << (uint8)m_objectTypeId;
@@ -224,7 +222,7 @@ void Object::SendUpdateToPlayer(Player* player)
void Object::BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target) const
{
- ByteBuffer buf(50);
+ ByteBuffer buf(500);
buf << (uint8) UPDATETYPE_VALUES;
buf.append(GetPackGUID());
@@ -253,9 +251,9 @@ void Object::DestroyForPlayer(Player *target) const
target->GetSession()->SendPacket( &data );
}
-void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
+void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags) const
{
- *data << (uint8)flags; // update flags
+ *data << (uint16)flags; // update flags
// 0x20
if (flags & UPDATEFLAG_LIVING)
@@ -265,9 +263,10 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
{
case TYPEID_UNIT:
{
- flags2 &= ~MOVEMENTFLAG_SPLINE2;
if(((Creature*)this)->isVehicle())
((Unit*)this)->m_movementInfo.unk1 |= 0x20; // always allow pitch
+ if(((Unit*)this)->isInFlight())
+ flags2 |= (MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_LEVITATING);
}
break;
case TYPEID_PLAYER:
@@ -287,31 +286,14 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
*data << uint32(flags2); // movement flags
*data << uint16(((Unit*)this)->m_movementInfo.unk1);// unknown 2.3.0
*data << uint32(getMSTime()); // time (in milliseconds)
- }
- // 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();
- }
- }
+ // position
+ *data << ((WorldObject*)this)->GetPositionX();
+ *data << ((WorldObject*)this)->GetPositionY();
+ *data << ((WorldObject*)this)->GetPositionZ();
+ *data << ((WorldObject*)this)->GetOrientation();
- // 0x20
- if(flags & UPDATEFLAG_LIVING)
- {
+ // 0x00000200
((Unit*)this)->BuildMovementPacket(data);
*data << ((Unit*)this)->GetSpeed( MOVE_WALK );
@@ -331,25 +313,27 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
FlightPathMovementGenerator *fmg = (FlightPathMovementGenerator*)(((Player*)this)->GetMotionMaster()->top());
- uint32 flags3 = 0x00000300;
+ uint32 flags3 = MOVEFLAG_GLIDE;
*data << uint32(flags3); // splines flag?
- if(flags3 & 0x10000) // probably x,y,z coords there
+ if(flags3 & 0x20000) // may be orientation
{
*data << (float)0;
- *data << (float)0;
- *data << (float)0;
}
-
- if(flags3 & 0x20000) // probably guid there
+ else
{
- *data << uint64(0);
- }
+ if(flags3 & 0x8000) // probably x,y,z coords there
+ {
+ *data << (float)0;
+ *data << (float)0;
+ *data << (float)0;
+ }
- if(flags3 & 0x40000) // may be orientation
- {
- *data << (float)0;
+ if(flags3 & 0x10000) // probably guid there
+ {
+ *data << uint64(0);
+ }
}
Path &path = fmg->GetPath();
@@ -364,8 +348,13 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
*data << uint32(traveltime); // full move time?
*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
for(uint32 i = 0; i < poscount; ++i)
@@ -377,22 +366,50 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
*data << uint8(0); // added in 3.0.8
- /*for(uint32 i = 0; i < poscount; i++)
- {
- // path points
- *data << (float)0;
- *data << (float)0;
- *data << (float)0;
- }*/
-
*data << path.GetNodes()[poscount-1].x;
*data << path.GetNodes()[poscount-1].y;
*data << path.GetNodes()[poscount-1].z;
-
- // target position (path end)
- /**data << ((Unit*)this)->GetPositionX();
- *data << ((Unit*)this)->GetPositionY();
- *data << ((Unit*)this)->GetPositionZ();*/
+ }
+ }
+ else
+ {
+ if(flags & UPDATEFLAG_POSITION)
+ {
+ *data << uint8(0); // unk PGUID!
+ *data << ((WorldObject*)this)->GetPositionX();
+ *data << ((WorldObject*)this)->GetPositionY();
+ *data << ((WorldObject*)this)->GetPositionZ();
+ *data << ((WorldObject*)this)->GetPositionX();
+ *data << ((WorldObject*)this)->GetPositionY();
+ *data << ((WorldObject*)this)->GetPositionZ();
+ *data << ((WorldObject*)this)->GetOrientation();
+
+ if(GetTypeId() == TYPEID_CORPSE)
+ *data << float(((WorldObject*)this)->GetOrientation());
+ else
+ *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();
+ }
+ }
}
}
@@ -473,6 +490,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const
*data << uint32(((Vehicle*)this)->GetVehicleInfo()->m_ID); // vehicle id
*data << float(0); // facing adjustment
}
+
+ // 0x200
+ if(flags & UPDATEFLAG_ROTATION)
+ {
+ *data << uint64(((GameObject*)this)->GetRotation());
+ }
}
void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *updateMask, Player *target) const
@@ -515,7 +538,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
// 2 specialized loops for speed optimization in non-unit case
if(isType(TYPEMASK_UNIT)) // unit (creature/player) case
{
- for( uint16 index = 0; index < m_valuesCount; index ++ )
+ for( uint16 index = 0; index < m_valuesCount; ++index )
{
if( updateMask->GetBit( index ) )
{
@@ -633,7 +656,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
}
else if(isType(TYPEMASK_GAMEOBJECT)) // gameobject case
{
- for( uint16 index = 0; index < m_valuesCount; index ++ )
+ for( uint16 index = 0; index < m_valuesCount; ++index )
{
if( updateMask->GetBit( index ) )
{
@@ -665,7 +688,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
}
else // other objects case (no special index checks)
{
- for( uint16 index = 0; index < m_valuesCount; index ++ )
+ for( uint16 index = 0; index < m_valuesCount; ++index )
{
if( updateMask->GetBit( index ) )
{
@@ -678,8 +701,6 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
void Object::ClearUpdateMask(bool remove)
{
- uint32 *temp = m_uint32Values;
-
memcpy(m_uint32Values_mirror, m_uint32Values, m_valuesCount*sizeof(uint32));
if(m_objectUpdated)
@@ -900,7 +921,7 @@ void Object::SetUInt16Value( uint16 index, uint8 offset, uint16 value )
return;
}
- if(uint8(m_uint32Values[ index ] >> (offset * 16)) != value)
+ if(uint16(m_uint32Values[ index ] >> (offset * 16)) != value)
{
m_uint32Values[ index ] &= ~uint32(uint32(0xFFFF) << (offset * 16));
m_uint32Values[ index ] |= uint32(uint32(value) << (offset * 16));
@@ -1669,7 +1690,7 @@ void WorldObject::BuildHeartBeatMsg(WorldPacket *data) const
data->Initialize(MSG_MOVE_HEARTBEAT, 32);
data->append(GetPackGUID());
*data << uint32(((Unit*)this)->GetUnitMovementFlags()); // movement flags
- *data << uint16(0); // 2.3.0
+ *data << uint16(((Unit*)this)->m_movementInfo.unk1); // 2.3.0
*data << uint32(getMSTime()); // time
*data << m_positionX;
*data << m_positionY;
@@ -1689,7 +1710,7 @@ void WorldObject::BuildTeleportAckMsg(WorldPacket *data, float x, float y, float
data->append(GetPackGUID());
*data << uint32(0); // this value increments every time
*data << uint32(((Unit*)this)->GetUnitMovementFlags()); // movement flags
- *data << uint16(0); // 2.3.0
+ *data << uint16(((Unit*)this)->m_movementInfo.unk1); // 2.3.0
*data << uint32(getMSTime()); // time
*data << x;
*data << y;
diff --git a/src/game/Object.h b/src/game/Object.h
index 0e08247aece..037bb94aede 100644
--- a/src/game/Object.h
+++ b/src/game/Object.h
@@ -330,13 +330,13 @@ class TRINITY_DLL_SPEC Object
virtual void _SetUpdateBits(UpdateMask *updateMask, Player *target) const;
virtual void _SetCreateBits(UpdateMask *updateMask, Player *target) const;
- void _BuildMovementUpdate(ByteBuffer * data, uint8 flags) const;
+ void _BuildMovementUpdate(ByteBuffer * data, uint16 flags) const;
void _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask *updateMask, Player *target ) const;
uint16 m_objectType;
uint8 m_objectTypeId;
- uint8 m_updateFlag;
+ uint16 m_updateFlag;
union
{
diff --git a/src/game/ObjectAccessor.cpp b/src/game/ObjectAccessor.cpp
index 0472c89a59f..55e7d9179b8 100644
--- a/src/game/ObjectAccessor.cpp
+++ b/src/game/ObjectAccessor.cpp
@@ -94,31 +94,36 @@ Object* ObjectAccessor::GetObjectByTypeMask(WorldObject const &p, uint64 guid, u
if(typemask & TYPEMASK_PLAYER)
{
obj = FindPlayer(guid);
- if(obj) return obj;
+ if(obj)
+ return obj;
}
if(typemask & TYPEMASK_UNIT)
{
obj = GetCreatureOrPetOrVehicle(p,guid);
- if(obj) return obj;
+ if(obj)
+ return obj;
}
if(typemask & TYPEMASK_GAMEOBJECT)
{
obj = p.GetMap()->GetGameObject(guid);
- if(obj) return obj;
+ if(obj)
+ return obj;
}
if(typemask & TYPEMASK_DYNAMICOBJECT)
{
obj = p.GetMap()->GetDynamicObject(guid);
- if(obj) return obj;
+ if(obj)
+ return obj;
}
if(typemask & TYPEMASK_ITEM && p.GetTypeId() == TYPEID_PLAYER)
{
obj = ((Player const &)p).GetItemByGuid( guid );
- if(obj) return obj;
+ if(obj)
+ return obj;
}
return NULL;
@@ -249,7 +254,7 @@ ObjectAccessor::RemoveCorpse(Corpse *corpse)
CellPair cell_pair = Trinity::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY());
uint32 cell_id = (cell_pair.y_coord*TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord;
- objmgr.DeleteCorpseCellData(corpse->GetMapId(),cell_id,corpse->GetOwnerGUID());
+ objmgr.DeleteCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGUID());
corpse->RemoveFromWorld();
i_player2corpse.erase(iter);
@@ -268,7 +273,7 @@ ObjectAccessor::AddCorpse(Corpse *corpse)
CellPair cell_pair = Trinity::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY());
uint32 cell_id = (cell_pair.y_coord*TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord;
- objmgr.AddCorpseCellData(corpse->GetMapId(),cell_id,corpse->GetOwnerGUID(),corpse->GetInstanceId());
+ objmgr.AddCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGUID(), corpse->GetInstanceId());
}
void
@@ -276,19 +281,19 @@ ObjectAccessor::AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* ma
{
Guard guard(i_corpseGuard);
for(Player2CorpsesMapType::iterator iter = i_player2corpse.begin(); iter != i_player2corpse.end(); ++iter)
- if(iter->second->GetGrid()==gridpair)
+ if(iter->second->GetGrid() == gridpair)
{
// verify, if the corpse in our instance (add only corpses which are)
if (map->Instanceable())
{
if (iter->second->GetInstanceId() == map->GetInstanceId())
{
- grid.AddWorldObject(iter->second,iter->second->GetGUID());
+ grid.AddWorldObject(iter->second, iter->second->GetGUID());
}
}
else
{
- grid.AddWorldObject(iter->second,iter->second->GetGUID());
+ grid.AddWorldObject(iter->second, iter->second->GetGUID());
}
}
}
@@ -310,10 +315,11 @@ ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid, bool insignia)
// remove corpse from player_guid -> corpse map
RemoveCorpse(corpse);
- // remove resurrectble corpse from grid object registry (loaded state checked into call)
+ // remove resurrectable corpse from grid object registry (loaded state checked into call)
// do not load the map if it's not loaded
Map *map = MapManager::Instance().FindMap(corpse->GetMapId(), corpse->GetInstanceId());
- if(map) map->Remove(corpse,false);
+ if(map)
+ map->Remove(corpse, false);
// remove corpse from DB
corpse->DeleteFromDB();
@@ -329,7 +335,7 @@ ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid, bool insignia)
bones = new Corpse;
bones->Create(corpse->GetGUIDLow());
- for (int i = 3; i < CORPSE_END; i++) // don't overwrite guid and object type
+ for (int i = 3; i < CORPSE_END; ++i) // don't overwrite guid and object type
bones->SetUInt32Value(i, corpse->GetUInt32Value(i));
bones->SetGrid(corpse->GetGrid());
@@ -339,12 +345,12 @@ ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid, bool insignia)
bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation());
bones->SetMapId(corpse->GetMapId());
bones->SetInstanceId(corpse->GetInstanceId());
- bones->SetPhaseMask(corpse->GetPhaseMask(),false);
+ bones->SetPhaseMask(corpse->GetPhaseMask(), false);
bones->SetUInt32Value(CORPSE_FIELD_FLAGS, CORPSE_FLAG_UNK2 | CORPSE_FLAG_BONES);
bones->SetUInt64Value(CORPSE_FIELD_OWNER, 0);
- for (int i = 0; i < EQUIPMENT_SLOT_END; i++)
+ for (int i = 0; i < EQUIPMENT_SLOT_END; ++i)
{
if(corpse->GetUInt32Value(CORPSE_FIELD_ITEM + i))
bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0);
@@ -456,7 +462,7 @@ ObjectAccessor::UpdateObjectVisibility(WorldObject *obj)
CellPair p = Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY());
Cell cell(p);
- obj->GetMap()->UpdateObjectVisibility(obj,cell,p);
+ obj->GetMap()->UpdateObjectVisibility(obj, cell, p);
}
/*void ObjectAccessor::UpdateVisibilityForPlayer( Player* player )
@@ -465,8 +471,8 @@ ObjectAccessor::UpdateObjectVisibility(WorldObject *obj)
Cell cell(p);
Map* m = player->GetMap();
- m->UpdatePlayerVisibility(player,cell,p);
- m->UpdateObjectsVisibilityFor(player,cell,p);
+ m->UpdatePlayerVisibility(player, cell, p);
+ m->UpdateObjectsVisibilityFor(player, cell, p);
}*/
/// Define the static member of HashMapHolder
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 38ba9c33a6c..9d942c9fca2 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -123,6 +123,7 @@ ObjectMgr::ObjectMgr()
m_hiPetNumber = 1;
m_ItemTextId = 1;
m_mailid = 1;
+ m_equipmentSetGuid = 1;
m_guildId = 1;
m_arenaTeamId = 1;
m_auctionid = 1;
@@ -5701,6 +5702,13 @@ void ObjectMgr::SetHighestGuids()
delete result;
}
+ result = CharacterDatabase.Query("SELECT MAX(setguid) FROM character_equipmentsets");
+ if (result)
+ {
+ m_equipmentSetGuid = (*result)[0].GetUInt64()+1;
+ delete result;
+ }
+
result = CharacterDatabase.Query( "SELECT MAX(guildid) FROM guild" );
if (result)
{
@@ -5729,6 +5737,16 @@ uint32 ObjectMgr::GenerateAuctionID()
return m_auctionid++;
}
+uint64 ObjectMgr::GenerateEquipmentSetGuid()
+{
+ if(m_equipmentSetGuid>=0xFFFFFFFFFFFFFFFEll)
+ {
+ sLog.outError("EquipmentSet guid overflow!! Can't continue, shutting down server. ");
+ World::StopNow(ERROR_EXIT_CODE);
+ }
+ return m_equipmentSetGuid++;
+}
+
uint32 ObjectMgr::GenerateGuildId()
{
if(m_guildId>=0xFFFFFFFE)
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index b8d282569f1..28da3b01529 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -595,6 +595,7 @@ class ObjectMgr
uint32 GenerateLowGuid(HighGuid guidhigh);
uint32 GenerateArenaTeamId();
uint32 GenerateAuctionID();
+ uint64 GenerateEquipmentSetGuid();
uint32 GenerateGuildId();
uint32 GenerateItemTextID();
uint32 GenerateMailID();
@@ -819,6 +820,7 @@ class ObjectMgr
// first free id for selected id type
uint32 m_arenaTeamId;
uint32 m_auctionid;
+ uint64 m_equipmentSetGuid;
uint32 m_guildId;
uint32 m_ItemTextId;
uint32 m_mailid;
diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp
index 8382b8ddbb4..b66786f9d91 100644
--- a/src/game/Opcodes.cpp
+++ b/src/game/Opcodes.cpp
@@ -339,15 +339,15 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x134*/ { "SMSG_SPELL_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x135*/ { "SMSG_COOLDOWN_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x136*/ { "CMSG_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelAuraOpcode },
- /*0x137*/ { "SMSG_UPDATE_AURA_DURATION_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x137*/ { "SMSG_EQUIPMENT_SET_SAVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x138*/ { "SMSG_PET_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x139*/ { "MSG_CHANNEL_START", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x13A*/ { "MSG_CHANNEL_UPDATE", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x13B*/ { "CMSG_CANCEL_CHANNELLING", STATUS_LOGGEDIN, &WorldSession::HandleCancelChanneling },
/*0x13C*/ { "SMSG_AI_REACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x13D*/ { "CMSG_SET_SELECTION", STATUS_LOGGEDIN, &WorldSession::HandleSetSelectionOpcode },
- /*0x13E*/ { "CMSG_SET_TARGET_OBSOLETE", STATUS_LOGGEDIN, &WorldSession::HandleSetTargetOpcode },
- /*0x13F*/ { "CMSG_UNUSED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x13E*/ { "CMSG_EQUIPMENT_SET_DELETE", STATUS_LOGGEDIN, &WorldSession::HandleEquipmentSetDelete },
+ /*0x13F*/ { "CMSG_INSTANCE_LOCK_RESPONSE", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x140*/ { "CMSG_UNUSED2", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x141*/ { "CMSG_ATTACKSWING", STATUS_LOGGEDIN, &WorldSession::HandleAttackSwingOpcode },
/*0x142*/ { "CMSG_ATTACKSTOP", STATUS_LOGGEDIN, &WorldSession::HandleAttackStopOpcode },
@@ -359,7 +359,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x148*/ { "SMSG_ATTACKSWING_DEADTARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x149*/ { "SMSG_ATTACKSWING_CANT_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x14A*/ { "SMSG_ATTACKERSTATEUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14B*/ { "SMSG_VICTIMSTATEUPDATE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14B*/ { "SMSG_BATTLEFIELD_PORT_DENIED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x14C*/ { "SMSG_DAMAGE_DONE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x14D*/ { "SMSG_DAMAGE_TAKEN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x14E*/ { "SMSG_CANCEL_COMBAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
@@ -1217,13 +1217,45 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x4A2*/ { "CMSG_CHECK_LOGIN_CRITERIA", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4A3*/ { "SMSG_SERVER_BUCK_DATA_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4A4*/ { "CMSG_QUERY_VEHICLE_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x4A5*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x4A6*/ { "SMSG_CLIENTCACHE_VERSION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x4A7*/ { "UMSG_UNKNOWN_1191", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x4A8*/ { "UMSG_UNKNOWN_1192", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x4A9*/ { "UMSG_UNKNOWN_1193", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x4AA*/ { "UMSG_UNKNOWN_1194", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x4AB*/ { "UMSG_UNKNOWN_1195", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4A5*/ { "UMSG_UNKNOWN_1189", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4A6*/ { "SMSG_UNKNOWN_1190", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4A7*/ { "SMSG_UNKNOWN_1191", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4A8*/ { "CMSG_UNKNOWN_1192", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4A9*/ { "CMSG_EJECT_PASSENGER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4AA*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4AB*/ { "SMSG_CLIENTCACHE_VERSION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*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*/ { "SMSG_UNKNOWN_1202", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4B3*/ { "UMSG_UNKNOWN_1203", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4B4*/ { "UMSG_UNKNOWN_1204", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4B5*/ { "SMSG_UNKNOWN_1205", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4B6*/ { "CMSG_UNKNOWN_1206", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4B7*/ { "SMSG_UNKNOWN_1207", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4B8*/ { "CMSG_LFG_SET_ROLES", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetRoles },
+ /*0x4B9*/ { "UMSG_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_EQUIPMENT_SET_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4BD*/ { "CMSG_EQUIPMENT_SET_SAVE", STATUS_LOGGEDIN, &WorldSession::HandleEquipmentSetSave },
+ /*0x4BE*/ { "CMSG_UNKNOWN_1214", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4BF*/ { "SMSG_UNKNOWN_1215", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4C0*/ { "SMSG_TALENTS_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4C1*/ { "CMSG_LEARN_PREVIEW_TALENTS", STATUS_LOGGEDIN, &WorldSession::HandleLearnPreviewTalents },
+ /*0x4C2*/ { "CMSG_LEARN_PREVIEW_TALENTS_PET", STATUS_LOGGEDIN, &WorldSession::HandleLearnPreviewTalentsPet },
+ /*0x4C3*/ { "UMSG_UNKNOWN_1219", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4C4*/ { "UMSG_UNKNOWN_1220", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4C5*/ { "UMSG_UNKNOWN_1221", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4C6*/ { "UMSG_UNKNOWN_1222", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4C7*/ { "SMSG_UNKNOWN_1223", 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 },
+ /*0x4CB*/ { "CMSG_EQUIPMENT_SET_USE", STATUS_LOGGEDIN, &WorldSession::HandleEquipmentSetUse },
+ /*0x4CC*/ { "SMSG_EQUIPMENT_SET_USE_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
};
diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h
index fbf3e9a72a1..3c2b004ec1f 100644
--- a/src/game/Opcodes.h
+++ b/src/game/Opcodes.h
@@ -347,15 +347,15 @@ enum Opcodes
SMSG_SPELL_COOLDOWN = 0x134,
SMSG_COOLDOWN_EVENT = 0x135,
CMSG_CANCEL_AURA = 0x136,
- SMSG_UPDATE_AURA_DURATION_OBSOLETE = 0x137,
+ SMSG_EQUIPMENT_SET_SAVED = 0x137,
SMSG_PET_CAST_FAILED = 0x138,
MSG_CHANNEL_START = 0x139,
MSG_CHANNEL_UPDATE = 0x13A,
CMSG_CANCEL_CHANNELLING = 0x13B,
SMSG_AI_REACTION = 0x13C,
CMSG_SET_SELECTION = 0x13D,
- CMSG_SET_TARGET_OBSOLETE = 0x13E,
- CMSG_UNUSED = 0x13F,
+ CMSG_EQUIPMENT_SET_DELETE = 0x13E,
+ CMSG_INSTANCE_LOCK_RESPONSE = 0x13F,
CMSG_UNUSED2 = 0x140,
CMSG_ATTACKSWING = 0x141,
CMSG_ATTACKSTOP = 0x142,
@@ -367,7 +367,7 @@ enum Opcodes
SMSG_ATTACKSWING_DEADTARGET = 0x148,
SMSG_ATTACKSWING_CANT_ATTACK = 0x149,
SMSG_ATTACKERSTATEUPDATE = 0x14A,
- SMSG_VICTIMSTATEUPDATE_OBSOLETE = 0x14B,
+ SMSG_BATTLEFIELD_PORT_DENIED = 0x14B,
SMSG_DAMAGE_DONE_OBSOLETE = 0x14C,
SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D,
SMSG_CANCEL_COMBAT = 0x14E,
@@ -695,7 +695,7 @@ enum Opcodes
CMSG_BUYBACK_ITEM = 0x290,
SMSG_SERVER_MESSAGE = 0x291,
CMSG_MEETINGSTONE_JOIN = 0x292,
- CMSG_MEETINGSTONE_LEAVE = 0x293,
+ CMSG_MEETINGSTONE_LEAVE = 0x293, // SMSG?
CMSG_MEETINGSTONE_CHEAT = 0x294,
SMSG_MEETINGSTONE_SETQUEUE = 0x295,
CMSG_MEETINGSTONE_INFO = 0x296,
@@ -1216,24 +1216,56 @@ enum Opcodes
SMSG_PET_LEARNED_SPELL = 0x499,
SMSG_PET_REMOVED_SPELL = 0x49A,
CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0x49B,
- CMSG_HEARTH_AND_RESURRECT = 0x49C,
- SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D,
- SMSG_CRITERIA_DELETED = 0x49E,
- SMSG_ACHIEVEMENT_DELETED = 0x49F,
- CMSG_SERVER_INFO_QUERY = 0x4A0,
- SMSG_SERVER_INFO_RESPONSE = 0x4A1,
- CMSG_CHECK_LOGIN_CRITERIA = 0x4A2,
- SMSG_SERVER_BUCK_DATA_START = 0x4A3,
- CMSG_QUERY_VEHICLE_STATUS = 0x4A4,
- SMSG_PET_GUIDS = 0x4A5,
- SMSG_CLIENTCACHE_VERSION = 0x4A6,
- UMSG_UNKNOWN_1191 = 0x4A7,
- UMSG_UNKNOWN_1192 = 0x4A8,
- UMSG_UNKNOWN_1193 = 0x4A9,
- UMSG_UNKNOWN_1194 = 0x4AA,
- UMSG_UNKNOWN_1195 = 0x4AB,
- UMSG_UNKNOWN_1196 = 0x4AC,
- NUM_MSG_TYPES = 0x4AD
+ CMSG_HEARTH_AND_RESURRECT = 0x49C, // not changed in 3.1
+ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, // not changed 9626
+ SMSG_CRITERIA_DELETED = 0x49E, // not changed 9626
+ SMSG_ACHIEVEMENT_DELETED = 0x49F, // not changed 9626
+ CMSG_SERVER_INFO_QUERY = 0x4A0, // not found
+ SMSG_SERVER_INFO_RESPONSE = 0x4A1, // not found
+ CMSG_CHECK_LOGIN_CRITERIA = 0x4A2, // not found
+ SMSG_SERVER_BUCK_DATA_START = 0x4A3, // not found
+ CMSG_QUERY_VEHICLE_STATUS = 0x4A4, // not found
+ UMSG_UNKNOWN_1189 = 0x4A5, // not found, old SMSG_PET_GUIDS
+ SMSG_UNKNOWN_1190 = 0x4A6, // smsg unk, old SMSG_CLIENTCACHE_VERSION
+ SMSG_UNKNOWN_1191 = 0x4A7, // smsg guid+uint32 (vehicle)
+ CMSG_UNKNOWN_1192 = 0x4A8, // cmsg uint64
+ CMSG_EJECT_PASSENGER = 0x4A9, // cmsg uint64
+ SMSG_PET_GUIDS = 0x4AA, // shifted+5
+ SMSG_CLIENTCACHE_VERSION = 0x4AB, // shifted+5
+ UMSG_UNKNOWN_1196 = 0x4AC, // not found
+ UMSG_UNKNOWN_1197 = 0x4AD, // not found
+ UMSG_UNKNOWN_1198 = 0x4AE, // not found
+ UMSG_UNKNOWN_1199 = 0x4AF, // not found
+ UMSG_UNKNOWN_1200 = 0x4B0, // not found
+ UMSG_UNKNOWN_1201 = 0x4B1, // not found
+ SMSG_UNKNOWN_1202 = 0x4B2, // refund something
+ CMSG_UNKNOWN_1203 = 0x4B3, // refund request?
+ CMSG_UNKNOWN_1204 = 0x4B4, // lua: ContainerRefundItemPurchase
+ SMSG_UNKNOWN_1205 = 0x4B5, // refund something
+ CMSG_UNKNOWN_1206 = 0x4B6, // CMSG, uint32
+ SMSG_UNKNOWN_1207 = 0x4B7, // SMSG, string+float
+ CMSG_LFG_SET_ROLES = 0x4B8, // CMSG, empty, lua: SetLFGRoles
+ UMSG_UNKNOWN_1209 = 0x4B9, // not found
+ CMSG_UNKNOWN_1210 = 0x4BA, // CMSG, uint64, lua: CalendarContextEventSignUp
+ SMSG_UNKNOWN_1211 = 0x4BB, // SMSG, calendar related
+ SMSG_EQUIPMENT_SET_LIST = 0x4BC, // SMSG, equipment manager list?
+ CMSG_EQUIPMENT_SET_SAVE = 0x4BD, // CMSG, lua: SaveEquipmentSet
+ CMSG_UNKNOWN_1214 = 0x4BE, // CMSG, missle?
+ SMSG_UNKNOWN_1215 = 0x4BF, // SMSG, uint64, uint8, 3 x float
+ SMSG_TALENTS_INFO = 0x4C0, // SMSG, talents related
+ CMSG_LEARN_PREVIEW_TALENTS = 0x4C1, // CMSG, lua: LearnPreviewTalents (for player?)
+ CMSG_LEARN_PREVIEW_TALENTS_PET = 0x4C2, // CMSG, lua: LearnPreviewTalents (for pet?)
+ UMSG_UNKNOWN_1219 = 0x4C3, // not found
+ UMSG_UNKNOWN_1220 = 0x4C4, // not found
+ UMSG_UNKNOWN_1221 = 0x4C5, // not found
+ UMSG_UNKNOWN_1222 = 0x4C6, // not found
+ SMSG_UNKNOWN_1223 = 0x4C7, // uint64, arena pet?
+ SMSG_UNKNOWN_1224 = 0x4C8, // uint32 "Can't change arena team..."
+ UMSG_UNKNOWN_1225 = 0x4C9, // not found
+ UMSG_UNKNOWN_1226 = 0x4CA, // not found
+ CMSG_EQUIPMENT_SET_USE = 0x4CB, // CMSG, lua: UseEquipmentSet
+ SMSG_EQUIPMENT_SET_USE_RESULT = 0x4CC, // SMSG, UseEquipmentSetResult?
+ NUM_MSG_TYPES = 0x4CD
};
/// Player state
diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp
index 89979ef439a..e27981922b6 100644
--- a/src/game/Pet.cpp
+++ b/src/game/Pet.cpp
@@ -304,6 +304,8 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
if(owner->GetGroup())
owner->SetGroupUpdateFlag(GROUP_UPDATE_PET);
+ owner->SendTalentsInfoData(true);
+
if(getPetType() == HUNTER_PET)
{
result = CharacterDatabase.PQuery("SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = '%u' AND id = '%u'", owner->GetGUIDLow(), GetCharmInfo()->GetPetNumber());
@@ -1570,6 +1572,13 @@ void Pet::InitTalentForLevel()
resetTalents(true);
}
SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount);
+
+ Unit *owner = GetOwner();
+ if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ if(!m_loading)
+ ((Player*)owner)->SendTalentsInfoData(true);
}
uint32 Pet::resetTalentsCost() const
diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp
index 7547d125d9c..d03aa7af7c4 100644
--- a/src/game/PetHandler.cpp
+++ b/src/game/PetHandler.cpp
@@ -542,6 +542,7 @@ void WorldSession::HandlePetUnlearnOpcode(WorldPacket& recvPacket)
return;
}
pet->resetTalents();
+ _player->SendTalentsInfoData(true);
}
void WorldSession::HandlePetSpellAutocastOpcode( WorldPacket& recvPacket )
@@ -708,4 +709,31 @@ void WorldSession::HandlePetLearnTalent( WorldPacket & recv_data )
recv_data >> guid >> talent_id >> requested_rank;
_player->LearnPetTalent(guid, talent_id, requested_rank);
+ _player->SendTalentsInfoData(true);
+}
+
+void WorldSession::HandleLearnPreviewTalentsPet( WorldPacket & recv_data )
+{
+ sLog.outDebug("CMSG_LEARN_PREVIEW_TALENTS_PET");
+
+ CHECK_PACKET_SIZE(recv_data, 8+4);
+
+ uint64 guid;
+ recv_data >> guid;
+
+ uint32 talentsCount;
+ recv_data >> talentsCount;
+
+ uint32 talentId, talentRank;
+
+ for(uint32 i = 0; i < talentsCount; ++i)
+ {
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4+4);
+
+ recv_data >> talentId >> talentRank;
+
+ _player->LearnPetTalent(guid, talentId, talentRank);
+ }
+
+ _player->SendTalentsInfoData(true);
}
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 5f97ab82e68..188a41f5b94 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -349,10 +349,6 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
PlayerTalkClass = new PlayerMenu( GetSession() );
m_currentBuybackSlot = BUYBACK_SLOT_START;
- for ( int aX = 0 ; aX < 8 ; aX++ )
- m_Tutorials[ aX ] = 0x00;
- m_TutorialsChanged = false;
-
m_DailyQuestChanged = false;
m_lastDailyQuestTime = 0;
@@ -429,7 +425,10 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
m_lastPotionId = 0;
- for (int i = 0; i < BASEMOD_END; i++)
+ m_activeSpec = 0;
+ m_specsCount = 0;
+
+ for (int i = 0; i < BASEMOD_END; ++i)
{
m_auraBaseMod[i][FLAT_MOD] = 0.0f;
m_auraBaseMod[i][PCT_MOD] = 1.0f;
@@ -454,7 +453,7 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
m_summon_z = 0.0f;
//Default movement to run mode
- m_unit_movement_flags = 0;
+ //m_unit_movement_flags = 0;
m_mover = this;
m_seer = this;
@@ -598,6 +597,7 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES, 0 ); // 0=disabled
SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES1, 0 ); // 0=disabled
+ SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES2, 0 ); // 0=disabled
SetUInt32Value( PLAYER_CHOSEN_TITLE, 0 );
SetUInt32Value( PLAYER_FIELD_KILLS, 0 );
SetUInt32Value( PLAYER_FIELD_LIFETIME_HONORBALE_KILLS, 0 );
@@ -1535,14 +1535,14 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
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);
const ItemPrototype * proto = objmgr.GetItemPrototype(item_id);
SpellItemEnchantmentEntry const *enchant = NULL;
for(uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot)
{
- uint32 enchantId = GetUInt32Value(visualbase+1+enchantSlot);
+ uint32 enchantId = GetUInt16Value(visualbase + 1, enchantSlot);
if(enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId))
break;
}
@@ -1645,6 +1645,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
// reset movement flags at teleport, because player will continue move with these flags after teleport
SetUnitMovementFlags(0);
+ m_movementInfo.flags = 0;
if (m_transport)
{
@@ -2423,6 +2424,8 @@ void Player::InitTalentForLevel()
else
SetFreeTalentPoints(talentPointsForLevel-m_usedTalentCount);
}
+
+ SendTalentsInfoData(false); // update at client
}
void Player::InitStatsForLevel(bool reapplyMods)
@@ -2603,7 +2606,7 @@ void Player::SendInitialSpells()
if(!itr->second->active || itr->second->disabled)
continue;
- data << uint16(itr->first);
+ data << uint32(itr->first);
data << uint16(0); // it's not slot id
spellCount +=1;
@@ -2623,7 +2626,7 @@ void Player::SendInitialSpells()
if(itr->second.end > infTime)
continue;
- data << uint16(itr->first);
+ data << uint32(itr->first);
time_t cooldown = 0;
if(itr->second.end > curTime)
@@ -2816,15 +2819,15 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
if(next_active_spell_id)
{
// update spell ranks in spellbook and action bar
- WorldPacket data(SMSG_SUPERCEDED_SPELL, (4));
- data << uint16(spell_id);
- data << uint16(next_active_spell_id);
+ WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4);
+ data << uint32(spell_id);
+ data << uint32(next_active_spell_id);
GetSession()->SendPacket( &data );
}
else
{
WorldPacket data(SMSG_REMOVED_SPELL, 4);
- data << uint16(spell_id);
+ data << uint32(spell_id);
GetSession()->SendPacket(&data);
}
}
@@ -2915,9 +2918,9 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
{
if(IsInWorld()) // not send spell (re-/over-)learn packets at loading
{
- WorldPacket data(SMSG_SUPERCEDED_SPELL, (4));
- data << uint16(itr2->first);
- data << uint16(spell_id);
+ WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4);
+ data << uint32(itr2->first);
+ data << uint32(spell_id);
GetSession()->SendPacket( &data );
}
@@ -2931,9 +2934,9 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
{
if(IsInWorld()) // not send spell (re-/over-)learn packets at loading
{
- WorldPacket data(SMSG_SUPERCEDED_SPELL, (4));
- data << uint16(spell_id);
- data << uint16(itr2->first);
+ WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4);
+ data << uint32(spell_id);
+ data << uint32(itr2->first);
GetSession()->SendPacket( &data );
}
@@ -3325,9 +3328,9 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_
if(update_action_bar_for_low_rank)
{
// downgrade spell ranks in spellbook and action bar
- WorldPacket data(SMSG_SUPERCEDED_SPELL, (4));
- data << uint16(spell_id);
- data << uint16(prev_id);
+ WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4);
+ data << uint32(spell_id);
+ data << uint32(prev_id);
GetSession()->SendPacket( &data );
prev_activate = true;
}
@@ -3341,7 +3344,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_
if(!prev_activate)
{
WorldPacket data(SMSG_REMOVED_SPELL, 4);
- data << uint16(spell_id);
+ data << uint32(spell_id);
GetSession()->SendPacket(&data);
}
}
@@ -3727,23 +3730,12 @@ void Player::InitVisibleBits()
// Players visible items are not inventory stuff
for(uint16 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{
- uint32 offset = i * MAX_VISIBLE_ITEM_OFFSET;
-
- // item creator
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 0 + offset);
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 1 + offset);
+ uint32 offset = i * 2;
// item entry
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 0 + offset);
-
- // item enchantments
- 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_VISIBLE_ITEM_1_ENTRYID + offset);
+ // enchant
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + offset);
}
updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE);
@@ -3768,7 +3760,7 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *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)
continue;
@@ -3801,7 +3793,7 @@ void Player::DestroyForPlayer( Player *target ) const
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)
continue;
@@ -4022,6 +4014,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
CharacterDatabase.PExecute("DELETE FROM character_pet_declinedname WHERE owner = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = '%u'",guid);
+ CharacterDatabase.PExecute("DELETE FROM character_equipmentsets WHERE guid = '%u'",guid);
CharacterDatabase.CommitTransaction();
//LoginDatabase.PExecute("UPDATE realmcharacters SET numchars = numchars - 1 WHERE acctid = %d AND realmid = %d", accountId, realmID);
@@ -5540,7 +5533,8 @@ void Player::SendInitialActionButtons() const
{
sLog.outDetail( "Initializing Action Buttons for '%u'", GetGUIDLow() );
- WorldPacket data(SMSG_ACTION_BUTTONS, (MAX_ACTION_BUTTONS*4));
+ WorldPacket data(SMSG_ACTION_BUTTONS, 1+(MAX_ACTION_BUTTONS*4));
+ data << uint8(0); // can be 0, 1, 2
for(int button = 0; button < MAX_ACTION_BUTTONS; ++button)
{
ActionButtonList::const_iterator itr = m_actionButtons.find(button);
@@ -8462,7 +8456,7 @@ uint8 Player::CanUnequipItems( uint32 item, uint32 count ) const
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 );
if( pItem && pItem->GetEntry() == item )
@@ -8504,7 +8498,7 @@ uint32 Player::GetItemCount( uint32 item, bool inBankAlso, Item* skipItem ) cons
if( pItem && pItem != skipItem && pItem->GetEntry() == item )
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 );
if( pItem && pItem != skipItem && pItem->GetEntry() == item )
@@ -8564,7 +8558,7 @@ Item* Player::GetItemByGuid( uint64 guid ) const
if( pItem && pItem->GetGUID() == guid )
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 );
if( pItem && pItem->GetGUID() == guid )
@@ -8610,7 +8604,7 @@ Item* Player::GetItemByPos( uint16 pos ) 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];
else if(bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END
|| bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END )
@@ -8680,7 +8674,7 @@ bool Player::IsInventoryPos( uint8 bag, uint8 slot )
return true;
if( bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END )
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 false;
}
@@ -8801,7 +8795,7 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const
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 );
if( pItem && pItem->GetEntry() == item )
@@ -8968,7 +8962,7 @@ bool Player::HasItemTotemCategory( uint32 TotemCategory ) const
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
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 = GetUseableItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
@@ -9008,18 +9002,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))
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
if(slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS))
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
- // guestbag case (not use)
- if(slot >= QUESTBAG_SLOT_START && slot < QUESTBAG_SLOT_END)
- return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
-
// prevent cheating
if(slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END || slot >= PLAYER_SLOT_END)
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
@@ -9265,7 +9251,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
{
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(no_space_count)
@@ -9439,7 +9425,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
// search stack for merge to
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(no_space_count)
@@ -10660,30 +10646,14 @@ void Player::SetVisibleItemSlot(uint8 slot, Item *pItem)
{
if(pItem)
{
- SetUInt64Value(PLAYER_VISIBLE_ITEM_1_CREATOR + (slot * MAX_VISIBLE_ITEM_OFFSET), pItem->GetUInt64Value(ITEM_FIELD_CREATOR));
-
- 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());
+ SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), pItem->GetEntry());
+ SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 0, pItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
+ SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 1, pItem->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT));
}
else
{
- SetUInt64Value(PLAYER_VISIBLE_ITEM_1_CREATOR + (slot * MAX_VISIBLE_ITEM_OFFSET), 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);
+ SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), 0);
+ SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 0);
}
}
@@ -10933,7 +10903,7 @@ 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 ))
{
@@ -11038,7 +11008,7 @@ void Player::DestroyZoneLimitedItem( bool update, uint32 new_zone )
if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
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 (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
@@ -12171,11 +12141,12 @@ void Player::ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool
}
// visualize enchantment at player and equipped items
- if(slot < MAX_INSPECTED_ENCHANTMENT_SLOT)
- {
- int VisibleBase = PLAYER_VISIBLE_ITEM_1_0 + (item->GetSlot() * MAX_VISIBLE_ITEM_OFFSET);
- SetUInt32Value(VisibleBase + 1 + slot, apply? item->GetEnchantmentId(slot) : 0);
- }
+ if(slot == PERM_ENCHANTMENT_SLOT)
+ SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 0, apply ? item->GetEnchantmentId(slot) : 0);
+
+ if(slot == TEMP_ENCHANTMENT_SLOT)
+ SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 1, apply ? item->GetEnchantmentId(slot) : 0);
+
if(apply_dur)
{
@@ -12275,9 +12246,9 @@ void Player::PrepareQuestMenu( uint64 guid )
uint32 quest_id = i->second;
QuestStatus status = GetQuestStatus( quest_id );
if ( status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus( quest_id ) )
- qm.AddMenuItem(quest_id, DIALOG_STATUS_REWARD_REP);
+ qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
else if ( status == QUEST_STATUS_INCOMPLETE )
- qm.AddMenuItem(quest_id, DIALOG_STATUS_INCOMPLETE);
+ qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
else if (status == QUEST_STATUS_AVAILABLE )
qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT);
}
@@ -12291,9 +12262,9 @@ void Player::PrepareQuestMenu( uint64 guid )
QuestStatus status = GetQuestStatus( quest_id );
if (pQuest->IsAutoComplete() && CanTakeQuest(pQuest, false))
- qm.AddMenuItem(quest_id, DIALOG_STATUS_REWARD_REP);
+ qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
else if ( status == QUEST_STATUS_NONE && CanTakeQuest( pQuest, false ) )
- qm.AddMenuItem(quest_id, DIALOG_STATUS_AVAILABLE);
+ qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT);
}
}
@@ -12316,10 +12287,10 @@ void Player::SendPreparedQuest( uint64 guid )
if ( pQuest )
{
- if( status == DIALOG_STATUS_REWARD_REP && !GetQuestRewardStatus( quest_id ) )
+ if( status == DIALOG_STATUS_UNK2 && !GetQuestRewardStatus( quest_id ) )
+ PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanRewardQuest(pQuest, false), true );
+ else if( status == DIALOG_STATUS_UNK2 )
PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanRewardQuest(pQuest, false), true );
- else if( status == DIALOG_STATUS_INCOMPLETE )
- PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, false, true );
// Send completable on repeatable quest if player don't have quest
else if( pQuest->IsRepeatable() && !pQuest->IsDaily() )
PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanCompleteRepeatableQuest(pQuest), true );
@@ -14119,6 +14090,38 @@ void Player::_LoadArenaTeamInfo(QueryResult *result)
delete result;
}
+void Player::_LoadEquipmentSets(QueryResult *result)
+{
+ // SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid));
+ if (!result)
+ return;
+
+ uint32 count = 0;
+ do
+ {
+ Field *fields = result->Fetch();
+
+ EquipmentSet eqSet;
+
+ eqSet.Guid = fields[0].GetUInt64();
+ uint32 index = fields[1].GetUInt32();
+ eqSet.Name = fields[2].GetCppString();
+ eqSet.IconName = fields[3].GetCppString();
+ eqSet.state = EQUIPMENT_SET_UNCHANGED;
+
+ for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ eqSet.Items[i] = fields[4+i].GetUInt32();
+
+ m_EquipmentSets[index] = eqSet;
+
+ ++count;
+
+ if(count >= MAX_EQUIPMENT_SET_INDEX) // client limit
+ break;
+ } while (result->NextRow());
+ delete result;
+}
+
bool Player::LoadPositionFromDB(uint32& mapid, float& x,float& y,float& z,float& o, bool& in_flight, uint64 guid)
{
QueryResult *result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,taxi_path FROM characters WHERE guid = '%u'",GUID_LOPART(guid));
@@ -14662,8 +14665,6 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
InitTalentForLevel();
learnDefaultSpells();
- _LoadTutorials(holder->GetResult(PLAYER_LOGIN_QUERY_LOADTUTORIALS));
-
// must be before inventory (some items required reputation check)
m_reputationMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADREPUTATION));
@@ -14808,6 +14809,9 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
m_achievementMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS), holder->GetResult(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS));
m_achievementMgr.CheckAllAchievementCriteria();
+
+ _LoadEquipmentSets(holder->GetResult(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS));
+
return true;
}
@@ -15426,27 +15430,6 @@ void Player::_LoadSpells(QueryResult *result)
}
}
-void Player::_LoadTutorials(QueryResult *result)
-{
- //QueryResult *result = CharacterDatabase.PQuery("SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u' AND realmid = '%u'", GetAccountId(), realmid);
-
- if(result)
- {
- do
- {
- Field *fields = result->Fetch();
-
- for (int iI=0; iI<8; iI++)
- m_Tutorials[iI] = fields[iI].GetUInt32();
- }
- while( result->NextRow() );
-
- delete result;
- }
-
- m_TutorialsChanged = false;
-}
-
void Player::_LoadGroup(QueryResult *result)
{
//QueryResult *result = CharacterDatabase.PQuery("SELECT leaderGuid FROM group_member WHERE memberGuid='%u'", GetGUIDLow());
@@ -15961,13 +15944,14 @@ void Player::SaveToDB()
_SaveInventory();
_SaveQuestStatus();
_SaveDailyQuestStatus();
- _SaveTutorials();
_SaveSpells();
_SaveSpellCooldowns();
_SaveActions();
_SaveAuras();
m_achievementMgr.SaveToDB();
m_reputationMgr.SaveToDB();
+ _SaveEquipmentSets();
+ GetSession()->SaveTutorialsData(); // changed only while character in game
CharacterDatabase.CommitTransaction();
@@ -16248,33 +16232,6 @@ void Player::_SaveSpells()
}
}
-void Player::_SaveTutorials()
-{
- if(!m_TutorialsChanged)
- return;
-
- uint32 Rows=0;
- // it's better than rebuilding indexes multiple times
- QueryResult *result = CharacterDatabase.PQuery("SELECT count(*) AS r FROM character_tutorial WHERE account = '%u' AND realmid = '%u'", GetSession()->GetAccountId(), realmID );
- if(result)
- {
- Rows = result->Fetch()[0].GetUInt32();
- delete result;
- }
-
- if (Rows)
- {
- CharacterDatabase.PExecute("UPDATE character_tutorial SET tut0='%u', tut1='%u', tut2='%u', tut3='%u', tut4='%u', tut5='%u', tut6='%u', tut7='%u' WHERE account = '%u' AND realmid = '%u'",
- m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7], GetSession()->GetAccountId(), realmID );
- }
- else
- {
- CharacterDatabase.PExecute("INSERT INTO character_tutorial (account,realmid,tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7) VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", GetSession()->GetAccountId(), realmID, m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7]);
- };
-
- m_TutorialsChanged = false;
-}
-
void Player::outDebugValues() const
{
if(!sLog.IsOutDebug()) // optimize disabled debug output
@@ -16711,9 +16668,8 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent)
if(pet->isControlled())
{
- WorldPacket data(SMSG_PET_SPELLS, 8+4);
+ WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0);
- data << uint32(0);
GetSession()->SendPacket(&data);
if(GetGroup())
@@ -16843,9 +16799,9 @@ void Player::PetSpellInitialize()
CharmInfo *charmInfo = pet->GetCharmInfo();
- WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1);
+ WorldPacket data(SMSG_PET_SPELLS, 8+2+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1);
data << uint64(pet->GetGUID());
- data << uint32(pet->GetCreatureInfo()->family); // creature family (required for pet talents)
+ data << uint16(pet->GetCreatureInfo()->family); // creature family (required for pet talents)
data << uint32(0);
data << uint8(pet->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
@@ -16883,7 +16839,7 @@ void Player::PetSpellInitialize()
{
time_t cooldown = (itr->second > curTime) ? (itr->second - curTime) * IN_MILISECONDS : 0;
- data << uint16(itr->first); // spellid
+ data << uint32(itr->first); // spellid
data << uint16(0); // spell category?
data << uint32(cooldown); // cooldown
data << uint32(0); // category cooldown
@@ -16893,7 +16849,7 @@ void Player::PetSpellInitialize()
{
time_t cooldown = (itr->second > curTime) ? (itr->second - curTime) * IN_MILISECONDS : 0;
- data << uint16(itr->first); // spellid
+ data << uint32(itr->first); // spellid
data << uint16(0); // spell category?
data << uint32(0); // cooldown
data << uint32(cooldown); // category cooldown
@@ -16918,9 +16874,9 @@ void Player::PossessSpellInitialize()
return;
}
- WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1);
+ WorldPacket data(SMSG_PET_SPELLS, 8+2+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1);
data << uint64(charm->GetGUID());
- data << uint32(0);
+ data << uint16(0);
data << uint32(0);
data << uint32(0);
@@ -16938,10 +16894,10 @@ void Player::VehicleSpellInitialize()
if(!charm)
return;
- WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+4*10+1+1);
+ WorldPacket data(SMSG_PET_SPELLS, 8+2+4+4+4*10+1+1);
data << uint64(charm->GetGUID());
- data << uint32(0x00000000);
- data << uint32(0x00000000);
+ data << uint16(0);
+ data << uint32(0);
data << uint32(0x00000101);
for(uint32 i = 0; i < CREATURE_MAX_SPELLS; ++i)
@@ -16998,9 +16954,9 @@ void Player::CharmSpellInitialize()
}
}
- WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+4*addlist+1);
+ WorldPacket data(SMSG_PET_SPELLS, 8+2+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+4*addlist+1);
data << uint64(charm->GetGUID());
- data << uint32(0);
+ data << uint16(0);
data << uint32(0);
if(charm->GetTypeId() != TYPEID_PLAYER)
@@ -17032,9 +16988,8 @@ void Player::CharmSpellInitialize()
void Player::SendRemoveControlBar()
{
- WorldPacket data(SMSG_PET_SPELLS, 8+4);
+ WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0);
- data << uint32(0);
GetSession()->SendPacket(&data);
}
@@ -17892,8 +17847,8 @@ void Player::UpdateHomebindTime(uint32 time)
{
if (time >= m_HomebindTimer)
{
- // teleport to homebind location
- TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation());
+ // teleport to nearest graveyard
+ RepopAtGraveyard();
}
else
m_HomebindTimer -= time;
@@ -18680,6 +18635,8 @@ void Player::SendInitialPacketsBeforeAddToMap()
data << uint32(0); // unknown, may be rest state time or experience
GetSession()->SendPacket(&data);
+ GetSocial()->SendSocialList();
+
// Homebind
data.Initialize(SMSG_BINDPOINTUPDATE, 5*4);
data << m_homebindX << m_homebindY << m_homebindZ;
@@ -18690,12 +18647,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
// SMSG_SET_PROFICIENCY
// SMSG_UPDATE_AURA_DURATION
- // tutorial stuff
- data.Initialize(SMSG_TUTORIAL_FLAGS, 8*4);
- for (int i = 0; i < 8; ++i)
- data << uint32( GetTutorialInt(i) );
- GetSession()->SendPacket(&data);
-
+ SendTalentsInfoData(false);
SendInitialSpells();
data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4);
@@ -18711,16 +18663,13 @@ void Player::SendInitialPacketsBeforeAddToMap()
GetZoneAndAreaId(newzone,newarea);
UpdateZone(newzone,newarea); // also call SendInitWorldStates();
- // SMSG_SET_AURA_SINGLE
+ SendEquipmentSetList();
- data.Initialize(SMSG_LOGIN_SETTIMESPEED, 8);
+ data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
data << uint32(secsToTimeBitFields(sWorld.GetGameTime()));
data << (float)0.01666667f; // game speed
+ data << uint32(0); // added in 3.1.2
GetSession()->SendPacket( &data );
-
- // set fly flag if in fly form or taxi flight to prevent visually drop at ground in showup moment
- //if(HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || isInFlight())
- // AddUnitMovementFlag(MOVEMENTFLAG_FLYING2);
}
void Player::SendInitialPacketsAfterAddToMap()
@@ -20076,7 +20025,7 @@ bool Player::isTotalImmune()
bool Player::HasTitle(uint32 bitIndex)
{
- if (bitIndex > 128)
+ if (bitIndex > 192)
return false;
uint32 fieldIndexOffset = bitIndex / 32;
@@ -20773,3 +20722,314 @@ bool Player::canSeeSpellClickOn(Creature const *c) const
}
return false;
}
+
+void Player::BuildPlayerTalentsInfoData(WorldPacket *data)
+{
+ *data << uint32(GetFreeTalentPoints()); // unspentTalentPoints
+ uint8 talentGroupCount = 1;
+ *data << uint8(talentGroupCount); // talent group count (0, 1 or 2)
+ *data << uint8(0); // talent group index (0 or 1)
+
+ if(talentGroupCount)
+ {
+ // loop through all specs (only 1 for now)
+ for(uint32 groups = 0; groups < talentGroupCount; ++groups)
+ {
+ uint8 talentIdCount = 0;
+ size_t pos = data->wpos();
+ *data << uint8(talentIdCount); // [PH], talentIdCount
+
+ // find class talent tabs (all players have 3 talent tabs)
+ uint32 const* talentTabIds = GetTalentTabPages(getClass());
+
+ for(uint32 i = 0; i < 3; ++i)
+ {
+ uint32 talentTabId = talentTabIds[i];
+
+ for(uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
+ {
+ TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
+ if(!talentInfo)
+ continue;
+
+ // skip another tab talents
+ if(talentInfo->TalentTab != talentTabId)
+ continue;
+
+ // find max talent rank
+ int32 curtalent_maxrank = -1;
+ for(int32 k = 4; k > -1; --k)
+ {
+ if(talentInfo->RankID[k] && HasSpell(talentInfo->RankID[k]))
+ {
+ curtalent_maxrank = k;
+ break;
+ }
+ }
+
+ // not learned talent
+ if(curtalent_maxrank < 0)
+ continue;
+
+ *data << uint32(talentInfo->TalentID); // Talent.dbc
+ *data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
+
+ ++talentIdCount;
+ }
+ }
+
+ data->put<uint8>(pos, talentIdCount); // put real count
+
+ *data << uint8(MAX_GLYPH_SLOT_INDEX); // glyphs count
+
+ for(uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
+ *data << uint16(GetGlyph(i)); // GlyphProperties.dbc
+ }
+ }
+}
+
+void Player::BuildPetTalentsInfoData(WorldPacket *data)
+{
+ uint32 unspentTalentPoints = 0;
+ size_t pointsPos = data->wpos();
+ *data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints
+
+ uint8 talentIdCount = 0;
+ size_t countPos = data->wpos();
+ *data << uint8(talentIdCount); // [PH], talentIdCount
+
+ Pet *pet = GetPet();
+ if(!pet)
+ return;
+
+ unspentTalentPoints = pet->GetFreeTalentPoints();
+
+ data->put<uint32>(pointsPos, unspentTalentPoints); // put real points
+
+ CreatureInfo const *ci = pet->GetCreatureInfo();
+ if(!ci)
+ return;
+
+ CreatureFamilyEntry const *pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
+ if(!pet_family || pet_family->petTalentType < 0)
+ return;
+
+ for(uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
+ {
+ TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry( talentTabId );
+ if(!talentTabInfo)
+ continue;
+
+ if(!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
+ continue;
+
+ for(uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
+ {
+ TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
+ if(!talentInfo)
+ continue;
+
+ // skip another tab talents
+ if(talentInfo->TalentTab != talentTabId)
+ continue;
+
+ // find max talent rank
+ int32 curtalent_maxrank = -1;
+ for(int32 k = 4; k > -1; --k)
+ {
+ if(talentInfo->RankID[k] && pet->HasSpell(talentInfo->RankID[k]))
+ {
+ curtalent_maxrank = k;
+ break;
+ }
+ }
+
+ // not learned talent
+ if(curtalent_maxrank < 0)
+ continue;
+
+ *data << uint32(talentInfo->TalentID); // Talent.dbc
+ *data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
+
+ ++talentIdCount;
+ }
+
+ data->put<uint8>(countPos, talentIdCount); // put real count
+
+ break;
+ }
+}
+
+void Player::SendTalentsInfoData(bool pet)
+{
+ WorldPacket data(SMSG_TALENTS_INFO, 50);
+ data << uint8(pet ? 1 : 0);
+ if(pet)
+ BuildPetTalentsInfoData(&data);
+ else
+ BuildPlayerTalentsInfoData(&data);
+ GetSession()->SendPacket(&data);
+}
+
+void Player::BuildEnchantmentsInfoData(WorldPacket *data)
+{
+ uint32 slotUsedMask = 0;
+ size_t slotUsedMaskPos = data->wpos();
+ *data << uint32(slotUsedMask); // slotUsedMask < 0x80000
+
+ for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ {
+ Item *item = GetItemByPos(INVENTORY_SLOT_BAG_0, i);
+
+ if(!item)
+ continue;
+
+ slotUsedMask |= (1 << i);
+
+ *data << uint32(item->GetEntry()); // item entry
+
+ uint16 enchantmentMask = 0;
+ size_t enchantmentMaskPos = data->wpos();
+ *data << uint16(enchantmentMask); // enchantmentMask < 0x1000
+
+ for(uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
+ {
+ uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
+
+ if(!enchId)
+ continue;
+
+ enchantmentMask |= (1 << j);
+
+ *data << uint16(enchId); // enchantmentId?
+ }
+
+ data->put<uint16>(enchantmentMaskPos, enchantmentMask);
+
+ *data << uint16(0); // ?
+ *data << uint8(0); // PGUID!
+ *data << uint32(0); // seed?
+ }
+
+ data->put<uint32>(slotUsedMaskPos, slotUsedMask);
+}
+
+void Player::SendEquipmentSetList()
+{
+ uint32 count = 0;
+ WorldPacket data(SMSG_EQUIPMENT_SET_LIST, 4);
+ size_t count_pos = data.wpos();
+ data << uint32(count); // count placeholder
+ for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
+ {
+ if(itr->second.state==EQUIPMENT_SET_DELETED)
+ continue;
+ data.appendPackGUID(itr->second.Guid);
+ data << uint32(itr->first);
+ data << itr->second.Name;
+ data << itr->second.IconName;
+ for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ data.appendPackGUID(MAKE_NEW_GUID(itr->second.Items[i], 0, HIGHGUID_ITEM));
+
+ ++count; // client have limit but it checked at loading and set
+ }
+ data.put<uint32>(count_pos, count);
+ GetSession()->SendPacket(&data);
+}
+
+void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset)
+{
+ if(eqset.Guid != 0)
+ {
+ bool found = false;
+
+ for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
+ {
+ if((itr->second.Guid == eqset.Guid) && (itr->first == index))
+ {
+ found = true;
+ break;
+ }
+ }
+
+ if(!found) // something wrong...
+ {
+ sLog.outError("Player %s tried to save equipment set "UI64FMTD" (index %u), but that equipment set not found!", GetName(), eqset.Guid, index);
+ return;
+ }
+ }
+
+ EquipmentSet& eqslot = m_EquipmentSets[index];
+
+ EquipmentSetUpdateState old_state = eqslot.state;
+
+ eqslot = eqset;
+
+ if(eqset.Guid == 0)
+ {
+ eqslot.Guid = objmgr.GenerateEquipmentSetGuid();
+
+ WorldPacket data(SMSG_EQUIPMENT_SET_SAVED, 4 + 1);
+ data << uint32(index);
+ data.appendPackGUID(eqslot.Guid);
+ GetSession()->SendPacket(&data);
+ }
+
+ eqslot.state = old_state == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED;
+}
+
+void Player::_SaveEquipmentSets()
+{
+ for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
+ {
+ uint32 index = itr->first;
+ EquipmentSet& eqset = itr->second;
+ switch(eqset.state)
+ {
+ case EQUIPMENT_SET_UNCHANGED:
+ ++itr;
+ break; // nothing do
+ case EQUIPMENT_SET_CHANGED:
+ CharacterDatabase.PExecute("UPDATE character_equipmentsets SET name='%s', iconname='%s', item0='%u', item1='%u', item2='%u', item3='%u', item4='%u', item5='%u', item6='%u', item7='%u', item8='%u', item9='%u', item10='%u', item11='%u', item12='%u', item13='%u', item14='%u', item15='%u', item16='%u', item17='%u', item18='%u' WHERE guid='%u' AND setguid='"UI64FMTD"' AND setindex='%u'",
+ eqset.Name.c_str(), eqset.IconName.c_str(), eqset.Items[0], eqset.Items[1], eqset.Items[2], eqset.Items[3], eqset.Items[4], eqset.Items[5], eqset.Items[6], eqset.Items[7],
+ eqset.Items[8], eqset.Items[9], eqset.Items[10], eqset.Items[11], eqset.Items[12], eqset.Items[13], eqset.Items[14], eqset.Items[15], eqset.Items[16], eqset.Items[17], eqset.Items[18], GetGUIDLow(), eqset.Guid, index);
+ eqset.state = EQUIPMENT_SET_UNCHANGED;
+ ++itr;
+ break;
+ case EQUIPMENT_SET_NEW:
+ CharacterDatabase.PExecute("INSERT INTO character_equipmentsets VALUES ('%u', '"UI64FMTD"', '%u', '%s', '%s', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')",
+ GetGUIDLow(), eqset.Guid, index, eqset.Name.c_str(), eqset.IconName.c_str(), eqset.Items[0], eqset.Items[1], eqset.Items[2], eqset.Items[3], eqset.Items[4], eqset.Items[5], eqset.Items[6], eqset.Items[7],
+ eqset.Items[8], eqset.Items[9], eqset.Items[10], eqset.Items[11], eqset.Items[12], eqset.Items[13], eqset.Items[14], eqset.Items[15], eqset.Items[16], eqset.Items[17], eqset.Items[18]);
+ eqset.state = EQUIPMENT_SET_UNCHANGED;
+ ++itr;
+ break;
+ case EQUIPMENT_SET_DELETED:
+ CharacterDatabase.PExecute("DELETE FROM character_equipmentsets WHERE setguid="UI64FMTD, eqset.Guid);
+ m_EquipmentSets.erase(itr++);
+ break;
+ }
+ }
+}
+
+void Player::DeleteEquipmentSet(uint64 setGuid)
+{
+ for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
+ {
+ if(itr->second.Guid == setGuid)
+ {
+ if(itr->second.state == EQUIPMENT_SET_NEW)
+ m_EquipmentSets.erase(itr);
+ else
+ itr->second.state = EQUIPMENT_SET_DELETED;
+ break;
+ }
+ }
+}
+
+void Player::ActivateSpec(uint32 specNum)
+{
+ if(GetActiveSpec() == specNum)
+ return;
+
+ resetTalents(true);
+} \ No newline at end of file
diff --git a/src/game/Player.h b/src/game/Player.h
index 379bb606f7a..f6784e402a2 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -355,6 +355,7 @@ struct LookingForGroup
LookingForGroupSlot slots[MAX_LOOKING_FOR_GROUP_SLOT];
LookingForGroupSlot more;
std::string comment;
+ uint8 roles;
};
enum PlayerMovementType
@@ -543,7 +544,7 @@ enum PlayerSlots
// first slot for item stored (in any way in player m_items data)
PLAYER_SLOT_START = 0,
// 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)
};
@@ -611,24 +612,39 @@ enum KeyRingSlots // 32 slots
KEYRING_SLOT_END = 118
};
-enum VanityPetSlots // 18 slots
+enum CurrencyTokenSlots // 32 slots
{
- VANITYPET_SLOT_START = 118, // not use, vanity pets stored as spells
- VANITYPET_SLOT_END = 136 // not allowed any content in.
+ CURRENCYTOKEN_SLOT_START = 118,
+ CURRENCYTOKEN_SLOT_END = 150
};
-enum CurrencyTokenSlots // 32 slots
+enum EquipmentSetUpdateState
{
- CURRENCYTOKEN_SLOT_START = 136,
- CURRENCYTOKEN_SLOT_END = 168
+ EQUIPMENT_SET_UNCHANGED = 0,
+ EQUIPMENT_SET_CHANGED = 1,
+ EQUIPMENT_SET_NEW = 2,
+ EQUIPMENT_SET_DELETED = 3
};
-enum QuestBagSlots // 32 slots
+struct EquipmentSet
{
- QUESTBAG_SLOT_START = 168, // not use
- QUESTBAG_SLOT_END = 200 // not allowed any content in.
+ EquipmentSet() : Guid(0), state(EQUIPMENT_SET_NEW)
+ {
+ for(int i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ Items[i] = 0;
+ }
+
+ uint64 Guid;
+ std::string Name;
+ std::string IconName;
+ uint32 Items[EQUIPMENT_SLOT_END];
+ EquipmentSetUpdateState state;
};
+#define MAX_EQUIPMENT_SET_INDEX 10 // client limit
+
+typedef std::map<uint32, EquipmentSet> EquipmentSets;
+
struct ItemPosCount
{
ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {}
@@ -647,15 +663,19 @@ enum TradeSlots
enum TransferAbortReason
{
- TRANSFER_ABORT_ERROR = 0x00,
- TRANSFER_ABORT_MAX_PLAYERS = 0x01, // Transfer Aborted: instance is full
- TRANSFER_ABORT_NOT_FOUND = 0x02, // Transfer Aborted: instance not found
- TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x03, // You have entered too many instances recently.
- TRANSFER_ABORT_ZONE_IN_COMBAT = 0x05, // Unable to zone in while an encounter is in progress.
- TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x06, // You must have <TBC,WotLK> expansion installed to access this area.
- TRANSFER_ABORT_DIFFICULTY = 0x07, // <Normal,Heroic,Epic> difficulty mode is not available for %s.
- TRANSFER_ABORT_UNIQUE_MESSAGE = 0x08, // Until you've escaped TLK's grasp, you cannot leave this place!
- TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x09 // Additional instances cannot be launched, please try again later.
+ TRANSFER_ABORT_NONE = 0x00,
+ TRANSFER_ABORT_ERROR = 0x01,
+ TRANSFER_ABORT_MAX_PLAYERS = 0x02, // Transfer Aborted: instance is full
+ TRANSFER_ABORT_NOT_FOUND = 0x03, // Transfer Aborted: instance not found
+ TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x04, // You have entered too many instances recently.
+ TRANSFER_ABORT_ZONE_IN_COMBAT = 0x06, // Unable to zone in while an encounter is in progress.
+ TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x07, // You must have <TBC,WotLK> expansion installed to access this area.
+ TRANSFER_ABORT_DIFFICULTY = 0x08, // <Normal,Heroic,Epic> difficulty mode is not available for %s.
+ 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
@@ -724,20 +744,20 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOADSPELLS = 4,
PLAYER_LOGIN_QUERY_LOADQUESTSTATUS = 5,
PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS = 6,
- PLAYER_LOGIN_QUERY_LOADTUTORIALS = 7, // common for all characters for some account at specific realm
- PLAYER_LOGIN_QUERY_LOADREPUTATION = 8,
- PLAYER_LOGIN_QUERY_LOADINVENTORY = 9,
- PLAYER_LOGIN_QUERY_LOADACTIONS = 10,
- PLAYER_LOGIN_QUERY_LOADMAILCOUNT = 11,
- PLAYER_LOGIN_QUERY_LOADMAILDATE = 12,
- PLAYER_LOGIN_QUERY_LOADSOCIALLIST = 13,
- PLAYER_LOGIN_QUERY_LOADHOMEBIND = 14,
- PLAYER_LOGIN_QUERY_LOADSPELLCOOLDOWNS = 15,
- PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 16,
- PLAYER_LOGIN_QUERY_LOADGUILD = 17,
- PLAYER_LOGIN_QUERY_LOADARENAINFO = 18,
- PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 19,
- PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 20,
+ PLAYER_LOGIN_QUERY_LOADREPUTATION = 7,
+ PLAYER_LOGIN_QUERY_LOADINVENTORY = 8,
+ PLAYER_LOGIN_QUERY_LOADACTIONS = 9,
+ PLAYER_LOGIN_QUERY_LOADMAILCOUNT = 10,
+ PLAYER_LOGIN_QUERY_LOADMAILDATE = 11,
+ PLAYER_LOGIN_QUERY_LOADSOCIALLIST = 12,
+ PLAYER_LOGIN_QUERY_LOADHOMEBIND = 13,
+ PLAYER_LOGIN_QUERY_LOADSPELLCOOLDOWNS = 14,
+ PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 15,
+ PLAYER_LOGIN_QUERY_LOADGUILD = 16,
+ PLAYER_LOGIN_QUERY_LOADARENAINFO = 17,
+ PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 18,
+ PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 19,
+ PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS = 20,
MAX_PLAYER_LOGIN_QUERY = 21
};
@@ -1095,6 +1115,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool apply_dur = true, bool ignore_condition = false);
void ApplyEnchantment(Item *item,bool apply);
void SendEnchantmentDurations();
+ void BuildEnchantmentsInfoData(WorldPacket *data);
void AddItemDurations(Item *item);
void RemoveItemDurations(Item *item);
void SendItemDurations();
@@ -1271,22 +1292,6 @@ class TRINITY_DLL_SPEC Player : public Unit
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED);
}
- uint32 GetTutorialInt(uint32 intId )
- {
- ASSERT( (intId < 8) );
- return m_Tutorials[intId];
- }
-
- void SetTutorialInt(uint32 intId, uint32 value)
- {
- ASSERT( (intId < 8) );
- if(m_Tutorials[intId]!=value)
- {
- m_Tutorials[intId] = value;
- m_TutorialsChanged = true;
- }
- }
-
QuestStatusMap& getQuestStatusMap() { return mQuestStatus; };
const uint64& GetSelection( ) const { return m_curSelection; }
@@ -1373,12 +1378,21 @@ class TRINITY_DLL_SPEC Player : public Unit
bool resetTalents(bool no_cost = false);
uint32 resetTalentsCost() const;
void InitTalentForLevel();
-
+ void BuildPlayerTalentsInfoData(WorldPacket *data);
+ void BuildPetTalentsInfoData(WorldPacket *data);
+ void SendTalentsInfoData(bool pet);
void LearnTalent(uint32 talentId, uint32 talentRank);
void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank);
uint32 CalculateTalentsPoints() const;
+ // Dual Spec
+ uint32 GetActiveSpec() { return m_activeSpec; }
+ void SetActiveSpec(uint32 spec) { m_activeSpec = spec; }
+ uint32 GetSpecsCount() { return m_specsCount; }
+ void SetSpecsCount(uint32 count) { m_specsCount = count; }
+ void ActivateSpec(uint32 specNum);
+
void InitGlyphsForLevel();
void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); }
uint32 GetGlyphSlot(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); }
@@ -1758,6 +1772,10 @@ class TRINITY_DLL_SPEC Player : public Unit
void CastItemCombatSpell(Item *item, CalcDamageInfo *damageInfo, ItemPrototype const * proto);
void CastItemUseSpell(Item *item,SpellCastTargets const& targets,uint8 cast_count, uint32 glyphIndex);
+ void SendEquipmentSetList();
+ void SetEquipmentSet(uint32 index, EquipmentSet eqset);
+ void DeleteEquipmentSet(uint64 setGuid);
+
void SendInitWorldStates(uint32 zone, uint32 area);
void SendUpdateWorldState(uint32 Field, uint32 Value);
void SendDirectMessage(WorldPacket *data);
@@ -1928,11 +1946,11 @@ class TRINITY_DLL_SPEC Player : public Unit
}
void HandleFall(MovementInfo const& movementInfo);
- bool isMoving() const { return HasUnitMovementFlag(movementFlagsMask); }
- bool isMovingOrTurning() const { return HasUnitMovementFlag(movementOrTurningFlagsMask); }
+ bool isMoving() const { return m_movementInfo.HasMovementFlag(movementFlagsMask); }
+ bool isMovingOrTurning() const { return m_movementInfo.HasMovementFlag(movementOrTurningFlagsMask); }
- bool CanFly() const { return HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); }
- bool IsFlying() const { return HasUnitMovementFlag(MOVEMENTFLAG_FLYING); }
+ bool CanFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
+ bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING); }
bool IsAllowUseFlyMountsHere() const;
void SetClientControl(Unit* target, uint8 allowMove);
@@ -2127,11 +2145,11 @@ class TRINITY_DLL_SPEC Player : public Unit
void _LoadGroup(QueryResult *result);
void _LoadSkills();
void _LoadSpells(QueryResult *result);
- void _LoadTutorials(QueryResult *result);
void _LoadFriendList(QueryResult *result);
bool _LoadHomeBind(QueryResult *result);
void _LoadDeclinedNames(QueryResult *result);
void _LoadArenaTeamInfo(QueryResult *result);
+ void _LoadEquipmentSets(QueryResult *result);
/*********************************************************/
/*** SAVE SYSTEM ***/
@@ -2144,7 +2162,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void _SaveQuestStatus();
void _SaveDailyQuestStatus();
void _SaveSpells();
- void _SaveTutorials();
+ void _SaveEquipmentSets();
void _SetCreateBits(UpdateMask *updateMask, Player *target) const;
void _SetUpdateBits(UpdateMask *updateMask, Player *target) const;
@@ -2197,6 +2215,9 @@ class TRINITY_DLL_SPEC Player : public Unit
PlayerSpellMap m_spells;
uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use
+ uint32 m_activeSpec;
+ uint32 m_specsCount;
+
ActionButtonList m_actionButtons;
float m_auraBaseMod[BASEMOD_END][MOD_END];
@@ -2231,9 +2252,6 @@ class TRINITY_DLL_SPEC Player : public Unit
time_t m_nextThinkTime;
- uint32 m_Tutorials[8];
- bool m_TutorialsChanged;
-
bool m_DailyQuestChanged;
time_t m_lastDailyQuestTime;
@@ -2292,6 +2310,7 @@ class TRINITY_DLL_SPEC Player : public Unit
DeclinedName *m_declinedname;
Runes *m_runes;
+ EquipmentSets m_EquipmentSets;
private:
// internal common parts for CanStore/StoreItem functions
uint8 _CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool swap, Item *pSrcItem ) const;
diff --git a/src/game/QueryHandler.cpp b/src/game/QueryHandler.cpp
index 5d13a6a576a..5786e24eaef 100644
--- a/src/game/QueryHandler.cpp
+++ b/src/game/QueryHandler.cpp
@@ -40,13 +40,14 @@ void WorldSession::SendNameQueryOpcode(Player *p)
return;
// guess size
- WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+4+4+4+10) );
- data << p->GetGUID();
- data << p->GetName();
+ WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+10) );
+ data.append(p->GetPackGUID()); // player guid
+ data << uint8(0); // added in 3.1
+ data << p->GetName(); // played name
data << uint8(0); // realm name for cross realm BG usage
- data << uint32(p->getRace());
- data << uint32(p->getGender());
- data << uint32(p->getClass());
+ data << uint8(p->getRace());
+ data << uint8(p->getGender());
+ data << uint8(p->getClass());
if(DeclinedName const* names = p->GetDeclinedNames())
{
data << uint8(1); // is declined
@@ -98,14 +99,15 @@ void WorldSession::SendNameQueryOpcodeFromDBCallBack(QueryResult *result, uint32
else
field = fields[2].GetUInt32();
- // guess size
- WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+4+4+4+10) );
- data << MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER);
+ // guess size
+ WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+1+10) );
+ data.appendPackGUID(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER));
+ data << uint8(0); // added in 3.1
data << name;
data << uint8(0);
- data << uint32(field & 0xFF);
- data << uint32((field >> 16) & 0xFF);
- data << uint32((field >> 8) & 0xFF);
+ data << uint8(field & 0xFF);
+ data << uint8((field >> 16) & 0xFF);
+ data << uint8((field >> 8) & 0xFF);
// if the first declined name field (3) is empty, the rest must be too
if(sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) && fields[3].GetCppString() != "")
@@ -167,9 +169,9 @@ void WorldSession::HandleCreatureQueryOpcode( WorldPacket & recv_data )
CreatureLocale const *cl = objmgr.GetCreatureLocale(entry);
if (cl)
{
- if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty())
+ if (cl->Name.size() > size_t(loc_idx) && !cl->Name[loc_idx].empty())
Name = cl->Name[loc_idx];
- if (cl->SubName.size() > loc_idx && !cl->SubName[loc_idx].empty())
+ if (cl->SubName.size() > size_t(loc_idx) && !cl->SubName[loc_idx].empty())
SubName = cl->SubName[loc_idx];
}
}
@@ -185,13 +187,18 @@ void WorldSession::HandleCreatureQueryOpcode( WorldPacket & recv_data )
data << uint32(ci->type); // CreatureType.dbc
data << uint32(ci->family); // CreatureFamily.dbc
data << uint32(ci->rank); // Creature Rank (elite, boss, etc)
- data << uint32(ci->PetSpellDataId); // Id from CreatureSpellData.dbc wdbField12
+ data << uint32(ci->unk1); // new in 3.1, creature entry?
+ data << uint32(ci->unk2); // new in 3.1, creature entry?
data << (uint32)ci->Modelid_A1; // Modelid_A1
data << (uint32)ci->Modelid_A2; // Modelid_A2
data << (uint32)ci->Modelid_H1; // Modelid_H1
data << (uint32)ci->Modelid_H2; // Modelid_H2
+ data << float(ci->unk16); // unk
data << float(ci->unk17); // unk
data << uint8(ci->RacialLeader);
+ for(uint32 i = 0; i < 4; ++i)
+ data << uint32(ci->questItems[i]); // itemId[4], quest drop
+ data << uint32(ci->movementId); // CreatureMovementInfo.dbc
SendPacket( &data );
sLog.outDebug( "WORLD: Sent SMSG_CREATURE_QUERY_RESPONSE" );
}
@@ -234,9 +241,9 @@ void WorldSession::HandleGameObjectQueryOpcode( WorldPacket & recv_data )
GameObjectLocale const *gl = objmgr.GetGameObjectLocale(entryID);
if (gl)
{
- if (gl->Name.size() > loc_idx && !gl->Name[loc_idx].empty())
+ if (gl->Name.size() > size_t(loc_idx) && !gl->Name[loc_idx].empty())
Name = gl->Name[loc_idx];
- if (gl->CastBarCaption.size() > loc_idx && !gl->CastBarCaption[loc_idx].empty())
+ if (gl->CastBarCaption.size() > size_t(loc_idx) && !gl->CastBarCaption[loc_idx].empty())
CastBarCaption = gl->CastBarCaption[loc_idx];
}
}
@@ -249,9 +256,11 @@ void WorldSession::HandleGameObjectQueryOpcode( WorldPacket & recv_data )
data << uint8(0) << uint8(0) << uint8(0); // name2, name3, name4
data << IconName; // 2.0.3, string. Icon name to use instead of default icon for go's (ex: "Attack" makes sword)
data << CastBarCaption; // 2.0.3, string. Text will appear in Cast Bar when using GO (ex: "Collecting")
- data << uint8(0); // 2.0.3, string
+ data << info->unk1; // 2.0.3, string
data.append(info->raw.data, 24);
data << float(info->size); // go size
+ for(uint32 i = 0; i < 4; ++i)
+ data << uint32(info->questItems[i]); // itemId[4], quest drop
SendPacket( &data );
sLog.outDebug( "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE" );
}
@@ -371,9 +380,9 @@ void WorldSession::HandleNpcTextQueryOpcode( WorldPacket & recv_data )
{
for (int i = 0; i < 8; ++i)
{
- if (nl->Text_0[i].size() > loc_idx && !nl->Text_0[i][loc_idx].empty())
+ if (nl->Text_0[i].size() > size_t(loc_idx) && !nl->Text_0[i][loc_idx].empty())
Text_0[i]=nl->Text_0[i][loc_idx];
- if (nl->Text_1[i].size() > loc_idx && !nl->Text_1[i][loc_idx].empty())
+ if (nl->Text_1[i].size() > size_t(loc_idx) && !nl->Text_1[i][loc_idx].empty())
Text_1[i]=nl->Text_1[i][loc_idx];
}
}
@@ -440,7 +449,7 @@ void WorldSession::HandlePageTextQueryOpcode( WorldPacket & recv_data )
PageTextLocale const *pl = objmgr.GetPageTextLocale(pageID);
if (pl)
{
- if (pl->Text.size() > loc_idx && !pl->Text[loc_idx].empty())
+ if (pl->Text.size() > size_t(loc_idx) && !pl->Text[loc_idx].empty())
Text = pl->Text[loc_idx];
}
}
diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h
index f6cb2dd5b55..4db92b941ba 100644
--- a/src/game/QuestDef.h
+++ b/src/game/QuestDef.h
@@ -106,13 +106,15 @@ enum __QuestGiverStatus
{
DIALOG_STATUS_NONE = 0,
DIALOG_STATUS_UNAVAILABLE = 1,
- DIALOG_STATUS_CHAT = 2,
- DIALOG_STATUS_INCOMPLETE = 3,
- DIALOG_STATUS_REWARD_REP = 4,
- DIALOG_STATUS_AVAILABLE_REP = 5,
- DIALOG_STATUS_AVAILABLE = 6,
- DIALOG_STATUS_REWARD2 = 7, // not yellow dot on minimap
- DIALOG_STATUS_REWARD = 8 // yellow dot on minimap
+ DIALOG_STATUS_CHAT = 2, // 3.1 - may be changed
+ DIALOG_STATUS_UNK1 = 3, // 3.1
+ DIALOG_STATUS_UNK2 = 4, // 3.1
+ DIALOG_STATUS_INCOMPLETE = 5,
+ DIALOG_STATUS_REWARD_REP = 6,
+ DIALOG_STATUS_AVAILABLE_REP = 7,
+ DIALOG_STATUS_AVAILABLE = 8,
+ DIALOG_STATUS_REWARD2 = 9, // no yellow dot on minimap
+ DIALOG_STATUS_REWARD = 10 // yellow dot on minimap
};
enum __QuestFlags
diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp
index 74839bac1c3..1efbc859198 100644
--- a/src/game/QuestHandler.cpp
+++ b/src/game/QuestHandler.cpp
@@ -114,16 +114,17 @@ void WorldSession::HandleQuestgiverHelloOpcode( WorldPacket & recv_data )
void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
{
- CHECK_PACKET_SIZE(recv_data, 8+4);
+ CHECK_PACKET_SIZE(recv_data, 8+4+4);
uint64 guid;
uint32 quest;
- recv_data >> guid >> quest;
+ uint32 unk1;
+ recv_data >> guid >> quest >> unk1;
if(!GetPlayer()->isAlive())
return;
- sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u", uint32(GUID_LOPART(guid)), quest );
+ sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1 );
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER);
@@ -210,12 +211,13 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
void WorldSession::HandleQuestgiverQueryQuestOpcode( WorldPacket & recv_data )
{
- CHECK_PACKET_SIZE(recv_data, 8+4);
+ CHECK_PACKET_SIZE(recv_data, 8+4+1);
uint64 guid;
uint32 quest;
- recv_data >> guid >> quest;
- sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST npc = %u, quest = %u", uint32(GUID_LOPART(guid)), quest );
+ uint8 unk1;
+ recv_data >> guid >> quest >> unk1;
+ sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1 );
// Verify that the guid is valid and is a questgiver or involved in the requested quest
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM);
@@ -234,7 +236,7 @@ void WorldSession::HandleQuestgiverQueryQuestOpcode( WorldPacket & recv_data )
void WorldSession::HandleQuestQueryOpcode( WorldPacket & recv_data )
{
- CHECK_PACKET_SIZE(recv_data,4);
+ CHECK_PACKET_SIZE(recv_data, 4);
uint32 quest;
recv_data >> quest;
@@ -419,7 +421,12 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data)
_player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false);
}
else
- _player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false);
+ {
+ if(pQuest->GetReqItemsCount()) // some items required
+ _player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false);
+ else // no items required
+ _player->PlayerTalkClass->SendQuestGiverOfferReward(pQuest, guid, true);
+ }
}
}
diff --git a/src/game/RandomMovementGenerator.cpp b/src/game/RandomMovementGenerator.cpp
index 46a3b6086db..6d3648d51e4 100644
--- a/src/game/RandomMovementGenerator.cpp
+++ b/src/game/RandomMovementGenerator.cpp
@@ -130,7 +130,7 @@ RandomMovementGenerator<Creature>::_setRandomLocation(Creature &creature)
else
{
i_nextMoveTime.Reset(urand(500+i_destinationHolder.GetTotalTravelTime(),5000+i_destinationHolder.GetTotalTravelTime()));
- creature.SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
+ creature.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
}
//Call for creature group update
@@ -152,8 +152,8 @@ RandomMovementGenerator<Creature>::Initialize(Creature &creature)
if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2);
- else
- creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MOVEMENTFLAG_WALK_MODE : MOVEMENTFLAG_NONE );
+ else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0)
+ creature.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
_setRandomLocation(creature);
}
@@ -195,13 +195,13 @@ RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff
{
if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2);
- else
- creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MOVEMENTFLAG_WALK_MODE : MOVEMENTFLAG_NONE);
+ else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0)
+ creature.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
_setRandomLocation(creature);
}
else if(creature.isPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(),PET_FOLLOW_DIST+2.5f))
{
- creature.SetUnitMovementFlags(MOVEMENTFLAG_NONE);
+ creature.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
_setRandomLocation(creature);
}
}
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 7a00340111d..0ab69789660 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -694,7 +694,10 @@ enum SpellEffects
SPELL_EFFECT_CREATE_ITEM_2 = 157,
SPELL_EFFECT_MILLING = 158,
SPELL_EFFECT_ALLOW_RENAME_PET = 159,
- TOTAL_SPELL_EFFECTS = 160
+ SPELL_EFFECT_160 = 160,
+ SPELL_EFFECT_161 = 161,
+ SPELL_EFFECT_162 = 162,
+ TOTAL_SPELL_EFFECTS = 163
};
enum SpellCastResult
@@ -1157,7 +1160,7 @@ enum GameobjectTypes
GAMEOBJECT_TYPE_FISHINGNODE = 17,
GAMEOBJECT_TYPE_SUMMONING_RITUAL = 18,
GAMEOBJECT_TYPE_MAILBOX = 19,
- GAMEOBJECT_TYPE_AUCTIONHOUSE = 20,
+ GAMEOBJECT_TYPE_DO_NOT_USE = 20,
GAMEOBJECT_TYPE_GUARDPOST = 21,
GAMEOBJECT_TYPE_SPELLCASTER = 22,
GAMEOBJECT_TYPE_MEETINGSTONE = 23,
@@ -1165,7 +1168,7 @@ enum GameobjectTypes
GAMEOBJECT_TYPE_FISHINGHOLE = 25,
GAMEOBJECT_TYPE_FLAGDROP = 26,
GAMEOBJECT_TYPE_MINI_GAME = 27,
- GAMEOBJECT_TYPE_LOTTERY_KIOSK = 28,
+ GAMEOBJECT_TYPE_DO_NOT_USE_2 = 28,
GAMEOBJECT_TYPE_CAPTURE_POINT = 29,
GAMEOBJECT_TYPE_AURA_GENERATOR = 30,
GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY = 31,
diff --git a/src/game/SkillHandler.cpp b/src/game/SkillHandler.cpp
index 950fc985173..55f510dc6da 100644
--- a/src/game/SkillHandler.cpp
+++ b/src/game/SkillHandler.cpp
@@ -36,6 +36,30 @@ void WorldSession::HandleLearnTalentOpcode( WorldPacket & recv_data )
recv_data >> talent_id >> requested_rank;
_player->LearnTalent(talent_id, requested_rank);
+ _player->SendTalentsInfoData(false);
+}
+
+void WorldSession::HandleLearnPreviewTalents(WorldPacket& recvPacket)
+{
+ sLog.outDebug("CMSG_LEARN_PREVIEW_TALENTS");
+
+ CHECK_PACKET_SIZE(recvPacket, 4);
+
+ uint32 talentsCount;
+ recvPacket >> talentsCount;
+
+ uint32 talentId, talentRank;
+
+ for(uint32 i = 0; i < talentsCount; ++i)
+ {
+ CHECK_PACKET_SIZE(recvPacket, recvPacket.rpos()+4+4);
+
+ recvPacket >> talentId >> talentRank;
+
+ _player->LearnTalent(talentId, talentRank);
+ }
+
+ _player->SendTalentsInfoData(false);
}
void WorldSession::HandleTalentWipeConfirmOpcode( WorldPacket & recv_data )
@@ -66,6 +90,7 @@ void WorldSession::HandleTalentWipeConfirmOpcode( WorldPacket & recv_data )
return;
}
+ _player->SendTalentsInfoData(false);
unit->CastSpell(_player, 14867, true); //spell: "Untalent Visual Effect"
}
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 77774d6031f..db3d05036f6 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -3482,7 +3482,6 @@ void Spell::SendLogExecute()
data << uint32(0);
break;
case SPELL_EFFECT_OPEN_LOCK:
- case SPELL_EFFECT_OPEN_LOCK_ITEM:
if(Item *item = m_targets.getItemTarget())
data.append(item->GetPackGUID());
else
@@ -4081,7 +4080,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if( m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->isMoving() )
{
// skip stuck spell to allow use it in falling case and apply spell limitations at movement
- if( (!m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING) || m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK) &&
+ if( (!((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING) || m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK) &&
(IsAutoRepeat() || (m_spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) != 0) )
return SPELL_FAILED_MOVING;
}
diff --git a/src/game/SpellAuraDefines.h b/src/game/SpellAuraDefines.h
index 8dd39552eb2..9eee8f6416e 100644
--- a/src/game/SpellAuraDefines.h
+++ b/src/game/SpellAuraDefines.h
@@ -334,7 +334,13 @@ enum AuraType
SPELL_AURA_286,
SPELL_AURA_DEFLECT_SPELLS,
SPELL_AURA_288,
- TOTAL_AURAS = 289
+ SPELL_AURA_289,
+ SPELL_AURA_290,
+ SPELL_AURA_291,
+ SPELL_AURA_292,
+ SPELL_AURA_293,
+ SPELL_AURA_294,
+ TOTAL_AURAS = 295
};
enum AreaAuraType
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 0b726f742aa..eb55943e3c4 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -50,298 +50,306 @@
#include "Vehicle.h"
#include "CellImpl.h"
+#define Aura AuraEffect
pAuraHandler AuraHandler[TOTAL_AURAS]=
{
- &AuraEffect::HandleNULL, // 0 SPELL_AURA_NONE
- &AuraEffect::HandleBindSight, // 1 SPELL_AURA_BIND_SIGHT
- &AuraEffect::HandleModPossess, // 2 SPELL_AURA_MOD_POSSESS
- &AuraEffect::HandlePeriodicDamage, // 3 SPELL_AURA_PERIODIC_DAMAGE
- &AuraEffect::HandleAuraDummy, // 4 SPELL_AURA_DUMMY
- &AuraEffect::HandleModConfuse, // 5 SPELL_AURA_MOD_CONFUSE
- &AuraEffect::HandleModCharm, // 6 SPELL_AURA_MOD_CHARM
- &AuraEffect::HandleModFear, // 7 SPELL_AURA_MOD_FEAR
- &AuraEffect::HandlePeriodicHeal, // 8 SPELL_AURA_PERIODIC_HEAL
- &AuraEffect::HandleModAttackSpeed, // 9 SPELL_AURA_MOD_ATTACKSPEED
- &AuraEffect::HandleModThreat, // 10 SPELL_AURA_MOD_THREAT
- &AuraEffect::HandleModTaunt, // 11 SPELL_AURA_MOD_TAUNT
- &AuraEffect::HandleAuraModStun, // 12 SPELL_AURA_MOD_STUN
- &AuraEffect::HandleModDamageDone, // 13 SPELL_AURA_MOD_DAMAGE_DONE
- &AuraEffect::HandleNoImmediateEffect, // 14 SPELL_AURA_MOD_DAMAGE_TAKEN implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
- &AuraEffect::HandleNoImmediateEffect, // 15 SPELL_AURA_DAMAGE_SHIELD implemented in Unit::DoAttackDamage
- &AuraEffect::HandleModStealth, // 16 SPELL_AURA_MOD_STEALTH
- &AuraEffect::HandleNoImmediateEffect, // 17 SPELL_AURA_MOD_STEALTH_DETECT
- &AuraEffect::HandleInvisibility, // 18 SPELL_AURA_MOD_INVISIBILITY
- &AuraEffect::HandleInvisibilityDetect, // 19 SPELL_AURA_MOD_INVISIBILITY_DETECTION
- &AuraEffect::HandleAuraModTotalHealthPercentRegen, // 20 SPELL_AURA_OBS_MOD_HEALTH
- &AuraEffect::HandleAuraModTotalEnergyPercentRegen, // 21 SPELL_AURA_OBS_MOD_ENERGY
- &AuraEffect::HandleAuraModResistance, // 22 SPELL_AURA_MOD_RESISTANCE
- &AuraEffect::HandlePeriodicTriggerSpell, // 23 SPELL_AURA_PERIODIC_TRIGGER_SPELL
- &AuraEffect::HandlePeriodicEnergize, // 24 SPELL_AURA_PERIODIC_ENERGIZE
- &AuraEffect::HandleAuraModPacify, // 25 SPELL_AURA_MOD_PACIFY
- &AuraEffect::HandleAuraModRoot, // 26 SPELL_AURA_MOD_ROOT
- &AuraEffect::HandleAuraModSilence, // 27 SPELL_AURA_MOD_SILENCE
- &AuraEffect::HandleReflectSpells, // 28 SPELL_AURA_REFLECT_SPELLS implement in Unit::SpellHitResult
- &AuraEffect::HandleAuraModStat, // 29 SPELL_AURA_MOD_STAT
- &AuraEffect::HandleAuraModSkill, // 30 SPELL_AURA_MOD_SKILL
- &AuraEffect::HandleAuraModIncreaseSpeed, // 31 SPELL_AURA_MOD_INCREASE_SPEED
- &AuraEffect::HandleAuraModIncreaseMountedSpeed, // 32 SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
- &AuraEffect::HandleAuraModDecreaseSpeed, // 33 SPELL_AURA_MOD_DECREASE_SPEED
- &AuraEffect::HandleAuraModIncreaseHealth, // 34 SPELL_AURA_MOD_INCREASE_HEALTH
- &AuraEffect::HandleAuraModIncreaseEnergy, // 35 SPELL_AURA_MOD_INCREASE_ENERGY
- &AuraEffect::HandleAuraModShapeshift, // 36 SPELL_AURA_MOD_SHAPESHIFT
- &AuraEffect::HandleAuraModEffectImmunity, // 37 SPELL_AURA_EFFECT_IMMUNITY
- &AuraEffect::HandleAuraModStateImmunity, // 38 SPELL_AURA_STATE_IMMUNITY
- &AuraEffect::HandleAuraModSchoolImmunity, // 39 SPELL_AURA_SCHOOL_IMMUNITY
- &AuraEffect::HandleAuraModDmgImmunity, // 40 SPELL_AURA_DAMAGE_IMMUNITY
- &AuraEffect::HandleAuraModDispelImmunity, // 41 SPELL_AURA_DISPEL_IMMUNITY
- &AuraEffect::HandleAuraProcTriggerSpell, // 42 SPELL_AURA_PROC_TRIGGER_SPELL implemented in Unit::ProcDamageAndSpellFor and Unit::HandleProcTriggerSpell
- &AuraEffect::HandleNoImmediateEffect, // 43 SPELL_AURA_PROC_TRIGGER_DAMAGE implemented in Unit::ProcDamageAndSpellFor
- &AuraEffect::HandleAuraTrackCreatures, // 44 SPELL_AURA_TRACK_CREATURES
- &AuraEffect::HandleAuraTrackResources, // 45 SPELL_AURA_TRACK_RESOURCES
- &AuraEffect::HandleUnused, // 46 SPELL_AURA_46 (used in test spells 54054 and 54058, and spell 48050) (3.0.8a)
- &AuraEffect::HandleAuraModParryPercent, // 47 SPELL_AURA_MOD_PARRY_PERCENT
- &AuraEffect::HandleNULL, // 48 SPELL_AURA_48 spell Napalm (area damage spell with additional delayed damage effect)
- &AuraEffect::HandleAuraModDodgePercent, // 49 SPELL_AURA_MOD_DODGE_PERCENT
- &AuraEffect::HandleNoImmediateEffect, // 50 SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT implemented in Unit::SpellCriticalHealingBonus
- &AuraEffect::HandleAuraModBlockPercent, // 51 SPELL_AURA_MOD_BLOCK_PERCENT
- &AuraEffect::HandleAuraModCritPercent, // 52 SPELL_AURA_MOD_CRIT_PERCENT
- &AuraEffect::HandlePeriodicLeech, // 53 SPELL_AURA_PERIODIC_LEECH
- &AuraEffect::HandleModHitChance, // 54 SPELL_AURA_MOD_HIT_CHANCE
- &AuraEffect::HandleModSpellHitChance, // 55 SPELL_AURA_MOD_SPELL_HIT_CHANCE
- &AuraEffect::HandleAuraTransform, // 56 SPELL_AURA_TRANSFORM
- &AuraEffect::HandleModSpellCritChance, // 57 SPELL_AURA_MOD_SPELL_CRIT_CHANCE
- &AuraEffect::HandleAuraModIncreaseSwimSpeed, // 58 SPELL_AURA_MOD_INCREASE_SWIM_SPEED
- &AuraEffect::HandleNoImmediateEffect, // 59 SPELL_AURA_MOD_DAMAGE_DONE_CREATURE implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
- &AuraEffect::HandleAuraModPacifyAndSilence, // 60 SPELL_AURA_MOD_PACIFY_SILENCE
- &AuraEffect::HandleAuraModScale, // 61 SPELL_AURA_MOD_SCALE
- &AuraEffect::HandlePeriodicHealthFunnel, // 62 SPELL_AURA_PERIODIC_HEALTH_FUNNEL
- &AuraEffect::HandleUnused, // 63 unused (3.0.8a) old SPELL_AURA_PERIODIC_MANA_FUNNEL
- &AuraEffect::HandlePeriodicManaLeech, // 64 SPELL_AURA_PERIODIC_MANA_LEECH
- &AuraEffect::HandleModCastingSpeed, // 65 SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
- &AuraEffect::HandleFeignDeath, // 66 SPELL_AURA_FEIGN_DEATH
- &AuraEffect::HandleAuraModDisarm, // 67 SPELL_AURA_MOD_DISARM
- &AuraEffect::HandleAuraModStalked, // 68 SPELL_AURA_MOD_STALKED
- &AuraEffect::HandleSchoolAbsorb, // 69 SPELL_AURA_SCHOOL_ABSORB implemented in Unit::CalcAbsorbResist
- &AuraEffect::HandleUnused, // 70 SPELL_AURA_EXTRA_ATTACKS Useless, used by only one spell that has only visual effect
- &AuraEffect::HandleModSpellCritChanceShool, // 71 SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
- &AuraEffect::HandleModPowerCostPCT, // 72 SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
- &AuraEffect::HandleModPowerCost, // 73 SPELL_AURA_MOD_POWER_COST_SCHOOL
- &AuraEffect::HandleNoImmediateEffect, // 74 SPELL_AURA_REFLECT_SPELLS_SCHOOL implemented in Unit::SpellHitResult
- &AuraEffect::HandleNoImmediateEffect, // 75 SPELL_AURA_MOD_LANGUAGE
- &AuraEffect::HandleFarSight, // 76 SPELL_AURA_FAR_SIGHT
- &AuraEffect::HandleModMechanicImmunity, // 77 SPELL_AURA_MECHANIC_IMMUNITY
- &AuraEffect::HandleAuraMounted, // 78 SPELL_AURA_MOUNTED
- &AuraEffect::HandleModDamagePercentDone, // 79 SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
- &AuraEffect::HandleModPercentStat, // 80 SPELL_AURA_MOD_PERCENT_STAT
- &AuraEffect::HandleNoImmediateEffect, // 81 SPELL_AURA_SPLIT_DAMAGE_PCT
- &AuraEffect::HandleWaterBreathing, // 82 SPELL_AURA_WATER_BREATHING
- &AuraEffect::HandleModBaseResistance, // 83 SPELL_AURA_MOD_BASE_RESISTANCE
- &AuraEffect::HandleModRegen, // 84 SPELL_AURA_MOD_REGEN
- &AuraEffect::HandleModPowerRegen, // 85 SPELL_AURA_MOD_POWER_REGEN
- &AuraEffect::HandleChannelDeathItem, // 86 SPELL_AURA_CHANNEL_DEATH_ITEM
- &AuraEffect::HandleNoImmediateEffect, // 87 SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
- &AuraEffect::HandleNoImmediateEffect, // 88 SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
- &AuraEffect::HandlePeriodicDamagePCT, // 89 SPELL_AURA_PERIODIC_DAMAGE_PERCENT
- &AuraEffect::HandleUnused, // 90 unused (3.0.8a) old SPELL_AURA_MOD_RESIST_CHANCE
- &AuraEffect::HandleNoImmediateEffect, // 91 SPELL_AURA_MOD_DETECT_RANGE implemented in Creature::GetAttackDistance
- &AuraEffect::HandlePreventFleeing, // 92 SPELL_AURA_PREVENTS_FLEEING
- &AuraEffect::HandleModUnattackable, // 93 SPELL_AURA_MOD_UNATTACKABLE
- &AuraEffect::HandleNoImmediateEffect, // 94 SPELL_AURA_INTERRUPT_REGEN implemented in Player::RegenerateAll
- &AuraEffect::HandleAuraGhost, // 95 SPELL_AURA_GHOST
- &AuraEffect::HandleNoImmediateEffect, // 96 SPELL_AURA_SPELL_MAGNET implemented in Unit::SelectMagnetTarget
- &AuraEffect::HandleManaShield, // 97 SPELL_AURA_MANA_SHIELD implemented in Unit::CalcAbsorbResist
- &AuraEffect::HandleAuraModSkill, // 98 SPELL_AURA_MOD_SKILL_TALENT
- &AuraEffect::HandleAuraModAttackPower, // 99 SPELL_AURA_MOD_ATTACK_POWER
- &AuraEffect::HandleUnused, //100 SPELL_AURA_AURAS_VISIBLE obsolete? all player can see all auras now, but still have spells including GM-spell
- &AuraEffect::HandleModResistancePercent, //101 SPELL_AURA_MOD_RESISTANCE_PCT
- &AuraEffect::HandleNoImmediateEffect, //102 SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS implemented in Unit::MeleeDamageBonus
- &AuraEffect::HandleAuraModTotalThreat, //103 SPELL_AURA_MOD_TOTAL_THREAT
- &AuraEffect::HandleAuraWaterWalk, //104 SPELL_AURA_WATER_WALK
- &AuraEffect::HandleAuraFeatherFall, //105 SPELL_AURA_FEATHER_FALL
- &AuraEffect::HandleAuraHover, //106 SPELL_AURA_HOVER
- &AuraEffect::HandleAddModifier, //107 SPELL_AURA_ADD_FLAT_MODIFIER
- &AuraEffect::HandleAddModifier, //108 SPELL_AURA_ADD_PCT_MODIFIER
- &AuraEffect::HandleNoImmediateEffect, //109 SPELL_AURA_ADD_TARGET_TRIGGER
- &AuraEffect::HandleModPowerRegenPCT, //110 SPELL_AURA_MOD_POWER_REGEN_PERCENT
- &AuraEffect::HandleNoImmediateEffect, //111 SPELL_AURA_ADD_CASTER_HIT_TRIGGER implemented in Unit::SelectMagnetTarget
- &AuraEffect::HandleNoImmediateEffect, //112 SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
- &AuraEffect::HandleNoImmediateEffect, //113 SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN implemented in Unit::MeleeDamageBonus
- &AuraEffect::HandleNoImmediateEffect, //114 SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT implemented in Unit::MeleeDamageBonus
- &AuraEffect::HandleNoImmediateEffect, //115 SPELL_AURA_MOD_HEALING implemented in Unit::SpellBaseHealingBonusForVictim
- &AuraEffect::HandleNoImmediateEffect, //116 SPELL_AURA_MOD_REGEN_DURING_COMBAT
- &AuraEffect::HandleNoImmediateEffect, //117 SPELL_AURA_MOD_MECHANIC_RESISTANCE implemented in Unit::MagicSpellHitResult
- &AuraEffect::HandleNoImmediateEffect, //118 SPELL_AURA_MOD_HEALING_PCT implemented in Unit::SpellHealingBonus
- &AuraEffect::HandleUnused, //119 unused (3.0.8a) old SPELL_AURA_SHARE_PET_TRACKING
- &AuraEffect::HandleAuraUntrackable, //120 SPELL_AURA_UNTRACKABLE
- &AuraEffect::HandleAuraEmpathy, //121 SPELL_AURA_EMPATHY
- &AuraEffect::HandleModOffhandDamagePercent, //122 SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT
- &AuraEffect::HandleModTargetResistance, //123 SPELL_AURA_MOD_TARGET_RESISTANCE
- &AuraEffect::HandleAuraModRangedAttackPower, //124 SPELL_AURA_MOD_RANGED_ATTACK_POWER
- &AuraEffect::HandleNoImmediateEffect, //125 SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN implemented in Unit::MeleeDamageBonus
- &AuraEffect::HandleNoImmediateEffect, //126 SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT implemented in Unit::MeleeDamageBonus
- &AuraEffect::HandleNoImmediateEffect, //127 SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS implemented in Unit::MeleeDamageBonus
- &AuraEffect::HandleModPossessPet, //128 SPELL_AURA_MOD_POSSESS_PET
- &AuraEffect::HandleAuraModIncreaseSpeed, //129 SPELL_AURA_MOD_SPEED_ALWAYS
- &AuraEffect::HandleAuraModIncreaseMountedSpeed, //130 SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
- &AuraEffect::HandleNoImmediateEffect, //131 SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS implemented in Unit::MeleeDamageBonus
- &AuraEffect::HandleAuraModIncreaseEnergyPercent, //132 SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT
- &AuraEffect::HandleAuraModIncreaseHealthPercent, //133 SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT
- &AuraEffect::HandleAuraModRegenInterrupt, //134 SPELL_AURA_MOD_MANA_REGEN_INTERRUPT
- &AuraEffect::HandleModHealingDone, //135 SPELL_AURA_MOD_HEALING_DONE
- &AuraEffect::HandleNoImmediateEffect, //136 SPELL_AURA_MOD_HEALING_DONE_PERCENT implemented in Unit::SpellHealingBonus
- &AuraEffect::HandleModTotalPercentStat, //137 SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE
- &AuraEffect::HandleHaste, //138 SPELL_AURA_MOD_HASTE
- &AuraEffect::HandleForceReaction, //139 SPELL_AURA_FORCE_REACTION
- &AuraEffect::HandleAuraModRangedHaste, //140 SPELL_AURA_MOD_RANGED_HASTE
- &AuraEffect::HandleRangedAmmoHaste, //141 SPELL_AURA_MOD_RANGED_AMMO_HASTE
- &AuraEffect::HandleAuraModBaseResistancePCT, //142 SPELL_AURA_MOD_BASE_RESISTANCE_PCT
- &AuraEffect::HandleAuraModResistanceExclusive, //143 SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE
- &AuraEffect::HandleAuraSafeFall, //144 SPELL_AURA_SAFE_FALL implemented in WorldSession::HandleMovementOpcodes
- &AuraEffect::HandleAuraModPetTalentsPoints, //145 SPELL_AURA_MOD_PET_TALENT_POINTS
- &AuraEffect::HandleNoImmediateEffect, //146 SPELL_AURA_ALLOW_TAME_PET_TYPE
- &AuraEffect::HandleModStateImmunityMask, //147 SPELL_AURA_MECHANIC_IMMUNITY_MASK
- &AuraEffect::HandleAuraRetainComboPoints, //148 SPELL_AURA_RETAIN_COMBO_POINTS
- &AuraEffect::HandleNoImmediateEffect, //149 SPELL_AURA_REDUCE_PUSHBACK
- &AuraEffect::HandleShieldBlockValue, //150 SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT
- &AuraEffect::HandleAuraTrackStealthed, //151 SPELL_AURA_TRACK_STEALTHED
- &AuraEffect::HandleNoImmediateEffect, //152 SPELL_AURA_MOD_DETECTED_RANGE implemented in Creature::GetAttackDistance
- &AuraEffect::HandleNoImmediateEffect, //153 SPELL_AURA_SPLIT_DAMAGE_FLAT
- &AuraEffect::HandleNoImmediateEffect, //154 SPELL_AURA_MOD_STEALTH_LEVEL
- &AuraEffect::HandleNoImmediateEffect, //155 SPELL_AURA_MOD_WATER_BREATHING
- &AuraEffect::HandleNoImmediateEffect, //156 SPELL_AURA_MOD_REPUTATION_GAIN
- &AuraEffect::HandleNULL, //157 SPELL_AURA_PET_DAMAGE_MULTI
- &AuraEffect::HandleShieldBlockValue, //158 SPELL_AURA_MOD_SHIELD_BLOCKVALUE
- &AuraEffect::HandleNoImmediateEffect, //159 SPELL_AURA_NO_PVP_CREDIT only for Honorless Target spell
- &AuraEffect::HandleNoImmediateEffect, //160 SPELL_AURA_MOD_AOE_AVOIDANCE implemented in Unit::MagicSpellHitResult
- &AuraEffect::HandleNoImmediateEffect, //161 SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
- &AuraEffect::HandleAuraPowerBurn, //162 SPELL_AURA_POWER_BURN_MANA
- &AuraEffect::HandleNoImmediateEffect, //163 SPELL_AURA_MOD_CRIT_DAMAGE_BONUS_MELEE
- &AuraEffect::HandleUnused, //164 unused (3.0.8a), only one test spell
- &AuraEffect::HandleNoImmediateEffect, //165 SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS implemented in Unit::MeleeDamageBonus
- &AuraEffect::HandleAuraModAttackPowerPercent, //166 SPELL_AURA_MOD_ATTACK_POWER_PCT
- &AuraEffect::HandleAuraModRangedAttackPowerPercent, //167 SPELL_AURA_MOD_RANGED_ATTACK_POWER_PCT
- &AuraEffect::HandleNoImmediateEffect, //168 SPELL_AURA_MOD_DAMAGE_DONE_VERSUS implemented in Unit::SpellDamageBonus, Unit::MeleeDamageBonus
- &AuraEffect::HandleNoImmediateEffect, //169 SPELL_AURA_MOD_CRIT_PERCENT_VERSUS implemented in Unit::DealDamageBySchool, Unit::DoAttackDamage, Unit::SpellCriticalBonus
- &AuraEffect::HandleNULL, //170 SPELL_AURA_DETECT_AMORE different spells that ignore transformation effects
- &AuraEffect::HandleAuraModIncreaseSpeed, //171 SPELL_AURA_MOD_SPEED_NOT_STACK
- &AuraEffect::HandleAuraModIncreaseMountedSpeed, //172 SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
- &AuraEffect::HandleUnused, //173 unused (3.0.8a) no spells, old SPELL_AURA_ALLOW_CHAMPION_SPELLS only for Proclaim Champion spell
- &AuraEffect::HandleModSpellDamagePercentFromStat, //174 SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT implemented in Unit::SpellBaseDamageBonus
- &AuraEffect::HandleModSpellHealingPercentFromStat, //175 SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT implemented in Unit::SpellBaseHealingBonus
- &AuraEffect::HandleSpiritOfRedemption, //176 SPELL_AURA_SPIRIT_OF_REDEMPTION only for Spirit of Redemption spell, die at aura end
- &AuraEffect::HandleCharmConvert, //177 SPELL_AURA_AOE_CHARM
- &AuraEffect::HandleNoImmediateEffect, //178 SPELL_AURA_MOD_DEBUFF_RESISTANCE implemented in Unit::MagicSpellHitResult
- &AuraEffect::HandleNoImmediateEffect, //179 SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE implemented in Unit::SpellCriticalBonus
- &AuraEffect::HandleNoImmediateEffect, //180 SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS implemented in Unit::SpellDamageBonus
- &AuraEffect::HandleUnused, //181 unused (3.0.8a) old SPELL_AURA_MOD_FLAT_SPELL_CRIT_DAMAGE_VERSUS
- &AuraEffect::HandleAuraModResistenceOfStatPercent, //182 SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT
- &AuraEffect::HandleNULL, //183 SPELL_AURA_MOD_CRITICAL_THREAT only used in 28746
- &AuraEffect::HandleNoImmediateEffect, //184 SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
- &AuraEffect::HandleNoImmediateEffect, //185 SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
- &AuraEffect::HandleNoImmediateEffect, //186 SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE implemented in Unit::MagicSpellHitResult
- &AuraEffect::HandleNoImmediateEffect, //187 SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE implemented in Unit::GetUnitCriticalChance
- &AuraEffect::HandleNoImmediateEffect, //188 SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE implemented in Unit::GetUnitCriticalChance
- &AuraEffect::HandleModRating, //189 SPELL_AURA_MOD_RATING
- &AuraEffect::HandleNoImmediateEffect, //190 SPELL_AURA_MOD_FACTION_REPUTATION_GAIN implemented in Player::CalculateReputationGain
- &AuraEffect::HandleAuraModUseNormalSpeed, //191 SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
- &AuraEffect::HandleModMeleeRangedSpeedPct, //192 SPELL_AURA_HASTE_MELEE
- &AuraEffect::HandleModCombatSpeedPct, //193 SPELL_AURA_MELEE_SLOW (in fact combat (any type attack) speed pct)
- &AuraEffect::HandleNULL, //194 SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL implemented in Unit::CalcAbsorbResist
- &AuraEffect::HandleNoImmediateEffect, //195 SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL implemented in Unit::CalcAbsorbResist
- &AuraEffect::HandleNULL, //196 SPELL_AURA_MOD_COOLDOWN
- &AuraEffect::HandleNoImmediateEffect, //197 SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE implemented in Unit::SpellCriticalBonus Unit::GetUnitCriticalChance
- &AuraEffect::HandleUnused, //198 unused (3.0.8a) old SPELL_AURA_MOD_ALL_WEAPON_SKILLS
- &AuraEffect::HandleNoImmediateEffect, //199 SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT implemented in Unit::MagicSpellHitResult
- &AuraEffect::HandleNoImmediateEffect, //200 SPELL_AURA_MOD_XP_PCT implemented in Player::GiveXP
- &AuraEffect::HandleAuraAllowFlight, //201 SPELL_AURA_FLY this aura enable flight mode...
- &AuraEffect::HandleNoImmediateEffect, //202 SPELL_AURA_CANNOT_BE_DODGED implemented in Unit::RollPhysicalOutcomeAgainst
- &AuraEffect::HandleNoImmediateEffect, //203 SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE implemented in Unit::CalculateMeleeDamage and Unit::CalculateSpellDamage
- &AuraEffect::HandleNoImmediateEffect, //204 SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE implemented in Unit::CalculateMeleeDamage and Unit::CalculateSpellDamage
- &AuraEffect::HandleNULL, //205 vulnerable to school dmg?
- &AuraEffect::HandleAuraModIncreaseFlightSpeed, //206 SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED
- &AuraEffect::HandleAuraModIncreaseFlightSpeed, //207 SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
- &AuraEffect::HandleAuraModIncreaseFlightSpeed, //208 SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
- &AuraEffect::HandleAuraModIncreaseFlightSpeed, //209 SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
- &AuraEffect::HandleAuraModIncreaseFlightSpeed, //210 SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS
- &AuraEffect::HandleAuraModIncreaseFlightSpeed, //211 SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK
- &AuraEffect::HandleAuraModRangedAttackPowerOfStatPercent, //212 SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT
- &AuraEffect::HandleNoImmediateEffect, //213 SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT implemented in Player::RewardRage
- &AuraEffect::HandleNULL, //214 Tamed Pet Passive
- &AuraEffect::HandleArenaPreparation, //215 SPELL_AURA_ARENA_PREPARATION
- &AuraEffect::HandleModCastingSpeed, //216 SPELL_AURA_HASTE_SPELLS
- &AuraEffect::HandleUnused, //217 unused (3.0.8a)
- &AuraEffect::HandleAuraModRangedHaste, //218 SPELL_AURA_HASTE_RANGED
- &AuraEffect::HandleModManaRegen, //219 SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
- &AuraEffect::HandleModRatingFromStat, //220 SPELL_AURA_MOD_RATING_FROM_STAT
- &AuraEffect::HandleNULL, //221 ignored
- &AuraEffect::HandleUnused, //222 unused (3.0.8a) only for spell 44586 that not used in real spell cast
- &AuraEffect::HandleNoImmediateEffect, //223 SPELL_AURA_RAID_PROC_FROM_CHARGE
- &AuraEffect::HandleUnused, //224 unused (3.0.8a)
- &AuraEffect::HandleNoImmediateEffect, //225 SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
- &AuraEffect::HandleAuraPeriodicDummy, //226 SPELL_AURA_PERIODIC_DUMMY
- &AuraEffect::HandlePeriodicTriggerSpellWithValue, //227 SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE
- &AuraEffect::HandleNoImmediateEffect, //228 stealth detection
- &AuraEffect::HandleNULL, //229 SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
- &AuraEffect::HandleAuraModIncreaseHealth, //230 SPELL_AURA_MOD_INCREASE_HEALTH_2
- &AuraEffect::HandleNoImmediateEffect, //231 SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
- &AuraEffect::HandleNoImmediateEffect, //232 SPELL_AURA_MECHANIC_DURATION_MOD implement in Unit::CalculateSpellDuration
- &AuraEffect::HandleNULL, //233 set model id to the one of the creature with id GetMiscValue()
- &AuraEffect::HandleNoImmediateEffect, //234 SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK implement in Unit::CalculateSpellDuration
- &AuraEffect::HandleNoImmediateEffect, //235 SPELL_AURA_MOD_DISPEL_RESIST implement in Unit::MagicSpellHitResult
- &AuraEffect::HandleAuraControlVehicle, //236 SPELL_AURA_CONTROL_VEHICLE
- &AuraEffect::HandleModSpellDamagePercentFromAttackPower, //237 SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER implemented in Unit::SpellBaseDamageBonus
- &AuraEffect::HandleModSpellHealingPercentFromAttackPower, //238 SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER implemented in Unit::SpellBaseHealingBonus
- &AuraEffect::HandleAuraModScale, //239 SPELL_AURA_MOD_SCALE_2 only in Noggenfogger Elixir (16595) before 2.3.0 aura 61
- &AuraEffect::HandleAuraModExpertise, //240 SPELL_AURA_MOD_EXPERTISE
- &AuraEffect::HandleForceMoveForward, //241 Forces the player to move forward
- &AuraEffect::HandleUnused, //242 SPELL_AURA_MOD_SPELL_DAMAGE_FROM_HEALING
- &AuraEffect::HandleNULL, //243 faction reaction override spells
- &AuraEffect::HandleComprehendLanguage, //244 Comprehend language
- &AuraEffect::HandleNoImmediateEffect, //245 SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
- &AuraEffect::HandleNoImmediateEffect, //246 SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK implemented in Spell::EffectApplyAura
- &AuraEffect::HandleNULL, //247 target to become a clone of the caster
- &AuraEffect::HandleNoImmediateEffect, //248 SPELL_AURA_MOD_COMBAT_RESULT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
- &AuraEffect::HandleAuraConvertRune, //249 SPELL_AURA_CONVERT_RUNE
- &AuraEffect::HandleAuraModIncreaseHealth, //250 SPELL_AURA_MOD_INCREASE_HEALTH_2
- &AuraEffect::HandleNoImmediateEffect, //251 SPELL_AURA_MOD_ENEMY_DODGE
- &AuraEffect::HandleNULL, //252 haste all?
- &AuraEffect::HandleNoImmediateEffect, //253 SPELL_AURA_MOD_BLOCK_CRIT_CHANCE implemented in Unit::isBlockCritical
- &AuraEffect::HandleAuraModDisarm, //254 SPELL_AURA_MOD_DISARM_OFFHAND
- &AuraEffect::HandleNoImmediateEffect, //255 SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT implemented in Unit::SpellDamageBonus
- &AuraEffect::HandleNoReagentUseAura, //256 SPELL_AURA_NO_REAGENT_USE Use SpellClassMask for spell select
- &AuraEffect::HandleNULL, //257 SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS Use SpellClassMask for spell select
- &AuraEffect::HandleNULL, //258 SPELL_AURA_MOD_SPELL_VISUAL
- &AuraEffect::HandleNoImmediateEffect, //259 SPELL_AURA_MOD_HOT_PCT implemented in Unit::SpellHealingBonus
- &AuraEffect::HandleNoImmediateEffect, //260 SPELL_AURA_SCREEN_EFFECT (miscvalue = id in ScreenEffect.dbc) not required any code
- &AuraEffect::HandlePhase, //261 SPELL_AURA_PHASE undetactable invisibility? implemented in Unit::isVisibleForOrDetect
- &AuraEffect::HandleNoImmediateEffect, //262 SPELL_AURA_ABILITY_IGNORE_AURASTATE implemented in spell::cancast
- &AuraEffect::HandleAuraAllowOnlyAbility, //263 SPELL_AURA_ALLOW_ONLY_ABILITY player can use only abilities set in SpellClassMask
- &AuraEffect::HandleUnused, //264 unused (3.0.8a)
- &AuraEffect::HandleUnused, //265 unused (3.0.8a)
- &AuraEffect::HandleUnused, //266 unused (3.0.8a)
- &AuraEffect::HandleNoImmediateEffect, //267 SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL implemented in Unit::IsImmunedToSpellEffect
- &AuraEffect::HandleAuraModAttackPowerOfStatPercent, //268 SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
- &AuraEffect::HandleNoImmediateEffect, //269 SPELL_AURA_MOD_IGNORE_TARGET_RESIST implemented in Unit::CalcAbsorbResist and CalcArmorReducedDamage
- &AuraEffect::HandleNoImmediateEffect, //270 SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST implemented in Unit::CalcAbsorbResist and CalcArmorReducedDamage
- &AuraEffect::HandleNoImmediateEffect, //271 SPELL_AURA_MOD_DAMAGE_FROM_CASTER implemented in Unit::SpellDamageBonus
- &AuraEffect::HandleNULL, //272 reduce spell cast time?
- &AuraEffect::HandleUnused, //273 clientside
- &AuraEffect::HandleNoImmediateEffect, //274 SPELL_AURA_CONSUME_NO_AMMO implemented in spell::CalculateDamageDoneForAllTargets
- &AuraEffect::HandleNoImmediateEffect, //275 SPELL_AURA_MOD_IGNORE_SHAPESHIFT Use SpellClassMask for spell select
- &AuraEffect::HandleNULL, //276 mod damage % mechanic?
- &AuraEffect::HandleNoImmediateEffect, //277 SPELL_AURA_MOD_ABILITY_AFFECTED_TARGETS implemented in spell::settargetmap
- &AuraEffect::HandleAuraModDisarm, //278 SPELL_AURA_MOD_DISARM_RANGED disarm ranged weapon
- &AuraEffect::HandleNULL, //279 visual effects? 58836 and 57507
- &AuraEffect::HandleNoImmediateEffect, //280 SPELL_AURA_MOD_WEAPONTYPE_IGNORE_TARGET_RESISTANCE
- &AuraEffect::HandleNoImmediateEffect, //281 SPELL_AURA_MOD_HONOR_GAIN_PCT implemented in Player::RewardHonor
- &AuraEffect::HandleAuraIncreaseBaseHealthPercent, //282 SPELL_AURA_INCREASE_BASE_HEALTH_PERCENT
- &AuraEffect::HandleNoImmediateEffect, //283 SPELL_AURA_MOD_HEALING_RECEIVED implemented in Unit::SpellHealingBonus
- &AuraEffect::HandleUnused, //284 not used by any spells (3.08a)
- &AuraEffect::HandleUnused, //285 not used by any spells (3.08a)
- &AuraEffect::HandleUnused, //286 not used by any spells (3.08a)
- &AuraEffect::HandleNoImmediateEffect, //287 SPELL_AURA_DEFLECT_SPELLS implemented in Unit::MagicSpellHitResult and Unit::MeleeSpellHitResult
- &AuraEffect::HandleUnused, //288 not used by any spells (3.09) except 1 test spell.
+ &Aura::HandleNULL, // 0 SPELL_AURA_NONE
+ &Aura::HandleBindSight, // 1 SPELL_AURA_BIND_SIGHT
+ &Aura::HandleModPossess, // 2 SPELL_AURA_MOD_POSSESS
+ &Aura::HandlePeriodicDamage, // 3 SPELL_AURA_PERIODIC_DAMAGE
+ &Aura::HandleAuraDummy, // 4 SPELL_AURA_DUMMY
+ &Aura::HandleModConfuse, // 5 SPELL_AURA_MOD_CONFUSE
+ &Aura::HandleModCharm, // 6 SPELL_AURA_MOD_CHARM
+ &Aura::HandleModFear, // 7 SPELL_AURA_MOD_FEAR
+ &Aura::HandlePeriodicHeal, // 8 SPELL_AURA_PERIODIC_HEAL
+ &Aura::HandleModAttackSpeed, // 9 SPELL_AURA_MOD_ATTACKSPEED
+ &Aura::HandleModThreat, // 10 SPELL_AURA_MOD_THREAT
+ &Aura::HandleModTaunt, // 11 SPELL_AURA_MOD_TAUNT
+ &Aura::HandleAuraModStun, // 12 SPELL_AURA_MOD_STUN
+ &Aura::HandleModDamageDone, // 13 SPELL_AURA_MOD_DAMAGE_DONE
+ &Aura::HandleNoImmediateEffect, // 14 SPELL_AURA_MOD_DAMAGE_TAKEN implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
+ &Aura::HandleNoImmediateEffect, // 15 SPELL_AURA_DAMAGE_SHIELD implemented in Unit::DoAttackDamage
+ &Aura::HandleModStealth, // 16 SPELL_AURA_MOD_STEALTH
+ &Aura::HandleNoImmediateEffect, // 17 SPELL_AURA_MOD_STEALTH_DETECT
+ &Aura::HandleInvisibility, // 18 SPELL_AURA_MOD_INVISIBILITY
+ &Aura::HandleInvisibilityDetect, // 19 SPELL_AURA_MOD_INVISIBILITY_DETECTION
+ &Aura::HandleAuraModTotalHealthPercentRegen, // 20 SPELL_AURA_OBS_MOD_HEALTH
+ &Aura::HandleAuraModTotalEnergyPercentRegen, // 21 SPELL_AURA_OBS_MOD_ENERGY
+ &Aura::HandleAuraModResistance, // 22 SPELL_AURA_MOD_RESISTANCE
+ &Aura::HandlePeriodicTriggerSpell, // 23 SPELL_AURA_PERIODIC_TRIGGER_SPELL
+ &Aura::HandlePeriodicEnergize, // 24 SPELL_AURA_PERIODIC_ENERGIZE
+ &Aura::HandleAuraModPacify, // 25 SPELL_AURA_MOD_PACIFY
+ &Aura::HandleAuraModRoot, // 26 SPELL_AURA_MOD_ROOT
+ &Aura::HandleAuraModSilence, // 27 SPELL_AURA_MOD_SILENCE
+ &Aura::HandleReflectSpells, // 28 SPELL_AURA_REFLECT_SPELLS implement in Unit::SpellHitResult
+ &Aura::HandleAuraModStat, // 29 SPELL_AURA_MOD_STAT
+ &Aura::HandleAuraModSkill, // 30 SPELL_AURA_MOD_SKILL
+ &Aura::HandleAuraModIncreaseSpeed, // 31 SPELL_AURA_MOD_INCREASE_SPEED
+ &Aura::HandleAuraModIncreaseMountedSpeed, // 32 SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
+ &Aura::HandleAuraModDecreaseSpeed, // 33 SPELL_AURA_MOD_DECREASE_SPEED
+ &Aura::HandleAuraModIncreaseHealth, // 34 SPELL_AURA_MOD_INCREASE_HEALTH
+ &Aura::HandleAuraModIncreaseEnergy, // 35 SPELL_AURA_MOD_INCREASE_ENERGY
+ &Aura::HandleAuraModShapeshift, // 36 SPELL_AURA_MOD_SHAPESHIFT
+ &Aura::HandleAuraModEffectImmunity, // 37 SPELL_AURA_EFFECT_IMMUNITY
+ &Aura::HandleAuraModStateImmunity, // 38 SPELL_AURA_STATE_IMMUNITY
+ &Aura::HandleAuraModSchoolImmunity, // 39 SPELL_AURA_SCHOOL_IMMUNITY
+ &Aura::HandleAuraModDmgImmunity, // 40 SPELL_AURA_DAMAGE_IMMUNITY
+ &Aura::HandleAuraModDispelImmunity, // 41 SPELL_AURA_DISPEL_IMMUNITY
+ &Aura::HandleAuraProcTriggerSpell, // 42 SPELL_AURA_PROC_TRIGGER_SPELL implemented in Unit::ProcDamageAndSpellFor and Unit::HandleProcTriggerSpell
+ &Aura::HandleNoImmediateEffect, // 43 SPELL_AURA_PROC_TRIGGER_DAMAGE implemented in Unit::ProcDamageAndSpellFor
+ &Aura::HandleAuraTrackCreatures, // 44 SPELL_AURA_TRACK_CREATURES
+ &Aura::HandleAuraTrackResources, // 45 SPELL_AURA_TRACK_RESOURCES
+ &Aura::HandleUnused, // 46 SPELL_AURA_46 (used in test spells 54054 and 54058, and spell 48050) (3.0.8a)
+ &Aura::HandleAuraModParryPercent, // 47 SPELL_AURA_MOD_PARRY_PERCENT
+ &Aura::HandleNULL, // 48 SPELL_AURA_48 spell Napalm (area damage spell with additional delayed damage effect)
+ &Aura::HandleAuraModDodgePercent, // 49 SPELL_AURA_MOD_DODGE_PERCENT
+ &Aura::HandleNoImmediateEffect, // 50 SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT implemented in Unit::SpellCriticalHealingBonus
+ &Aura::HandleAuraModBlockPercent, // 51 SPELL_AURA_MOD_BLOCK_PERCENT
+ &Aura::HandleAuraModCritPercent, // 52 SPELL_AURA_MOD_CRIT_PERCENT
+ &Aura::HandlePeriodicLeech, // 53 SPELL_AURA_PERIODIC_LEECH
+ &Aura::HandleModHitChance, // 54 SPELL_AURA_MOD_HIT_CHANCE
+ &Aura::HandleModSpellHitChance, // 55 SPELL_AURA_MOD_SPELL_HIT_CHANCE
+ &Aura::HandleAuraTransform, // 56 SPELL_AURA_TRANSFORM
+ &Aura::HandleModSpellCritChance, // 57 SPELL_AURA_MOD_SPELL_CRIT_CHANCE
+ &Aura::HandleAuraModIncreaseSwimSpeed, // 58 SPELL_AURA_MOD_INCREASE_SWIM_SPEED
+ &Aura::HandleNoImmediateEffect, // 59 SPELL_AURA_MOD_DAMAGE_DONE_CREATURE implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
+ &Aura::HandleAuraModPacifyAndSilence, // 60 SPELL_AURA_MOD_PACIFY_SILENCE
+ &Aura::HandleAuraModScale, // 61 SPELL_AURA_MOD_SCALE
+ &Aura::HandlePeriodicHealthFunnel, // 62 SPELL_AURA_PERIODIC_HEALTH_FUNNEL
+ &Aura::HandleUnused, // 63 unused (3.0.8a) old SPELL_AURA_PERIODIC_MANA_FUNNEL
+ &Aura::HandlePeriodicManaLeech, // 64 SPELL_AURA_PERIODIC_MANA_LEECH
+ &Aura::HandleModCastingSpeed, // 65 SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
+ &Aura::HandleFeignDeath, // 66 SPELL_AURA_FEIGN_DEATH
+ &Aura::HandleAuraModDisarm, // 67 SPELL_AURA_MOD_DISARM
+ &Aura::HandleAuraModStalked, // 68 SPELL_AURA_MOD_STALKED
+ &Aura::HandleSchoolAbsorb, // 69 SPELL_AURA_SCHOOL_ABSORB implemented in Unit::CalcAbsorbResist
+ &Aura::HandleUnused, // 70 SPELL_AURA_EXTRA_ATTACKS Useless, used by only one spell that has only visual effect
+ &Aura::HandleModSpellCritChanceShool, // 71 SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
+ &Aura::HandleModPowerCostPCT, // 72 SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
+ &Aura::HandleModPowerCost, // 73 SPELL_AURA_MOD_POWER_COST_SCHOOL
+ &Aura::HandleNoImmediateEffect, // 74 SPELL_AURA_REFLECT_SPELLS_SCHOOL implemented in Unit::SpellHitResult
+ &Aura::HandleNoImmediateEffect, // 75 SPELL_AURA_MOD_LANGUAGE
+ &Aura::HandleFarSight, // 76 SPELL_AURA_FAR_SIGHT
+ &Aura::HandleModMechanicImmunity, // 77 SPELL_AURA_MECHANIC_IMMUNITY
+ &Aura::HandleAuraMounted, // 78 SPELL_AURA_MOUNTED
+ &Aura::HandleModDamagePercentDone, // 79 SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
+ &Aura::HandleModPercentStat, // 80 SPELL_AURA_MOD_PERCENT_STAT
+ &Aura::HandleNoImmediateEffect, // 81 SPELL_AURA_SPLIT_DAMAGE_PCT
+ &Aura::HandleWaterBreathing, // 82 SPELL_AURA_WATER_BREATHING
+ &Aura::HandleModBaseResistance, // 83 SPELL_AURA_MOD_BASE_RESISTANCE
+ &Aura::HandleModRegen, // 84 SPELL_AURA_MOD_REGEN
+ &Aura::HandleModPowerRegen, // 85 SPELL_AURA_MOD_POWER_REGEN
+ &Aura::HandleChannelDeathItem, // 86 SPELL_AURA_CHANNEL_DEATH_ITEM
+ &Aura::HandleNoImmediateEffect, // 87 SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
+ &Aura::HandleNoImmediateEffect, // 88 SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
+ &Aura::HandlePeriodicDamagePCT, // 89 SPELL_AURA_PERIODIC_DAMAGE_PERCENT
+ &Aura::HandleUnused, // 90 unused (3.0.8a) old SPELL_AURA_MOD_RESIST_CHANCE
+ &Aura::HandleNoImmediateEffect, // 91 SPELL_AURA_MOD_DETECT_RANGE implemented in Creature::GetAttackDistance
+ &Aura::HandlePreventFleeing, // 92 SPELL_AURA_PREVENTS_FLEEING
+ &Aura::HandleModUnattackable, // 93 SPELL_AURA_MOD_UNATTACKABLE
+ &Aura::HandleNoImmediateEffect, // 94 SPELL_AURA_INTERRUPT_REGEN implemented in Player::RegenerateAll
+ &Aura::HandleAuraGhost, // 95 SPELL_AURA_GHOST
+ &Aura::HandleNoImmediateEffect, // 96 SPELL_AURA_SPELL_MAGNET implemented in Unit::SelectMagnetTarget
+ &Aura::HandleManaShield, // 97 SPELL_AURA_MANA_SHIELD implemented in Unit::CalcAbsorbResist
+ &Aura::HandleAuraModSkill, // 98 SPELL_AURA_MOD_SKILL_TALENT
+ &Aura::HandleAuraModAttackPower, // 99 SPELL_AURA_MOD_ATTACK_POWER
+ &Aura::HandleUnused, //100 SPELL_AURA_AURAS_VISIBLE obsolete? all player can see all auras now, but still have spells including GM-spell
+ &Aura::HandleModResistancePercent, //101 SPELL_AURA_MOD_RESISTANCE_PCT
+ &Aura::HandleNoImmediateEffect, //102 SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS implemented in Unit::MeleeDamageBonus
+ &Aura::HandleAuraModTotalThreat, //103 SPELL_AURA_MOD_TOTAL_THREAT
+ &Aura::HandleAuraWaterWalk, //104 SPELL_AURA_WATER_WALK
+ &Aura::HandleAuraFeatherFall, //105 SPELL_AURA_FEATHER_FALL
+ &Aura::HandleAuraHover, //106 SPELL_AURA_HOVER
+ &Aura::HandleAddModifier, //107 SPELL_AURA_ADD_FLAT_MODIFIER
+ &Aura::HandleAddModifier, //108 SPELL_AURA_ADD_PCT_MODIFIER
+ &Aura::HandleNoImmediateEffect, //109 SPELL_AURA_ADD_TARGET_TRIGGER
+ &Aura::HandleModPowerRegenPCT, //110 SPELL_AURA_MOD_POWER_REGEN_PERCENT
+ &Aura::HandleNoImmediateEffect, //111 SPELL_AURA_ADD_CASTER_HIT_TRIGGER implemented in Unit::SelectMagnetTarget
+ &Aura::HandleNoImmediateEffect, //112 SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
+ &Aura::HandleNoImmediateEffect, //113 SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN implemented in Unit::MeleeDamageBonus
+ &Aura::HandleNoImmediateEffect, //114 SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT implemented in Unit::MeleeDamageBonus
+ &Aura::HandleNoImmediateEffect, //115 SPELL_AURA_MOD_HEALING implemented in Unit::SpellBaseHealingBonusForVictim
+ &Aura::HandleNoImmediateEffect, //116 SPELL_AURA_MOD_REGEN_DURING_COMBAT
+ &Aura::HandleNoImmediateEffect, //117 SPELL_AURA_MOD_MECHANIC_RESISTANCE implemented in Unit::MagicSpellHitResult
+ &Aura::HandleNoImmediateEffect, //118 SPELL_AURA_MOD_HEALING_PCT implemented in Unit::SpellHealingBonus
+ &Aura::HandleUnused, //119 unused (3.0.8a) old SPELL_AURA_SHARE_PET_TRACKING
+ &Aura::HandleAuraUntrackable, //120 SPELL_AURA_UNTRACKABLE
+ &Aura::HandleAuraEmpathy, //121 SPELL_AURA_EMPATHY
+ &Aura::HandleModOffhandDamagePercent, //122 SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT
+ &Aura::HandleModTargetResistance, //123 SPELL_AURA_MOD_TARGET_RESISTANCE
+ &Aura::HandleAuraModRangedAttackPower, //124 SPELL_AURA_MOD_RANGED_ATTACK_POWER
+ &Aura::HandleNoImmediateEffect, //125 SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN implemented in Unit::MeleeDamageBonus
+ &Aura::HandleNoImmediateEffect, //126 SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT implemented in Unit::MeleeDamageBonus
+ &Aura::HandleNoImmediateEffect, //127 SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS implemented in Unit::MeleeDamageBonus
+ &Aura::HandleModPossessPet, //128 SPELL_AURA_MOD_POSSESS_PET
+ &Aura::HandleAuraModIncreaseSpeed, //129 SPELL_AURA_MOD_SPEED_ALWAYS
+ &Aura::HandleAuraModIncreaseMountedSpeed, //130 SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
+ &Aura::HandleNoImmediateEffect, //131 SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS implemented in Unit::MeleeDamageBonus
+ &Aura::HandleAuraModIncreaseEnergyPercent, //132 SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT
+ &Aura::HandleAuraModIncreaseHealthPercent, //133 SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT
+ &Aura::HandleAuraModRegenInterrupt, //134 SPELL_AURA_MOD_MANA_REGEN_INTERRUPT
+ &Aura::HandleModHealingDone, //135 SPELL_AURA_MOD_HEALING_DONE
+ &Aura::HandleNoImmediateEffect, //136 SPELL_AURA_MOD_HEALING_DONE_PERCENT implemented in Unit::SpellHealingBonus
+ &Aura::HandleModTotalPercentStat, //137 SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE
+ &Aura::HandleHaste, //138 SPELL_AURA_MOD_HASTE
+ &Aura::HandleForceReaction, //139 SPELL_AURA_FORCE_REACTION
+ &Aura::HandleAuraModRangedHaste, //140 SPELL_AURA_MOD_RANGED_HASTE
+ &Aura::HandleRangedAmmoHaste, //141 SPELL_AURA_MOD_RANGED_AMMO_HASTE
+ &Aura::HandleAuraModBaseResistancePCT, //142 SPELL_AURA_MOD_BASE_RESISTANCE_PCT
+ &Aura::HandleAuraModResistanceExclusive, //143 SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE
+ &Aura::HandleAuraSafeFall, //144 SPELL_AURA_SAFE_FALL implemented in WorldSession::HandleMovementOpcodes
+ &Aura::HandleAuraModPetTalentsPoints, //145 SPELL_AURA_MOD_PET_TALENT_POINTS
+ &Aura::HandleNoImmediateEffect, //146 SPELL_AURA_ALLOW_TAME_PET_TYPE
+ &Aura::HandleModStateImmunityMask, //147 SPELL_AURA_MECHANIC_IMMUNITY_MASK
+ &Aura::HandleAuraRetainComboPoints, //148 SPELL_AURA_RETAIN_COMBO_POINTS
+ &Aura::HandleNoImmediateEffect, //149 SPELL_AURA_REDUCE_PUSHBACK
+ &Aura::HandleShieldBlockValue, //150 SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT
+ &Aura::HandleAuraTrackStealthed, //151 SPELL_AURA_TRACK_STEALTHED
+ &Aura::HandleNoImmediateEffect, //152 SPELL_AURA_MOD_DETECTED_RANGE implemented in Creature::GetAttackDistance
+ &Aura::HandleNoImmediateEffect, //153 SPELL_AURA_SPLIT_DAMAGE_FLAT
+ &Aura::HandleNoImmediateEffect, //154 SPELL_AURA_MOD_STEALTH_LEVEL
+ &Aura::HandleNoImmediateEffect, //155 SPELL_AURA_MOD_WATER_BREATHING
+ &Aura::HandleNoImmediateEffect, //156 SPELL_AURA_MOD_REPUTATION_GAIN
+ &Aura::HandleNULL, //157 SPELL_AURA_PET_DAMAGE_MULTI
+ &Aura::HandleShieldBlockValue, //158 SPELL_AURA_MOD_SHIELD_BLOCKVALUE
+ &Aura::HandleNoImmediateEffect, //159 SPELL_AURA_NO_PVP_CREDIT only for Honorless Target spell
+ &Aura::HandleNoImmediateEffect, //160 SPELL_AURA_MOD_AOE_AVOIDANCE implemented in Unit::MagicSpellHitResult
+ &Aura::HandleNoImmediateEffect, //161 SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
+ &Aura::HandleAuraPowerBurn, //162 SPELL_AURA_POWER_BURN_MANA
+ &Aura::HandleNoImmediateEffect, //163 SPELL_AURA_MOD_CRIT_DAMAGE_BONUS_MELEE
+ &Aura::HandleUnused, //164 unused (3.0.8a), only one test spell
+ &Aura::HandleNoImmediateEffect, //165 SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS implemented in Unit::MeleeDamageBonus
+ &Aura::HandleAuraModAttackPowerPercent, //166 SPELL_AURA_MOD_ATTACK_POWER_PCT
+ &Aura::HandleAuraModRangedAttackPowerPercent, //167 SPELL_AURA_MOD_RANGED_ATTACK_POWER_PCT
+ &Aura::HandleNoImmediateEffect, //168 SPELL_AURA_MOD_DAMAGE_DONE_VERSUS implemented in Unit::SpellDamageBonus, Unit::MeleeDamageBonus
+ &Aura::HandleNoImmediateEffect, //169 SPELL_AURA_MOD_CRIT_PERCENT_VERSUS implemented in Unit::DealDamageBySchool, Unit::DoAttackDamage, Unit::SpellCriticalBonus
+ &Aura::HandleNULL, //170 SPELL_AURA_DETECT_AMORE different spells that ignore transformation effects
+ &Aura::HandleAuraModIncreaseSpeed, //171 SPELL_AURA_MOD_SPEED_NOT_STACK
+ &Aura::HandleAuraModIncreaseMountedSpeed, //172 SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
+ &Aura::HandleUnused, //173 unused (3.0.8a) no spells, old SPELL_AURA_ALLOW_CHAMPION_SPELLS only for Proclaim Champion spell
+ &Aura::HandleModSpellDamagePercentFromStat, //174 SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT implemented in Unit::SpellBaseDamageBonus
+ &Aura::HandleModSpellHealingPercentFromStat, //175 SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT implemented in Unit::SpellBaseHealingBonus
+ &Aura::HandleSpiritOfRedemption, //176 SPELL_AURA_SPIRIT_OF_REDEMPTION only for Spirit of Redemption spell, die at aura end
+ &Aura::HandleCharmConvert, //177 SPELL_AURA_AOE_CHARM
+ &Aura::HandleNoImmediateEffect, //178 SPELL_AURA_MOD_DEBUFF_RESISTANCE implemented in Unit::MagicSpellHitResult
+ &Aura::HandleNoImmediateEffect, //179 SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE implemented in Unit::SpellCriticalBonus
+ &Aura::HandleNoImmediateEffect, //180 SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS implemented in Unit::SpellDamageBonus
+ &Aura::HandleUnused, //181 unused (3.0.8a) old SPELL_AURA_MOD_FLAT_SPELL_CRIT_DAMAGE_VERSUS
+ &Aura::HandleAuraModResistenceOfStatPercent, //182 SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT
+ &Aura::HandleNULL, //183 SPELL_AURA_MOD_CRITICAL_THREAT only used in 28746
+ &Aura::HandleNoImmediateEffect, //184 SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
+ &Aura::HandleNoImmediateEffect, //185 SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
+ &Aura::HandleNoImmediateEffect, //186 SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE implemented in Unit::MagicSpellHitResult
+ &Aura::HandleNoImmediateEffect, //187 SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE implemented in Unit::GetUnitCriticalChance
+ &Aura::HandleNoImmediateEffect, //188 SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE implemented in Unit::GetUnitCriticalChance
+ &Aura::HandleModRating, //189 SPELL_AURA_MOD_RATING
+ &Aura::HandleNoImmediateEffect, //190 SPELL_AURA_MOD_FACTION_REPUTATION_GAIN implemented in Player::CalculateReputationGain
+ &Aura::HandleAuraModUseNormalSpeed, //191 SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
+ &Aura::HandleModMeleeRangedSpeedPct, //192 SPELL_AURA_HASTE_MELEE
+ &Aura::HandleModCombatSpeedPct, //193 SPELL_AURA_MELEE_SLOW (in fact combat (any type attack) speed pct)
+ &Aura::HandleNULL, //194 SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL implemented in Unit::CalcAbsorbResist
+ &Aura::HandleNoImmediateEffect, //195 SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL implemented in Unit::CalcAbsorbResist
+ &Aura::HandleNULL, //196 SPELL_AURA_MOD_COOLDOWN
+ &Aura::HandleNoImmediateEffect, //197 SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE implemented in Unit::SpellCriticalBonus Unit::GetUnitCriticalChance
+ &Aura::HandleUnused, //198 unused (3.0.8a) old SPELL_AURA_MOD_ALL_WEAPON_SKILLS
+ &Aura::HandleNoImmediateEffect, //199 SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT implemented in Unit::MagicSpellHitResult
+ &Aura::HandleNoImmediateEffect, //200 SPELL_AURA_MOD_XP_PCT implemented in Player::GiveXP
+ &Aura::HandleAuraAllowFlight, //201 SPELL_AURA_FLY this aura enable flight mode...
+ &Aura::HandleNoImmediateEffect, //202 SPELL_AURA_CANNOT_BE_DODGED implemented in Unit::RollPhysicalOutcomeAgainst
+ &Aura::HandleNoImmediateEffect, //203 SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE implemented in Unit::CalculateMeleeDamage and Unit::CalculateSpellDamage
+ &Aura::HandleNoImmediateEffect, //204 SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE implemented in Unit::CalculateMeleeDamage and Unit::CalculateSpellDamage
+ &Aura::HandleNULL, //205 vulnerable to school dmg?
+ &Aura::HandleAuraModIncreaseFlightSpeed, //206 SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED
+ &Aura::HandleAuraModIncreaseFlightSpeed, //207 SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
+ &Aura::HandleAuraModIncreaseFlightSpeed, //208 SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
+ &Aura::HandleAuraModIncreaseFlightSpeed, //209 SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
+ &Aura::HandleAuraModIncreaseFlightSpeed, //210 SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS
+ &Aura::HandleAuraModIncreaseFlightSpeed, //211 SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK
+ &Aura::HandleAuraModRangedAttackPowerOfStatPercent, //212 SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT
+ &Aura::HandleNoImmediateEffect, //213 SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT implemented in Player::RewardRage
+ &Aura::HandleNULL, //214 Tamed Pet Passive
+ &Aura::HandleArenaPreparation, //215 SPELL_AURA_ARENA_PREPARATION
+ &Aura::HandleModCastingSpeed, //216 SPELL_AURA_HASTE_SPELLS
+ &Aura::HandleUnused, //217 unused (3.0.8a)
+ &Aura::HandleAuraModRangedHaste, //218 SPELL_AURA_HASTE_RANGED
+ &Aura::HandleModManaRegen, //219 SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
+ &Aura::HandleModRatingFromStat, //220 SPELL_AURA_MOD_RATING_FROM_STAT
+ &Aura::HandleNULL, //221 ignored
+ &Aura::HandleUnused, //222 unused (3.0.8a) only for spell 44586 that not used in real spell cast
+ &Aura::HandleNoImmediateEffect, //223 SPELL_AURA_RAID_PROC_FROM_CHARGE
+ &Aura::HandleUnused, //224 unused (3.0.8a)
+ &Aura::HandleNoImmediateEffect, //225 SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
+ &Aura::HandleAuraPeriodicDummy, //226 SPELL_AURA_PERIODIC_DUMMY
+ &Aura::HandlePeriodicTriggerSpellWithValue, //227 SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE
+ &Aura::HandleNoImmediateEffect, //228 stealth detection
+ &Aura::HandleNULL, //229 SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
+ &Aura::HandleAuraModIncreaseHealth, //230 SPELL_AURA_MOD_INCREASE_HEALTH_2
+ &Aura::HandleNoImmediateEffect, //231 SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
+ &Aura::HandleNoImmediateEffect, //232 SPELL_AURA_MECHANIC_DURATION_MOD implement in Unit::CalculateSpellDuration
+ &Aura::HandleNULL, //233 set model id to the one of the creature with id GetMiscValue()
+ &Aura::HandleNoImmediateEffect, //234 SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK implement in Unit::CalculateSpellDuration
+ &Aura::HandleNoImmediateEffect, //235 SPELL_AURA_MOD_DISPEL_RESIST implement in Unit::MagicSpellHitResult
+ &Aura::HandleAuraControlVehicle, //236 SPELL_AURA_CONTROL_VEHICLE
+ &Aura::HandleModSpellDamagePercentFromAttackPower, //237 SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER implemented in Unit::SpellBaseDamageBonus
+ &Aura::HandleModSpellHealingPercentFromAttackPower, //238 SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER implemented in Unit::SpellBaseHealingBonus
+ &Aura::HandleAuraModScale, //239 SPELL_AURA_MOD_SCALE_2 only in Noggenfogger Elixir (16595) before 2.3.0 aura 61
+ &Aura::HandleAuraModExpertise, //240 SPELL_AURA_MOD_EXPERTISE
+ &Aura::HandleForceMoveForward, //241 Forces the player to move forward
+ &Aura::HandleUnused, //242 SPELL_AURA_MOD_SPELL_DAMAGE_FROM_HEALING
+ &Aura::HandleNULL, //243 faction reaction override spells
+ &Aura::HandleComprehendLanguage, //244 Comprehend language
+ &Aura::HandleNoImmediateEffect, //245 SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
+ &Aura::HandleNoImmediateEffect, //246 SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK implemented in Spell::EffectApplyAura
+ &Aura::HandleNULL, //247 target to become a clone of the caster
+ &Aura::HandleNoImmediateEffect, //248 SPELL_AURA_MOD_COMBAT_RESULT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
+ &Aura::HandleAuraConvertRune, //249 SPELL_AURA_CONVERT_RUNE
+ &Aura::HandleAuraModIncreaseHealth, //250 SPELL_AURA_MOD_INCREASE_HEALTH_2
+ &Aura::HandleNoImmediateEffect, //251 SPELL_AURA_MOD_ENEMY_DODGE
+ &Aura::HandleNULL, //252 haste all?
+ &Aura::HandleNoImmediateEffect, //253 SPELL_AURA_MOD_BLOCK_CRIT_CHANCE implemented in Unit::isBlockCritical
+ &Aura::HandleAuraModDisarm, //254 SPELL_AURA_MOD_DISARM_OFFHAND
+ &Aura::HandleNoImmediateEffect, //255 SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT implemented in Unit::SpellDamageBonus
+ &Aura::HandleNoReagentUseAura, //256 SPELL_AURA_NO_REAGENT_USE Use SpellClassMask for spell select
+ &Aura::HandleNULL, //257 SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS Use SpellClassMask for spell select
+ &Aura::HandleNULL, //258 SPELL_AURA_MOD_SPELL_VISUAL
+ &Aura::HandleNoImmediateEffect, //259 SPELL_AURA_MOD_HOT_PCT implemented in Unit::SpellHealingBonus
+ &Aura::HandleNoImmediateEffect, //260 SPELL_AURA_SCREEN_EFFECT (miscvalue = id in ScreenEffect.dbc) not required any code
+ &Aura::HandlePhase, //261 SPELL_AURA_PHASE undetactable invisibility? implemented in Unit::isVisibleForOrDetect
+ &Aura::HandleNoImmediateEffect, //262 SPELL_AURA_ABILITY_IGNORE_AURASTATE implemented in spell::cancast
+ &Aura::HandleAuraAllowOnlyAbility, //263 SPELL_AURA_ALLOW_ONLY_ABILITY player can use only abilities set in SpellClassMask
+ &Aura::HandleUnused, //264 unused (3.0.8a)
+ &Aura::HandleUnused, //265 unused (3.0.8a)
+ &Aura::HandleUnused, //266 unused (3.0.8a)
+ &Aura::HandleNoImmediateEffect, //267 SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL implemented in Unit::IsImmunedToSpellEffect
+ &Aura::HandleAuraModAttackPowerOfStatPercent, //268 SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
+ &Aura::HandleNoImmediateEffect, //269 SPELL_AURA_MOD_IGNORE_TARGET_RESIST implemented in Unit::CalcAbsorbResist and CalcArmorReducedDamage
+ &Aura::HandleNoImmediateEffect, //270 SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST implemented in Unit::CalcAbsorbResist and CalcArmorReducedDamage
+ &Aura::HandleNoImmediateEffect, //271 SPELL_AURA_MOD_DAMAGE_FROM_CASTER implemented in Unit::SpellDamageBonus
+ &Aura::HandleNULL, //272 reduce spell cast time?
+ &Aura::HandleUnused, //273 clientside
+ &Aura::HandleNoImmediateEffect, //274 SPELL_AURA_CONSUME_NO_AMMO implemented in spell::CalculateDamageDoneForAllTargets
+ &Aura::HandleNoImmediateEffect, //275 SPELL_AURA_MOD_IGNORE_SHAPESHIFT Use SpellClassMask for spell select
+ &Aura::HandleNULL, //276 mod damage % mechanic?
+ &Aura::HandleNoImmediateEffect, //277 SPELL_AURA_MOD_ABILITY_AFFECTED_TARGETS implemented in spell::settargetmap
+ &Aura::HandleAuraModDisarm, //278 SPELL_AURA_MOD_DISARM_RANGED disarm ranged weapon
+ &Aura::HandleNULL, //279 visual effects? 58836 and 57507
+ &Aura::HandleNoImmediateEffect, //280 SPELL_AURA_MOD_WEAPONTYPE_IGNORE_TARGET_RESISTANCE
+ &Aura::HandleNoImmediateEffect, //281 SPELL_AURA_MOD_HONOR_GAIN_PCT implemented in Player::RewardHonor
+ &Aura::HandleAuraIncreaseBaseHealthPercent, //282 SPELL_AURA_INCREASE_BASE_HEALTH_PERCENT
+ &Aura::HandleNoImmediateEffect, //283 SPELL_AURA_MOD_HEALING_RECEIVED implemented in Unit::SpellHealingBonus
+ &Aura::HandleUnused, //284 not used by any spells (3.08a)
+ &Aura::HandleUnused, //285 not used by any spells (3.08a)
+ &Aura::HandleUnused, //286 not used by any spells (3.08a)
+ &Aura::HandleNoImmediateEffect, //287 SPELL_AURA_DEFLECT_SPELLS implemented in Unit::MagicSpellHitResult and Unit::MeleeSpellHitResult
+ &Aura::HandleUnused, //288 not used by any spells (3.09) except 1 test spell.
+ &Aura::HandleUnused, //289 unused
+ &Aura::HandleUnused, //290 unused
+ &Aura::HandleUnused, //291 unused
+ &Aura::HandleNULL, //292 call stabled pet
+ &Aura::HandleNULL, //293 2 test spells
+ &Aura::HandleNULL //294 2 spells, possible prevent mana regen
};
+#undef Aura
Aura::Aura(SpellEntry const* spellproto, uint32 effMask, int32 *currentBasePoints, Unit *target, WorldObject *source, Unit *caster, Item* castItem) :
m_caster_guid(0), m_castItemGuid(castItem?castItem->GetGUID():0), m_target(target),
@@ -3607,9 +3615,8 @@ void AuraEffect::HandleAuraModScale(bool apply, bool Real, bool /*changeAmount*/
((Player*)caster)->SetFarSightGUID(0);
((Player*)caster)->SetClientControl(m_target,0);
- WorldPacket data(SMSG_PET_SPELLS, 8+4);
+ WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0);
- data << uint32(0);
((Player*)caster)->GetSession()->SendPacket(&data);
}
@@ -3655,7 +3662,7 @@ void AuraEffect::HandleModPossessPet(bool apply, bool Real)
{
pet->AttackStop();
pet->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
- pet->SetUnitMovementFlags(MOVEMENTFLAG_NONE);
+ pet->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
}
}*/
@@ -3768,9 +3775,8 @@ void AuraEffect::HandleAuraModPetTalentsPoints(bool Apply, bool Real, bool chang
if(caster->GetTypeId() == TYPEID_PLAYER)
{
- WorldPacket data(SMSG_PET_SPELLS, 8+4);
+ WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0);
- data << uint32(0);
((Player*)caster)->GetSession()->SendPacket(&data);
}
if(m_target->GetTypeId() == TYPEID_UNIT)
@@ -4008,7 +4014,6 @@ void AuraEffect::HandleInvisibilityDetect(bool apply, bool Real, bool /*changeAm
m_target->m_detectInvisibilityMask |= (1 << GetMiscValue());
}
if(Real && m_target->GetTypeId()==TYPEID_PLAYER)
- //ObjectAccessor::UpdateVisibilityForPlayer((Player*)m_target);
m_target->SetToNotify();
}
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 1e3c1d78dfe..9b176683e7c 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -223,7 +223,10 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectEnchantItemPrismatic, //156 SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC
&Spell::EffectCreateItem2, //157 SPELL_EFFECT_CREATE_ITEM_2 create/learn item/spell for profession
&Spell::EffectMilling, //158 SPELL_EFFECT_MILLING milling
- &Spell::EffectRenamePet //159 SPELL_EFFECT_ALLOW_RENAME_PET allow rename pet once again
+ &Spell::EffectRenamePet, //159 SPELL_EFFECT_ALLOW_RENAME_PET allow rename pet once again
+ &Spell::EffectNULL, //160 SPELL_EFFECT_160 unused
+ &Spell::EffectNULL, //161 SPELL_EFFECT_161 second talent spec (learn/revert)
+ &Spell::EffectNULL //162 SPELL_EFFECT_162 activate primary/secondary spec
};
void Spell::EffectNULL(uint32 /*i*/)
@@ -5551,6 +5554,7 @@ void Spell::EffectApplyGlyph(uint32 i)
player->CastSpell(m_caster, gp->SpellId, true);
player->SetGlyph(m_glyphIndex, glyph);
+ player->SendTalentsInfoData(false);
}
}
}
diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp
index f48c3eaad95..54c99ee90dd 100644
--- a/src/game/TargetedMovementGenerator.cpp
+++ b/src/game/TargetedMovementGenerator.cpp
@@ -148,6 +148,7 @@ TargetedMovementGenerator<T>::Initialize(T &owner)
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2);
+
_setTargetLocation(owner);
}
diff --git a/src/game/Transports.cpp b/src/game/Transports.cpp
index bd698932e6c..58e2447e6c4 100644
--- a/src/game/Transports.cpp
+++ b/src/game/Transports.cpp
@@ -136,8 +136,7 @@ void MapManager::LoadTransports()
Transport::Transport() : GameObject()
{
- // 2.3.2 - 0x5A
- m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
+ m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_ROTATION);
}
bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags)
diff --git a/src/game/Traveller.h b/src/game/Traveller.h
index 702cc6413b0..dfa4913a4cc 100644
--- a/src/game/Traveller.h
+++ b/src/game/Traveller.h
@@ -121,7 +121,7 @@ inline float Traveller<Player>::Speed()
else if(i_traveller.isInFlight())
return PLAYER_FLIGHT_SPEED;
else
- return i_traveller.GetSpeed(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN);
+ return i_traveller.GetSpeed(i_traveller.m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN);
}
template<>
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index ac11c3b3317..d8b1ce56a3a 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -86,8 +86,8 @@ Unit::Unit()
{
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
- // 2.3.2 - 0x70
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION);
+
+ m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION);
m_attackTimer[BASE_ATTACK] = 0;
m_attackTimer[OFF_ATTACK] = 0;
@@ -163,7 +163,7 @@ Unit::Unit()
m_speed_rate[i] = 1.0f;
m_charmInfo = NULL;
- m_unit_movement_flags = 0;
+ //m_unit_movement_flags = 0;
m_reducedThreatPercent = 0;
m_misdirectionTargetGUID = 0;
@@ -286,6 +286,7 @@ void Unit::SendMonsterStop()
{
WorldPacket data( SMSG_MONSTER_MOVE, (17 + GetPackGUID().size()) );
data.append(GetPackGUID());
+ data << uint8(0); // new in 3.1
data << GetPositionX() << GetPositionY() << GetPositionZ();
data << getMSTime();
data << uint8(1);
@@ -296,15 +297,15 @@ void Unit::SendMonsterStop()
void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 Time, Player* player)
{
- WorldPacket data( SMSG_MONSTER_MOVE, 12+4+1+4+4+4+12+GetPackGUID().size());
+ WorldPacket data( SMSG_MONSTER_MOVE, 1+12+4+1+4+4+4+12+GetPackGUID().size());
data.append(GetPackGUID());
+ data << uint8(0); // new in 3.1
data << GetPositionX() << GetPositionY() << GetPositionZ();
data << getMSTime();
data << uint8(0);
data << uint32((GetUnitMovementFlags() & MOVEMENTFLAG_LEVITATING) ? MOVEFLAG_FLY : MOVEFLAG_WALK);
-
data << Time; // Time in between points
data << uint32(1); // 1 single waypoint
data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
@@ -322,6 +323,7 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 M
WorldPacket data( SMSG_MONSTER_MOVE, 12+4+1+4+4+4+12+GetPackGUID().size());
data.append(GetPackGUID());
+ data << uint8(0); // new in 3.1
data << GetPositionX() << GetPositionY() << GetPositionZ();
data << getMSTime();
@@ -348,9 +350,11 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 M
/*void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player)
{
+ float moveTime = Time;
+
WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) );
data.append(GetPackGUID());
-
+ data << uint8(0); // new in 3.1
data << GetPositionX() << GetPositionY() << GetPositionZ();
data << uint32(getMSTime());
@@ -377,7 +381,10 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 M
data << uint32(MovementFlags);
- data << uint32(Time); // Time in between points
+ if(MovementFlags & MONSTER_MOVE_WALK)
+ moveTime *= 1.05f;
+
+ data << uint32(moveTime); // Time in between points
data << uint32(1); // 1 single waypoint
data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
@@ -393,8 +400,9 @@ void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end)
uint32 pathSize = end - start;
- WorldPacket data( SMSG_MONSTER_MOVE, (GetPackGUID().size()+4+4+4+4+1+4+4+4+pathSize*4*3) );
+ WorldPacket data( SMSG_MONSTER_MOVE, (GetPackGUID().size()+1+4+4+4+4+1+4+4+4+pathSize*4*3) );
data.append(GetPackGUID());
+ data << uint8(0);
data << GetPositionX();
data << GetPositionY();
data << GetPositionZ();
@@ -405,7 +413,7 @@ void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end)
data << uint32( pathSize );
data.append( (char*)path.GetNodes(start), pathSize * 4 * 3 );
SendMessageToSet(&data, true);
-
+//MONSTER_MOVE_SPLINE_FLY
addUnitState(UNIT_STAT_MOVE);
}
@@ -13530,7 +13538,7 @@ void Unit::SetRooted(bool apply)
uint32 apply_stat = UNIT_STAT_ROOT;
if(apply)
{
- SetFlag(UNIT_FIELD_FLAGS,(apply_stat<<16)); // probably wrong
+ //SetFlag(UNIT_FIELD_FLAGS,(apply_stat<<16)); // probably wrong
if(GetTypeId() == TYPEID_PLAYER)
{
@@ -13546,7 +13554,7 @@ void Unit::SetRooted(bool apply)
}
else
{
- RemoveFlag(UNIT_FIELD_FLAGS,(apply_stat<<16)); // probably wrong
+ //RemoveFlag(UNIT_FIELD_FLAGS,(apply_stat<<16)); // probably wrong
if(!hasUnitState(UNIT_STAT_STUNNED)) // prevent allow move if have also stun effect
{
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 2c68f4d5c0c..bbc28433344 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -448,7 +448,8 @@ enum UnitState
UNIT_STAT_CHARGING = 0x00020000,
UNIT_STAT_JUMPING = 0x00040000,
UNIT_STAT_ONVEHICLE = 0x00080000,
- UNIT_STAT_MOVE = 0x00100000,
+ UNIT_STAT_MOVE = 0x00100000,
+ //UNIT_STAT_WALK = 0x00200000,
UNIT_STAT_UNATTACKABLE = (UNIT_STAT_IN_FLIGHT | UNIT_STAT_ONVEHICLE),
UNIT_STAT_MOVING = (UNIT_STAT_ROAMING | UNIT_STAT_CHASE),
UNIT_STAT_CONTROLLED = (UNIT_STAT_CONFUSED | UNIT_STAT_STUNNED | UNIT_STAT_FLEEING),
@@ -618,13 +619,10 @@ enum NPCFlags
enum MoveFlags
{
- MOVEFLAG_NONE = 0x00000000,
- MOVEFLAG_SLIDE = 0x00000002,
- MOVEFLAG_MARCH_ON_SPOT = 0x00000004,
- MOVEFLAG_JUMP = 0x00000008,
- MOVEFLAG_WALK = 0x00000100,
- MOVEFLAG_FLY = 0x00000200, //For dragon (+walk = glide)
- MOVEFLAG_ORIENTATION = 0x00000400, //Fix orientation
+ MOVEFLAG_JUMP = 0x00000800,
+ MOVEFLAG_WALK = 0x00001000,
+ MOVEFLAG_FLY = 0x00002000,
+ MOVEFLAG_GLIDE = 0x00003000, // dragon
};
enum MovementFlags
@@ -658,6 +656,7 @@ enum MovementFlags
MOVEMENTFLAG_UNK3 = 0x40000000
};
+/*
enum MonsterMovementFlags
{
MONSTER_MOVE_NONE = 0x00000000,
@@ -693,6 +692,7 @@ enum MonsterMovementFlags
// masks
MONSTER_MOVE_SPLINE_FLY = 0x00003000, // fly by points
};
+*/
struct MovementInfo
{
@@ -723,6 +723,10 @@ struct MovementInfo
x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_zspeed = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0;
}
+
+ uint32 GetMovementFlags() { return flags; }
+ void AddMovementFlag(uint32 flag) { flags |= flag; }
+ bool HasMovementFlag(uint32 flag) const { return flags & flag; }
};
enum DiminishingLevels
@@ -1668,15 +1672,11 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool IsStopped() const { return !(hasUnitState(UNIT_STAT_MOVING)); }
void StopMoving();
- void AddUnitMovementFlag(uint32 f) { m_unit_movement_flags |= f; }
- void RemoveUnitMovementFlag(uint32 f)
- {
- uint32 oldval = m_unit_movement_flags;
- m_unit_movement_flags = oldval & ~f;
- }
- uint32 HasUnitMovementFlag(uint32 f) const { return m_unit_movement_flags & f; }
- uint32 GetUnitMovementFlags() const { return m_unit_movement_flags; }
- void SetUnitMovementFlags(uint32 f) { m_unit_movement_flags = f; }
+ void AddUnitMovementFlag(uint32 f) { m_movementInfo.flags |= f; }
+ void RemoveUnitMovementFlag(uint32 f) { m_movementInfo.flags &= ~f; }
+ uint32 HasUnitMovementFlag(uint32 f) const { return m_movementInfo.flags & f; }
+ uint32 GetUnitMovementFlags() const { return m_movementInfo.flags; }
+ void SetUnitMovementFlags(uint32 f) { m_movementInfo.flags = f; }
void SetControlled(bool apply, UnitState state);
@@ -1814,7 +1814,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
virtual SpellSchoolMask GetMeleeDamageSchoolMask() const;
MotionMaster i_motionMaster;
- uint32 m_unit_movement_flags;
+ //uint32 m_unit_movement_flags;
uint32 m_reactiveTimer[MAX_REACTIVE];
uint32 m_regenTimer;
diff --git a/src/game/UpdateData.cpp b/src/game/UpdateData.cpp
index d041c6100fc..a3192b74b0e 100644
--- a/src/game/UpdateData.cpp
+++ b/src/game/UpdateData.cpp
@@ -105,7 +105,9 @@ void UpdateData::Compress(void* dst, uint32 *dst_size, void* src, int src_size)
bool UpdateData::BuildPacket(WorldPacket *packet)
{
- ByteBuffer buf(4+(m_outOfRangeGUIDs.empty() ? 0 : 1+4+9*m_outOfRangeGUIDs.size())+m_data.wpos());
+ ASSERT(packet->empty()); // shouldn't happen
+
+ ByteBuffer buf(4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos());
buf << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount);
@@ -122,8 +124,6 @@ bool UpdateData::BuildPacket(WorldPacket *packet)
buf.append(m_data);
- packet->clear();
-
size_t pSize = buf.wpos(); // use real used data size
if (pSize > 100 ) // compress large packets
diff --git a/src/game/UpdateFields.h b/src/game/UpdateFields.h
index 97fcbeb05d6..50063ca7df1 100644
--- a/src/game/UpdateFields.h
+++ b/src/game/UpdateFields.h
@@ -21,7 +21,7 @@
#ifndef _UPDATEFIELDS_AUTO_H
#define _UPDATEFIELDS_AUTO_H
-// Auto generated for version 3, 0, 3, 9183
+// Auto generated for version 3, 1, 3, 9947
enum EObjectFields
{
@@ -39,9 +39,9 @@ enum EItemFields
ITEM_FIELD_CONTAINED = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC
ITEM_FIELD_CREATOR = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC
ITEM_FIELD_GIFTCREATOR = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC
- ITEM_FIELD_STACK_COUNT = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
- ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
- ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER_ONLY, UNK2
+ ITEM_FIELD_STACK_COUNT = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
+ ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
+ ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER, ITEM_OWNER
ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_1_1 = OBJECT_END + 0x0010, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_1_3 = OBJECT_END + 0x0012, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
@@ -69,9 +69,9 @@ enum EItemFields
ITEM_FIELD_ENCHANTMENT_12_3 = OBJECT_END + 0x0033, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC
ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER_ONLY
- ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
- ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
+ ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER
+ ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
+ ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
ITEM_FIELD_PAD = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: NONE
ITEM_END = OBJECT_END + 0x003A,
};
@@ -111,8 +111,8 @@ enum EUnitFields
UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_LEVEL = OBJECT_END + 0x002F, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x0030, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x0031, // Size: 3, Type: INT, Flags: PUBLIC
@@ -126,53 +126,53 @@ enum EUnitFields
UNIT_FIELD_DISPLAYID = OBJECT_END + 0x003C, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x003D, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x003E, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER
+ UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER
+ UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER
+ UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER
UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0043, // Size: 1, Type: BYTES, Flags: PUBLIC
UNIT_FIELD_PETNUMBER = OBJECT_END + 0x0044, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x0045, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER_ONLY
- UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER_ONLY
+ UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER
+ UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER
UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x0048, // Size: 1, Type: INT, Flags: DYNAMIC
UNIT_CHANNEL_SPELL = OBJECT_END + 0x0049, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_MOD_CAST_SPEED = OBJECT_END + 0x004A, // Size: 1, Type: FLOAT, Flags: PUBLIC
UNIT_CREATED_BY_SPELL = OBJECT_END + 0x004B, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC
UNIT_NPC_EMOTESTATE = OBJECT_END + 0x004D, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER, PARTY_LEADER
+ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_BASE_MANA = OBJECT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074, // Size: 1, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER
+ UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x008C, // Size: 1, Type: FLOAT, Flags: PUBLIC
UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE
UNIT_END = OBJECT_END + 0x008E,
@@ -186,285 +186,222 @@ enum EUnitFields
PLAYER_BYTES_3 = UNIT_END + 0x0007, // Size: 1, Type: BYTES, Flags: PUBLIC
PLAYER_DUEL_TEAM = UNIT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_GUILD_TIMESTAMP = UNIT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_QUEST_LOG_1_1 = UNIT_END + 0x000A, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_1_1 = UNIT_END + 0x000A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_1_2 = UNIT_END + 0x000B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_1_3 = UNIT_END + 0x000C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_1_4 = UNIT_END + 0x000D, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_2_1 = UNIT_END + 0x000E, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_2_1 = UNIT_END + 0x000E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_2_2 = UNIT_END + 0x000F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_2_3 = UNIT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_2_4 = UNIT_END + 0x0011, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_3_1 = UNIT_END + 0x0012, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_3_1 = UNIT_END + 0x0012, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_3_2 = UNIT_END + 0x0013, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_3_3 = UNIT_END + 0x0014, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_3_4 = UNIT_END + 0x0015, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_4_1 = UNIT_END + 0x0016, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_4_1 = UNIT_END + 0x0016, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_4_2 = UNIT_END + 0x0017, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_4_3 = UNIT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_4_4 = UNIT_END + 0x0019, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_5_1 = UNIT_END + 0x001A, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_5_1 = UNIT_END + 0x001A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_5_2 = UNIT_END + 0x001B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_5_3 = UNIT_END + 0x001C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_5_4 = UNIT_END + 0x001D, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_6_1 = UNIT_END + 0x001E, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_6_1 = UNIT_END + 0x001E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_6_2 = UNIT_END + 0x001F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_6_3 = UNIT_END + 0x0020, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_6_4 = UNIT_END + 0x0021, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_7_1 = UNIT_END + 0x0022, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_7_1 = UNIT_END + 0x0022, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_7_2 = UNIT_END + 0x0023, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_7_3 = UNIT_END + 0x0024, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_7_4 = UNIT_END + 0x0025, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_8_1 = UNIT_END + 0x0026, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_8_1 = UNIT_END + 0x0026, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_8_2 = UNIT_END + 0x0027, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_8_3 = UNIT_END + 0x0028, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_8_4 = UNIT_END + 0x0029, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_9_1 = UNIT_END + 0x002A, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_9_1 = UNIT_END + 0x002A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_9_2 = UNIT_END + 0x002B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_9_3 = UNIT_END + 0x002C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_9_4 = UNIT_END + 0x002D, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_10_1 = UNIT_END + 0x002E, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_10_1 = UNIT_END + 0x002E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_10_2 = UNIT_END + 0x002F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_10_3 = UNIT_END + 0x0030, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_10_4 = UNIT_END + 0x0031, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_11_1 = UNIT_END + 0x0032, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_11_1 = UNIT_END + 0x0032, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_11_2 = UNIT_END + 0x0033, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_11_3 = UNIT_END + 0x0034, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_11_4 = UNIT_END + 0x0035, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_12_1 = UNIT_END + 0x0036, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_12_1 = UNIT_END + 0x0036, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_12_2 = UNIT_END + 0x0037, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_12_3 = UNIT_END + 0x0038, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_12_4 = UNIT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_13_1 = UNIT_END + 0x003A, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_13_1 = UNIT_END + 0x003A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_13_2 = UNIT_END + 0x003B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_13_3 = UNIT_END + 0x003C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_13_4 = UNIT_END + 0x003D, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_14_1 = UNIT_END + 0x003E, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_14_1 = UNIT_END + 0x003E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_14_2 = UNIT_END + 0x003F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_14_3 = UNIT_END + 0x0040, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_14_4 = UNIT_END + 0x0041, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_15_1 = UNIT_END + 0x0042, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_15_1 = UNIT_END + 0x0042, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_15_2 = UNIT_END + 0x0043, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_15_3 = UNIT_END + 0x0044, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_15_4 = UNIT_END + 0x0045, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_16_1 = UNIT_END + 0x0046, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_16_1 = UNIT_END + 0x0046, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_16_2 = UNIT_END + 0x0047, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_16_3 = UNIT_END + 0x0048, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_16_4 = UNIT_END + 0x0049, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_17_1 = UNIT_END + 0x004A, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_17_1 = UNIT_END + 0x004A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_17_2 = UNIT_END + 0x004B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_17_3 = UNIT_END + 0x004C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_17_4 = UNIT_END + 0x004D, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_18_1 = UNIT_END + 0x004E, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_18_1 = UNIT_END + 0x004E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_18_2 = UNIT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_18_3 = UNIT_END + 0x0050, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_18_4 = UNIT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_19_1 = UNIT_END + 0x0052, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_19_1 = UNIT_END + 0x0052, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_19_2 = UNIT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_19_3 = UNIT_END + 0x0054, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_19_4 = UNIT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_20_1 = UNIT_END + 0x0056, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_20_1 = UNIT_END + 0x0056, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_20_2 = UNIT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_20_3 = UNIT_END + 0x0058, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_20_4 = UNIT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_21_1 = UNIT_END + 0x005A, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_21_1 = UNIT_END + 0x005A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_21_2 = UNIT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_21_3 = UNIT_END + 0x005C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_21_4 = UNIT_END + 0x005D, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_22_1 = UNIT_END + 0x005E, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_22_1 = UNIT_END + 0x005E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_22_2 = UNIT_END + 0x005F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_22_3 = UNIT_END + 0x0060, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_22_4 = UNIT_END + 0x0061, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_23_1 = UNIT_END + 0x0062, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_23_1 = UNIT_END + 0x0062, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_23_2 = UNIT_END + 0x0063, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_23_3 = UNIT_END + 0x0064, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_23_4 = UNIT_END + 0x0065, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_24_1 = UNIT_END + 0x0066, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_24_1 = UNIT_END + 0x0066, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_24_2 = UNIT_END + 0x0067, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_24_3 = UNIT_END + 0x0068, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_24_4 = UNIT_END + 0x0069, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_QUEST_LOG_25_1 = UNIT_END + 0x006A, // Size: 1, Type: INT, Flags: GROUP_ONLY
+ PLAYER_QUEST_LOG_25_1 = UNIT_END + 0x006A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_25_2 = UNIT_END + 0x006B, // Size: 1, Type: INT, 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_VISIBLE_ITEM_1_CREATOR = UNIT_END + 0x006E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_SEED = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007F, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x0080, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0082, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_SEED = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x0091, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x0092, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0094, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x00A1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_SEED = UNIT_END + 0x00A2, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x00A4, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A6, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00B3, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_SEED = UNIT_END + 0x00B4, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00B5, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00B6, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B8, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00C5, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_SEED = UNIT_END + 0x00C6, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00C7, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00C8, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00CA, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00D7, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_SEED = UNIT_END + 0x00D8, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00D9, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00DA, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00DC, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00E9, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_SEED = UNIT_END + 0x00EA, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00EB, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00EC, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00EE, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00FB, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_SEED = UNIT_END + 0x00FC, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x0100, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x010D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_SEED = UNIT_END + 0x010E, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x010F, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x0110, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0112, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x011F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_SEED = UNIT_END + 0x0120, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x0121, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x0122, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0124, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x0131, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_SEED = UNIT_END + 0x0132, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x0133, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x0134, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0136, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x0143, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_SEED = UNIT_END + 0x0144, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x0145, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x0146, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0148, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x0155, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_SEED = UNIT_END + 0x0156, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x0157, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x0158, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x015A, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x0167, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_SEED = UNIT_END + 0x0168, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x0169, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x016A, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x016C, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x0179, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_SEED = UNIT_END + 0x017A, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x017B, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x017C, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x017E, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x018B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_SEED = UNIT_END + 0x018C, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0190, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x019D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_SEED = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x01A0, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x01A2, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x01AF, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_SEED = UNIT_END + 0x01B0, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x01B1, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x01B2, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x01B4, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x01C1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_SEED = UNIT_END + 0x01C2, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x01C3, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_CHOSEN_TITLE = UNIT_END + 0x01C4, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_FIELD_PAD_0 = UNIT_END + 0x01C5, // Size: 1, Type: INT, Flags: NONE
- PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01C6, // Size: 46, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01F4, // Size: 32, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x0214, // Size: 56, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x024C, // Size: 14, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x025A, // Size: 24, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0272, // Size: 64, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_VANITYPET_SLOT_1 = UNIT_END + 0x02B2, // Size: 36, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x02D6, // Size: 64, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_QUESTBAG_SLOT_1 = UNIT_END + 0x0316, // Size: 64, Type: LONG, Flags: PRIVATE
- PLAYER_FARSIGHT = UNIT_END + 0x0356, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x0358, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x035A, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x035C, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER_XP = UNIT_END + 0x035E, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x035F, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x0360, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE
- PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x04E0, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x04E1, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_TRACK_CREATURES = UNIT_END + 0x04E2, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_TRACK_RESOURCES = UNIT_END + 0x04E3, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x04E4, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x04E5, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x04E6, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_EXPERTISE = UNIT_END + 0x04E7, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x04E8, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x04E9, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x04EA, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x04EB, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x04EC, // Size: 7, Type: FLOAT, Flags: PRIVATE
- PLAYER_SHIELD_BLOCK = UNIT_END + 0x04F3, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x04F4, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x04F5, // Size: 128, Type: BYTES, Flags: PRIVATE
- PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x0575, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_COINAGE = UNIT_END + 0x0576, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x0577, // Size: 7, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x057E, // Size: 7, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x0585, // Size: 7, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x058C, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x058D, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x058E, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BYTES = UNIT_END + 0x058F, // Size: 1, Type: BYTES, Flags: PRIVATE
- PLAYER_AMMO_ID = UNIT_END + 0x0590, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_SELF_RES_SPELL = UNIT_END + 0x0591, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0592, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0593, // Size: 12, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x059F, // Size: 12, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_KILLS = UNIT_END + 0x05AB, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
- PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x05AC, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x05AD, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x05AE, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BYTES2 = UNIT_END + 0x05AF, // Size: 1, Type: BYTES, Flags: PRIVATE
- PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x05B0, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x05B1, // Size: 25, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x05CA, // Size: 18, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x05DC, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x05DD, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x05DE, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x05DF, // Size: 25, Type: INT, Flags: PRIVATE
- PLAYER_RUNE_REGEN_1 = UNIT_END + 0x05F8, // Size: 4, Type: FLOAT, Flags: PRIVATE
- PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x05FC, // Size: 3, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x05FF, // Size: 8, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0607, // Size: 8, Type: INT, Flags: PRIVATE
- PLAYER_GLYPHS_ENABLED = UNIT_END + 0x060F, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_END = UNIT_END + 0x0610,
+ PLAYER_VISIBLE_ITEM_1_ENTRYID = UNIT_END + 0x006E, // 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_ENCHANTMENT = UNIT_END + 0x0093, // Size: 1, Type: TWO_SHORT, 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_INV_SLOT_HEAD = UNIT_END + 0x0096, // Size: 46, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x00C4, // Size: 32, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x00E4, // Size: 56, 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_KEYRING_SLOT_1 = UNIT_END + 0x0142, // Size: 64, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x0182, // Size: 64, Type: LONG, Flags: PRIVATE
+ PLAYER_FARSIGHT = UNIT_END + 0x01C2, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x01C4, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x01C6, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER__FIELD_KNOWN_TITLES2 = UNIT_END + 0x01C8, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x01CA, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER_XP = UNIT_END + 0x01CC, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x01CD, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x01CE, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE
+ PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x034E, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x034F, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_TRACK_CREATURES = UNIT_END + 0x0350, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_TRACK_RESOURCES = UNIT_END + 0x0351, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x0352, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x0353, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x0354, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_EXPERTISE = UNIT_END + 0x0355, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x0356, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x0357, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0358, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0359, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x035A, // Size: 7, Type: FLOAT, Flags: PRIVATE
+ PLAYER_SHIELD_BLOCK = UNIT_END + 0x0361, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x0362, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x0363, // Size: 128, Type: BYTES, Flags: PRIVATE
+ PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x03E3, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_COINAGE = UNIT_END + 0x03E4, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x03E5, // Size: 7, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x03EC, // Size: 7, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x03F3, // Size: 7, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x03FA, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x03FB, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x03FC, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BYTES = UNIT_END + 0x03FD, // Size: 1, Type: BYTES, Flags: PRIVATE
+ PLAYER_AMMO_ID = UNIT_END + 0x03FE, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_SELF_RES_SPELL = UNIT_END + 0x03FF, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0400, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0401, // Size: 12, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x040D, // Size: 12, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_KILLS = UNIT_END + 0x0419, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
+ PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x041A, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x041B, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x041C, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BYTES2 = UNIT_END + 0x041D, // Size: 1, Type: BYTES, Flags: PRIVATE
+ PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x041E, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x041F, // Size: 25, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0438, // Size: 18, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x044A, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x044B, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x044C, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x044D, // Size: 25, Type: INT, Flags: PRIVATE
+ PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0466, // Size: 4, Type: FLOAT, Flags: PRIVATE
+ PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x046A, // Size: 3, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x046D, // Size: 6, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0473, // Size: 6, Type: INT, Flags: PRIVATE
+ PLAYER_GLYPHS_ENABLED = UNIT_END + 0x0479, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_END = UNIT_END + 0x047A,
};
enum EGameObjectFields
{
OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC
- GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0006, // Size: 4, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_POS_X = OBJECT_END + 0x000A, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_POS_Y = OBJECT_END + 0x000B, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_POS_Z = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_FACING = OBJECT_END + 0x000D, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_DYNAMIC = OBJECT_END + 0x000E, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC
- GAMEOBJECT_FACTION = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_LEVEL = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_BYTES_1 = OBJECT_END + 0x0011, // Size: 1, Type: BYTES, Flags: PUBLIC
- GAMEOBJECT_END = OBJECT_END + 0x0012,
+ GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC
+ GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC
+ GAMEOBJECT_FACTION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC
+ GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC
+ GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC
+ GAMEOBJECT_END = OBJECT_END + 0x000C,
};
enum EDynamicObjectFields
@@ -485,19 +422,15 @@ enum ECorpseFields
{
CORPSE_FIELD_OWNER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
CORPSE_FIELD_PARTY = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC
- CORPSE_FIELD_FACING = OBJECT_END + 0x0004, // Size: 1, Type: FLOAT, Flags: PUBLIC
- CORPSE_FIELD_POS_X = OBJECT_END + 0x0005, // Size: 1, Type: FLOAT, Flags: PUBLIC
- CORPSE_FIELD_POS_Y = OBJECT_END + 0x0006, // Size: 1, Type: FLOAT, Flags: PUBLIC
- CORPSE_FIELD_POS_Z = OBJECT_END + 0x0007, // Size: 1, Type: FLOAT, Flags: PUBLIC
- CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC
- CORPSE_FIELD_ITEM = OBJECT_END + 0x0009, // Size: 19, Type: INT, Flags: PUBLIC
- CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x001C, // Size: 1, Type: BYTES, Flags: PUBLIC
- CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x001D, // Size: 1, Type: BYTES, Flags: PUBLIC
- CORPSE_FIELD_GUILD = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC
- CORPSE_FIELD_FLAGS = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC
- CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: DYNAMIC
- CORPSE_FIELD_PAD = OBJECT_END + 0x0021, // Size: 1, Type: INT, Flags: NONE
- CORPSE_END = OBJECT_END + 0x0022,
+ CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0004, // Size: 1, Type: INT, Flags: PUBLIC
+ CORPSE_FIELD_ITEM = OBJECT_END + 0x0005, // Size: 19, Type: INT, Flags: PUBLIC
+ CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PUBLIC
+ CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x0019, // Size: 1, Type: BYTES, Flags: PUBLIC
+ CORPSE_FIELD_GUILD = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC
+ CORPSE_FIELD_FLAGS = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC
+ CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: DYNAMIC
+ CORPSE_FIELD_PAD = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: NONE
+ CORPSE_END = OBJECT_END + 0x001E,
};
#endif
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
index 5197e799104..8cac1c64b7c 100644
--- a/src/game/Vehicle.cpp
+++ b/src/game/Vehicle.cpp
@@ -30,7 +30,7 @@
Vehicle::Vehicle() : Creature(), m_vehicleInfo(NULL), m_usableSeatNum(0)
{
m_summonMask |= SUMMON_MASK_VEHICLE;
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_VEHICLE);
+ m_updateFlag = (UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_VEHICLE);
}
Vehicle::~Vehicle()
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 3da26c01a05..c6d2bc9104a 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -257,6 +257,8 @@ World::AddSession_ (WorldSession* s)
s->SendPacket (&packet);
s->SendAddonsInfo();
+ s->SendTutorialsData();
+
UpdateMaxSessionCounters ();
// Updates the population
diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp
index 1721e3ff295..7c6da00b409 100644
--- a/src/game/WorldSession.cpp
+++ b/src/game/WorldSession.cpp
@@ -46,7 +46,8 @@ WorldSession::WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8
LookingForGroup_auto_join(false), LookingForGroup_auto_add(false), m_muteTime(mute_time),
_player(NULL), m_Socket(sock),_security(sec), _accountId(id), m_expansion(expansion),
m_sessionDbcLocale(sWorld.GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(objmgr.GetIndexForLocale(locale)),
-_logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), m_latency(0)
+_logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false),
+m_latency(0), m_TutorialsChanged(false)
{
if (sock)
{
@@ -569,6 +570,65 @@ void WorldSession::SetAccountData(uint32 type, time_t time_, std::string data)
CharacterDatabase.CommitTransaction ();
}
+void WorldSession::LoadTutorialsData()
+{
+ for ( int aX = 0 ; aX < 8 ; ++aX )
+ m_Tutorials[ aX ] = 0;
+
+ QueryResult *result = CharacterDatabase.PQuery("SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u'", GetAccountId());
+
+ if(result)
+ {
+ do
+ {
+ Field *fields = result->Fetch();
+
+ for (int iI = 0; iI < 8; ++iI)
+ m_Tutorials[iI] = fields[iI].GetUInt32();
+ }
+ while( result->NextRow() );
+
+ delete result;
+ }
+
+ m_TutorialsChanged = false;
+}
+
+void WorldSession::SendTutorialsData()
+{
+ WorldPacket data(SMSG_TUTORIAL_FLAGS, 4*8);
+ for(uint32 i = 0; i < 8; ++i)
+ data << m_Tutorials[i];
+ SendPacket(&data);
+}
+
+void WorldSession::SaveTutorialsData()
+{
+ if(!m_TutorialsChanged)
+ return;
+
+ uint32 Rows=0;
+ // it's better than rebuilding indexes multiple times
+ QueryResult *result = CharacterDatabase.PQuery("SELECT count(*) AS r FROM character_tutorial WHERE account = '%u'", GetAccountId());
+ if(result)
+ {
+ Rows = result->Fetch()[0].GetUInt32();
+ delete result;
+ }
+
+ if (Rows)
+ {
+ CharacterDatabase.PExecute("UPDATE character_tutorial SET tut0='%u', tut1='%u', tut2='%u', tut3='%u', tut4='%u', tut5='%u', tut6='%u', tut7='%u' WHERE account = '%u'",
+ m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7], GetAccountId());
+ }
+ else
+ {
+ CharacterDatabase.PExecute("INSERT INTO character_tutorial (account,tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7) VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", GetAccountId(), m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7]);
+ }
+
+ m_TutorialsChanged = false;
+}
+
void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
{
CHECK_PACKET_SIZE(data, data.rpos()+4+2+4+4+4+4+4);
@@ -582,8 +642,10 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
if(mi->flags & MOVEMENTFLAG_ONTRANSPORT)
{
- CHECK_PACKET_SIZE(data, data.rpos()+8+4+4+4+4+4+1);
- data >> mi->t_guid;
+ if(!data.readPackGUID(mi->t_guid))
+ return;
+
+ CHECK_PACKET_SIZE(data, data.rpos()+4+4+4+4+4+1);
data >> mi->t_x;
data >> mi->t_y;
data >> mi->t_z;
diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h
index 53f2a4b52f6..6d20d50f22e 100644
--- a/src/game/WorldSession.h
+++ b/src/game/WorldSession.h
@@ -119,6 +119,7 @@ class TRINITY_DLL_SPEC WorldSession
void SendNotification(int32 string_id,...);
void SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName);
void SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type);
+ void SendLfgUpdate(uint8 unk1, uint8 unk2, uint8 unk3);
void SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res);
void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2,3);
void SendSetPhaseShift(uint32 phaseShift);
@@ -191,6 +192,22 @@ class TRINITY_DLL_SPEC WorldSession
AccountData *GetAccountData(uint32 type) { return &m_accountData[type]; }
void SetAccountData(uint32 type, time_t time_, std::string data);
void LoadAccountData();
+ void LoadTutorialsData();
+ void SendTutorialsData();
+ void SaveTutorialsData();
+ uint32 GetTutorialInt(uint32 intId )
+ {
+ return m_Tutorials[intId];
+ }
+
+ void SetTutorialInt(uint32 intId, uint32 value)
+ {
+ if(m_Tutorials[intId] != value)
+ {
+ m_Tutorials[intId] = value;
+ m_TutorialsChanged = true;
+ }
+ }
//mail
//used with item_page table
@@ -517,6 +534,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket);
void HandleLearnTalentOpcode(WorldPacket& recvPacket);
+ void HandleLearnPreviewTalents(WorldPacket& recvPacket);
void HandleTalentWipeConfirmOpcode(WorldPacket& recvPacket);
void HandleUnlearnSkillOpcode(WorldPacket& recvPacket);
@@ -589,6 +607,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandlePetSpellAutocastOpcode( WorldPacket& recvPacket );
void HandlePetCastSpellOpcode( WorldPacket& recvPacket );
void HandlePetLearnTalent( WorldPacket& recvPacket );
+ void HandleLearnPreviewTalentsPet( WorldPacket& recvPacket );
void HandleSetActionBarToggles(WorldPacket& recv_data);
@@ -625,6 +644,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandleLfmClearOpcode(WorldPacket& recv_data);
void HandleSetLfmOpcode(WorldPacket& recv_data);
void HandleSetLfgCommentOpcode(WorldPacket& recv_data);
+ void HandleLfgSetRoles(WorldPacket& recv_data);
void HandleSetTitleOpcode(WorldPacket& recv_data);
void HandleRealmSplitOpcode(WorldPacket& recv_data);
void HandleTimeSyncResp(WorldPacket& recv_data);
@@ -696,6 +716,9 @@ class TRINITY_DLL_SPEC WorldSession
void HandleRemoveGlyph(WorldPacket& recv_data);
void HandleCharCustomize(WorldPacket& recv_data);
void HandleQueryInspectAchievements(WorldPacket& recv_data);
+ void HandleEquipmentSetSave(WorldPacket& recv_data);
+ void HandleEquipmentSetDelete(WorldPacket& recv_data);
+ void HandleEquipmentSetUse(WorldPacket& recv_data);
private:
// private trade methods
void moveItems(Item* myItems[], Item* hisItems[]);
@@ -719,6 +742,8 @@ class TRINITY_DLL_SPEC WorldSession
int m_sessionDbLocaleIndex;
uint32 m_latency;
AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES];
+ uint32 m_Tutorials[8];
+ bool m_TutorialsChanged;
AddonsList m_addonsList;
ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue;
};
diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp
index 8bd4144b845..68daec242f8 100644
--- a/src/game/WorldSocket.cpp
+++ b/src/game/WorldSocket.cpp
@@ -921,10 +921,10 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
// NOTE ATM the socket is single-threaded, have this in mind ...
ACE_NEW_RETURN (m_Session, WorldSession (id, this, AccountTypes(security), expansion, mutetime, locale), -1);
- m_Crypt.SetKey (&K);
- m_Crypt.Init ();
+ m_Crypt.Init(&K);
m_Session->LoadAccountData();
+ m_Session->LoadTutorialsData();
m_Session->ReadAddonsInfo(recvPacket);
// In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec
diff --git a/src/shared/Auth/AuthCrypt.cpp b/src/shared/Auth/AuthCrypt.cpp
index 0b2a3f64338..e8126ad9f73 100644
--- a/src/shared/Auth/AuthCrypt.cpp
+++ b/src/shared/Auth/AuthCrypt.cpp
@@ -20,64 +20,62 @@
#include "AuthCrypt.h"
#include "Hmac.h"
+#include "Log.h"
+#include "BigNumber.h"
AuthCrypt::AuthCrypt()
{
_initialized = false;
}
-void AuthCrypt::Init()
+AuthCrypt::~AuthCrypt()
{
- _send_i = _send_j = _recv_i = _recv_j = 0;
- _initialized = true;
-}
-void AuthCrypt::DecryptRecv(uint8 *data, size_t len)
-{
- if (!_initialized) return;
- if (len < CRYPTED_RECV_LEN) return;
-
- for (size_t t = 0; t < CRYPTED_RECV_LEN; t++)
- {
- _recv_i %= _key.size();
- uint8 x = (data[t] - _recv_j) ^ _key[_recv_i];
- ++_recv_i;
- _recv_j = data[t];
- data[t] = x;
- }
}
-void AuthCrypt::EncryptSend(uint8 *data, size_t len)
+void AuthCrypt::Init(BigNumber *K)
{
- if (!_initialized) return;
-
- for (size_t t = 0; t < len; t++)
- {
- _send_i %= _key.size();
- uint8 x = (data[t] ^ _key[_send_i]) + _send_j;
- ++_send_i;
- data[t] = _send_j = x;
- }
-}
+ uint8 ServerEncryptionKey[SEED_KEY_SIZE] = { 0x22, 0xBE, 0xE5, 0xCF, 0xBB, 0x07, 0x64, 0xD9, 0x00, 0x45, 0x1B, 0xD0, 0x24, 0xB8, 0xD5, 0x45 };
+ HmacHash serverEncryptHmac(SEED_KEY_SIZE, (uint8*)ServerEncryptionKey);
+ uint8 *encryptHash = serverEncryptHmac.ComputeHash(K);
-void AuthCrypt::SetKey(BigNumber *bn)
-{
- uint8 *key = new uint8[SHA_DIGEST_LENGTH];
- GenerateKey(key, bn);
- _key.resize(SHA_DIGEST_LENGTH);
- std::copy(key, key + SHA_DIGEST_LENGTH, _key.begin());
- delete[] key;
+ uint8 ServerDecryptionKey[SEED_KEY_SIZE] = { 0xF4, 0x66, 0x31, 0x59, 0xFC, 0x83, 0x6E, 0x31, 0x31, 0x02, 0x51, 0xD5, 0x44, 0x31, 0x67, 0x98 };
+ HmacHash clientDecryptHmac(SEED_KEY_SIZE, (uint8*)ServerDecryptionKey);
+ uint8 *decryptHash = clientDecryptHmac.ComputeHash(K);
+
+ //SARC4 _serverDecrypt(encryptHash);
+ _clientDecrypt.Init(decryptHash);
+ _serverEncrypt.Init(encryptHash);
+ //SARC4 _clientEncrypt(decryptHash);
+
+ uint8 syncBuf[1024];
+
+ memset(syncBuf, 0, 1024);
+
+ _serverEncrypt.UpdateData(1024, syncBuf);
+ //_clientEncrypt.UpdateData(1024, syncBuf);
+
+ memset(syncBuf, 0, 1024);
+
+ //_serverDecrypt.UpdateData(1024, syncBuf);
+ _clientDecrypt.UpdateData(1024, syncBuf);
+
+ _initialized = true;
}
-AuthCrypt::~AuthCrypt()
+void AuthCrypt::DecryptRecv(uint8 *data, size_t len)
{
+ if (!_initialized)
+ return;
+
+ _clientDecrypt.UpdateData(len, data);
}
-void AuthCrypt::GenerateKey(uint8 *key, BigNumber *bn)
+void AuthCrypt::EncryptSend(uint8 *data, size_t len)
{
- HmacHash hash;
- hash.UpdateBigNumber(bn);
- hash.Finalize();
- memcpy(key, hash.GetDigest(), SHA_DIGEST_LENGTH);
+ if (!_initialized)
+ return;
+
+ _serverEncrypt.UpdateData(len, data);
}
diff --git a/src/shared/Auth/AuthCrypt.h b/src/shared/Auth/AuthCrypt.h
index 5c35511ad9f..226fde018ae 100644
--- a/src/shared/Auth/AuthCrypt.h
+++ b/src/shared/Auth/AuthCrypt.h
@@ -22,7 +22,7 @@
#define _AUTHCRYPT_H
#include <Common.h>
-#include <vector>
+#include "SARC4.h"
class BigNumber;
@@ -32,22 +32,15 @@ class AuthCrypt
AuthCrypt();
~AuthCrypt();
- const static size_t CRYPTED_RECV_LEN = 6;
-
- void Init();
-
- void SetKey(BigNumber *);
-
+ void Init(BigNumber *K);
void DecryptRecv(uint8 *, size_t);
void EncryptSend(uint8 *, size_t);
bool IsInitialized() { return _initialized; }
- static void GenerateKey(uint8 *, BigNumber *);
-
private:
- std::vector<uint8> _key;
- uint8 _send_i, _send_j, _recv_i, _recv_j;
+ SARC4 _clientDecrypt;
+ SARC4 _serverEncrypt;
bool _initialized;
};
#endif
diff --git a/src/shared/Auth/CMakeLists.txt b/src/shared/Auth/CMakeLists.txt
index f0714509e1d..536853e560e 100644
--- a/src/shared/Auth/CMakeLists.txt
+++ b/src/shared/Auth/CMakeLists.txt
@@ -12,6 +12,8 @@ SET(trinityauth_STAT_SRCS
Sha1.h
md5.c
md5.h
+ SARC4.cpp
+ SARC4.h
)
add_library(trinityauth STATIC ${trinityauth_STAT_SRCS})
diff --git a/src/shared/Auth/Hmac.cpp b/src/shared/Auth/Hmac.cpp
index a8572f0e9f8..985b4fb9a56 100644
--- a/src/shared/Auth/Hmac.cpp
+++ b/src/shared/Auth/Hmac.cpp
@@ -21,17 +21,16 @@
#include "Auth/Hmac.h"
#include "BigNumber.h"
-HmacHash::HmacHash()
+HmacHash::HmacHash(uint32 len, uint8 *seed)
{
- uint8 temp[SEED_KEY_SIZE] = { 0x38, 0xA7, 0x83, 0x15, 0xF8, 0x92, 0x25, 0x30, 0x71, 0x98, 0x67, 0xB1, 0x8C, 0x4, 0xE2, 0xAA };
- memcpy(&m_key, &temp, SEED_KEY_SIZE);
+ ASSERT(len == SEED_KEY_SIZE);
+
HMAC_CTX_init(&m_ctx);
- HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL);
+ HMAC_Init_ex(&m_ctx, seed, SEED_KEY_SIZE, EVP_sha1(), NULL);
}
HmacHash::~HmacHash()
{
- memset(&m_key, 0x00, SEED_KEY_SIZE);
HMAC_CTX_cleanup(&m_ctx);
}
@@ -45,15 +44,16 @@ void HmacHash::UpdateData(const uint8 *data, int length)
HMAC_Update(&m_ctx, data, length);
}
-void HmacHash::Initialize()
-{
- HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL);
-}
-
void HmacHash::Finalize()
{
uint32 length = 0;
- HMAC_Final(&m_ctx, m_digest, &length);
+ HMAC_Final(&m_ctx, (uint8*)m_digest, &length);
ASSERT(length == SHA_DIGEST_LENGTH)
}
+uint8 *HmacHash::ComputeHash(BigNumber *bn)
+{
+ HMAC_Update(&m_ctx, bn->AsByteArray(), bn->GetNumBytes());
+ Finalize();
+ return (uint8*)m_digest;
+}
diff --git a/src/shared/Auth/Hmac.h b/src/shared/Auth/Hmac.h
index fc80bdca4c4..76a302d68de 100644
--- a/src/shared/Auth/Hmac.h
+++ b/src/shared/Auth/Hmac.h
@@ -32,17 +32,16 @@ class BigNumber;
class HmacHash
{
public:
- HmacHash();
+ HmacHash(uint32 len, uint8 *seed);
~HmacHash();
void UpdateBigNumber(BigNumber *bn);
void UpdateData(const uint8 *data, int length);
- void Initialize();
void Finalize();
- uint8 *GetDigest() { return m_digest; };
- int GetLength() { return SHA_DIGEST_LENGTH; };
+ uint8 *ComputeHash(BigNumber *bn);
+ uint8 *GetDigest() { return (uint8*)m_digest; }
+ int GetLength() { return SHA_DIGEST_LENGTH; }
private:
HMAC_CTX m_ctx;
- uint8 m_key[SEED_KEY_SIZE];
uint8 m_digest[SHA_DIGEST_LENGTH];
};
#endif
diff --git a/src/shared/Auth/Makefile.am b/src/shared/Auth/Makefile.am
index 7398e2f2fa7..bc1a39868f5 100644
--- a/src/shared/Auth/Makefile.am
+++ b/src/shared/Auth/Makefile.am
@@ -35,6 +35,8 @@ libmangosauth_a_SOURCES = \
BigNumber.h \
Hmac.cpp \
Hmac.h \
+ SARC4.cpp \
+ SARC4.h \
Sha1.cpp \
Sha1.h \
md5.c \
diff --git a/src/shared/Auth/SARC4.cpp b/src/shared/Auth/SARC4.cpp
new file mode 100644
index 00000000000..f59bb7f0c53
--- /dev/null
+++ b/src/shared/Auth/SARC4.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "Auth/SARC4.h"
+#include <openssl/sha.h>
+
+SARC4::SARC4()
+{
+ EVP_CIPHER_CTX_init(&m_ctx);
+ EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL);
+ EVP_CIPHER_CTX_set_key_length(&m_ctx, SHA_DIGEST_LENGTH);
+}
+
+SARC4::SARC4(uint8 *seed)
+{
+ EVP_CIPHER_CTX_init(&m_ctx);
+ EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL);
+ EVP_CIPHER_CTX_set_key_length(&m_ctx, SHA_DIGEST_LENGTH);
+ EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL);
+}
+
+SARC4::~SARC4()
+{
+ EVP_CIPHER_CTX_cleanup(&m_ctx);
+}
+
+void SARC4::Init(uint8 *seed)
+{
+ EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL);
+}
+
+void SARC4::UpdateData(int len, uint8 *data)
+{
+ int outlen = 0;
+ EVP_EncryptUpdate(&m_ctx, data, &outlen, data, len);
+ EVP_EncryptFinal_ex(&m_ctx, data, &outlen);
+}
diff --git a/src/shared/Auth/SARC4.h b/src/shared/Auth/SARC4.h
new file mode 100644
index 00000000000..3f15328d6cb
--- /dev/null
+++ b/src/shared/Auth/SARC4.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _AUTH_SARC4_H
+#define _AUTH_SARC4_H
+
+#include "Common.h"
+#include <openssl/evp.h>
+
+class SARC4
+{
+ public:
+ SARC4();
+ SARC4(uint8 *seed);
+ ~SARC4();
+ void Init(uint8 *seed);
+ void UpdateData(int len, uint8 *data);
+ private:
+ EVP_CIPHER_CTX m_ctx;
+};
+#endif
diff --git a/src/shared/Database/SQLStorage.cpp b/src/shared/Database/SQLStorage.cpp
index 61ecaa7412f..50fd484bff5 100644
--- a/src/shared/Database/SQLStorage.cpp
+++ b/src/shared/Database/SQLStorage.cpp
@@ -27,16 +27,16 @@ extern DatabasePostgre WorldDatabase;
extern DatabaseMysql WorldDatabase;
#endif
-const char CreatureInfosrcfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifflliiis";
-const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifflliiii";
+const char CreatureInfosrcfmt[]="iiiiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiiffliiiiiliiis";
+const char CreatureInfodstfmt[]="iiiiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiiffliiiiiliiii";
const char CreatureDataAddonInfofmt[]="iiiiiis";
const char CreatureModelfmt[]="iffbi";
const char CreatureInfoAddonInfofmt[]="iiiiiis";
const char EquipmentInfofmt[]="iiii";
-const char GameObjectInfosrcfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiis";
-const char GameObjectInfodstfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiii";
-const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiisiiii";
-const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiii";
+const char GameObjectInfosrcfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiis";
+const char GameObjectInfodstfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiii";
+const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiisiiii";
+const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiii";
const char PageTextfmt[]="isi";
const char SpellThreatfmt[]="ii";
const char InstanceTemplatesrcfmt[]="iiiiiiffffs";
diff --git a/src/trinityrealm/AuthCodes.h b/src/trinityrealm/AuthCodes.h
index a85415ba849..467f9826676 100644
--- a/src/trinityrealm/AuthCodes.h
+++ b/src/trinityrealm/AuthCodes.h
@@ -67,9 +67,8 @@ enum LoginResult
};
// we need to stick to 1 version or half of the stuff will work for someone
-// others will not and opposite
-// will only support WoW, WoW:TBC and WoW:WotLK 3.0.9 client build 9551...
+// will only support WoW, WoW:TBC and WoW:WotLK 3.1.3 client build 9947...
-#define EXPECTED_TRINITY_CLIENT_BUILD {9551, 0}
+#define EXPECTED_TRINITY_CLIENT_BUILD {9947, 0}
#endif