Core/PacketIO: Updated packets to 8.3.0
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user