Core/PacketIO: Updated packets to 8.3.0

This commit is contained in:
Shauren
2020-02-17 23:58:08 +01:00
parent 38cc011af0
commit 462a10de17
25 changed files with 1311 additions and 964 deletions
@@ -0,0 +1 @@
UPDATE `character_inventory` SET `slot`=`slot`+4 WHERE `slot`>=47 AND `bag`=0;
@@ -0,0 +1,223 @@
DROP TABLE IF EXISTS `class_expansion_requirement`;
CREATE TABLE `class_expansion_requirement` (
`ClassID` tinyint(3) unsigned NOT NULL,
`RaceID` tinyint(3) unsigned NOT NULL,
`ActiveExpansionLevel` tinyint(3) unsigned DEFAULT '0',
`AccountExpansionLevel` tinyint(3) unsigned DEFAULT '0',
PRIMARY KEY (`ClassID`,`RaceID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--
-- Dumping data for table `class_expansion_requirement`
--
INSERT INTO `class_expansion_requirement` VALUES
(1,1,0,0),
(1,2,0,0),
(1,3,0,0),
(1,4,0,0),
(1,5,0,0),
(1,6,0,0),
(1,7,0,0),
(1,8,0,0),
(1,9,0,0),
(1,10,0,0),
(1,11,0,0),
(1,22,0,0),
(1,24,0,0),
(1,25,0,0),
(1,26,0,0),
(1,27,0,0),
(1,28,0,0),
(1,29,0,0),
(1,30,0,0),
(1,31,0,0),
(1,32,0,0),
(1,34,0,0),
(1,35,0,0),
(1,36,0,0),
(1,37,0,0),
(2,1,0,0),
(2,3,0,0),
(2,6,0,0),
(2,10,0,0),
(2,11,0,0),
(2,30,0,0),
(2,31,0,0),
(2,34,0,0),
(3,1,0,0),
(3,2,0,0),
(3,3,0,0),
(3,4,0,0),
(3,5,0,0),
(3,6,0,0),
(3,7,0,0),
(3,8,0,0),
(3,9,0,0),
(3,10,0,0),
(3,11,0,0),
(3,22,0,0),
(3,24,0,0),
(3,25,0,0),
(3,26,0,0),
(3,27,0,0),
(3,28,0,0),
(3,29,0,0),
(3,30,0,0),
(3,31,0,0),
(3,32,0,0),
(3,34,0,0),
(3,35,0,0),
(3,36,0,0),
(3,37,0,0),
(4,1,0,0),
(4,2,0,0),
(4,3,0,0),
(4,4,0,0),
(4,5,0,0),
(4,7,0,0),
(4,8,0,0),
(4,9,0,0),
(4,10,0,0),
(4,22,0,0),
(4,24,0,0),
(4,25,0,0),
(4,26,0,0),
(4,27,0,0),
(4,29,0,0),
(4,31,0,0),
(4,32,0,0),
(4,34,0,0),
(4,35,0,0),
(4,36,0,0),
(4,37,0,0),
(5,1,0,0),
(5,3,0,0),
(5,4,0,0),
(5,5,0,0),
(5,6,0,0),
(5,7,0,0),
(5,8,0,0),
(5,9,0,0),
(5,10,0,0),
(5,11,0,0),
(5,22,0,0),
(5,24,0,0),
(5,25,0,0),
(5,26,0,0),
(5,27,0,0),
(5,29,0,0),
(5,30,0,0),
(5,31,0,0),
(5,32,0,0),
(5,34,0,0),
(5,35,0,0),
(5,36,0,0),
(5,37,0,0),
(6,1,2,2),
(6,2,2,2),
(6,3,2,2),
(6,4,2,2),
(6,5,2,2),
(6,6,2,2),
(6,7,2,2),
(6,8,2,2),
(6,9,2,2),
(6,10,2,2),
(6,11,2,2),
(6,22,2,2),
(6,24,2,8),
(6,25,2,8),
(6,26,2,8),
(6,27,2,8),
(6,28,2,8),
(6,29,2,8),
(6,30,2,8),
(6,31,2,8),
(6,32,2,8),
(6,34,2,8),
(6,35,2,8),
(6,36,2,8),
(6,37,2,8),
(7,2,0,0),
(7,3,0,0),
(7,6,0,0),
(7,8,0,0),
(7,9,0,0),
(7,11,0,0),
(7,24,0,0),
(7,25,0,0),
(7,26,0,0),
(7,28,0,0),
(7,31,0,0),
(7,32,0,0),
(7,34,0,0),
(7,35,0,0),
(7,36,0,0),
(8,1,0,0),
(8,2,0,0),
(8,3,0,0),
(8,4,0,0),
(8,5,0,0),
(8,7,0,0),
(8,8,0,0),
(8,9,0,0),
(8,10,0,0),
(8,11,0,0),
(8,22,0,0),
(8,24,0,0),
(8,25,0,0),
(8,26,0,0),
(8,27,0,0),
(8,29,0,0),
(8,30,0,0),
(8,31,0,0),
(8,32,0,0),
(8,34,0,0),
(8,35,0,0),
(8,36,0,0),
(8,37,0,0),
(9,1,0,0),
(9,2,0,0),
(9,3,0,0),
(9,5,0,0),
(9,7,0,0),
(9,8,0,0),
(9,9,0,0),
(9,10,0,0),
(9,22,0,0),
(9,27,0,0),
(9,29,0,0),
(9,34,0,0),
(9,35,0,0),
(9,37,0,0),
(10,1,4,4),
(10,2,4,4),
(10,3,4,4),
(10,4,4,4),
(10,5,4,4),
(10,6,4,4),
(10,7,4,4),
(10,8,4,4),
(10,10,4,4),
(10,11,4,4),
(10,24,4,4),
(10,25,4,4),
(10,26,4,4),
(10,27,4,4),
(10,28,4,4),
(10,29,4,4),
(10,31,4,4),
(10,32,4,4),
(10,34,4,4),
(10,35,4,4),
(10,36,4,4),
(10,37,4,4),
(11,4,0,0),
(11,6,0,0),
(11,8,0,0),
(11,22,0,0),
(11,28,0,0),
(11,31,0,0),
(11,32,0,0),
(12,4,6,6),
(12,10,6,6);
@@ -518,7 +518,7 @@ void UnlockedAzeriteEssence::WriteUpdate(ByteBuffer& data, AzeriteItem const* ow
void SelectedAzeriteEssences::WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const
{
for (std::size_t i = 0; i < 3; ++i)
for (std::size_t i = 0; i < 4; ++i)
{
data << uint32(AzeriteEssenceID[i]);
}
@@ -529,7 +529,7 @@ void SelectedAzeriteEssences::WriteCreate(ByteBuffer& data, AzeriteItem const* o
void SelectedAzeriteEssences::WriteUpdate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const
{
UpdateMask<7> const& changesMask = _changesMask;
UpdateMask<8> const& changesMask = _changesMask;
data.WriteBits(changesMask.GetBlocksMask(0), 1);
if (changesMask.GetBlock(0))
data.WriteBits(changesMask.GetBlock(0), 32);
@@ -548,7 +548,7 @@ void SelectedAzeriteEssences::WriteUpdate(ByteBuffer& data, AzeriteItem const* o
}
if (changesMask[3])
{
for (std::size_t i = 0; i < 3; ++i)
for (std::size_t i = 0; i < 4; ++i)
{
if (changesMask[4 + i])
{
@@ -938,6 +938,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fiel
data << uint32(PassiveSpells.size());
data << uint32(WorldEffects.size());
data << uint32(ChannelObjects.size());
data << SkinningOwnerGUID;
for (std::size_t i = 0; i < PassiveSpells.size(); ++i)
{
PassiveSpells[i].WriteCreate(data, owner, receiver);
@@ -954,22 +955,22 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fiel
void UnitData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
UpdateMask<191> allowedMaskForTarget({ 0xFFFFEFFFu, 0xFC3FBFFFu, 0x0001EFFFu, 0xFFDFFFF9u, 0x001FC003u, 0x00000000u });
UpdateMask<192> allowedMaskForTarget({ 0xFFFFEFFFu, 0xFC3FBFFFu, 0x0001EFFFu, 0xFFBFFFF9u, 0x003F8007u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, fieldVisibilityFlags, owner, receiver);
}
void UnitData::AppendAllowedFieldsMaskForFlag(UpdateMask<191>& allowedMaskForTarget, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags) const
void UnitData::AppendAllowedFieldsMaskForFlag(UpdateMask<192>& allowedMaskForTarget, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags) const
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
allowedMaskForTarget |= { 0x00001000u, 0x03C04000u, 0xFFFE1000u, 0x00200006u, 0xFFE03FFCu, 0x7FFFFFFFu };
allowedMaskForTarget |= { 0x00001000u, 0x03C04000u, 0xFFFE1000u, 0x00400006u, 0xFFC07FF8u, 0xFFFFFFFFu };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x00200000u, 0x00003FFCu, 0x00000000u };
allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x00400000u, 0x00007FF8u, 0x00000000u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
allowedMaskForTarget |= { 0x00000000u, 0x03C00000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000003FCu };
allowedMaskForTarget |= { 0x00000000u, 0x03C00000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000007F8u };
}
void UnitData::WriteUpdate(ByteBuffer& data, UpdateMask<191> const& changesMask, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
void UnitData::WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMask, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlocksMask(0), 6);
for (std::size_t i = 0; i < 6; ++i)
@@ -1469,94 +1470,98 @@ void UnitData::WriteUpdate(ByteBuffer& data, UpdateMask<191> const& changesMask,
{
data << GuildGUID;
}
if (changesMask[114])
{
data << SkinningOwnerGUID;
}
}
if (changesMask[114])
if (changesMask[115])
{
for (std::size_t i = 0; i < 2; ++i)
{
if (changesMask[115 + i])
if (changesMask[116 + i])
{
data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(NpcFlags[i], i, owner, receiver));
}
}
}
if (changesMask[117])
if (changesMask[118])
{
for (std::size_t i = 0; i < 6; ++i)
{
if (changesMask[118 + i])
if (changesMask[119 + i])
{
data << int32(Power[i]);
}
if (changesMask[124 + i])
if (changesMask[125 + i])
{
data << int32(MaxPower[i]);
}
if (changesMask[130 + i])
if (changesMask[131 + i])
{
data << float(PowerRegenFlatModifier[i]);
}
if (changesMask[136 + i])
if (changesMask[137 + i])
{
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
}
if (changesMask[142])
if (changesMask[143])
{
for (std::size_t i = 0; i < 3; ++i)
{
if (changesMask[143 + i])
if (changesMask[144 + i])
{
VirtualItems[i].WriteUpdate(data, owner, receiver);
}
}
}
if (changesMask[146])
if (changesMask[147])
{
for (std::size_t i = 0; i < 2; ++i)
{
if (changesMask[147 + i])
if (changesMask[148 + i])
{
data << uint32(AttackRoundBaseTime[i]);
}
}
}
if (changesMask[149])
if (changesMask[150])
{
for (std::size_t i = 0; i < 4; ++i)
{
if (changesMask[150 + i])
if (changesMask[151 + i])
{
data << int32(Stats[i]);
}
if (changesMask[154 + i])
if (changesMask[155 + i])
{
data << int32(StatPosBuff[i]);
}
if (changesMask[158 + i])
if (changesMask[159 + i])
{
data << int32(StatNegBuff[i]);
}
}
}
if (changesMask[162])
if (changesMask[163])
{
for (std::size_t i = 0; i < 7; ++i)
{
if (changesMask[163 + i])
if (changesMask[164 + i])
{
data << int32(Resistances[i]);
}
if (changesMask[170 + i])
if (changesMask[171 + i])
{
data << int32(BonusResistanceMods[i]);
}
if (changesMask[177 + i])
if (changesMask[178 + i])
{
data << int32(PowerCostModifier[i]);
}
if (changesMask[184 + i])
if (changesMask[185 + i])
{
data << float(PowerCostMultiplier[i]);
}
@@ -1676,6 +1681,7 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(LookAtControllerID);
Base::ClearChangesMask(TaxiNodesID);
Base::ClearChangesMask(GuildGUID);
Base::ClearChangesMask(SkinningOwnerGUID);
Base::ClearChangesMask(NpcFlags);
Base::ClearChangesMask(Power);
Base::ClearChangesMask(MaxPower);
@@ -2494,7 +2500,7 @@ void QuestSession::ClearChangesMask()
void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
for (std::size_t i = 0; i < 195; ++i)
for (std::size_t i = 0; i < 199; ++i)
{
data << InvSlots[i];
}
@@ -2737,7 +2743,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
UpdateMask<1490> const& changesMask = _changesMask;
UpdateMask<1494> const& changesMask = _changesMask;
for (std::size_t i = 0; i < 1; ++i)
data << uint32(changesMask.GetBlocksMask(i));
data.WriteBits(changesMask.GetBlocksMask(1), 15);
@@ -3363,7 +3369,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
}
if (changesMask[104])
{
for (std::size_t i = 0; i < 195; ++i)
for (std::size_t i = 0; i < 199; ++i)
{
if (changesMask[105 + i])
{
@@ -3371,147 +3377,147 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl
}
}
}
if (changesMask[300])
if (changesMask[304])
{
for (std::size_t i = 0; i < 2; ++i)
{
if (changesMask[301 + i])
if (changesMask[305 + i])
{
data << uint32(TrackResourceMask[i]);
}
}
}
if (changesMask[303])
if (changesMask[307])
{
for (std::size_t i = 0; i < 192; ++i)
{
if (changesMask[304 + i])
if (changesMask[308 + i])
{
data << uint64(ExploredZones[i]);
}
}
}
if (changesMask[496])
if (changesMask[500])
{
for (std::size_t i = 0; i < 2; ++i)
{
if (changesMask[497 + i])
if (changesMask[501 + i])
{
RestInfo[i].WriteUpdate(data, owner, receiver);
}
}
}
if (changesMask[499])
if (changesMask[503])
{
for (std::size_t i = 0; i < 7; ++i)
{
if (changesMask[500 + i])
if (changesMask[504 + i])
{
data << int32(ModDamageDonePos[i]);
}
if (changesMask[507 + i])
if (changesMask[511 + i])
{
data << int32(ModDamageDoneNeg[i]);
}
if (changesMask[514 + i])
if (changesMask[518 + i])
{
data << float(ModDamageDonePercent[i]);
}
}
}
if (changesMask[521])
if (changesMask[525])
{
for (std::size_t i = 0; i < 3; ++i)
{
if (changesMask[522 + i])
if (changesMask[526 + i])
{
data << float(WeaponDmgMultipliers[i]);
}
if (changesMask[525 + i])
if (changesMask[529 + i])
{
data << float(WeaponAtkSpeedMultipliers[i]);
}
}
}
if (changesMask[528])
if (changesMask[532])
{
for (std::size_t i = 0; i < 12; ++i)
{
if (changesMask[529 + i])
if (changesMask[533 + i])
{
data << uint32(BuybackPrice[i]);
}
if (changesMask[541 + i])
if (changesMask[545 + i])
{
data << uint32(BuybackTimestamp[i]);
}
}
}
if (changesMask[553])
if (changesMask[557])
{
for (std::size_t i = 0; i < 32; ++i)
{
if (changesMask[554 + i])
if (changesMask[558 + i])
{
data << int32(CombatRatings[i]);
}
}
}
if (changesMask[593])
if (changesMask[597])
{
for (std::size_t i = 0; i < 4; ++i)
{
if (changesMask[594 + i])
if (changesMask[598 + i])
{
data << uint32(NoReagentCostMask[i]);
}
}
}
if (changesMask[598])
if (changesMask[602])
{
for (std::size_t i = 0; i < 2; ++i)
{
if (changesMask[599 + i])
if (changesMask[603 + i])
{
data << int32(ProfessionSkillLine[i]);
}
}
}
if (changesMask[601])
if (changesMask[605])
{
for (std::size_t i = 0; i < 4; ++i)
{
if (changesMask[602 + i])
if (changesMask[606 + i])
{
data << uint32(BagSlotFlags[i]);
}
}
}
if (changesMask[606])
if (changesMask[610])
{
for (std::size_t i = 0; i < 7; ++i)
{
if (changesMask[607 + i])
if (changesMask[611 + i])
{
data << uint32(BankBagSlotFlags[i]);
}
}
}
if (changesMask[614])
if (changesMask[618])
{
for (std::size_t i = 0; i < 875; ++i)
{
if (changesMask[615 + i])
if (changesMask[619 + i])
{
data << uint64(QuestCompleted[i]);
}
}
}
if (changesMask[586])
if (changesMask[590])
{
for (std::size_t i = 0; i < 6; ++i)
{
if (changesMask[587 + i])
if (changesMask[591 + i])
{
PvpInfo[i].WriteUpdate(data, owner, receiver);
}
@@ -145,11 +145,11 @@ struct UnlockedAzeriteEssence : public IsUpdateFieldStructureTag
void WriteUpdate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const;
};
struct SelectedAzeriteEssences : public IsUpdateFieldStructureTag, public HasChangesMask<7>
struct SelectedAzeriteEssences : public IsUpdateFieldStructureTag, public HasChangesMask<8>
{
UpdateField<uint32, 0, 1> SpecializationID;
UpdateField<uint32, 0, 2> Enabled;
UpdateFieldArray<uint32, 3, 3, 4> AzeriteEssenceID;
UpdateFieldArray<uint32, 4, 3, 4> AzeriteEssenceID;
void WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const;
@@ -203,7 +203,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag
void WriteUpdate(ByteBuffer& data, Unit const* owner, Player const* receiver) const;
};
struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<191>
struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<192>
{
UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells;
@@ -320,26 +320,27 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<191>
UpdateField<int32, 96, 111> LookAtControllerID;
UpdateField<int32, 96, 112> TaxiNodesID;
UpdateField<ObjectGuid, 96, 113> GuildGUID;
UpdateFieldArray<uint32, 2, 114, 115> NpcFlags;
UpdateField<ObjectGuid, 96, 114> SkinningOwnerGUID;
UpdateFieldArray<uint32, 2, 115, 116> NpcFlags;
struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
UpdateFieldArray<int32, 6, 117, 118> Power;
UpdateFieldArray<int32, 6, 117, 124> MaxPower;
UpdateFieldArray<float, 6, 117, 130> PowerRegenFlatModifier;
UpdateFieldArray<float, 6, 117, 136> PowerRegenInterruptedFlatModifier;
UpdateFieldArray<UF::VisibleItem, 3, 142, 143> VirtualItems;
UpdateFieldArray<uint32, 2, 146, 147> AttackRoundBaseTime;
UpdateFieldArray<int32, 4, 149, 150> Stats;
UpdateFieldArray<int32, 4, 149, 154> StatPosBuff;
UpdateFieldArray<int32, 4, 149, 158> StatNegBuff;
UpdateFieldArray<int32, 7, 162, 163> Resistances;
UpdateFieldArray<int32, 7, 162, 170> BonusResistanceMods;
UpdateFieldArray<int32, 7, 162, 177> PowerCostModifier;
UpdateFieldArray<float, 7, 162, 184> PowerCostMultiplier;
UpdateFieldArray<int32, 6, 118, 119> Power;
UpdateFieldArray<int32, 6, 118, 125> MaxPower;
UpdateFieldArray<float, 6, 118, 131> PowerRegenFlatModifier;
UpdateFieldArray<float, 6, 118, 137> PowerRegenInterruptedFlatModifier;
UpdateFieldArray<UF::VisibleItem, 3, 143, 144> VirtualItems;
UpdateFieldArray<uint32, 2, 147, 148> AttackRoundBaseTime;
UpdateFieldArray<int32, 4, 150, 151> Stats;
UpdateFieldArray<int32, 4, 150, 155> StatPosBuff;
UpdateFieldArray<int32, 4, 150, 159> StatNegBuff;
UpdateFieldArray<int32, 7, 163, 164> Resistances;
UpdateFieldArray<int32, 7, 163, 171> BonusResistanceMods;
UpdateFieldArray<int32, 7, 163, 178> PowerCostModifier;
UpdateFieldArray<float, 7, 163, 185> PowerCostMultiplier;
void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
void AppendAllowedFieldsMaskForFlag(UpdateMask<191>& allowedMaskForTarget, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
void WriteUpdate(ByteBuffer& data, UpdateMask<191> const& changesMask, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
void AppendAllowedFieldsMaskForFlag(UpdateMask<192>& allowedMaskForTarget, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
void WriteUpdate(ByteBuffer& data, UpdateMask<192> const& changesMask, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
void ClearChangesMask();
};
@@ -523,7 +524,7 @@ struct QuestSession : public IsUpdateFieldStructureTag, public HasChangesMask<87
void ClearChangesMask();
};
struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1490>
struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1494>
{
UpdateField<bool, 0, 1> BackpackAutoSortDisabled;
UpdateField<bool, 0, 2> BankAutoSortDisabled;
@@ -624,24 +625,24 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas
UpdateField<int32, 98, 101> PvpLastWeeksRewardClaimed;
UpdateField<uint8, 98, 102> NumBankSlots;
OptionalUpdateField<UF::QuestSession, 98, 103> QuestSession;
UpdateFieldArray<ObjectGuid, 195, 104, 105> InvSlots;
UpdateFieldArray<uint32, 2, 300, 301> TrackResourceMask;
UpdateFieldArray<uint64, 192, 303, 304> ExploredZones;
UpdateFieldArray<UF::RestInfo, 2, 496, 497> RestInfo;
UpdateFieldArray<int32, 7, 499, 500> ModDamageDonePos;
UpdateFieldArray<int32, 7, 499, 507> ModDamageDoneNeg;
UpdateFieldArray<float, 7, 499, 514> ModDamageDonePercent;
UpdateFieldArray<float, 3, 521, 522> WeaponDmgMultipliers;
UpdateFieldArray<float, 3, 521, 525> WeaponAtkSpeedMultipliers;
UpdateFieldArray<uint32, 12, 528, 529> BuybackPrice;
UpdateFieldArray<uint32, 12, 528, 541> BuybackTimestamp;
UpdateFieldArray<int32, 32, 553, 554> CombatRatings;
UpdateFieldArray<UF::PVPInfo, 6, 586, 587> PvpInfo;
UpdateFieldArray<uint32, 4, 593, 594> NoReagentCostMask;
UpdateFieldArray<int32, 2, 598, 599> ProfessionSkillLine;
UpdateFieldArray<uint32, 4, 601, 602> BagSlotFlags;
UpdateFieldArray<uint32, 7, 606, 607> BankBagSlotFlags;
UpdateFieldArray<uint64, 875, 614, 615> QuestCompleted;
UpdateFieldArray<ObjectGuid, 199, 104, 105> InvSlots;
UpdateFieldArray<uint32, 2, 304, 305> TrackResourceMask;
UpdateFieldArray<uint64, 192, 307, 308> ExploredZones;
UpdateFieldArray<UF::RestInfo, 2, 500, 501> RestInfo;
UpdateFieldArray<int32, 7, 503, 504> ModDamageDonePos;
UpdateFieldArray<int32, 7, 503, 511> ModDamageDoneNeg;
UpdateFieldArray<float, 7, 503, 518> ModDamageDonePercent;
UpdateFieldArray<float, 3, 525, 526> WeaponDmgMultipliers;
UpdateFieldArray<float, 3, 525, 529> WeaponAtkSpeedMultipliers;
UpdateFieldArray<uint32, 12, 532, 533> BuybackPrice;
UpdateFieldArray<uint32, 12, 532, 545> BuybackTimestamp;
UpdateFieldArray<int32, 32, 557, 558> CombatRatings;
UpdateFieldArray<UF::PVPInfo, 6, 590, 591> PvpInfo;
UpdateFieldArray<uint32, 4, 597, 598> NoReagentCostMask;
UpdateFieldArray<int32, 2, 602, 603> ProfessionSkillLine;
UpdateFieldArray<uint32, 4, 605, 606> BagSlotFlags;
UpdateFieldArray<uint32, 7, 610, 611> BankBagSlotFlags;
UpdateFieldArray<uint64, 875, 618, 619> QuestCompleted;
void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
+12 -12
View File
@@ -604,41 +604,41 @@ enum InventorySlots : uint8 // 4 slots
INVENTORY_SLOT_BAG_END = 23
};
enum InventoryPackSlots : uint8 // 24 slots
enum InventoryPackSlots : uint8 // 28 slots
{
INVENTORY_SLOT_ITEM_START = 23,
INVENTORY_SLOT_ITEM_END = 47
INVENTORY_SLOT_ITEM_END = 51
};
enum BankItemSlots // 28 slots
{
BANK_SLOT_ITEM_START = 47,
BANK_SLOT_ITEM_END = 75
BANK_SLOT_ITEM_START = 51,
BANK_SLOT_ITEM_END = 79
};
enum BankBagSlots // 7 slots
{
BANK_SLOT_BAG_START = 75,
BANK_SLOT_BAG_END = 82
BANK_SLOT_BAG_START = 79,
BANK_SLOT_BAG_END = 86
};
enum BuyBackSlots // 12 slots
{
// stored in m_buybackitems
BUYBACK_SLOT_START = 82,
BUYBACK_SLOT_END = 94
BUYBACK_SLOT_START = 86,
BUYBACK_SLOT_END = 98
};
enum ReagentSlots // 98 slots
{
REAGENT_SLOT_START = 94,
REAGENT_SLOT_END = 192,
REAGENT_SLOT_START = 98,
REAGENT_SLOT_END = 196,
};
enum ChildEquipmentSlots
{
CHILD_EQUIPMENT_SLOT_START = 192,
CHILD_EQUIPMENT_SLOT_END = 195,
CHILD_EQUIPMENT_SLOT_START = 196,
CHILD_EQUIPMENT_SLOT_END = 199,
};
struct ItemPosCount
+66 -8
View File
@@ -9881,37 +9881,76 @@ void ObjectMgr::LoadRaceAndClassExpansionRequirements()
oldMSTime = getMSTime();
_classExpansionRequirementStore.clear();
// 0 1
result = WorldDatabase.Query("SELECT classID, expansion FROM `class_expansion_requirement`");
// 0 1 2 3
result = WorldDatabase.Query("SELECT ClassID, RaceID, ActiveExpansionLevel, AccountExpansionLevel FROM `class_expansion_requirement`");
if (result)
{
std::map<uint8, std::map<uint8, std::pair<uint8, uint8>>> temp;
uint32 count = 0;
do
{
Field* fields = result->Fetch();
uint8 classID = fields[0].GetInt8();
uint8 expansion = fields[1].GetInt8();
uint8 classID = fields[0].GetUInt8();
uint8 raceID = fields[1].GetUInt8();
uint8 activeExpansionLevel = fields[2].GetUInt8();
uint8 accountExpansionLevel = fields[3].GetUInt8();
ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(classID);
if (!classEntry)
{
TC_LOG_ERROR("sql.sql", "Class %u defined in `class_expansion_requirement` does not exists, skipped.", classID);
TC_LOG_ERROR("sql.sql", "Class %u (race %u) defined in `class_expansion_requirement` does not exists, skipped.",
uint32(classID), uint32(raceID));
continue;
}
if (expansion >= MAX_EXPANSIONS)
ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(raceID);
if (!classEntry)
{
TC_LOG_ERROR("sql.sql", "Class %u defined in `class_expansion_requirement` has incorrect expansion %u, skipped.", classID, expansion);
TC_LOG_ERROR("sql.sql", "Race %u (class %u) defined in `class_expansion_requirement` does not exists, skipped.",
uint32(raceID), uint32(classID));
continue;
}
_classExpansionRequirementStore[classID] = expansion;
if (activeExpansionLevel >= MAX_EXPANSIONS)
{
TC_LOG_ERROR("sql.sql", "Class %u Race %u defined in `class_expansion_requirement` has incorrect ActiveExpansionLevel %u, skipped.",
uint32(classID), uint32(raceID), activeExpansionLevel);
continue;
}
if (accountExpansionLevel >= MAX_ACCOUNT_EXPANSIONS)
{
TC_LOG_ERROR("sql.sql", "Class %u Race %u defined in `class_expansion_requirement` has incorrect AccountExpansionLevel %u, skipped.",
uint32(classID), uint32(raceID), accountExpansionLevel);
continue;
}
temp[raceID][classID] = { activeExpansionLevel, accountExpansionLevel };
++count;
}
while (result->NextRow());
for (auto&& race : temp)
{
_classExpansionRequirementStore.emplace_back();
RaceClassAvailability& raceClassAvailability = _classExpansionRequirementStore.back();
raceClassAvailability.RaceID = race.first;
for (auto&& class_ : race.second)
{
raceClassAvailability.Classes.emplace_back();
ClassAvailability& classAvailability = raceClassAvailability.Classes.back();
classAvailability.ClassID = class_.first;
classAvailability.ActiveExpansionLevel = class_.second.first;
classAvailability.AccountExpansionLevel = class_.second.second;
}
}
TC_LOG_INFO("server.loading", ">> Loaded %u class expansion requirements in %u ms.", count, GetMSTimeDiffToNow(oldMSTime));
}
else
@@ -9974,6 +10013,25 @@ bool ObjectMgr::GetRealmName(uint32 realmId, std::string& name, std::string& nor
return false;
}
ClassAvailability const* ObjectMgr::GetClassExpansionRequirement(uint8 raceId, uint8 classId) const
{
auto raceItr = std::find_if(_classExpansionRequirementStore.begin(), _classExpansionRequirementStore.end(), [raceId](RaceClassAvailability const& raceClass)
{
return raceClass.RaceID == raceId;
});
if (raceItr == _classExpansionRequirementStore.end())
return nullptr;
auto classItr = std::find_if(raceItr->Classes.begin(), raceItr->Classes.end(), [classId](ClassAvailability const& classAvailability)
{
return classAvailability.ClassID == classId;
});
if (classItr == raceItr->Classes.end())
return nullptr;
return &(*classItr);
}
PlayerChoice const* ObjectMgr::GetPlayerChoice(int32 choiceId) const
{
return Trinity::Containers::MapGetValuePtr(_playerChoices, choiceId);
+16 -9
View File
@@ -934,6 +934,19 @@ struct PhaseAreaInfo
ConditionContainer Conditions;
};
struct ClassAvailability
{
uint8 ClassID = 0;
uint8 ActiveExpansionLevel = 0;
uint8 AccountExpansionLevel = 0;
};
struct RaceClassAvailability
{
uint8 RaceID = 0;
std::vector<ClassAvailability> Classes;
};
struct RaceUnlockRequirement
{
uint8 Expansion;
@@ -1587,14 +1600,8 @@ class TC_GAME_API ObjectMgr
return nullptr;
}
std::unordered_map<uint8, uint8> const& GetClassExpansionRequirements() const { return _classExpansionRequirementStore; }
uint8 GetClassExpansionRequirement(uint8 class_) const
{
auto itr = _classExpansionRequirementStore.find(class_);
if (itr != _classExpansionRequirementStore.end())
return itr->second;
return EXPANSION_CLASSIC;
}
std::vector<RaceClassAvailability> const& GetClassExpansionRequirements() const { return _classExpansionRequirementStore; }
ClassAvailability const* GetClassExpansionRequirement(uint8 raceId, uint8 classId) const;
SceneTemplate const* GetSceneTemplate(uint32 sceneId) const
{
@@ -1771,7 +1778,7 @@ class TC_GAME_API ObjectMgr
std::set<uint32> _hasDifficultyEntries[MAX_CREATURE_DIFFICULTIES]; // already loaded creatures with difficulty 1 values, used in CheckCreatureTemplate
std::unordered_map<uint8, RaceUnlockRequirement> _raceUnlockRequirementStore;
std::unordered_map<uint8, uint8> _classExpansionRequirementStore;
std::vector<RaceClassAvailability> _classExpansionRequirementStore;
RealmNameContainer _realmNameStore;
SceneTemplateContainer _sceneTemplateStore;
@@ -65,7 +65,7 @@ void WorldSession::SendAuctionHello(ObjectGuid guid, Creature* unit)
WorldPackets::AuctionHouse::AuctionHelloResponse auctionHelloResponse;
auctionHelloResponse.Guid = guid;
auctionHelloResponse.OpenForBusiness = true; // 3.3.3: 1 - AH enabled, 0 - AH disabled
auctionHelloResponse.OpenForBusiness = false; // 3.3.3: 1 - AH enabled, 0 - AH disabled
SendPacket(auctionHelloResponse.Write());
}
+4 -3
View File
@@ -20,6 +20,7 @@
#include "BattlenetRpcErrorCodes.h"
#include "CharacterTemplateDataStore.h"
#include "ClientConfigPackets.h"
#include "GameTime.h"
#include "ObjectMgr.h"
#include "RBAC.h"
#include "Realm.h"
@@ -35,16 +36,16 @@ void WorldSession::SendAuthResponse(uint32 code, bool queued, uint32 queuePos)
{
response.SuccessInfo = boost::in_place();
response.SuccessInfo->AccountExpansionLevel = GetAccountExpansion();
response.SuccessInfo->ActiveExpansionLevel = GetExpansion();
response.SuccessInfo->AccountExpansionLevel = GetAccountExpansion();
response.SuccessInfo->VirtualRealmAddress = realm.Id.GetAddress();
response.SuccessInfo->Time = int32(time(nullptr));
response.SuccessInfo->Time = int32(GameTime::GetGameTime());
// Send current home realm. Also there is no need to send it later in realm queries.
response.SuccessInfo->VirtualRealms.emplace_back(realm.Id.GetAddress(), true, false, realm.Name, realm.NormalizedName);
if (HasPermission(rbac::RBAC_PERM_USE_CHARACTER_TEMPLATES))
for (auto const& templ : sCharacterTemplateDataStore->GetCharacterTemplates())
for (auto&& templ : sCharacterTemplateDataStore->GetCharacterTemplates())
response.SuccessInfo->Templates.push_back(&templ.second);
response.SuccessInfo->AvailableClasses = &sObjectMgr->GetClassExpansionRequirements();
+12 -4
View File
@@ -517,11 +517,19 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
//}
// prevent character creating Expansion class without Expansion account
uint8 classExpansionRequirement = sObjectMgr->GetClassExpansionRequirement(charCreate.CreateInfo->Class);
if (classExpansionRequirement > GetAccountExpansion())
ClassAvailability const* classExpansionRequirement = sObjectMgr->GetClassExpansionRequirement(charCreate.CreateInfo->Race, charCreate.CreateInfo->Class);
if (!classExpansionRequirement)
{
TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character with expansion %u class (%u)",
GetAccountExpansion(), GetAccountId(), classExpansionRequirement, charCreate.CreateInfo->Class);
TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character for race/class combination that is missing requirements in db (%u/%u)",
GetAccountExpansion(), GetAccountId(), uint32(charCreate.CreateInfo->Race), uint32(charCreate.CreateInfo->Class));
SendCharCreate(CHAR_CREATE_EXPANSION_CLASS);
return;
}
if (classExpansionRequirement->ActiveExpansionLevel > GetExpansion() || classExpansionRequirement->AccountExpansionLevel > GetAccountExpansion())
{
TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character with expansion %u race/class (%u/%u)",
GetAccountExpansion(), GetAccountId(), uint32(charCreate.CreateInfo->Race), uint32(charCreate.CreateInfo->Class));
SendCharCreate(CHAR_CREATE_EXPANSION_CLASS);
return;
}
@@ -110,6 +110,7 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObj
WorldPackets::Query::QueryGameObjectResponse response;
response.GameObjectID = packet.GameObjectID;
response.Guid = packet.Guid;
SendPacket(response.Write());
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE");
}
@@ -109,11 +109,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Auth::AuthWaitInfo const&
return data;
}
WorldPackets::Auth::AuthResponse::AuthResponse()
: ServerPacket(SMSG_AUTH_RESPONSE, 132)
{
}
WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
{
_worldPacket << uint32(Result);
@@ -134,10 +129,17 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
_worldPacket << uint32(SuccessInfo->CurrencyID);
_worldPacket << int32(SuccessInfo->Time);
for (auto const& klass : *SuccessInfo->AvailableClasses)
for (RaceClassAvailability const& raceClassAvailability : *SuccessInfo->AvailableClasses)
{
_worldPacket << uint8(klass.first); /// the current class
_worldPacket << uint8(klass.second); /// the required Expansion
_worldPacket << uint8(raceClassAvailability.RaceID);
_worldPacket << uint32(raceClassAvailability.Classes.size());
for (ClassAvailability const& classAvailability : raceClassAvailability.Classes)
{
_worldPacket << uint8(classAvailability.ClassID);
_worldPacket << uint8(classAvailability.ActiveExpansionLevel);
_worldPacket << uint8(classAvailability.AccountExpansionLevel);
}
}
_worldPacket.WriteBit(SuccessInfo->IsExpansionTrial);
@@ -25,6 +25,7 @@
#include <unordered_map>
struct CharacterTemplate;
struct RaceClassAvailability;
namespace WorldPackets
{
@@ -137,8 +138,8 @@ namespace WorldPackets
bool InGameRoom = false;
};
uint8 AccountExpansionLevel = 0; ///< the current expansion of this account, the possible values are in @ref Expansions
uint8 ActiveExpansionLevel = 0; ///< the current server expansion, the possible values are in @ref Expansions
uint8 AccountExpansionLevel = 0; ///< the current expansion of this account, the possible values are in @ref Expansions
uint32 TimeRested = 0; ///< affects the return value of the GetBillingTimeRested() client API call, it is the number of seconds you have left until the experience points and loot you receive from creatures and quests is reduced. It is only used in the Asia region in retail, it's not implemented in TC and will probably never be.
uint32 VirtualRealmAddress = 0; ///< a special identifier made from the Index, BattleGroup and Region.
@@ -151,7 +152,7 @@ namespace WorldPackets
std::vector<VirtualRealmInfo> VirtualRealms; ///< list of realms connected to this one (inclusive) @todo implement
std::vector<CharacterTemplate const*> Templates; ///< list of pre-made character templates.
std::unordered_map<uint8, uint8> const* AvailableClasses = nullptr; ///< the minimum AccountExpansion required to select the classes
std::vector<RaceClassAvailability> const* AvailableClasses = nullptr; ///< the minimum AccountExpansion required to select race/class combinations
bool IsExpansionTrial = false;
bool ForceCharacterTemplate = false; ///< forces the client to always use a character template when creating a new character. @see Templates. @todo implement
@@ -160,7 +161,7 @@ namespace WorldPackets
Optional<int32> ExpansionTrialExpiration; ///< expansion trial expiration unix timestamp
};
AuthResponse();
AuthResponse() : ServerPacket(SMSG_AUTH_RESPONSE, 132) { }
WorldPacket const* Write() override;
@@ -170,12 +170,21 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters
data << uint32(charInfo.Unknown703);
data << uint32(charInfo.LastLoginVersion);
data << uint32(charInfo.Flags4);
data << uint32(charInfo.Unknown830.size());
data.WriteBits(charInfo.Name.length(), 6);
data.WriteBit(charInfo.FirstLogin);
data.WriteBit(charInfo.BoostInProgress);
data.WriteBits(charInfo.unkWod61x, 5);
for (std::string const& str : charInfo.Unknown830)
data.WriteBits(str.length() + 1, 6);
data.FlushBits();
for (std::string const& str : charInfo.Unknown830)
if (!str.empty())
data << str;
data.WriteString(charInfo.Name);
return data;
@@ -166,6 +166,8 @@ namespace WorldPackets
};
std::array<VisualItemInfo, 23> VisualItems = { };
std::vector<std::string> Unknown830; // Something with character names, same length limit as name,
// client accepts unlimited number of these in packet but only uses first 3
};
struct RaceUnlock
@@ -121,6 +121,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonTalent const& talent)
{
data << int32(talent.GarrTalentID);
data << int32(talent.Rank);
data << int32(talent.ResearchStartTime);
data << int32(talent.Flags);
@@ -156,18 +157,18 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonInfo co
data << *mission;
for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionRewards)
{
data << uint32(missionReward.size());
for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionRewards)
for (WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem : missionReward)
data << missionRewardItem;
}
for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards)
{
data << uint32(missionReward.size());
for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards)
for (WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem : missionReward)
data << missionRewardItem;
}
for (WorldPackets::Garrison::GarrisonMissionBonusAbility const* areaBonus : garrison.MissionAreaBonuses)
data << *areaBonus;
@@ -131,6 +131,7 @@ namespace WorldPackets
struct GarrisonTalent
{
int32 GarrTalentID = 0;
int32 Rank = 0;
time_t ResearchStartTime = time_t(0);
int32 Flags = 0;
};
@@ -269,6 +269,7 @@ void WorldPackets::Query::QueryGameObject::Read()
WorldPacket const* WorldPackets::Query::QueryGameObjectResponse::Write()
{
_worldPacket << GameObjectID;
_worldPacket << Guid;
_worldPacket.WriteBit(Allow);
_worldPacket.FlushBits();
@@ -239,6 +239,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
uint32 GameObjectID = 0;
ObjectGuid Guid;
bool Allow = false;
GameObjectStats Stats;
};
@@ -25,6 +25,8 @@ WorldPacket const* WorldPackets::Scenes::PlayScene::Write()
_worldPacket << int32(SceneScriptPackageID);
_worldPacket << TransportGUID;
_worldPacket << Location.PositionXYZOStream();
_worldPacket.WriteBit(PerformTactCallbacks);
_worldPacket.FlushBits();
return &_worldPacket;
}
@@ -38,6 +38,7 @@ namespace WorldPackets
int32 SceneScriptPackageID = 0;
ObjectGuid TransportGUID;
Position Location;
bool PerformTactCallbacks = false;
};
class TC_GAME_API CancelScene final : public ServerPacket
@@ -65,7 +65,6 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write()
_worldPacket.WriteBit(WillKickFromWorld);
_worldPacket.WriteBit(KioskModeEnabled);
_worldPacket.WriteBit(CompetitiveModeEnabled);
_worldPacket.WriteBit(RaceClassExpansionLevels.is_initialized());
_worldPacket.WriteBit(TokenBalanceEnabled);
_worldPacket.WriteBit(WarModeFeatureEnabled);
_worldPacket.WriteBit(ClubsEnabled);
@@ -113,13 +112,6 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write()
_worldPacket << int32(SessionAlert->DisplayTime);
}
if (RaceClassExpansionLevels)
{
_worldPacket << uint32(RaceClassExpansionLevels->size());
if (!RaceClassExpansionLevels->empty())
_worldPacket.append(RaceClassExpansionLevels->data(), RaceClassExpansionLevels->size());
}
{
_worldPacket.WriteBit(VoiceChatManagerSettings.IsSquelched);
_worldPacket << VoiceChatManagerSettings.BnetAccountGuid;
@@ -145,7 +145,6 @@ namespace WorldPackets
bool IsMuted = false;
bool ClubFinderEnabled = false;
Optional<std::vector<uint8>> RaceClassExpansionLevels;
SocialQueueConfig QuickJoinConfig;
VoiceChatProxySettings VoiceChatManagerSettings;
RafSystemFeatureInfo RAFSystem;
+26 -13
View File
@@ -163,15 +163,22 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_ARTIFACT_SET_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArtifactSetAppearance);
DEFINE_HANDLER(CMSG_ATTACK_STOP, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAttackStopOpcode);
DEFINE_HANDLER(CMSG_ATTACK_SWING, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAttackSwingOpcode);
DEFINE_HANDLER(CMSG_AUCTION_BROWSE_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_HELLO_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionHelloOpcode);
DEFINE_HANDLER(CMSG_AUCTION_LIST_BIDDER_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListBidderItems);
DEFINE_HANDLER(CMSG_AUCTION_LIST_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListItems);
DEFINE_HANDLER(CMSG_AUCTION_LIST_OWNER_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListOwnerItems);
DEFINE_HANDLER(CMSG_AUCTION_LIST_PENDING_SALES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListPendingSales);
DEFINE_HANDLER(CMSG_AUCTION_PLACE_BID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionPlaceBid);
DEFINE_HANDLER(CMSG_AUCTION_REMOVE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionRemoveItem);
DEFINE_HANDLER(CMSG_AUCTION_REPLICATE_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReplicateItems);
DEFINE_HANDLER(CMSG_AUCTION_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionSellItem);
DEFINE_HANDLER(CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_LIST_BIDDER_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_LIST_ITEMS_BY_BUCKET_KEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_LIST_ITEMS_BY_ITEM_ID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_LIST_ITEMS_BY_ITEM_KEYS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_LIST_OWNER_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_PLACE_BID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_REMOVE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_REPLICATE_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_SELL_COMMODITY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_SELL_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_SET_FAVORITE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUCTION_START_COMMODITIES_PURCHASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_AUTH_CONTINUED_SESSION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess);
DEFINE_HANDLER(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess);
DEFINE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankItemOpcode);
@@ -618,6 +625,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyInviteOpcode);
DEFINE_HANDLER(CMSG_PARTY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyInviteResponseOpcode);
DEFINE_HANDLER(CMSG_PARTY_UNINVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyUninviteOpcode);
DEFINE_HANDLER(CMSG_PERFORM_ITEM_INTERACTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_PETITION_BUY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionBuy);
DEFINE_HANDLER(CMSG_PETITION_RENAME_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionRenameGuild);
DEFINE_HANDLER(CMSG_PETITION_SHOW_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionShowList);
@@ -931,14 +939,16 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_SWING_LANDED_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_CLOSED_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_COMMODITY_PRICE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_HELLO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_PENDING_SALES_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_BUCKET_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_FAVORITE_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OUTBID_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_BID_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REPLICATE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REPLICATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_WON_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_POINTS_DEPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1370,6 +1380,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_INTERACTION_OPEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_INTERACTION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1885,6 +1897,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO_IS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_MAP_INTERACTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_QUEST_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_SERVER_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
File diff suppressed because it is too large Load Diff