diff options
author | Rat <gmstreetrat@gmail.com> | 2014-12-01 21:09:23 +0100 |
---|---|---|
committer | Rat <gmstreetrat@gmail.com> | 2014-12-01 21:09:23 +0100 |
commit | b91ac01bc7b9f9a60b85f7e92b88a8d4c16d350c (patch) | |
tree | 752ff4331fa77c4ad907f30c075b930072ca18e8 /src | |
parent | e7f3f11ed5d7fec26de2c4fd9f2cb219d8019f9b (diff) | |
parent | 05913b82084ed2b640c7e44e7a55bdb7b797ca5c (diff) |
Merge branch '6.x' of https://github.com/TrinityCore/TrinityCore into Spells
Diffstat (limited to 'src')
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" |