Core: Update to 10.2.7
Port From (https://github.com/TrinityCore/TrinityCore/commit/468a06baf046b716305ee665e3cfd93c80e99457)
This commit is contained in:
@@ -751,7 +751,13 @@ namespace Framework.Constants
|
|||||||
CompleteTrackingQuest = 250, /*NYI*/
|
CompleteTrackingQuest = 250, /*NYI*/
|
||||||
|
|
||||||
GainLevels = 253, // Gain levels
|
GainLevels = 253, // Gain levels
|
||||||
Count = 257
|
|
||||||
|
CompleteQuestsCountOnAccount = 257, /*NYI*/
|
||||||
|
|
||||||
|
WarbandBankTabPurchased = 260, /*NYI*/
|
||||||
|
|
||||||
|
LearnTaxiNode = 262,
|
||||||
|
Count = 263
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum CriteriaDataType
|
public enum CriteriaDataType
|
||||||
|
|||||||
@@ -73,55 +73,56 @@ namespace Framework.Constants
|
|||||||
CharCreateClassTrialThrottleWeek = 60,
|
CharCreateClassTrialThrottleWeek = 60,
|
||||||
CharCreateClassTrialThrottleAccount = 61,
|
CharCreateClassTrialThrottleAccount = 61,
|
||||||
CharCreateFactionBalance = 62,
|
CharCreateFactionBalance = 62,
|
||||||
|
CharCreateTimerunning = 63,
|
||||||
|
|
||||||
CharDeleteInProgress = 63,
|
CharDeleteInProgress = 64,
|
||||||
CharDeleteSuccess = 64,
|
CharDeleteSuccess = 65,
|
||||||
CharDeleteFailed = 65,
|
CharDeleteFailed = 66,
|
||||||
CharDeleteFailedCharacterServicePending = 66,
|
CharDeleteFailedCharacterServicePending = 67,
|
||||||
CharDeleteFailedGuildLeader = 67,
|
CharDeleteFailedGuildLeader = 68,
|
||||||
CharDeleteFailedArenaCaptain = 68,
|
CharDeleteFailedArenaCaptain = 69,
|
||||||
CharDeleteFailedHasHeirloomOrMail = 69,
|
CharDeleteFailedHasHeirloomOrMail = 70,
|
||||||
CharDeleteFailedDeprecated1 = 70,
|
CharDeleteFailedDeprecated1 = 71,
|
||||||
CharDeleteFailedHasWowToken = 71,
|
CharDeleteFailedHasWowToken = 72,
|
||||||
CharDeleteFailedDeprecated2 = 72,
|
CharDeleteFailedDeprecated2 = 73,
|
||||||
CharDeleteFailedCommunityOwner = 73,
|
CharDeleteFailedCommunityOwner = 74,
|
||||||
|
|
||||||
CharLoginInProgress = 74,
|
CharLoginInProgress = 75,
|
||||||
CharLoginSuccess = 75,
|
CharLoginSuccess = 76,
|
||||||
CharLoginNoWorld = 76,
|
CharLoginNoWorld = 77,
|
||||||
CharLoginDuplicateCharacter = 77,
|
CharLoginDuplicateCharacter = 78,
|
||||||
CharLoginNoInstances = 78,
|
CharLoginNoInstances = 79,
|
||||||
CharLoginFailed = 79,
|
CharLoginFailed = 80,
|
||||||
CharLoginDisabled = 80,
|
CharLoginDisabled = 81,
|
||||||
CharLoginNoCharacter = 81,
|
CharLoginNoCharacter = 82,
|
||||||
CharLoginLockedForTransfer = 82,
|
CharLoginLockedForTransfer = 83,
|
||||||
CharLoginLockedByBilling = 83,
|
CharLoginLockedByBilling = 84,
|
||||||
CharLoginLockedByMobileAh = 84,
|
CharLoginLockedByMobileAh = 85,
|
||||||
CharLoginTemporaryGmLock = 85,
|
CharLoginTemporaryGmLock = 86,
|
||||||
CharLoginLockedByCharacterUpgrade = 86,
|
CharLoginLockedByCharacterUpgrade = 87,
|
||||||
CharLoginLockedByRevokedCharacterUpgrade = 87,
|
CharLoginLockedByRevokedCharacterUpgrade = 88,
|
||||||
CharLoginLockedByRevokedVasTransaction = 88,
|
CharLoginLockedByRevokedVasTransaction = 89,
|
||||||
CharLoginLockedByRestriction = 89,
|
CharLoginLockedByRestriction = 90,
|
||||||
CharLoginLockedForRealmPlaytype = 90,
|
CharLoginLockedForRealmPlaytype = 91,
|
||||||
|
|
||||||
CharNameSuccess = 91,
|
CharNameSuccess = 92,
|
||||||
CharNameFailure = 92,
|
CharNameFailure = 93,
|
||||||
CharNameNoName = 93,
|
CharNameNoName = 94,
|
||||||
CharNameTooShort = 94,
|
CharNameTooShort = 95,
|
||||||
CharNameTooLong = 95,
|
CharNameTooLong = 96,
|
||||||
CharNameInvalidCharacter = 96,
|
CharNameInvalidCharacter = 97,
|
||||||
CharNameMixedLanguages = 97,
|
CharNameMixedLanguages = 98,
|
||||||
CharNameProfane = 98,
|
CharNameProfane = 99,
|
||||||
CharNameReserved = 99,
|
CharNameReserved = 100,
|
||||||
CharNameInvalidApostrophe = 100,
|
CharNameInvalidApostrophe = 101,
|
||||||
CharNameMultipleApostrophes = 101,
|
CharNameMultipleApostrophes = 102,
|
||||||
CharNameThreeConsecutive = 102,
|
CharNameThreeConsecutive = 103,
|
||||||
CharNameInvalidSpace = 103,
|
CharNameInvalidSpace = 104,
|
||||||
CharNameConsecutiveSpaces = 104,
|
CharNameConsecutiveSpaces = 105,
|
||||||
CharNameRussianConsecutiveSilentCharacters = 105,
|
CharNameRussianConsecutiveSilentCharacters = 106,
|
||||||
CharNameRussianSilentCharacterAtBeginningOrEnd = 106,
|
CharNameRussianSilentCharacterAtBeginningOrEnd = 107,
|
||||||
CharNameDeclensionDoesntMatchBaseName = 107,
|
CharNameDeclensionDoesntMatchBaseName = 108,
|
||||||
CharNameSpacesDisallowed = 108,
|
CharNameSpacesDisallowed = 109,
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum CharacterUndeleteResult
|
public enum CharacterUndeleteResult
|
||||||
|
|||||||
@@ -415,7 +415,7 @@ namespace Framework.Constants
|
|||||||
CraftingReagentSlot12 = 55,
|
CraftingReagentSlot12 = 55,
|
||||||
CraftingReagentSlot13 = 56,
|
CraftingReagentSlot13 = 56,
|
||||||
CraftingReagentSlot14 = 57,
|
CraftingReagentSlot14 = 57,
|
||||||
|
Reforge = 58,
|
||||||
|
|
||||||
Max
|
Max
|
||||||
}
|
}
|
||||||
@@ -558,6 +558,11 @@ namespace Framework.Constants
|
|||||||
TemplateCharacter2 = 98,
|
TemplateCharacter2 = 98,
|
||||||
TemplateCharacter3 = 99,
|
TemplateCharacter3 = 99,
|
||||||
TemplateCharacter4 = 100,
|
TemplateCharacter4 = 100,
|
||||||
|
DungeonNormalJackpot = 101,
|
||||||
|
DungeonHeroicJackpot = 102,
|
||||||
|
DungeonMythicJackpot = 103,
|
||||||
|
Delves = 104,
|
||||||
|
Timerunning = 105,
|
||||||
|
|
||||||
Max
|
Max
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -35,7 +35,8 @@ namespace Framework.Constants
|
|||||||
public enum PetStableFlags
|
public enum PetStableFlags
|
||||||
{
|
{
|
||||||
Active = 0x1,
|
Active = 0x1,
|
||||||
Inactive = 0x2
|
Inactive = 0x2,
|
||||||
|
Favorite = 0x8
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum PetSpellState
|
public enum PetSpellState
|
||||||
|
|||||||
@@ -148,7 +148,8 @@ namespace Framework.Constants
|
|||||||
Mobile = 0x40,
|
Mobile = 0x40,
|
||||||
Guide = 0x1000,
|
Guide = 0x1000,
|
||||||
Newcomer = 0x2000,
|
Newcomer = 0x2000,
|
||||||
Censored = 0x4000
|
Censored = 0x4000,
|
||||||
|
Timerunning = 0x8000
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum DrunkenState
|
public enum DrunkenState
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -349,8 +349,9 @@ namespace Framework.Database
|
|||||||
" FROM conditional_content_tuning WHERE (`VerifiedBuild` > 0) = ?");
|
" FROM conditional_content_tuning WHERE (`VerifiedBuild` > 0) = ?");
|
||||||
|
|
||||||
// ContentTuning.db2
|
// ContentTuning.db2
|
||||||
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, MinLevel, MaxLevel, MinLevelType, MaxLevelType, TargetLevelDelta, " +
|
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, HealthItemLevelCurveID, DamageItemLevelCurveID, MinLevel, MaxLevel, " +
|
||||||
"TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel, QuestXpMultiplier FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?");
|
"MinLevelType, MaxLevelType, TargetLevelDelta, TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel, QuestXpMultiplier" +
|
||||||
|
" FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?");
|
||||||
|
|
||||||
// ContentTuningXExpected.db2
|
// ContentTuningXExpected.db2
|
||||||
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MinMythicPlusSeasonID, MaxMythicPlusSeasonID, " +
|
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MinMythicPlusSeasonID, MaxMythicPlusSeasonID, " +
|
||||||
@@ -767,7 +768,7 @@ namespace Framework.Database
|
|||||||
|
|
||||||
// ItemModifiedAppearance.db2
|
// ItemModifiedAppearance.db2
|
||||||
PrepareStatement(HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, ItemAppearanceModifierID, ItemAppearanceID, OrderIndex, " +
|
PrepareStatement(HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, ItemAppearanceModifierID, ItemAppearanceID, OrderIndex, " +
|
||||||
"TransmogSourceTypeEnum FROM item_modified_appearance WHERE (`VerifiedBuild` > 0) = ?");
|
"TransmogSourceTypeEnum Flags, FROM item_modified_appearance WHERE (`VerifiedBuild` > 0) = ?");
|
||||||
|
|
||||||
// ItemModifiedAppearanceExtra.db2
|
// ItemModifiedAppearanceExtra.db2
|
||||||
PrepareStatement(HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE_EXTRA, "SELECT ID, IconFileDataID, UnequippedIconFileDataID, SheatheType, " +
|
PrepareStatement(HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE_EXTRA, "SELECT ID, IconFileDataID, UnequippedIconFileDataID, SheatheType, " +
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace Game.DataStorage
|
|||||||
public uint Id;
|
public uint Id;
|
||||||
public short InstanceID;
|
public short InstanceID;
|
||||||
public AchievementFaction Faction;
|
public AchievementFaction Faction;
|
||||||
public ushort Supercedes;
|
public int Supercedes;
|
||||||
public ushort Category;
|
public ushort Category;
|
||||||
public byte MinimumCriteria;
|
public byte MinimumCriteria;
|
||||||
public byte Points;
|
public byte Points;
|
||||||
|
|||||||
@@ -386,6 +386,8 @@ namespace Game.DataStorage
|
|||||||
public uint Id;
|
public uint Id;
|
||||||
public int Flags;
|
public int Flags;
|
||||||
public int ExpansionID;
|
public int ExpansionID;
|
||||||
|
public int HealthItemLevelCurveID;
|
||||||
|
public int DamageItemLevelCurveID;
|
||||||
public int MinLevel;
|
public int MinLevel;
|
||||||
public int MaxLevel;
|
public int MaxLevel;
|
||||||
public int MinLevelType;
|
public int MinLevelType;
|
||||||
|
|||||||
@@ -286,6 +286,7 @@ namespace Game.DataStorage
|
|||||||
public int ItemAppearanceID;
|
public int ItemAppearanceID;
|
||||||
public int OrderIndex;
|
public int OrderIndex;
|
||||||
public byte TransmogSourceTypeEnum;
|
public byte TransmogSourceTypeEnum;
|
||||||
|
public int Flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class ItemModifiedAppearanceExtraRecord
|
public sealed class ItemModifiedAppearanceExtraRecord
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -957,16 +957,46 @@ namespace Game.Entities
|
|||||||
|
|
||||||
if (srcPetIndex >= 0)
|
if (srcPetIndex >= 0)
|
||||||
{
|
{
|
||||||
|
PetStableFlags flagToAdd, flagToRemove;
|
||||||
|
if (SharedConst.IsActivePetSlot(dstPetSlot))
|
||||||
|
{
|
||||||
|
flagToAdd = PetStableFlags.Active;
|
||||||
|
flagToRemove = PetStableFlags.Inactive;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
flagToAdd = PetStableFlags.Inactive;
|
||||||
|
flagToRemove = PetStableFlags.Active;
|
||||||
|
}
|
||||||
|
|
||||||
StableInfo stableInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetStable);
|
StableInfo stableInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetStable);
|
||||||
StablePetInfo stablePetInfo = stableInfo.ModifyValue(stableInfo.Pets, srcPetIndex);
|
StablePetInfo stablePetInfo = stableInfo.ModifyValue(stableInfo.Pets, srcPetIndex);
|
||||||
|
|
||||||
SetUpdateFieldValue(stablePetInfo.ModifyValue(stablePetInfo.PetSlot), (uint)dstPetSlot);
|
SetUpdateFieldValue(stablePetInfo.ModifyValue(stablePetInfo.PetSlot), (uint)dstPetSlot);
|
||||||
|
SetUpdateFieldFlagValue(stablePetInfo.ModifyValue(stablePetInfo.PetFlags), (byte)flagToAdd);
|
||||||
|
RemoveUpdateFieldFlagValue(stablePetInfo.ModifyValue(stablePetInfo.PetFlags), (byte)flagToRemove);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dstPetIndex >= 0)
|
if (dstPetIndex >= 0)
|
||||||
{
|
{
|
||||||
|
PetStableFlags flagToAdd, flagToRemove;
|
||||||
|
if (SharedConst.IsActivePetSlot(srcPetSlot))
|
||||||
|
{
|
||||||
|
flagToAdd = PetStableFlags.Active;
|
||||||
|
flagToRemove = PetStableFlags.Inactive;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
flagToAdd = PetStableFlags.Inactive;
|
||||||
|
flagToRemove = PetStableFlags.Active;
|
||||||
|
}
|
||||||
|
|
||||||
StableInfo stableInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetStable);
|
StableInfo stableInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetStable);
|
||||||
StablePetInfo stablePetInfo = stableInfo.ModifyValue(stableInfo.Pets, dstPetIndex);
|
StablePetInfo stablePetInfo = stableInfo.ModifyValue(stableInfo.Pets, dstPetIndex);
|
||||||
|
|
||||||
SetUpdateFieldValue(stablePetInfo.ModifyValue(stablePetInfo.PetSlot), (uint)srcPetSlot);
|
SetUpdateFieldValue(stablePetInfo.ModifyValue(stablePetInfo.PetSlot), (uint)srcPetSlot);
|
||||||
|
SetUpdateFieldFlagValue(stablePetInfo.ModifyValue(stablePetInfo.PetFlags), (byte)flagToAdd);
|
||||||
|
RemoveUpdateFieldFlagValue(stablePetInfo.ModifyValue(stablePetInfo.PetFlags), (byte)flagToRemove);
|
||||||
}
|
}
|
||||||
|
|
||||||
sess.SendPetStableResult(StableResult.StableSuccess);
|
sess.SendPetStableResult(StableResult.StableSuccess);
|
||||||
@@ -4745,6 +4775,48 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DeletePetFromDB(uint petNumber)
|
||||||
|
{
|
||||||
|
if (m_activePlayerData.PetStable.HasValue())
|
||||||
|
{
|
||||||
|
int ufIndex = m_activePlayerData.PetStable.GetValue().Pets.FindIndexIf(p => p.PetNumber == petNumber);
|
||||||
|
if (ufIndex >= 0)
|
||||||
|
{
|
||||||
|
StableInfo stableInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetStable);
|
||||||
|
RemoveDynamicUpdateFieldValue(stableInfo.ModifyValue(stableInfo.Pets), ufIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_petStable == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var petIndex = m_petStable.GetCurrentActivePetIndex();
|
||||||
|
if (petIndex.HasValue)
|
||||||
|
if (m_petStable.ActivePets[petIndex.Value] != null && m_petStable.ActivePets[petIndex.Value].PetNumber == petNumber)
|
||||||
|
m_petStable.CurrentPetIndex = null;
|
||||||
|
|
||||||
|
bool foundPet = false;
|
||||||
|
|
||||||
|
void FindAndRemovePet(PetStable.PetInfo[] pets)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < pets.Length; ++i)
|
||||||
|
{
|
||||||
|
var pet = pets[i];
|
||||||
|
if (pet != null && pet.PetNumber == petNumber && pet.Type == PetType.Hunter)
|
||||||
|
{
|
||||||
|
pets[i] = null;
|
||||||
|
foundPet = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
FindAndRemovePet(m_petStable.ActivePets);
|
||||||
|
FindAndRemovePet(m_petStable.StabledPets);
|
||||||
|
|
||||||
|
if (foundPet)
|
||||||
|
Pet.DeleteFromDB(petNumber);
|
||||||
|
}
|
||||||
|
|
||||||
public void SendTameFailure(PetTameResult result)
|
public void SendTameFailure(PetTameResult result)
|
||||||
{
|
{
|
||||||
PetTameFailure petTameFailure = new();
|
PetTameFailure petTameFailure = new();
|
||||||
@@ -5368,6 +5440,8 @@ namespace Game.Entities
|
|||||||
tag |= ChatFlags.AFK;
|
tag |= ChatFlags.AFK;
|
||||||
if (IsDeveloper())
|
if (IsDeveloper())
|
||||||
tag |= ChatFlags.Dev;
|
tag |= ChatFlags.Dev;
|
||||||
|
if (m_activePlayerData.TimerunningSeasonID != 0)
|
||||||
|
tag |= ChatFlags.Timerunning;
|
||||||
|
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -417,6 +417,12 @@ namespace Game
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (charCreate.CreateInfo.TimerunningSeasonID != 0)
|
||||||
|
{
|
||||||
|
SendCharCreate(ResponseCodes.CharCreateTimerunning);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CharacterCreateInfo createInfo = charCreate.CreateInfo;
|
CharacterCreateInfo createInfo = charCreate.CreateInfo;
|
||||||
PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_CHECK_NAME);
|
PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_CHECK_NAME);
|
||||||
stmt.AddValue(0, charCreate.CreateInfo.Name);
|
stmt.AddValue(0, charCreate.CreateInfo.Name);
|
||||||
|
|||||||
@@ -63,9 +63,9 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
[WorldPacketHandler(ClientOpcodes.ChatMessageWhisper)]
|
[WorldPacketHandler(ClientOpcodes.ChatMessageWhisper)]
|
||||||
void HandleChatMessageWhisper(ChatMessageWhisper packet)
|
void HandleChatMessageWhisper(ChatMessageWhisper chatMessageWhisper)
|
||||||
{
|
{
|
||||||
HandleChat(ChatMsg.Whisper, packet.Language, packet.Text, packet.Target);
|
HandleChat(ChatMsg.Whisper, chatMessageWhisper.Language, chatMessageWhisper.Text, chatMessageWhisper.Target, chatMessageWhisper.TargetGUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
[WorldPacketHandler(ClientOpcodes.ChatMessageChannel)]
|
[WorldPacketHandler(ClientOpcodes.ChatMessageChannel)]
|
||||||
@@ -80,7 +80,7 @@ namespace Game
|
|||||||
HandleChat(ChatMsg.Emote, Language.Universal, packet.Text);
|
HandleChat(ChatMsg.Emote, Language.Universal, packet.Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleChat(ChatMsg type, Language lang, string msg, string target = "", ObjectGuid channelGuid = default)
|
void HandleChat(ChatMsg type, Language lang, string msg, string target = "", ObjectGuid targetGuid = default)
|
||||||
{
|
{
|
||||||
Player sender = GetPlayer();
|
Player sender = GetPlayer();
|
||||||
|
|
||||||
@@ -204,15 +204,22 @@ namespace Game
|
|||||||
break;
|
break;
|
||||||
case ChatMsg.Whisper:
|
case ChatMsg.Whisper:
|
||||||
// @todo implement cross realm whispers (someday)
|
// @todo implement cross realm whispers (someday)
|
||||||
ExtendedPlayerName extName = ObjectManager.ExtractExtendedPlayerName(target);
|
Player receiver = null;
|
||||||
|
if (!targetGuid.IsEmpty())
|
||||||
if (!ObjectManager.NormalizePlayerName(ref extName.Name))
|
receiver = Global.ObjAccessor.FindConnectedPlayer(targetGuid);
|
||||||
|
else
|
||||||
{
|
{
|
||||||
SendChatPlayerNotfoundNotice(target);
|
ExtendedPlayerName extName = ObjectManager.ExtractExtendedPlayerName(target);
|
||||||
break;
|
|
||||||
|
if (!ObjectManager.NormalizePlayerName(ref extName.Name))
|
||||||
|
{
|
||||||
|
SendChatPlayerNotfoundNotice(target);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
receiver = Global.ObjAccessor.FindPlayerByName(extName.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
Player receiver = Global.ObjAccessor.FindPlayerByName(extName.Name);
|
|
||||||
if (receiver == null || (lang != Language.Addon && !receiver.IsAcceptWhispers() && receiver.GetSession().HasPermission(RBACPermissions.CanFilterWhispers) && !receiver.IsInWhisperWhiteList(sender.GetGUID())))
|
if (receiver == null || (lang != Language.Addon && !receiver.IsAcceptWhispers() && receiver.GetSession().HasPermission(RBACPermissions.CanFilterWhispers) && !receiver.IsInWhisperWhiteList(sender.GetGUID())))
|
||||||
{
|
{
|
||||||
SendChatPlayerNotfoundNotice(target);
|
SendChatPlayerNotfoundNotice(target);
|
||||||
@@ -331,7 +338,7 @@ namespace Game
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Channel chn = !channelGuid.IsEmpty() ? ChannelManager.GetChannelForPlayerByGuid(channelGuid, sender) : ChannelManager.GetChannelForPlayerByNamePart(target, sender);
|
Channel chn = !targetGuid.IsEmpty() ? ChannelManager.GetChannelForPlayerByGuid(targetGuid, sender) : ChannelManager.GetChannelForPlayerByNamePart(target, sender);
|
||||||
if (chn != null)
|
if (chn != null)
|
||||||
{
|
{
|
||||||
var chatChannel = CliDB.ChatChannelsStorage.LookupByKey(chn.GetChannelId());
|
var chatChannel = CliDB.ChatChannelsStorage.LookupByKey(chn.GetChannelId());
|
||||||
@@ -373,10 +380,23 @@ namespace Game
|
|||||||
[WorldPacketHandler(ClientOpcodes.ChatAddonMessageTargeted)]
|
[WorldPacketHandler(ClientOpcodes.ChatAddonMessageTargeted)]
|
||||||
void HandleChatAddonMessageTargeted(ChatAddonMessageTargeted chatAddonMessageTargeted)
|
void HandleChatAddonMessageTargeted(ChatAddonMessageTargeted chatAddonMessageTargeted)
|
||||||
{
|
{
|
||||||
HandleChatAddon(chatAddonMessageTargeted.Params.Type, chatAddonMessageTargeted.Params.Prefix, chatAddonMessageTargeted.Params.Text, chatAddonMessageTargeted.Params.IsLogged, chatAddonMessageTargeted.Target, chatAddonMessageTargeted.ChannelGUID);
|
switch (chatAddonMessageTargeted.Params.Type)
|
||||||
|
{
|
||||||
|
case ChatMsg.Whisper:
|
||||||
|
HandleChatAddon(chatAddonMessageTargeted.Params.Type, chatAddonMessageTargeted.Params.Prefix, chatAddonMessageTargeted.Params.Text,
|
||||||
|
chatAddonMessageTargeted.Params.IsLogged, chatAddonMessageTargeted.PlayerName, chatAddonMessageTargeted.PlayerGUID);
|
||||||
|
break;
|
||||||
|
case ChatMsg.Channel:
|
||||||
|
HandleChatAddon(chatAddonMessageTargeted.Params.Type, chatAddonMessageTargeted.Params.Prefix, chatAddonMessageTargeted.Params.Text,
|
||||||
|
chatAddonMessageTargeted.Params.IsLogged, chatAddonMessageTargeted.ChannelName, chatAddonMessageTargeted.ChannelGUID);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Log.outError(LogFilter.Misc, $"HandleChatAddonMessageTargetedOpcode: unknown addon message type {chatAddonMessageTargeted.Params.Type}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleChatAddon(ChatMsg type, string prefix, string text, bool isLogged, string target = "", ObjectGuid? channelGuid = null)
|
void HandleChatAddon(ChatMsg type, string prefix, string text, bool isLogged, string target = "", ObjectGuid? targetGuid = null)
|
||||||
{
|
{
|
||||||
Player sender = GetPlayer();
|
Player sender = GetPlayer();
|
||||||
|
|
||||||
@@ -403,12 +423,19 @@ namespace Game
|
|||||||
break;
|
break;
|
||||||
case ChatMsg.Whisper:
|
case ChatMsg.Whisper:
|
||||||
// @todo implement cross realm whispers (someday)
|
// @todo implement cross realm whispers (someday)
|
||||||
ExtendedPlayerName extName = ObjectManager.ExtractExtendedPlayerName(target);
|
Player receiver = null;
|
||||||
|
if (targetGuid.HasValue && !targetGuid.Value.IsEmpty())
|
||||||
|
receiver = Global.ObjAccessor.FindConnectedPlayer(targetGuid.Value);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ExtendedPlayerName extName = ObjectManager.ExtractExtendedPlayerName(target);
|
||||||
|
|
||||||
if (!ObjectManager.NormalizePlayerName(ref extName.Name))
|
if (!ObjectManager.NormalizePlayerName(ref extName.Name))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
receiver = Global.ObjAccessor.FindPlayerByName(extName.Name);
|
||||||
|
}
|
||||||
|
|
||||||
Player receiver = Global.ObjAccessor.FindPlayerByName(extName.Name);
|
|
||||||
if (receiver == null)
|
if (receiver == null)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -440,7 +467,7 @@ namespace Game
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ChatMsg.Channel:
|
case ChatMsg.Channel:
|
||||||
Channel chn = channelGuid.HasValue ? ChannelManager.GetChannelForPlayerByGuid(channelGuid.Value, sender) : ChannelManager.GetChannelForPlayerByNamePart(target, sender);
|
Channel chn = targetGuid.HasValue ? ChannelManager.GetChannelForPlayerByGuid(targetGuid.Value, sender) : ChannelManager.GetChannelForPlayerByNamePart(target, sender);
|
||||||
if (chn != null)
|
if (chn != null)
|
||||||
chn.AddonSay(sender.GetGUID(), prefix, text, isLogged);
|
chn.AddonSay(sender.GetGUID(), prefix, text, isLogged);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -593,6 +593,20 @@ namespace Game
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HandlePetAbandonByNumber(PetAbandonByNumber petAbandonByNumber)
|
||||||
|
{
|
||||||
|
Pet pet = _player.GetPet();
|
||||||
|
if (pet != null)
|
||||||
|
{
|
||||||
|
if (pet.IsHunterPet() && pet.m_unitData.PetNumber == petAbandonByNumber.PetNumber)
|
||||||
|
_player.RemovePet(pet, PetSaveMode.AsDeleted);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_player.DeletePetFromDB(petAbandonByNumber.PetNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[WorldPacketHandler(ClientOpcodes.PetSpellAutocast, Processing = PacketProcessing.Inplace)]
|
[WorldPacketHandler(ClientOpcodes.PetSpellAutocast, Processing = PacketProcessing.Inplace)]
|
||||||
void HandlePetSpellAutocast(PetSpellAutocast packet)
|
void HandlePetSpellAutocast(PetSpellAutocast packet)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -129,6 +129,7 @@ namespace Game
|
|||||||
data.Status = TaxiNodeStatus.Learned;
|
data.Status = TaxiNodeStatus.Learned;
|
||||||
SendPacket(data);
|
SendPacket(data);
|
||||||
|
|
||||||
|
GetPlayer().UpdateCriteria(CriteriaType.LearnTaxiNode, curloc);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteInt32(PreviousArenaSeason);
|
_worldPacket.WriteInt32(PreviousArenaSeason);
|
||||||
_worldPacket.WriteInt32(ConquestWeeklyProgressCurrencyID);
|
_worldPacket.WriteInt32(ConquestWeeklyProgressCurrencyID);
|
||||||
_worldPacket.WriteInt32(PvpSeasonID);
|
_worldPacket.WriteInt32(PvpSeasonID);
|
||||||
|
_worldPacket.WriteInt32(Unknown1027_1);
|
||||||
_worldPacket.WriteBit(WeeklyRewardChestsEnabled);
|
_worldPacket.WriteBit(WeeklyRewardChestsEnabled);
|
||||||
|
_worldPacket.WriteBit(Unknown1027_2);
|
||||||
|
_worldPacket.WriteBit(Unknown1027_3);
|
||||||
_worldPacket.FlushBits();
|
_worldPacket.FlushBits();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,7 +35,10 @@ namespace Game.Networking.Packets
|
|||||||
public int CurrentArenaSeason;
|
public int CurrentArenaSeason;
|
||||||
public int PvpSeasonID;
|
public int PvpSeasonID;
|
||||||
public int ConquestWeeklyProgressCurrencyID;
|
public int ConquestWeeklyProgressCurrencyID;
|
||||||
|
public int Unknown1027_1;
|
||||||
public bool WeeklyRewardChestsEnabled;
|
public bool WeeklyRewardChestsEnabled;
|
||||||
|
public bool Unknown1027_2;
|
||||||
|
public bool Unknown1027_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AreaSpiritHealerQuery : ClientPacket
|
public class AreaSpiritHealerQuery : ClientPacket
|
||||||
|
|||||||
@@ -202,6 +202,7 @@ namespace Game.Networking.Packets
|
|||||||
data.WriteInt32(MailSenderTypes.Count);
|
data.WriteInt32(MailSenderTypes.Count);
|
||||||
data.WriteUInt32(OverrideSelectScreenFileDataID);
|
data.WriteUInt32(OverrideSelectScreenFileDataID);
|
||||||
PersonalTabard.Write(data);
|
PersonalTabard.Write(data);
|
||||||
|
data.WriteInt32(TimerunningSeasonID);
|
||||||
|
|
||||||
foreach (ChrCustomizationChoice customization in Customizations)
|
foreach (ChrCustomizationChoice customization in Customizations)
|
||||||
{
|
{
|
||||||
@@ -255,6 +256,7 @@ namespace Game.Networking.Packets
|
|||||||
public int Unknown703;
|
public int Unknown703;
|
||||||
public int LastLoginVersion;
|
public int LastLoginVersion;
|
||||||
public uint OverrideSelectScreenFileDataID;
|
public uint OverrideSelectScreenFileDataID;
|
||||||
|
public int TimerunningSeasonID;
|
||||||
public uint PetCreatureDisplayId;
|
public uint PetCreatureDisplayId;
|
||||||
public uint PetExperienceLevel;
|
public uint PetExperienceLevel;
|
||||||
public uint PetCreatureFamilyId;
|
public uint PetCreatureFamilyId;
|
||||||
@@ -386,7 +388,7 @@ namespace Game.Networking.Packets
|
|||||||
CreateInfo.ClassId = (Class)_worldPacket.ReadUInt8();
|
CreateInfo.ClassId = (Class)_worldPacket.ReadUInt8();
|
||||||
CreateInfo.Sex = (Gender)_worldPacket.ReadUInt8();
|
CreateInfo.Sex = (Gender)_worldPacket.ReadUInt8();
|
||||||
var customizationCount = _worldPacket.ReadUInt32();
|
var customizationCount = _worldPacket.ReadUInt32();
|
||||||
|
CreateInfo.TimerunningSeasonID = _worldPacket.ReadInt32();
|
||||||
CreateInfo.Name = _worldPacket.ReadString(nameLength);
|
CreateInfo.Name = _worldPacket.ReadString(nameLength);
|
||||||
if (CreateInfo.TemplateSet.HasValue)
|
if (CreateInfo.TemplateSet.HasValue)
|
||||||
CreateInfo.TemplateSet = _worldPacket.ReadUInt32();
|
CreateInfo.TemplateSet = _worldPacket.ReadUInt32();
|
||||||
@@ -1137,6 +1139,7 @@ namespace Game.Networking.Packets
|
|||||||
public Gender Sex = Gender.None;
|
public Gender Sex = Gender.None;
|
||||||
public Array<ChrCustomizationChoice> Customizations = new(250);
|
public Array<ChrCustomizationChoice> Customizations = new(250);
|
||||||
public uint? TemplateSet;
|
public uint? TemplateSet;
|
||||||
|
public int TimerunningSeasonID;
|
||||||
public bool IsTrialBoost;
|
public bool IsTrialBoost;
|
||||||
public bool UseNPE;
|
public bool UseNPE;
|
||||||
public bool Unused1026;
|
public bool Unused1026;
|
||||||
|
|||||||
@@ -45,15 +45,30 @@ namespace Game.Networking.Packets
|
|||||||
public override void Read()
|
public override void Read()
|
||||||
{
|
{
|
||||||
Language = (Language)_worldPacket.ReadInt32();
|
Language = (Language)_worldPacket.ReadInt32();
|
||||||
uint targetLen = _worldPacket.ReadBits<uint>(9);
|
TargetGUID = _worldPacket.ReadPackedGuid();
|
||||||
|
TargetVirtualRealmAddress = _worldPacket.ReadUInt32();
|
||||||
|
|
||||||
|
uint targetLen = _worldPacket.ReadBits<uint>(6);
|
||||||
uint textLen = _worldPacket.ReadBits<uint>(11);
|
uint textLen = _worldPacket.ReadBits<uint>(11);
|
||||||
Target = _worldPacket.ReadString(targetLen);
|
|
||||||
Text = _worldPacket.ReadString(textLen);
|
if (targetLen > 1)
|
||||||
|
{
|
||||||
|
Target = _worldPacket.ReadString(targetLen - 1);
|
||||||
|
_worldPacket.Skip(1); // null terminator
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textLen > 1)
|
||||||
|
{
|
||||||
|
Text = _worldPacket.ReadString(textLen - 1);
|
||||||
|
_worldPacket.Skip(1); // null terminator
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Language Language = Language.Universal;
|
public Language Language = Language.Universal;
|
||||||
public string Text;
|
public ObjectGuid TargetGUID;
|
||||||
|
public uint TargetVirtualRealmAddress = 0;
|
||||||
public string Target;
|
public string Target;
|
||||||
|
public string Text;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ChatMessageChannel : ClientPacket
|
public class ChatMessageChannel : ClientPacket
|
||||||
@@ -98,15 +113,33 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public override void Read()
|
public override void Read()
|
||||||
{
|
{
|
||||||
uint targetLen = _worldPacket.ReadBits<uint>(9);
|
|
||||||
Params.Read(_worldPacket);
|
Params.Read(_worldPacket);
|
||||||
ChannelGUID = _worldPacket.ReadPackedGuid();
|
ChannelGUID = _worldPacket.ReadPackedGuid();
|
||||||
Target = _worldPacket.ReadString(targetLen);
|
PlayerGUID = _worldPacket.ReadPackedGuid();
|
||||||
|
PlayerVirtualRealmAddress = _worldPacket.ReadUInt32();
|
||||||
|
|
||||||
|
uint playerNameLength = _worldPacket.ReadBits<uint>(6);
|
||||||
|
uint channelNameLength = _worldPacket.ReadBits<uint>(6);
|
||||||
|
|
||||||
|
if (playerNameLength > 1)
|
||||||
|
{
|
||||||
|
PlayerName = _worldPacket.ReadString(playerNameLength - 1);
|
||||||
|
_worldPacket.Skip(1); // null terminator
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channelNameLength > 1)
|
||||||
|
{
|
||||||
|
ChannelName = _worldPacket.ReadString(channelNameLength - 1);
|
||||||
|
_worldPacket.Skip(1); // null terminator
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Target;
|
|
||||||
public ChatAddonMessageParams Params = new();
|
public ChatAddonMessageParams Params = new();
|
||||||
public ObjectGuid? ChannelGUID; // not optional in the packet. Optional for api reasons
|
public string PlayerName;
|
||||||
|
public ObjectGuid PlayerGUID;
|
||||||
|
public uint PlayerVirtualRealmAddress = 0;
|
||||||
|
public string ChannelName;
|
||||||
|
public ObjectGuid ChannelGUID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ChatMessageDND : ClientPacket
|
public class ChatMessageDND : ClientPacket
|
||||||
@@ -220,6 +253,7 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteUInt32(TargetVirtualAddress);
|
_worldPacket.WriteUInt32(TargetVirtualAddress);
|
||||||
_worldPacket.WriteUInt32(SenderVirtualAddress);
|
_worldPacket.WriteUInt32(SenderVirtualAddress);
|
||||||
_worldPacket.WriteUInt32(AchievementID);
|
_worldPacket.WriteUInt32(AchievementID);
|
||||||
|
_worldPacket.WriteUInt16((ushort)_ChatFlags);
|
||||||
_worldPacket.WriteFloat(DisplayTime);
|
_worldPacket.WriteFloat(DisplayTime);
|
||||||
_worldPacket.WriteUInt32(SpellID);
|
_worldPacket.WriteUInt32(SpellID);
|
||||||
_worldPacket.WriteBits(SenderName.GetByteCount(), 11);
|
_worldPacket.WriteBits(SenderName.GetByteCount(), 11);
|
||||||
@@ -227,7 +261,6 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteBits(Prefix.GetByteCount(), 5);
|
_worldPacket.WriteBits(Prefix.GetByteCount(), 5);
|
||||||
_worldPacket.WriteBits(Channel.GetByteCount(), 7);
|
_worldPacket.WriteBits(Channel.GetByteCount(), 7);
|
||||||
_worldPacket.WriteBits(ChatText.GetByteCount(), 12);
|
_worldPacket.WriteBits(ChatText.GetByteCount(), 12);
|
||||||
_worldPacket.WriteBits((ushort)_ChatFlags, 15);
|
|
||||||
_worldPacket.WriteBit(HideChatLog);
|
_worldPacket.WriteBit(HideChatLog);
|
||||||
_worldPacket.WriteBit(FakeSenderName);
|
_worldPacket.WriteBit(FakeSenderName);
|
||||||
_worldPacket.WriteBit(Unused_801.HasValue);
|
_worldPacket.WriteBit(Unused_801.HasValue);
|
||||||
|
|||||||
@@ -1286,13 +1286,19 @@ namespace Game.Networking.Packets
|
|||||||
public override void Write()
|
public override void Write()
|
||||||
{
|
{
|
||||||
_worldPacket.WriteInt64(TotalTime);
|
_worldPacket.WriteInt64(TotalTime);
|
||||||
_worldPacket.WriteInt64(TimeLeft);
|
|
||||||
_worldPacket.WriteInt32((int)Type);
|
_worldPacket.WriteInt32((int)Type);
|
||||||
|
_worldPacket.WriteInt64(TimeLeft);
|
||||||
|
_worldPacket.WriteBit(PlayerGuid.HasValue);
|
||||||
|
_worldPacket.FlushBits();
|
||||||
|
|
||||||
|
if (PlayerGuid.HasValue)
|
||||||
|
_worldPacket.WritePackedGuid(PlayerGuid.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long TotalTime;
|
public long TotalTime;
|
||||||
public long TimeLeft;
|
public long TimeLeft;
|
||||||
public CountdownTimerType Type;
|
public CountdownTimerType Type;
|
||||||
|
public ObjectGuid? PlayerGuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
class QueryCountdownTimer : ClientPacket
|
class QueryCountdownTimer : ClientPacket
|
||||||
|
|||||||
@@ -40,6 +40,18 @@ namespace Game.Networking.Packets
|
|||||||
public ObjectGuid Pet;
|
public ObjectGuid Pet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PetAbandonByNumber : ClientPacket
|
||||||
|
{
|
||||||
|
public uint PetNumber;
|
||||||
|
|
||||||
|
public PetAbandonByNumber(WorldPacket packet) : base(packet) { }
|
||||||
|
|
||||||
|
public override void Read()
|
||||||
|
{
|
||||||
|
PetNumber = _worldPacket.ReadUInt32();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class PetStopAttack : ClientPacket
|
class PetStopAttack : ClientPacket
|
||||||
{
|
{
|
||||||
public PetStopAttack(WorldPacket packet) : base(packet) { }
|
public PetStopAttack(WorldPacket packet) : base(packet) { }
|
||||||
@@ -271,7 +283,7 @@ namespace Game.Networking.Packets
|
|||||||
TargetGUID = _worldPacket.ReadPackedGuid();
|
TargetGUID = _worldPacket.ReadPackedGuid();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class PetCancelAura : ClientPacket
|
class PetCancelAura : ClientPacket
|
||||||
{
|
{
|
||||||
public PetCancelAura(WorldPacket packet) : base(packet) { }
|
public PetCancelAura(WorldPacket packet) : base(packet) { }
|
||||||
@@ -354,7 +366,7 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteUInt8((byte)ReactState);
|
_worldPacket.WriteUInt8((byte)ReactState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Structs
|
//Structs
|
||||||
public class PetSpellCooldown
|
public class PetSpellCooldown
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -565,25 +565,6 @@ namespace Game.Networking.Packets
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Structs
|
//Structs
|
||||||
public class PlayerGuidLookupHint
|
|
||||||
{
|
|
||||||
public void Write(WorldPacket data)
|
|
||||||
{
|
|
||||||
data.WriteBit(VirtualRealmAddress.HasValue);
|
|
||||||
data.WriteBit(NativeRealmAddress.HasValue);
|
|
||||||
data.FlushBits();
|
|
||||||
|
|
||||||
if (VirtualRealmAddress.HasValue)
|
|
||||||
data.WriteUInt32(VirtualRealmAddress.Value);
|
|
||||||
|
|
||||||
if (NativeRealmAddress.HasValue)
|
|
||||||
data.WriteUInt32(NativeRealmAddress.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public uint? VirtualRealmAddress = new(); // current realm (?) (identifier made from the Index, BattleGroup and Region)
|
|
||||||
public uint? NativeRealmAddress = new(); // original realm (?) (identifier made from the Index, BattleGroup and Region)
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PlayerGuidLookupData
|
public class PlayerGuidLookupData
|
||||||
{
|
{
|
||||||
public bool Initialize(ObjectGuid guid, Player player = null)
|
public bool Initialize(ObjectGuid guid, Player player = null)
|
||||||
@@ -603,6 +584,7 @@ namespace Game.Networking.Packets
|
|||||||
Sex = player.GetNativeGender();
|
Sex = player.GetNativeGender();
|
||||||
ClassID = player.GetClass();
|
ClassID = player.GetClass();
|
||||||
Level = (byte)player.GetLevel();
|
Level = (byte)player.GetLevel();
|
||||||
|
TimerunningSeasonID = player.m_activePlayerData.TimerunningSeasonID;
|
||||||
|
|
||||||
DeclinedNames names = player.GetDeclinedNames();
|
DeclinedNames names = player.GetDeclinedNames();
|
||||||
if (names != null)
|
if (names != null)
|
||||||
@@ -651,6 +633,7 @@ namespace Game.Networking.Packets
|
|||||||
data.WriteUInt8((byte)ClassID);
|
data.WriteUInt8((byte)ClassID);
|
||||||
data.WriteUInt8(Level);
|
data.WriteUInt8(Level);
|
||||||
data.WriteUInt8(Unused915);
|
data.WriteUInt8(Unused915);
|
||||||
|
data.WriteInt32(TimerunningSeasonID);
|
||||||
data.WriteString(Name);
|
data.WriteString(Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -666,6 +649,7 @@ namespace Game.Networking.Packets
|
|||||||
public Class ClassID = Class.None;
|
public Class ClassID = Class.None;
|
||||||
public byte Level;
|
public byte Level;
|
||||||
public byte Unused915;
|
public byte Unused915;
|
||||||
|
public int TimerunningSeasonID;
|
||||||
public DeclinedName DeclinedNames = new();
|
public DeclinedName DeclinedNames = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -492,6 +492,7 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteBits(PortraitTurnInText.GetByteCount(), 10);
|
_worldPacket.WriteBits(PortraitTurnInText.GetByteCount(), 10);
|
||||||
_worldPacket.WriteBits(PortraitTurnInName.GetByteCount(), 8);
|
_worldPacket.WriteBits(PortraitTurnInName.GetByteCount(), 8);
|
||||||
_worldPacket.WriteBit(AutoLaunched);
|
_worldPacket.WriteBit(AutoLaunched);
|
||||||
|
_worldPacket.WriteBit(FromContentPush);
|
||||||
_worldPacket.WriteBit(false); // unused in client
|
_worldPacket.WriteBit(false); // unused in client
|
||||||
_worldPacket.WriteBit(StartCheat);
|
_worldPacket.WriteBit(StartCheat);
|
||||||
_worldPacket.WriteBit(DisplayPopup);
|
_worldPacket.WriteBit(DisplayPopup);
|
||||||
@@ -539,6 +540,7 @@ namespace Game.Networking.Packets
|
|||||||
public bool DisplayPopup;
|
public bool DisplayPopup;
|
||||||
public bool StartCheat;
|
public bool StartCheat;
|
||||||
public bool AutoLaunched;
|
public bool AutoLaunched;
|
||||||
|
public bool FromContentPush;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class QuestGiverRequestItems : ServerPacket
|
public class QuestGiverRequestItems : ServerPacket
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
|
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
|
||||||
|
|
||||||
using Framework.Constants;
|
using Framework.Constants;
|
||||||
|
using Game.DataStorage;
|
||||||
using Game.Entities;
|
using Game.Entities;
|
||||||
using Game.Spells;
|
using Game.Spells;
|
||||||
using System;
|
using System;
|
||||||
@@ -1378,11 +1379,15 @@ namespace Game.Networking.Packets
|
|||||||
TuningType = ContentTuningType.CreatureToPlayerDamage;
|
TuningType = ContentTuningType.CreatureToPlayerDamage;
|
||||||
PlayerLevelDelta = (short)target.m_activePlayerData.ScalingPlayerLevelDelta;
|
PlayerLevelDelta = (short)target.m_activePlayerData.ScalingPlayerLevelDelta;
|
||||||
PlayerItemLevel = (ushort)target.GetAverageItemLevel();
|
PlayerItemLevel = (ushort)target.GetAverageItemLevel();
|
||||||
ScalingHealthItemLevelCurveID = (ushort)target.m_unitData.ScalingHealthItemLevelCurveID;
|
var contentTuning = CliDB.ContentTuningStorage.LookupByKey(creatureDifficulty.ContentTuningID);
|
||||||
|
if (contentTuning != null)
|
||||||
|
{
|
||||||
|
ScalingHealthItemLevelCurveID = (uint)contentTuning.HealthItemLevelCurveID;
|
||||||
|
TargetContentTuningID = contentTuning.Id;
|
||||||
|
}
|
||||||
TargetLevel = (byte)target.GetLevel();
|
TargetLevel = (byte)target.GetLevel();
|
||||||
Expansion = (byte)creatureDifficulty.HealthScalingExpansion;
|
Expansion = (byte)creatureDifficulty.HealthScalingExpansion;
|
||||||
TargetScalingLevelDelta = (sbyte)attacker.m_unitData.ScalingLevelDelta;
|
TargetScalingLevelDelta = (sbyte)attacker.m_unitData.ScalingLevelDelta;
|
||||||
TargetContentTuningID = creatureDifficulty.ContentTuningID;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1394,11 +1399,15 @@ namespace Game.Networking.Packets
|
|||||||
TuningType = ContentTuningType.PlayerToCreatureDamage;
|
TuningType = ContentTuningType.PlayerToCreatureDamage;
|
||||||
PlayerLevelDelta = (short)attacker.m_activePlayerData.ScalingPlayerLevelDelta;
|
PlayerLevelDelta = (short)attacker.m_activePlayerData.ScalingPlayerLevelDelta;
|
||||||
PlayerItemLevel = (ushort)attacker.GetAverageItemLevel();
|
PlayerItemLevel = (ushort)attacker.GetAverageItemLevel();
|
||||||
ScalingHealthItemLevelCurveID = (ushort)target.m_unitData.ScalingHealthItemLevelCurveID;
|
var contentTuning = CliDB.ContentTuningStorage.LookupByKey(creatureDifficulty.ContentTuningID);
|
||||||
|
if (contentTuning != null)
|
||||||
|
{
|
||||||
|
ScalingHealthItemLevelCurveID = (uint)contentTuning.HealthItemLevelCurveID;
|
||||||
|
TargetContentTuningID = contentTuning.Id;
|
||||||
|
}
|
||||||
TargetLevel = (byte)target.GetLevel();
|
TargetLevel = (byte)target.GetLevel();
|
||||||
Expansion = (byte)creatureDifficulty.HealthScalingExpansion;
|
Expansion = (byte)creatureDifficulty.HealthScalingExpansion;
|
||||||
TargetScalingLevelDelta = (sbyte)target.m_unitData.ScalingLevelDelta;
|
TargetScalingLevelDelta = (sbyte)target.m_unitData.ScalingLevelDelta;
|
||||||
TargetContentTuningID = creatureDifficulty.ContentTuningID;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,9 @@
|
|||||||
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
|
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
|
||||||
|
|
||||||
using Framework.Constants;
|
using Framework.Constants;
|
||||||
using Framework.Dynamic;
|
using Game.Entities;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Game.Entities;
|
|
||||||
|
|
||||||
namespace Game.Networking.Packets
|
namespace Game.Networking.Packets
|
||||||
{
|
{
|
||||||
@@ -41,6 +40,10 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteInt16(PlayerNameQueryTelemetryInterval);
|
_worldPacket.WriteInt16(PlayerNameQueryTelemetryInterval);
|
||||||
_worldPacket.WriteUInt32((uint)PlayerNameQueryInterval.TotalSeconds);
|
_worldPacket.WriteUInt32((uint)PlayerNameQueryInterval.TotalSeconds);
|
||||||
|
|
||||||
|
_worldPacket.WriteInt32(AddonChatThrottle.MaxTries);
|
||||||
|
_worldPacket.WriteInt32(AddonChatThrottle.TriesRestoredPerSecond);
|
||||||
|
_worldPacket.WriteInt32(AddonChatThrottle.UsedTriesPerMessage);
|
||||||
|
|
||||||
foreach (GameRuleValuePair gameRuleValue in GameRuleValues)
|
foreach (GameRuleValuePair gameRuleValue in GameRuleValues)
|
||||||
gameRuleValue.Write(_worldPacket);
|
gameRuleValue.Write(_worldPacket);
|
||||||
|
|
||||||
@@ -76,9 +79,10 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteBit(QuestSessionEnabled);
|
_worldPacket.WriteBit(QuestSessionEnabled);
|
||||||
_worldPacket.WriteBit(IsMuted);
|
_worldPacket.WriteBit(IsMuted);
|
||||||
_worldPacket.WriteBit(ClubFinderEnabled);
|
_worldPacket.WriteBit(ClubFinderEnabled);
|
||||||
|
_worldPacket.WriteBit(CommunityFinderEnabled);
|
||||||
_worldPacket.WriteBit(Unknown901CheckoutRelated);
|
_worldPacket.WriteBit(Unknown901CheckoutRelated);
|
||||||
|
|
||||||
_worldPacket.WriteBit(TextToSpeechFeatureEnabled);
|
_worldPacket.WriteBit(TextToSpeechFeatureEnabled);
|
||||||
|
|
||||||
_worldPacket.WriteBit(ChatDisabledByDefault);
|
_worldPacket.WriteBit(ChatDisabledByDefault);
|
||||||
_worldPacket.WriteBit(ChatDisabledByPlayer);
|
_worldPacket.WriteBit(ChatDisabledByPlayer);
|
||||||
_worldPacket.WriteBit(LFGListCustomRequiresAuthenticator);
|
_worldPacket.WriteBit(LFGListCustomRequiresAuthenticator);
|
||||||
@@ -87,9 +91,15 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteBit(ContentTrackingEnabled);
|
_worldPacket.WriteBit(ContentTrackingEnabled);
|
||||||
_worldPacket.WriteBit(IsSellAllJunkEnabled);
|
_worldPacket.WriteBit(IsSellAllJunkEnabled);
|
||||||
_worldPacket.WriteBit(IsGroupFinderEnabled);
|
_worldPacket.WriteBit(IsGroupFinderEnabled);
|
||||||
|
|
||||||
_worldPacket.WriteBit(IsLFDEnabled);
|
_worldPacket.WriteBit(IsLFDEnabled);
|
||||||
_worldPacket.WriteBit(IsLFREnabled);
|
_worldPacket.WriteBit(IsLFREnabled);
|
||||||
_worldPacket.WriteBit(IsPremadeGroupEnabled);
|
_worldPacket.WriteBit(IsPremadeGroupEnabled);
|
||||||
|
_worldPacket.WriteBit(CanShowSetRoleButton);
|
||||||
|
_worldPacket.WriteBit(false); // unused 10.2.7
|
||||||
|
_worldPacket.WriteBit(false); // unused 10.2.7
|
||||||
|
|
||||||
|
_worldPacket.WriteBits(Unknown1027.GetByteCount(), 7);
|
||||||
|
|
||||||
_worldPacket.FlushBits();
|
_worldPacket.FlushBits();
|
||||||
|
|
||||||
@@ -126,6 +136,8 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteInt32(SessionAlert.Value.DisplayTime);
|
_worldPacket.WriteInt32(SessionAlert.Value.DisplayTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_worldPacket.WriteString(Unknown1027);
|
||||||
|
|
||||||
_worldPacket.WriteBit(Squelch.IsSquelched);
|
_worldPacket.WriteBit(Squelch.IsSquelched);
|
||||||
_worldPacket.WritePackedGuid(Squelch.BnetAccountGuid);
|
_worldPacket.WritePackedGuid(Squelch.BnetAccountGuid);
|
||||||
_worldPacket.WritePackedGuid(Squelch.GuildGuid);
|
_worldPacket.WritePackedGuid(Squelch.GuildGuid);
|
||||||
@@ -175,6 +187,7 @@ namespace Game.Networking.Packets
|
|||||||
public bool QuestSessionEnabled;
|
public bool QuestSessionEnabled;
|
||||||
public bool IsMuted;
|
public bool IsMuted;
|
||||||
public bool ClubFinderEnabled;
|
public bool ClubFinderEnabled;
|
||||||
|
public bool CommunityFinderEnabled;
|
||||||
public bool Unknown901CheckoutRelated;
|
public bool Unknown901CheckoutRelated;
|
||||||
public bool TextToSpeechFeatureEnabled;
|
public bool TextToSpeechFeatureEnabled;
|
||||||
public bool ChatDisabledByDefault;
|
public bool ChatDisabledByDefault;
|
||||||
@@ -188,11 +201,14 @@ namespace Game.Networking.Packets
|
|||||||
public bool IsLFDEnabled = true; // classic only
|
public bool IsLFDEnabled = true; // classic only
|
||||||
public bool IsLFREnabled = true; // classic only
|
public bool IsLFREnabled = true; // classic only
|
||||||
public bool IsPremadeGroupEnabled = true; // classic only
|
public bool IsPremadeGroupEnabled = true; // classic only
|
||||||
|
public bool CanShowSetRoleButton = true;
|
||||||
|
|
||||||
public SocialQueueConfig QuickJoinConfig;
|
public SocialQueueConfig QuickJoinConfig;
|
||||||
public SquelchInfo Squelch;
|
public SquelchInfo Squelch;
|
||||||
public RafSystemFeatureInfo RAFSystem;
|
public RafSystemFeatureInfo RAFSystem;
|
||||||
public List<GameRuleValuePair> GameRuleValues = new();
|
public List<GameRuleValuePair> GameRuleValues = new();
|
||||||
|
public string Unknown1027; // related to movement lua functions used by keybinds
|
||||||
|
public AddonChatThrottleParams AddonChatThrottle;
|
||||||
|
|
||||||
public struct SessionAlertConfig
|
public struct SessionAlertConfig
|
||||||
{
|
{
|
||||||
@@ -245,6 +261,13 @@ namespace Game.Networking.Packets
|
|||||||
public uint DaysInCycle;
|
public uint DaysInCycle;
|
||||||
public uint Unknown1007;
|
public uint Unknown1007;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct AddonChatThrottleParams
|
||||||
|
{
|
||||||
|
public int MaxTries;
|
||||||
|
public int TriesRestoredPerSecond;
|
||||||
|
public int UsedTriesPerMessage;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FeatureSystemStatusGlueScreen : ServerPacket
|
public class FeatureSystemStatusGlueScreen : ServerPacket
|
||||||
@@ -277,9 +300,10 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue);
|
_worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue);
|
||||||
_worldPacket.WriteBit(IsNameReservationEnabled);
|
_worldPacket.WriteBit(IsNameReservationEnabled);
|
||||||
_worldPacket.WriteBit(LaunchETA.HasValue);
|
_worldPacket.WriteBit(LaunchETA.HasValue);
|
||||||
|
_worldPacket.WriteBit(TimerunningEnabled);
|
||||||
_worldPacket.WriteBit(AddonsDisabled);
|
_worldPacket.WriteBit(AddonsDisabled);
|
||||||
_worldPacket.WriteBit(Unused1000);
|
|
||||||
|
|
||||||
|
_worldPacket.WriteBit(Unused1000);
|
||||||
_worldPacket.WriteBit(AccountSaveDataExportEnabled);
|
_worldPacket.WriteBit(AccountSaveDataExportEnabled);
|
||||||
_worldPacket.WriteBit(AccountLockedByExport);
|
_worldPacket.WriteBit(AccountLockedByExport);
|
||||||
_worldPacket.WriteBit(!RealmHiddenAlert.IsEmpty());
|
_worldPacket.WriteBit(!RealmHiddenAlert.IsEmpty());
|
||||||
@@ -304,6 +328,8 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteInt32(MaximumExpansionLevel);
|
_worldPacket.WriteInt32(MaximumExpansionLevel);
|
||||||
_worldPacket.WriteInt32(ActiveSeason);
|
_worldPacket.WriteInt32(ActiveSeason);
|
||||||
_worldPacket.WriteInt32(GameRuleValues.Count);
|
_worldPacket.WriteInt32(GameRuleValues.Count);
|
||||||
|
_worldPacket.WriteInt32(ActiveTimerunningSeasonID);
|
||||||
|
_worldPacket.WriteInt32(RemainingTimerunningSeasonSeconds);
|
||||||
_worldPacket.WriteInt16(MaxPlayerNameQueriesPerPacket);
|
_worldPacket.WriteInt16(MaxPlayerNameQueriesPerPacket);
|
||||||
_worldPacket.WriteInt16(PlayerNameQueryTelemetryInterval);
|
_worldPacket.WriteInt16(PlayerNameQueryTelemetryInterval);
|
||||||
_worldPacket.WriteUInt32((uint)PlayerNameQueryInterval.TotalSeconds);
|
_worldPacket.WriteUInt32((uint)PlayerNameQueryInterval.TotalSeconds);
|
||||||
@@ -346,6 +372,7 @@ namespace Game.Networking.Packets
|
|||||||
public bool LiveRegionKeyBindingsCopyEnabled;
|
public bool LiveRegionKeyBindingsCopyEnabled;
|
||||||
public bool Unknown901CheckoutRelated; // NYI
|
public bool Unknown901CheckoutRelated; // NYI
|
||||||
public bool IsNameReservationEnabled; // classic only
|
public bool IsNameReservationEnabled; // classic only
|
||||||
|
public bool TimerunningEnabled; // NYI
|
||||||
public bool AddonsDisabled;
|
public bool AddonsDisabled;
|
||||||
public bool Unused1000;
|
public bool Unused1000;
|
||||||
public bool AccountSaveDataExportEnabled;
|
public bool AccountSaveDataExportEnabled;
|
||||||
@@ -363,6 +390,8 @@ namespace Game.Networking.Packets
|
|||||||
public uint KioskSessionMinutes;
|
public uint KioskSessionMinutes;
|
||||||
public int ActiveSeason; // Currently active Classic season
|
public int ActiveSeason; // Currently active Classic season
|
||||||
public List<GameRuleValuePair> GameRuleValues = new();
|
public List<GameRuleValuePair> GameRuleValues = new();
|
||||||
|
public int ActiveTimerunningSeasonID;
|
||||||
|
public int RemainingTimerunningSeasonSeconds;
|
||||||
public short MaxPlayerNameQueriesPerPacket = 50;
|
public short MaxPlayerNameQueriesPerPacket = 50;
|
||||||
public short PlayerNameQueryTelemetryInterval = 600;
|
public short PlayerNameQueryTelemetryInterval = 600;
|
||||||
public TimeSpan PlayerNameQueryInterval = TimeSpan.FromSeconds(10);
|
public TimeSpan PlayerNameQueryInterval = TimeSpan.FromSeconds(10);
|
||||||
|
|||||||
@@ -4729,7 +4729,7 @@ namespace Game.Spells
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
unitCaster->ModifyPower(cost.Power, -cost.Amount);
|
unitCaster.ModifyPower(cost.Power, -cost.Amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user