aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRat <gmstreetrat@gmail.com>2014-12-01 21:09:23 +0100
committerRat <gmstreetrat@gmail.com>2014-12-01 21:09:23 +0100
commitb91ac01bc7b9f9a60b85f7e92b88a8d4c16d350c (patch)
tree752ff4331fa77c4ad907f30c075b930072ca18e8 /src
parente7f3f11ed5d7fec26de2c4fd9f2cb219d8019f9b (diff)
parent05913b82084ed2b640c7e44e7a55bdb7b797ca5c (diff)
Merge branch '6.x' of https://github.com/TrinityCore/TrinityCore into Spells
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp11
-rw-r--r--src/server/game/DataStores/DB2Stores.h2
-rw-r--r--src/server/game/DataStores/DB2Structure.h5
-rw-r--r--src/server/game/DataStores/DBCStores.cpp13
-rw-r--r--src/server/game/DataStores/DBCStores.h2
-rw-r--r--src/server/game/DataStores/DBCStructure.h4
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp10
-rw-r--r--src/server/game/Entities/Creature/Creature.h6
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp2
-rw-r--r--src/server/game/Entities/Item/ItemPrototype.h2
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp17
-rw-r--r--src/server/game/Entities/Player/Player.cpp47
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp210
-rw-r--r--src/server/game/Entities/Unit/Unit.h15
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp39
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp33
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp2
-rw-r--r--src/server/game/Movement/Spline/MovementPacketBuilder.h3
-rw-r--r--src/server/game/Server/Packets/ChatPackets.h14
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h4
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp118
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h132
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h2
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp28
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h18
-rw-r--r--src/server/game/Server/WorldSession.h15
-rw-r--r--src/server/game/Spells/Spell.cpp14
-rw-r--r--src/server/game/Spells/SpellMgr.cpp2
-rw-r--r--src/server/game/Texts/CreatureTextMgr.cpp2
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp2
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp2
-rw-r--r--src/server/scripts/Commands/cs_reset.cpp3
-rw-r--r--src/server/worldserver/worldserver.conf.dist2
33 files changed, 507 insertions, 274 deletions
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 51669deef9d..2d3751ccd9e 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -52,6 +52,7 @@ TaxiMask sAllianceTaxiNodesMask;
TaxiMask sDeathKnightTaxiNodesMask;
TaxiPathSetBySource sTaxiPathSetBySource;
TaxiPathNodesByPath sTaxiPathNodesByPath;
+PhaseGroupContainer sPhasesByGroup;
typedef std::list<std::string> DB2StoreProblemList;
@@ -142,6 +143,11 @@ void LoadDB2Stores(std::string const& dataPath)
LoadDB2(availableDb2Locales, bad_db2_files, sTaxiNodesStore, db2Path, "TaxiNodes.db2");
LoadDB2(availableDb2Locales, bad_db2_files, sTaxiPathStore, db2Path, "TaxiPath.db2");
LoadDB2(availableDb2Locales, bad_db2_files, sTaxiPathNodeStore, db2Path, "TaxiPathNode.db2");
+
+ for (uint32 i = 0; i < sPhaseGroupStore.GetNumRows(); ++i)
+ if (PhaseGroupEntry const* group = sPhaseGroupStore.LookupEntry(i))
+ if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID))
+ sPhasesByGroup[group->PhaseGroupID].insert(phase->ID);
for (uint32 i = 0; i < sItemAppearanceStore.GetNumRows(); ++i)
if (ItemAppearanceEntry const* entry = sItemAppearanceStore.LookupEntry(i))
@@ -277,3 +283,8 @@ uint32 GetItemDisplayID(uint32 appearanceID)
return itr->second;
return 0;
}
+
+std::set<uint32> const& GetPhasesForGroup(uint32 group)
+{
+ return sPhasesByGroup[group];
+}
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 29fe93ce2b1..4294636b138 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -59,4 +59,6 @@ DB2StorageBase const* GetDB2Storage(uint32 type);
uint32 GetItemDisplayID(uint32 appearanceID);
+std::set<uint32> const& GetPhasesForGroup(uint32 group);
+
#endif
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 249f95d80e4..e720017b09d 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -95,7 +95,7 @@ struct ItemSparseEntry
{
uint32 ID; // 0
uint32 Quality; // 1
- uint32 Flags[3]; // 2-4
+ uint32 Flags[MAX_ITEM_PROTO_FLAGS]; // 2-4
float Unk1; // 5
float Unk2; // 6
uint32 BuyCount; // 7
@@ -379,4 +379,5 @@ typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath;
#define TaxiMaskSize 114
typedef uint8 TaxiMask[TaxiMaskSize];
-#endif \ No newline at end of file
+typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer;
+#endif
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index 2f5f3f9159d..cc85b56615b 100644
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -17,7 +17,6 @@
*/
#include "DBCStores.h"
-#include "DB2Stores.h"
#include "Containers.h"
#include "Log.h"
#include "SharedDefines.h"
@@ -238,8 +237,6 @@ DBCStorage <WorldMapOverlayEntry> sWorldMapOverlayStore(WorldMapOverlayEntryfmt)
DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsEntryfmt);
DBCStorage <PhaseEntry> sPhaseStore(PhaseEntryfmt);
-PhaseGroupContainer sPhasesByGroup;
-
typedef std::list<std::string> StoreProblemList;
uint32 DBCFileCount = 0;
@@ -487,11 +484,6 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales, bad_dbc_files, sPhaseStore, dbcPath, "Phase.dbc"); // 19116
- for (uint32 i = 0; i < sPhaseGroupStore.GetNumRows(); ++i)
- if (PhaseGroupEntry const* group = sPhaseGroupStore.LookupEntry(i))
- if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID))
- sPhasesByGroup[group->PhaseGroupID].insert(phase->ID);
-
LoadDBC(availableDbcLocales, bad_dbc_files, sPowerDisplayStore, dbcPath, "PowerDisplay.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sPvPDifficultyStore, dbcPath, "PvpDifficulty.dbc");//19116
@@ -1214,11 +1206,6 @@ SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, u
return NULL;
}
-std::set<uint32> const& GetPhasesForGroup(uint32 group)
-{
- return sPhasesByGroup[group];
-}
-
uint32 GetClassBySkillId(uint32 skillId)
{
ClassBySkillIdStore::const_iterator iter = sClassBySkillIdStore.find(skillId);
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index a631a471eb4..a6ecadfaf45 100644
--- a/src/server/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
@@ -89,8 +89,6 @@ LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty);
uint32 GetDefaultMapLight(uint32 mapId);
-std::set<uint32> const& GetPhasesForGroup(uint32 group);
-
typedef std::unordered_multimap<uint32, SkillRaceClassInfoEntry const*> SkillRaceClassInfoMap;
typedef std::pair<SkillRaceClassInfoMap::iterator, SkillRaceClassInfoMap::iterator> SkillRaceClassInfoBounds;
SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_);
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index 4a58428abb1..ee168f2349f 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -647,7 +647,7 @@ struct BarberShopStyleEntry
struct BattlemasterListEntry
{
uint32 ID; // 0
- uint32 MapID[16]; // 1-16 mapid
+ int32 MapID[16]; // 1-16 mapid
uint32 InstanceType; // 17 map type (3 - BG, 4 - arena)
//uint32 GroupsAllowed; // 18 (0 or 1)
char* Name_lang; // 19
@@ -2384,6 +2384,4 @@ struct MapDifficulty
};
typedef std::map<uint32, uint32> TalentSpellPosMap;
-
-typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer;
#endif
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 05405d6eddb..3cbe4057106 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -298,10 +298,10 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/)
m_creatureInfo = cinfo; // map mode related always
// equal to player Race field, but creature does not have race
- SetByteValue(UNIT_FIELD_BYTES_0, 0, 0);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE, 0);
// known valid are: CLASS_WARRIOR, CLASS_PALADIN, CLASS_ROGUE, CLASS_MAGE
- SetByteValue(UNIT_FIELD_BYTES_0, 1, uint8(cinfo->unit_class));
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, uint8(cinfo->unit_class));
// Cancel load if no model defined
if (!(cinfo->GetFirstValidModelId()))
@@ -320,7 +320,7 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/)
SetDisplayId(displayID);
SetNativeDisplayId(displayID);
- SetByteValue(UNIT_FIELD_BYTES_0, 2, minfo->gender);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, minfo->gender);
// Load creature equipment
if (!data || data->equipmentId == 0)
@@ -805,7 +805,7 @@ bool Creature::Create(ObjectGuid::LowType guidlow, Map* map, uint32 /*phaseMask*
{
SetDisplayId(displayID);
SetNativeDisplayId(displayID);
- SetByteValue(UNIT_FIELD_BYTES_0, 2, minfo->gender);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, minfo->gender);
}
LastUsedScriptID = GetCreatureTemplate()->ScriptID;
@@ -1560,7 +1560,7 @@ void Creature::Respawn(bool force)
{
SetDisplayId(displayID);
SetNativeDisplayId(displayID);
- SetByteValue(UNIT_FIELD_BYTES_0, 2, minfo->gender);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, minfo->gender);
}
GetMotionMaster()->InitDefault();
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 523a2eb2f4d..e9212b50933 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -88,9 +88,9 @@ struct CreatureTemplate
std::string SubName;
std::string IconName;
uint32 GossipMenuId;
- uint8 minlevel;
- uint8 maxlevel;
- uint32 expansion;
+ int16 minlevel;
+ int16 maxlevel;
+ int32 expansion;
uint32 expansionUnknown; // either 0 or 3, sent to the client / wdb
uint32 faction;
uint32 npcflag;
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 7091901c229..382bf45052b 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2150,7 +2150,7 @@ void GameObject::SetTransportState(GOState state, uint32 stopFrame /*= 0*/)
}
else
{
- ASSERT(state < GO_STATE_TRANSPORT_STOPPED + MAX_GO_STATE_TRANSPORT_STOP_FRAMES);
+ ASSERT(state < GOState(GO_STATE_TRANSPORT_STOPPED + MAX_GO_STATE_TRANSPORT_STOP_FRAMES));
ASSERT(stopFrame < m_goValue.Transport.StopFrames->size());
m_goValue.Transport.PathProgress = getMSTime() + m_goValue.Transport.StopFrames->at(stopFrame);
SetGoState(GOState(GO_STATE_TRANSPORT_STOPPED + stopFrame));
diff --git a/src/server/game/Entities/Item/ItemPrototype.h b/src/server/game/Entities/Item/ItemPrototype.h
index fe6051b4f9c..3846f7dd642 100644
--- a/src/server/game/Entities/Item/ItemPrototype.h
+++ b/src/server/game/Entities/Item/ItemPrototype.h
@@ -598,7 +598,7 @@ struct ItemEffect
{
uint32 SpellID;
uint32 Trigger;
- uint32 Charges;
+ int32 Charges;
int32 Cooldown;
uint32 Category;
int32 CategoryCooldown;
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index 52045f46472..bc08e8b1baf 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -214,18 +214,15 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c
{
case SUMMON_PET:
petlevel = owner->getLevel();
-
- SetUInt32Value(UNIT_FIELD_BYTES_0, 0x800); // class = mage
- SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
- // this enables popup window (pet dismiss, cancel)
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, CLASS_MAGE);
+ SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); // this enables popup window (pet dismiss, cancel)
break;
case HUNTER_PET:
- SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100); // class = warrior, gender = none, power = focus
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, CLASS_WARRIOR);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, GENDER_NONE);
SetSheath(SHEATH_STATE_MELEE);
SetByteFlag(UNIT_FIELD_BYTES_2, 2, fields[9].GetBool() ? UNIT_CAN_BE_ABANDONED : UNIT_CAN_BE_RENAMED | UNIT_CAN_BE_ABANDONED);
-
- SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
- // this enables popup window (pet abandon, cancel)
+ SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); // this enables popup window (pet abandon, cancel)
setPowerType(POWER_FOCUS);
break;
default:
@@ -782,7 +779,9 @@ bool Pet::CreateBaseAtTamed(CreatureTemplate const* cinfo, Map* map, uint32 phas
if (cinfo->type == CREATURE_TYPE_BEAST)
{
- SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, CLASS_WARRIOR);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, GENDER_NONE);
+ SetUInt32Value(UNIT_FIELD_DISPLAY_POWER, POWER_FOCUS);
SetSheath(SHEATH_STATE_MELEE);
SetByteFlag(UNIT_FIELD_BYTES_2, 2, UNIT_CAN_BE_RENAMED | UNIT_CAN_BE_ABANDONED);
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 7c7f0bb976e..52fb39993d2 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -985,9 +985,10 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
return false;
}
- uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Sex << 16);
-
- SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24)));
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE, createInfo->Race);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, createInfo->Class);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, createInfo->Sex);
+ SetUInt32Value(UNIT_FIELD_DISPLAY_POWER, powertype);
InitDisplayIds();
if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP)
{
@@ -4896,7 +4897,7 @@ void Player::CreateCorpse()
// prevent existence 2 corpse for player
SpawnCorpseBones();
- uint32 _uf, _pb, _pb2, _cfb1, _cfb2;
+ uint32 _pb, _pb2, _cfb1, _cfb2;
Corpse* corpse = new Corpse((m_ExtraFlags & PLAYER_EXTRA_PVP_DEATH) ? CORPSE_RESURRECTABLE_PVP : CORPSE_RESURRECTABLE_PVE);
SetPvPDeath(false);
@@ -4907,18 +4908,16 @@ void Player::CreateCorpse()
return;
}
- _uf = GetUInt32Value(UNIT_FIELD_BYTES_0);
_pb = GetUInt32Value(PLAYER_BYTES);
_pb2 = GetUInt32Value(PLAYER_BYTES_2);
- uint8 race = (uint8)(_uf);
uint8 skin = (uint8)(_pb);
uint8 face = (uint8)(_pb >> 8);
uint8 hairstyle = (uint8)(_pb >> 16);
uint8 haircolor = (uint8)(_pb >> 24);
uint8 facialhair = (uint8)(_pb2);
- _cfb1 = ((0x00) | (race << 8) | (getGender() << 16) | (skin << 24));
+ _cfb1 = ((0x00) | (getRace() << 8) | (getGender() << 16) | (skin << 24));
_cfb2 = ((face) | (hairstyle << 8) | (haircolor << 16) | (facialhair << 24));
corpse->SetUInt32Value(CORPSE_FIELD_BYTES_1, _cfb1);
@@ -9516,6 +9515,16 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
data << uint32(4131) << uint32(0); // 10 WORLDSTATE_ALGALON_DESPAWN_TIMER
}
break;
+ // Halls of Refection
+ case 4820:
+ if (instance && mapid == 668)
+ instance->FillInitialWorldStates(data);
+ else
+ {
+ data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED
+ data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT
+ }
+ break;
// Zul Aman
case 3805:
if (instance && mapid == 568)
@@ -9550,20 +9559,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
// Wintergrasp
case 4197:
if (bf && bf->GetTypeId() == BATTLEFIELD_WG)
- {
bf->FillInitialWorldStates(data);
- break;
- }
- // Halls of Refection
- case 4820:
- if (instance && mapid == 668)
- instance->FillInitialWorldStates(data);
- else
- {
- data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED
- data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT
- }
- break;
// No break here, intended.
default:
data << uint32(0x914) << uint32(0x0); // 7
@@ -16950,12 +16946,9 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
return false;
}
- // overwrite some data fields
- uint32 bytes0 = 0;
- bytes0 |= fields[3].GetUInt8(); // race
- bytes0 |= fields[4].GetUInt8() << 8; // class
- bytes0 |= gender << 16; // gender
- SetUInt32Value(UNIT_FIELD_BYTES_0, bytes0);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE, fields[3].GetUInt8());
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, fields[4].GetUInt8());
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, gender);
// check if race/class combination is valid
PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
@@ -26795,7 +26788,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy
case SUMMON_PET:
// this enables pet details window (Shift+P)
pet->GetCharmInfo()->SetPetNumber(pet_number, true);
- pet->SetUInt32Value(UNIT_FIELD_BYTES_0, 2048);
+ pet->SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, CLASS_MAGE);
pet->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0);
pet->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, 1000);
pet->SetFullHealth();
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 21360909108..5fbc6e7632c 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -7027,7 +7027,7 @@ void Unit::setPowerType(Powers new_powertype)
if (getPowerType() == new_powertype)
return;
- SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
+ SetUInt32Value(UNIT_FIELD_DISPLAY_POWER, new_powertype);
if (GetTypeId() == TYPEID_PLAYER)
{
@@ -10578,6 +10578,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
propagateSpeedChange();
+ // Spline packets are for creatures and move_update are for players
static OpcodeServer const moveTypeToOpcode[MAX_MOVE_TYPE][3] =
{
{SMSG_SPLINE_MOVE_SET_WALK_SPEED, SMSG_MOVE_SET_WALK_SPEED, SMSG_MOVE_UPDATE_WALK_SPEED },
@@ -10604,16 +10605,22 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER)
{
- /// @todo fix SMSG_MOVE_SET packets (were they removed?)
- //_selfOpcode = playerControl;
- WorldPackets::Movement::MoveUpdate packet(moveTypeToOpcode[mtype][2]);
- packet.movementInfo = m_movementInfo;
+ // Send notification to self
+ WorldPackets::Movement::MoveSetSpeed selfpacket(moveTypeToOpcode[mtype][1]);
+ selfpacket.MoverGUID = GetGUID();
+ selfpacket.SequenceIndex = m_movementCounter++;
+ selfpacket.Speed = rate;
+ ToPlayer()->GetSession()->SendPacket(selfpacket.Write());
+
+ // Send notification to other players
+ WorldPackets::Movement::MoveUpdateSpeed packet(moveTypeToOpcode[mtype][2]);
+ packet.movementInfo = &m_movementInfo;
packet.Speed = rate;
SendMessageToSet(packet.Write(), false);
}
else
{
- WorldPackets::Movement::MoveSplineSet packet(moveTypeToOpcode[mtype][0]);
+ WorldPackets::Movement::MoveSplineSetSpeed packet(moveTypeToOpcode[mtype][0]);
packet.MoverGUID = GetGUID();
packet.Speed = rate;
SendMessageToSet(packet.Write(), true);
@@ -14138,7 +14145,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au
if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
{
// to prevent client crash
- SetByteValue(UNIT_FIELD_BYTES_0, 1, (uint8)CLASS_MAGE);
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, (uint8)CLASS_MAGE);
// just to enable stat window
if (GetCharmInfo())
@@ -14240,7 +14247,7 @@ void Unit::RemoveCharmedBy(Unit* charmer)
CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate();
if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
{
- SetByteValue(UNIT_FIELD_BYTES_0, 1, uint8(cinfo->unit_class));
+ SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS, uint8(cinfo->unit_class));
if (GetCharmInfo())
GetCharmInfo()->SetPetNumber(0, true);
else
@@ -15665,61 +15672,26 @@ void Unit::SendTeleportPacket(Position& pos)
ObjectGuid guid = GetGUID();
ObjectGuid transGuid = GetTransGUID();
- WorldPacket data(SMSG_MOVE_UPDATE_TELEPORT, 38);
- WriteMovementInfo(data);
+ WorldPackets::Movement::MoveUpdateTeleport packet;
+ packet.movementInfo = &m_movementInfo;
if (GetTypeId() == TYPEID_PLAYER)
{
- WorldPacket data2(SMSG_MOVE_TELEPORT, 38);
- data2.WriteBit(guid[6]);
- data2.WriteBit(guid[0]);
- data2.WriteBit(guid[3]);
- data2.WriteBit(guid[2]);
- data2.WriteBit(0); // unknown
- data2.WriteBit(!transGuid.IsEmpty());
- data2.WriteBit(guid[1]);
+ WorldPackets::Movement::MoveTeleport selfPacket;
+
+ selfPacket.MoverGUID = guid;
+
if (!transGuid.IsEmpty())
{
- data2.WriteBit(transGuid[1]);
- data2.WriteBit(transGuid[3]);
- data2.WriteBit(transGuid[2]);
- data2.WriteBit(transGuid[5]);
- data2.WriteBit(transGuid[0]);
- data2.WriteBit(transGuid[7]);
- data2.WriteBit(transGuid[6]);
- data2.WriteBit(transGuid[4]);
+ selfPacket.TransportGUID.Value = transGuid;
+ selfPacket.TransportGUID.HasValue = true;
}
- data2.WriteBit(guid[4]);
- data2.WriteBit(guid[7]);
- data2.WriteBit(guid[5]);
- data2.FlushBits();
- if (!transGuid.IsEmpty())
- {
- data2.WriteByteSeq(transGuid[6]);
- data2.WriteByteSeq(transGuid[5]);
- data2.WriteByteSeq(transGuid[1]);
- data2.WriteByteSeq(transGuid[7]);
- data2.WriteByteSeq(transGuid[0]);
- data2.WriteByteSeq(transGuid[2]);
- data2.WriteByteSeq(transGuid[4]);
- data2.WriteByteSeq(transGuid[3]);
- }
-
- data2 << uint32(0); // counter
- data2.WriteByteSeq(guid[1]);
- data2.WriteByteSeq(guid[2]);
- data2.WriteByteSeq(guid[3]);
- data2.WriteByteSeq(guid[5]);
- data2 << float(GetPositionX());
- data2.WriteByteSeq(guid[4]);
- data2 << float(GetOrientation());
- data2.WriteByteSeq(guid[7]);
- data2 << float(GetPositionZMinusOffset());
- data2.WriteByteSeq(guid[0]);
- data2.WriteByteSeq(guid[6]);
- data2 << float(GetPositionY());
- ToPlayer()->SendDirectMessage(&data2); // Send the MSG_MOVE_TELEPORT packet to self.
+ selfPacket.Pos.Relocate(GetPositionX(), GetPositionY(), GetPositionZMinusOffset());
+ selfPacket.Facing = GetOrientation();
+ selfPacket.SequenceIndex = m_movementCounter++;
+
+ ToPlayer()->SendDirectMessage(selfPacket.Write());
}
// Relocate the player/creature to its old position, so we can broadcast to nearby players correctly
@@ -15729,7 +15701,7 @@ void Unit::SendTeleportPacket(Position& pos)
Relocate(&oldPos);
// Broadcast the packet to everyone except self.
- SendMessageToSet(&data, false);
+ SendMessageToSet(packet.Write(), false);
}
bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool teleport)
@@ -16122,10 +16094,27 @@ bool Unit::SetDisableGravity(bool disable, bool packetOnly /*= false*/)
}
}
- if (disable)
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_GRAVITY_DISABLE, SMSG_MOVE_GRAVITY_DISABLE).Send();
+ static OpcodeServer const gravityOpcodeTable[2][2] =
+ {
+ {SMSG_SPLINE_MOVE_GRAVITY_ENABLE, SMSG_MOVE_GRAVITY_ENABLE },
+ {SMSG_SPLINE_MOVE_GRAVITY_DISABLE, SMSG_MOVE_GRAVITY_DISABLE }
+ };
+
+ bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
+
+ if (player)
+ {
+ WorldPackets::Movement::MoveSetFlag packet(gravityOpcodeTable[disable][1]);
+ packet.MoverGUID = GetGUID();
+ packet.SequenceIndex = m_movementCounter++;
+ SendMessageToSet(packet.Write(), true);
+ }
else
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_GRAVITY_ENABLE, SMSG_MOVE_GRAVITY_ENABLE).Send();
+ {
+ WorldPackets::Movement::MoveSplineSetFlag packet(gravityOpcodeTable[disable][0]);
+ packet.MoverGUID = GetGUID();
+ SendMessageToSet(packet.Write(), true);
+ }
return true;
}
@@ -16156,10 +16145,11 @@ bool Unit::SetSwim(bool enable)
else
RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
- if (enable)
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_START_SWIM, static_cast<OpcodeServer>(NULL_OPCODE)).Send();
- else
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_STOP_SWIM, static_cast<OpcodeServer>(NULL_OPCODE)).Send();
+ static OpcodeServer const swimOpcodeTable[2] = {SMSG_SPLINE_MOVE_STOP_SWIM, SMSG_SPLINE_MOVE_START_SWIM};
+
+ WorldPackets::Movement::MoveSplineSetFlag packet(swimOpcodeTable[enable]);
+ packet.MoverGUID = GetGUID();
+ SendMessageToSet(packet.Write(), true);
return true;
}
@@ -16182,10 +16172,27 @@ bool Unit::SetCanFly(bool enable)
SetFall(true);
}
- if (enable)
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_FLYING, SMSG_MOVE_SET_CAN_FLY).Send();
+ static OpcodeServer const flyOpcodeTable[2][2] =
+ {
+ {SMSG_SPLINE_MOVE_UNSET_FLYING, SMSG_MOVE_UNSET_CAN_FLY },
+ {SMSG_SPLINE_MOVE_SET_FLYING, SMSG_MOVE_SET_CAN_FLY }
+ };
+
+ bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
+
+ if (player)
+ {
+ WorldPackets::Movement::MoveSetFlag packet(flyOpcodeTable[enable][1]);
+ packet.MoverGUID = GetGUID();
+ packet.SequenceIndex = m_movementCounter++;
+ SendMessageToSet(packet.Write(), true);
+ }
else
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_UNSET_FLYING, SMSG_MOVE_UNSET_CAN_FLY).Send();
+ {
+ WorldPackets::Movement::MoveSplineSetFlag packet(flyOpcodeTable[enable][0]);
+ packet.MoverGUID = GetGUID();
+ SendMessageToSet(packet.Write(), true);
+ }
return true;
}
@@ -16203,10 +16210,27 @@ bool Unit::SetWaterWalking(bool enable, bool packetOnly /*= false */)
RemoveUnitMovementFlag(MOVEMENTFLAG_WATERWALKING);
}
- if (enable)
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_WATER_WALK, SMSG_MOVE_WATER_WALK).Send();
+ static OpcodeServer const waterWalkingOpcodeTable[2][2] =
+ {
+ {SMSG_SPLINE_MOVE_SET_LAND_WALK, SMSG_MOVE_LAND_WALK },
+ {SMSG_SPLINE_MOVE_SET_WATER_WALK, SMSG_MOVE_WATER_WALK}
+ };
+
+ bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
+
+ if (player)
+ {
+ WorldPackets::Movement::MoveSetFlag packet(waterWalkingOpcodeTable[enable][1]);
+ packet.MoverGUID = GetGUID();
+ packet.SequenceIndex = m_movementCounter++;
+ SendMessageToSet(packet.Write(), true);
+ }
else
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_LAND_WALK, SMSG_MOVE_LAND_WALK).Send();
+ {
+ WorldPackets::Movement::MoveSplineSetFlag packet(waterWalkingOpcodeTable[enable][0]);
+ packet.MoverGUID = GetGUID();
+ SendMessageToSet(packet.Write(), true);
+ }
return true;
}
@@ -16224,10 +16248,27 @@ bool Unit::SetFeatherFall(bool enable, bool packetOnly /*= false */)
RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING_SLOW);
}
- if (enable)
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_FEATHER_FALL, SMSG_MOVE_FEATHER_FALL).Send();
+ static OpcodeServer const featherFallOpcodeTable[2][2] =
+ {
+ {SMSG_SPLINE_MOVE_SET_NORMAL_FALL, SMSG_MOVE_NORMAL_FALL },
+ {SMSG_SPLINE_MOVE_SET_FEATHER_FALL, SMSG_MOVE_FEATHER_FALL }
+ };
+
+ bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
+
+ if (player)
+ {
+ WorldPackets::Movement::MoveSetFlag packet(featherFallOpcodeTable[enable][1]);
+ packet.MoverGUID = GetGUID();
+ packet.SequenceIndex = m_movementCounter++;
+ SendMessageToSet(packet.Write(), true);
+ }
else
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_NORMAL_FALL, SMSG_MOVE_NORMAL_FALL).Send();
+ {
+ WorldPackets::Movement::MoveSplineSetFlag packet(featherFallOpcodeTable[enable][0]);
+ packet.MoverGUID = GetGUID();
+ SendMessageToSet(packet.Write(), true);
+ }
return true;
}
@@ -16260,10 +16301,27 @@ bool Unit::SetHover(bool enable, bool packetOnly /*= false*/)
}
}
- if (enable)
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_HOVER, SMSG_MOVE_SET_HOVER).Send();
+ static OpcodeServer const hoverOpcodeTable[2][2] =
+ {
+ {SMSG_SPLINE_MOVE_UNSET_HOVER, SMSG_MOVE_UNSET_HOVER },
+ {SMSG_SPLINE_MOVE_SET_HOVER, SMSG_MOVE_SET_HOVER }
+ };
+
+ bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
+
+ if (player)
+ {
+ WorldPackets::Movement::MoveSetFlag packet(hoverOpcodeTable[enable][1]);
+ packet.MoverGUID = GetGUID();
+ packet.SequenceIndex = m_movementCounter++;
+ SendMessageToSet(packet.Write(), true);
+ }
else
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_UNSET_HOVER, SMSG_MOVE_UNSET_HOVER).Send();
+ {
+ WorldPackets::Movement::MoveSplineSetFlag packet(hoverOpcodeTable[enable][0]);
+ packet.MoverGUID = GetGUID();
+ SendMessageToSet(packet.Write(), true);
+ }
return true;
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 120eef7ae51..95dfcc431f9 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -221,6 +221,13 @@ enum UnitStandFlags
UNIT_STAND_FLAGS_ALL = 0xFF
};
+enum UnitBytes0Offsets
+{
+ UNIT_BYTES_0_OFFSET_RACE = 0,
+ UNIT_BYTES_0_OFFSET_CLASS = 1,
+ UNIT_BYTES_0_OFFSET_GENDER = 3,
+};
+
// byte flags value (UNIT_FIELD_BYTES_1, 3)
enum UnitBytes1_Flags
{
@@ -1403,11 +1410,11 @@ class Unit : public WorldObject
uint8 getLevel() const { return uint8(GetUInt32Value(UNIT_FIELD_LEVEL)); }
uint8 getLevelForTarget(WorldObject const* /*target*/) const override { return getLevel(); }
void SetLevel(uint8 lvl);
- uint8 getRace() const { return GetByteValue(UNIT_FIELD_BYTES_0, 0); }
+ uint8 getRace() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_RACE); }
uint32 getRaceMask() const { return 1 << (getRace()-1); }
- uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
+ uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_CLASS); }
uint32 getClassMask() const { return 1 << (getClass()-1); }
- uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, 2); }
+ uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER); }
float GetStat(Stats stat) const { return float(GetUInt32Value(UNIT_FIELD_STAT+stat)); }
void SetStat(Stats stat, int32 val) { SetStatInt32Value(UNIT_FIELD_STAT+stat, val); }
@@ -1436,7 +1443,7 @@ class Unit : public WorldObject
int32 ModifyHealth(int32 val);
int32 GetHealthGain(int32 dVal);
- Powers getPowerType() const { return Powers(GetByteValue(UNIT_FIELD_BYTES_0, 3)); }
+ Powers getPowerType() const { return Powers(GetUInt32Value(UNIT_FIELD_DISPLAY_POWER)); }
void setPowerType(Powers power);
int32 GetPower(Powers power) const;
int32 GetMinPower(Powers power) const { return power == POWER_ECLIPSE ? -100 : 0; }
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 040c9600852..4858800b3d2 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -482,8 +482,8 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields)
creatureTemplate.SubName = fields[12].GetString();
creatureTemplate.IconName = fields[13].GetString();
creatureTemplate.GossipMenuId = fields[14].GetUInt32();
- creatureTemplate.minlevel = fields[15].GetUInt8();
- creatureTemplate.maxlevel = fields[16].GetUInt8();
+ creatureTemplate.minlevel = fields[15].GetInt16();
+ creatureTemplate.maxlevel = fields[16].GetInt16();
creatureTemplate.expansion = uint32(fields[17].GetInt16());
creatureTemplate.expansionUnknown = uint32(fields[18].GetUInt16());
creatureTemplate.faction = uint32(fields[19].GetUInt16());
@@ -674,18 +674,6 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
cInfo->Entry, cInfo->expansion, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->expansion);
}
- if (cInfo->minlevel > difficultyInfo->minlevel)
- {
- TC_LOG_ERROR("sql.sql", "Creature (Entry: %u, minlevel %u) has lower `minlevel` in difficulty %u mode (Entry: %u, minlevel %u).",
- cInfo->Entry, cInfo->minlevel, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->minlevel);
- }
-
- if (cInfo->maxlevel > difficultyInfo->maxlevel)
- {
- TC_LOG_ERROR("sql.sql", "Creature (Entry: %u, maxlevel %u) has lower `maxlevel` in difficulty %u mode (Entry: %u, maxlevel %u).",
- cInfo->Entry, cInfo->maxlevel, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->maxlevel);
- }
-
if (cInfo->faction != difficultyInfo->faction)
{
TC_LOG_ERROR("sql.sql", "Creature (Entry: %u, faction %u) has different `faction` in difficulty %u mode (Entry: %u, faction %u).",
@@ -983,6 +971,27 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
const_cast<CreatureTemplate*>(cInfo)->flags_extra &= CREATURE_FLAG_EXTRA_DB_ALLOWED;
}
+ // -1 is used in the client for auto-updating the levels
+ // having their expansion set to it to the latest one
+ if (cInfo->expansion == -1)
+ {
+ const_cast<CreatureTemplate*>(cInfo)->minlevel = (MAX_LEVEL + cInfo->minlevel);
+ const_cast<CreatureTemplate*>(cInfo)->maxlevel = (MAX_LEVEL + cInfo->maxlevel);
+ const_cast<CreatureTemplate*>(cInfo)->expansion = EXPANSION_WARLORDS_OF_DRAENOR;
+ }
+
+ if (cInfo->minlevel < 1 || cInfo->minlevel > STRONG_MAX_LEVEL)
+ {
+ TC_LOG_ERROR("sql.sql", "Creature (ID: %u): MinLevel %i is not within [1, 255], value has been set to 1.", cInfo->Entry, cInfo->minlevel);
+ const_cast<CreatureTemplate*>(cInfo)->minlevel = 1;
+ }
+
+ if (cInfo->maxlevel < 1 || cInfo->maxlevel > STRONG_MAX_LEVEL)
+ {
+ TC_LOG_ERROR("sql.sql", "Creature (ID: %u): MaxLevel %i is not within [1, 255], value has been set to 1.", cInfo->Entry, cInfo->maxlevel);
+ const_cast<CreatureTemplate*>(cInfo)->maxlevel = 1;
+ }
+
const_cast<CreatureTemplate*>(cInfo)->ModDamage *= Creature::_GetDamageMod(cInfo->rank);
}
@@ -9361,4 +9370,4 @@ std::string ObjectMgr::GetRealmName(uint32 realm) const
{
RealmNameContainer::const_iterator iter = _realmNameStore.find(realm);
return iter != _realmNameStore.end() ? iter->second : "";
-} \ No newline at end of file
+}
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 1ccd7294cc8..096eaac26fa 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -197,41 +197,16 @@ void WorldSession::HandleMoveWorldportAckOpcode()
GetPlayer()->ProcessDelayedOperations();
}
-void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket)
+void WorldSession::HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet)
{
- TC_LOG_DEBUG("network", "MSG_MOVE_TELEPORT_ACK");
-
- ObjectGuid guid;
- uint32 flags, time;
- recvPacket >> flags >> time;
-
- guid[5] = recvPacket.ReadBit();
- guid[0] = recvPacket.ReadBit();
- guid[1] = recvPacket.ReadBit();
- guid[6] = recvPacket.ReadBit();
- guid[3] = recvPacket.ReadBit();
- guid[7] = recvPacket.ReadBit();
- guid[2] = recvPacket.ReadBit();
- guid[4] = recvPacket.ReadBit();
-
- recvPacket.ReadByteSeq(guid[4]);
- recvPacket.ReadByteSeq(guid[2]);
- recvPacket.ReadByteSeq(guid[7]);
- recvPacket.ReadByteSeq(guid[6]);
- recvPacket.ReadByteSeq(guid[5]);
- recvPacket.ReadByteSeq(guid[1]);
- recvPacket.ReadByteSeq(guid[3]);
- recvPacket.ReadByteSeq(guid[0]);
-
- TC_LOG_DEBUG("network", "%s ", guid.ToString().c_str());
- TC_LOG_DEBUG("network", "Flags %u, time %u", flags, time/IN_MILLISECONDS);
+ TC_LOG_DEBUG("network", "CMSG_MOVE_TELEPORT_ACK: Guid: %s, Sequence: %u, Time: %u", packet.MoverGUID.ToString().c_str(), packet.AckIndex, packet.MoveTime);
Player* plMover = _player->m_mover->ToPlayer();
if (!plMover || !plMover->IsBeingTeleportedNear())
return;
- if (guid != plMover->GetGUID())
+ if (packet.MoverGUID != plMover->GetGUID())
return;
plMover->SetSemaphoreTeleportNear(false);
@@ -384,7 +359,7 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov
mover->UpdatePosition(movementInfo.pos);
WorldPackets::Movement::ServerPlayerMovement playerMovement;
- playerMovement.mover = mover;
+ playerMovement.movementInfo = &mover->m_movementInfo;
mover->SendMessageToSet(const_cast<WorldPacket*>(playerMovement.Write()), _player);
if (plrMover) // nothing is charmed, or player charmed
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 12a8c6320fa..3ca660dccd1 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -153,7 +153,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
if (pUser->IsInCombat())
{
- for (int i = 0; i < proto->Effects.size(); ++i)
+ for (uint32 i = 0; i < proto->Effects.size(); ++i)
{
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(proto->Effects[i].SpellID))
{
diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.h b/src/server/game/Movement/Spline/MovementPacketBuilder.h
index 83172b2c3e0..720c0b3b244 100644
--- a/src/server/game/Movement/Spline/MovementPacketBuilder.h
+++ b/src/server/game/Movement/Spline/MovementPacketBuilder.h
@@ -33,11 +33,8 @@ namespace Movement
class MoveSpline;
class PacketBuilder
{
- static void WriteCommonMonsterMovePart(const MoveSpline& mov, WorldPacket& data);
public:
-
static void WriteMonsterMove(const MoveSpline& mov, WorldPackets::Movement::MovementMonsterSpline& movementMonsterSpline);
- static void WriteStopMovement(Vector3 const& loc, uint32 splineId, ByteBuffer& data);
static void WriteCreate(MoveSpline const& moveSpline, ByteBuffer& data);
};
}
diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h
index 3d65bb04c54..9cdc534528f 100644
--- a/src/server/game/Server/Packets/ChatPackets.h
+++ b/src/server/game/Server/Packets/ChatPackets.h
@@ -143,8 +143,8 @@ namespace WorldPackets
ObjectGuid SenderAccountGUID;
ObjectGuid TargetGUID;
ObjectGuid PartyGUID;
- uint32 SenderVirtualAddress;
- uint32 TargetVirtualAddress;
+ uint32 SenderVirtualAddress = 0;
+ uint32 TargetVirtualAddress = 0;
std::string SenderName;
std::string TargetName;
std::string Prefix;
@@ -165,7 +165,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
ObjectGuid Guid;
- int32 EmoteID;
+ int32 EmoteID = 0;
};
class CTextEmote final : public ClientPacket
@@ -176,8 +176,8 @@ namespace WorldPackets
void Read() override;
ObjectGuid Target;
- int32 EmoteID;
- int32 SoundIndex;
+ int32 EmoteID = 0;
+ int32 SoundIndex = -1;
};
class STextEmote final : public ServerPacket
@@ -190,8 +190,8 @@ namespace WorldPackets
ObjectGuid SourceGUID;
ObjectGuid SourceAccountGUID;
ObjectGuid TargetGUID;
- int32 SoundIndex;
- int32 EmoteID;
+ int32 SoundIndex = -1;
+ int32 EmoteID = 0;
};
}
}
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index cb87bc0c586..72e2a02fbe2 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -31,8 +31,8 @@ namespace WorldPackets
WorldPacket const* Write() override;
- uint32 ProficiencyMask;
- uint8 ProficiencyClass;
+ uint32 ProficiencyMask = 0;
+ uint8 ProficiencyClass = 0;
};
struct ItemBonusInstanceData
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index 972a52dc41c..0c4d4bcff40 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -263,25 +263,44 @@ WorldPacket const* WorldPackets::Movement::MonsterMove::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Movement::MoveSplineSet::Write()
+WorldPacket const* WorldPackets::Movement::MoveSplineSetSpeed::Write()
{
_worldPacket << MoverGUID;
_worldPacket << Speed;
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Movement::MoveUpdate::Write()
+WorldPacket const* WorldPackets::Movement::MoveSetSpeed::Write()
{
- _worldPacket << movementInfo;
+ _worldPacket << MoverGUID;
+ _worldPacket << SequenceIndex;
_worldPacket << Speed;
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Movement::ServerPlayerMovement::Write()
+WorldPacket const* WorldPackets::Movement::MoveUpdateSpeed::Write()
+{
+ _worldPacket << *movementInfo;
+ _worldPacket << Speed;
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Movement::MoveSplineSetFlag::Write()
{
- MovementInfo movementInfo = mover->m_movementInfo;
+ _worldPacket << MoverGUID;
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Movement::MoveSetFlag::Write()
+{
+ _worldPacket << MoverGUID;
+ _worldPacket << SequenceIndex;
+ return &_worldPacket;
+}
- _worldPacket << movementInfo;
+WorldPacket const* WorldPackets::Movement::ServerPlayerMovement::Write()
+{
+ _worldPacket << *movementInfo;
return &_worldPacket;
}
@@ -321,3 +340,90 @@ WorldPacket const* WorldPackets::Movement::NewWorld::Write()
_worldPacket << Reason;
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Movement::MoveTeleport::Write()
+{
+ _worldPacket << MoverGUID;
+ _worldPacket << SequenceIndex;
+ _worldPacket << Pos.PositionXYZOStream();
+ _worldPacket << Facing;
+
+ _worldPacket.WriteBit(TransportGUID.HasValue);
+ _worldPacket.WriteBit(Vehicle.HasValue);
+ _worldPacket.FlushBits();
+
+ if (TransportGUID.HasValue)
+ _worldPacket << TransportGUID.Value;
+
+ if (Vehicle.HasValue)
+ {
+ _worldPacket << Vehicle.Value.VehicleSeatIndex;
+ _worldPacket.WriteBit(Vehicle.Value.VehicleExitVoluntary);
+ _worldPacket.WriteBit(Vehicle.Value.VehicleExitTeleport);
+ _worldPacket.FlushBits();
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Movement::MoveUpdateTeleport::Write()
+{
+ _worldPacket << *movementInfo;
+
+ _worldPacket << int32(MovementForces.size());
+ for (WorldPackets::Movement::MovementForce const& force : MovementForces)
+ {
+ _worldPacket << force.ID;
+ _worldPacket << force.Direction;
+ _worldPacket << force.TransportID;
+ _worldPacket << force.Magnitude;
+ _worldPacket.WriteBits(force.Type, 2);
+ _worldPacket.FlushBits();
+ }
+
+ _worldPacket.WriteBit(WalkSpeed.HasValue);
+ _worldPacket.WriteBit(RunSpeed.HasValue);
+ _worldPacket.WriteBit(RunBackSpeed.HasValue);
+ _worldPacket.WriteBit(SwimSpeed.HasValue);
+ _worldPacket.WriteBit(SwimBackSpeed.HasValue);
+ _worldPacket.WriteBit(FlightSpeed.HasValue);
+ _worldPacket.WriteBit(FlightBackSpeed.HasValue);
+ _worldPacket.WriteBit(TurnRate.HasValue);
+ _worldPacket.WriteBit(PitchRate.HasValue);
+
+ if (WalkSpeed.HasValue)
+ _worldPacket << WalkSpeed.Value;
+
+ if (RunSpeed.HasValue)
+ _worldPacket << RunSpeed.Value;
+
+ if (RunBackSpeed.HasValue)
+ _worldPacket << RunBackSpeed.Value;
+
+ if (SwimSpeed.HasValue)
+ _worldPacket << SwimSpeed.Value;
+
+ if (SwimBackSpeed.HasValue)
+ _worldPacket << SwimBackSpeed.Value;
+
+ if (FlightSpeed.HasValue)
+ _worldPacket << FlightSpeed.Value;
+
+ if (FlightBackSpeed.HasValue)
+ _worldPacket << FlightBackSpeed.Value;
+
+ if (TurnRate.HasValue)
+ _worldPacket << TurnRate.Value;
+
+ if (PitchRate.HasValue)
+ _worldPacket << PitchRate.Value;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Movement::MoveTeleportAck::Read()
+{
+ _worldPacket >> MoverGUID;
+ _worldPacket >> AckIndex;
+ _worldPacket >> MoveTime;
+}
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index 6f3b19a661d..6d5d10526b3 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -43,23 +43,23 @@ namespace WorldPackets
WorldPacket const* Write() override;
- Unit* mover;
+ MovementInfo* movementInfo = nullptr;
};
struct MonsterSplineFilterKey
{
- int16 Idx;
- int16 Speed;
+ int16 Idx = 0;
+ int16 Speed = 0;
};
struct MonsterSplineFilter
{
std::vector<MonsterSplineFilterKey> FilterKeys;
- uint8 FilterFlags;
- float BaseSpeed;
- int16 StartOffset;
- float DistToPrevFilterKey;
- int16 AddedToStart;
+ uint8 FilterFlags = 0;
+ float BaseSpeed = 0.0f;
+ int16 StartOffset = 0;
+ float DistToPrevFilterKey = 0.0f;
+ int16 AddedToStart = 0;
};
struct MovementSpline
@@ -86,7 +86,7 @@ namespace WorldPackets
struct MovementMonsterSpline
{
- uint32 ID;
+ uint32 ID = 0;
G3D::Vector3 Destination;
bool CrzTeleport = false;
MovementSpline Move;
@@ -104,26 +104,59 @@ namespace WorldPackets
G3D::Vector3 Pos;
};
- class MoveSplineSet : public ServerPacket
+ class MoveSplineSetSpeed : public ServerPacket
{
public:
- MoveSplineSet(OpcodeServer opcode) : ServerPacket(opcode, 12) { }
+ MoveSplineSetSpeed(OpcodeServer opcode) : ServerPacket(opcode, 12) { }
WorldPacket const* Write() override;
ObjectGuid MoverGUID;
- float Speed;
+ float Speed = 1.0f;
};
- class MoveUpdate : public ServerPacket
+ class MoveSetSpeed : public ServerPacket
{
public:
- MoveUpdate(OpcodeServer opcode) : ServerPacket(opcode) { }
+ MoveSetSpeed(OpcodeServer opcode) : ServerPacket(opcode) { }
WorldPacket const* Write() override;
- MovementInfo movementInfo;
- float Speed;
+ ObjectGuid MoverGUID;
+ uint32 SequenceIndex = 0; ///< Unit movement packet index, incremented each time
+ float Speed = 1.0f;
+ };
+
+ class MoveUpdateSpeed : public ServerPacket
+ {
+ public:
+ MoveUpdateSpeed(OpcodeServer opcode) : ServerPacket(opcode) { }
+
+ WorldPacket const* Write() override;
+
+ MovementInfo* movementInfo = nullptr;
+ float Speed = 1.0f;
+ };
+
+ class MoveSplineSetFlag final : public ServerPacket
+ {
+ public:
+ MoveSplineSetFlag(OpcodeServer opcode) : ServerPacket(opcode, 8) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid MoverGUID;
+ };
+
+ class MoveSetFlag final : public ServerPacket
+ {
+ public:
+ MoveSetFlag(OpcodeServer opcode) : ServerPacket(opcode, 12) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid MoverGUID;
+ uint32 SequenceIndex = 0; ///< Unit movement packet index, incremented each time
};
class TransferPending final : public ServerPacket
@@ -163,8 +196,8 @@ namespace WorldPackets
WorldPacket const* Write() override;
- int32 MapID = 0;
- uint32 Reason = 0;
+ int32 MapID = 0;
+ uint32 Reason = 0;
Position Pos;
};
@@ -175,6 +208,69 @@ namespace WorldPackets
void Read() override { }
};
+
+ struct VehicleTeleport
+ {
+ uint8 VehicleSeatIndex = 0;
+ bool VehicleExitVoluntary = false;
+ bool VehicleExitTeleport = false;
+ };
+
+ class MoveTeleport final : public ServerPacket
+ {
+ public:
+ MoveTeleport() : ServerPacket(SMSG_MOVE_TELEPORT, 12+4+16+16+4) { }
+
+ WorldPacket const* Write() override;
+
+ Position Pos;
+ Optional<VehicleTeleport> Vehicle;
+ uint32 SequenceIndex = 0;
+ ObjectGuid MoverGUID;
+ Optional<ObjectGuid> TransportGUID;
+ float Facing = 0.0f;
+ };
+
+ struct MovementForce
+ {
+ ObjectGuid ID;
+ G3D::Vector3 Direction;
+ uint32 TransportID = 0;
+ float Magnitude = 0;
+ uint8 Type = 0;
+ };
+
+ class MoveUpdateTeleport final : public ServerPacket
+ {
+ public:
+ MoveUpdateTeleport() : ServerPacket(SMSG_MOVE_UPDATE_TELEPORT) { }
+
+ WorldPacket const* Write() override;
+
+ MovementInfo* movementInfo = nullptr;
+ std::vector<MovementForce> MovementForces;
+ Optional<float> SwimBackSpeed;
+ Optional<float> FlightSpeed;
+ Optional<float> SwimSpeed;
+ Optional<float> WalkSpeed;
+ Optional<float> TurnRate;
+ Optional<float> RunSpeed;
+ Optional<float> FlightBackSpeed;
+ Optional<float> RunBackSpeed;
+ Optional<float> PitchRate;
+ };
+
+ class MoveTeleportAck final : public ClientPacket
+ {
+ public:
+ MoveTeleportAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_TELEPORT_ACK, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid MoverGUID;
+ int32 AckIndex = 0;
+ int32 MoveTime = 0;
+ };
}
}
diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h
index b9e04ec4260..8b6eae8db56 100644
--- a/src/server/game/Server/Packets/QueryPackets.h
+++ b/src/server/game/Server/Packets/QueryPackets.h
@@ -181,7 +181,7 @@ namespace WorldPackets
void Read() override;
- uint32 TableHash;
+ uint32 TableHash = 0;
std::vector<DBQueryRecord> Queries;
};
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 67aa0efe9f3..79671b85892 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -474,7 +474,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MOVE_STOP_STRAFE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_STOP_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TELEPORT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck );
+ DEFINE_HANDLER(CMSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MoveTeleportAck, &WorldSession::HandleMoveTeleportAck);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TIME_SKIPPED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_WATER_WALK_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck );
DEFINE_HANDLER(CMSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortAck, &WorldSession::HandleMoveWorldportAckOpcode);
@@ -1098,34 +1098,32 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_COLLISION_DISABLE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_COLLISION_ENABLE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_FEATHER_FALL, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_FORCE_RUN_SPEED_CHANGE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_FORCE_SWIM_SPEED_CHANGE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_DISABLE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_DISABLE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_ENABLE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_LAND_WALK, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_LAND_WALK, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_NORMAL_FALL, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ROOT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ACTIVE_MOVER, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HEIGHT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COMPOUND_STATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_HOVER, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_HOVER, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_PITCH_RATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_BACK_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_BACK_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_SPEED, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_TURN_RATE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_SPEED, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_UNHANDLED);
@@ -1135,10 +1133,10 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_BACK_SPEED, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_SPEED, STATUS_NEVER);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TURN_RATE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_NEVER);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NAME_QUERY_RESPONSE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_UNHANDLED);
@@ -1323,7 +1321,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_COLLISION_DISABLE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_COLLISION_ENABLE, STATUS_UNHANDLED);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_DISABLE, STATUS_UNHANDLED);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_DISABLE, STATUS_NEVER);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_ENABLE, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_ROOT, STATUS_UNHANDLED);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_ANIM, STATUS_UNHANDLED);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 70bc31fc5ce..f6bdf0892d7 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -1113,36 +1113,34 @@ enum OpcodeServer : uint32
SMSG_MOVE_COLLISION_DISABLE = 0xBADD,
SMSG_MOVE_COLLISION_ENABLE = 0xBADD,
SMSG_MOVE_FEATHER_FALL = 0xBADD,
- SMSG_MOVE_FORCE_RUN_SPEED_CHANGE = 0x08F5,
- SMSG_MOVE_FORCE_SWIM_SPEED_CHANGE = 0x061A,
SMSG_MOVE_GRAVITY_DISABLE = 0x02C6,
SMSG_MOVE_GRAVITY_ENABLE = 0xBADD,
SMSG_MOVE_KNOCK_BACK = 0xBADD,
- SMSG_MOVE_LAND_WALK = 0xBADD,
+ SMSG_MOVE_LAND_WALK = 0x13DA,
SMSG_MOVE_NORMAL_FALL = 0xBADD,
SMSG_MOVE_ROOT = 0x1B5A,
SMSG_MOVE_SET_ACTIVE_MOVER = 0xBADD,
- SMSG_MOVE_SET_CAN_FLY = 0xBADD,
+ SMSG_MOVE_SET_CAN_FLY = 0x01F6,
SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0xBADD,
SMSG_MOVE_SET_COLLISION_HEIGHT = 0x008D,
SMSG_MOVE_SET_COMPOUND_STATE = 0xBADD,
SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0xBADD,
SMSG_MOVE_SET_FLIGHT_SPEED = 0xBADD,
- SMSG_MOVE_SET_HOVER = 0xBADD,
+ SMSG_MOVE_SET_HOVER = 0x0296,
SMSG_MOVE_SET_PITCH_RATE = 0xBADD,
SMSG_MOVE_SET_RUN_BACK_SPEED = 0xBADD,
- SMSG_MOVE_SET_RUN_SPEED = 0xBADD,
+ SMSG_MOVE_SET_RUN_SPEED = 0x08F5,
SMSG_MOVE_SET_SWIM_BACK_SPEED = 0xBADD,
- SMSG_MOVE_SET_SWIM_SPEED = 0xBADD,
+ SMSG_MOVE_SET_SWIM_SPEED = 0x061A,
SMSG_MOVE_SET_TURN_RATE = 0xBADD,
SMSG_MOVE_SET_VEHICLE_REC_ID = 0xBADD,
SMSG_MOVE_SET_WALK_IN_AIR = 0xBADD,
SMSG_MOVE_SET_WALK_SPEED = 0xBADD,
SMSG_MOVE_TELEPORT = 0x03A6,
SMSG_MOVE_UNROOT = 0xBADD,
- SMSG_MOVE_UNSET_CAN_FLY = 0xBADD,
+ SMSG_MOVE_UNSET_CAN_FLY = 0x0BAE,
SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0xBADD,
- SMSG_MOVE_UNSET_HOVER = 0xBADD,
+ SMSG_MOVE_UNSET_HOVER = 0x01A5,
SMSG_MOVE_UNSET_WALK_IN_AIR = 0xBADD,
SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0xBADD,
SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0xBADD,
@@ -1156,7 +1154,7 @@ enum OpcodeServer : uint32
SMSG_MOVE_UPDATE_TELEPORT = 0x03D5,
SMSG_MOVE_UPDATE_TURN_RATE = 0x08BE,
SMSG_MOVE_UPDATE_WALK_SPEED = 0x01E5,
- SMSG_MOVE_WATER_WALK = 0xBADD,
+ SMSG_MOVE_WATER_WALK = 0x02A6,
SMSG_MULTIPLE_PACKETS = 0xBADD,
SMSG_NAME_QUERY_RESPONSE = 0x0828,
SMSG_NEW_TAXI_PATH = 0xBADD,
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index a04bb45dfe7..26db96b232d 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -162,6 +162,13 @@ namespace WorldPackets
class TutorialSetFlag;
}
+ namespace Movement
+ {
+ class ClientPlayerMovement;
+ class WorldPortAck;
+ class MoveTeleportAck;
+ }
+
namespace NPC
{
class Hello;
@@ -181,12 +188,6 @@ namespace WorldPackets
class QuestGiverStatusQuery;
class QuestGiverStatusMultipleQuery;
}
-
- namespace Movement
- {
- class ClientPlayerMovement;
- class WorldPortAck;
- }
}
enum AccountDataType
@@ -631,7 +632,7 @@ class WorldSession
// Knockback
void HandleMoveKnockBackAck(WorldPacket& recvPacket);
- void HandleMoveTeleportAck(WorldPacket& recvPacket);
+ void HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet);
void HandleForceSpeedChangeAck(WorldPacket& recvData);
void HandleSetCollisionHeightAck(WorldPacket& recvPacket);
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index c6b92f66fb9..303a885c39c 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -4365,7 +4365,7 @@ void Spell::TakeCastItem()
bool expendable = false;
bool withoutCharges = false;
- for (int i = 0; i < proto->Effects.size(); ++i)
+ for (uint32 i = 0; i < proto->Effects.size(); ++i)
{
// item has limited charges
if (proto->Effects[i].Charges)
@@ -4607,7 +4607,7 @@ void Spell::TakeReagents()
// if CastItem is also spell reagent
if (castItemTemplate && castItemTemplate->ItemId == itemid)
{
- for (int s = 0; s < castItemTemplate->Effects.size(); ++s)
+ for (uint32 s = 0; s < castItemTemplate->Effects.size(); ++s)
{
// CastItem will be used up and does not count as reagent
int32 charges = m_CastItem->GetSpellCharges(s);
@@ -6343,15 +6343,15 @@ SpellCastResult Spell::CheckItems()
case SPELL_EFFECT_CREATE_MANA_GEM:
{
uint32 item_id = effect->ItemType;
- ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item_id);
+ ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item_id);
- if (!pProto)
+ if (!proto)
return SPELL_FAILED_ITEM_AT_MAX_CHARGES;
- if (Item* pitem = player->GetItemByEntry(item_id))
+ if (Item* item = player->GetItemByEntry(item_id))
{
- for (int x = 0; x < pProto->Effects.size(); ++x)
- if (pProto->Effects[x].Charges != 0 && pitem->GetSpellCharges(x) == pProto->Effects[x].Charges)
+ for (uint32 x = 0; x < proto->Effects.size(); ++x)
+ if (proto->Effects[x].Charges != 0 && item->GetSpellCharges(x) == proto->Effects[x].Charges)
return SPELL_FAILED_ITEM_AT_MAX_CHARGES;
}
break;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 22c68271aba..4ba129b4946 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -1600,7 +1600,7 @@ void SpellMgr::LoadSpellTargetPositions()
mSpellTargetPositions.clear(); // need for reload case
- // 0 1 2 3 4 5
+ // 0 1 2 3 4 5
QueryResult result = WorldDatabase.Query("SELECT ID, EffectIndex, MapID, PositionX, PositionY, PositionZ FROM spell_target_position");
if (!result)
{
diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp
index 07d0bd53629..992942cefeb 100644
--- a/src/server/game/Texts/CreatureTextMgr.cpp
+++ b/src/server/game/Texts/CreatureTextMgr.cpp
@@ -60,7 +60,7 @@ class PlayerTextBuilder
{
std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale);
WorldPackets::Chat::Chat packet;
- return ChatHandler::BuildChatPacket(&packet, _msgType, Language(_language), _talker, _target, text, 0, "", locale);
+ ChatHandler::BuildChatPacket(&packet, _msgType, Language(_language), _talker, _target, text, 0, "", locale);
data = *packet.Write();
}
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index eb64c2f3eaa..aadf97e9b0c 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -1344,7 +1344,7 @@ public:
}
// Set gender
- target->SetByteValue(UNIT_FIELD_BYTES_0, 2, gender);
+ target->SetByteValue(UNIT_FIELD_BYTES_0, UNIT_BYTES_0_OFFSET_GENDER, gender);
target->SetByteValue(PLAYER_BYTES_3, 0, gender);
// Change display ID
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index fa6adcc8eb0..84e850034a9 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -954,7 +954,7 @@ public:
sObjectMgr->LoadGraveyardZones();
- handler->SendGlobalGMSysMessage("DB table `game_graveyard_zone` reloaded.");
+ handler->SendGlobalGMSysMessage("DB table `graveyard_zone` reloaded.");
return true;
}
diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp
index 01a0094bfc7..1c3bff77593 100644
--- a/src/server/scripts/Commands/cs_reset.cpp
+++ b/src/server/scripts/Commands/cs_reset.cpp
@@ -100,8 +100,7 @@ public:
player->SetShapeshiftForm(FORM_NONE);
player->setFactionForRace(player->getRace());
-
- player->SetUInt32Value(UNIT_FIELD_BYTES_0, ((player->getRace()) | (player->getClass() << 8) | (player->getGender() << 16) | (powerType << 24)));
+ player->SetUInt32Value(UNIT_FIELD_DISPLAY_POWER, powerType);
// reset only if player not in some form;
if (player->GetShapeshiftForm() == FORM_NONE)
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 71bc9233f87..36395d4d06e 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -93,7 +93,7 @@ LogsDir = ""
# Default: "127.0.0.1;3306;trinity;trinity;auth" - (LoginDatabaseInfo)
# "127.0.0.1;3306;trinity;trinity;world" - (WorldDatabaseInfo)
# "127.0.0.1;3306;trinity;trinity;characters" - (CharacterDatabaseInfo)
-# "127.0.0.1;3306;trinity;trinity;hotfixes" - (HotfixDatabaseInfo)
+# "127.0.0.1;3306;trinity;trinity;hotfixes" - (HotfixDatabaseInfo)
LoginDatabaseInfo = "127.0.0.1;3306;trinity;trinity;auth"
WorldDatabaseInfo = "127.0.0.1;3306;trinity;trinity;world"