Core/PacketIO: Updated to 11.0.0

Port From (https://github.com/TrinityCore/TrinityCore/commit/e59eef5432c7b70679d33f4911c88d0f7d75fd39)
This commit is contained in:
Hondacrx
2024-09-02 18:44:55 -04:00
parent bd0d40fa13
commit f38ad4607e
74 changed files with 4980 additions and 3595 deletions
+15 -13
View File
@@ -3,16 +3,16 @@
namespace Framework.Constants
{
public enum AccountDataTypes
public enum AccountDataTypes : uint
{
GlobalConfigCache = 0x00,
PerCharacterConfigCache = 0x01,
GlobalBindingsCache = 0x02,
PerCharacterBindingsCache = 0x03,
GlobalMacrosCache = 0x04,
PerCharacterMacrosCache = 0x05,
PerCharacterLayoutCache = 0x06,
PerCharacterChatCache = 0x07,
GlobalConfigCache = 0,
PerCharacterConfigCache = 1,
GlobalBindingsCache = 2,
PerCharacterBindingsCache = 3,
GlobalMacrosCache = 4,
PerCharacterMacrosCache = 5,
PerCharacterLayoutCache = 6,
PerCharacterChatCache = 7,
GlobalTtsCache = 8,
PerCharacterTtsCache = 9,
GlobalFlaggedCache = 10,
@@ -20,12 +20,14 @@ namespace Framework.Constants
PerCharacterClickBindingsCache = 12,
GlobalEditModeCache = 13,
PerCharacterEditModeCache = 14,
GlobalFrontendChatSettings = 15,
GlobalCharacterListOrder = 16,
Max = 15,
Max = 17,
AllAccountDataCacheMask = 0x7FFF,
GlobalCacheMask = 0x2515,
PerCharacterCacheMask = 0x5AEA
AllAccountDataCacheMask = 0x0001FFFFu,
GlobalCacheMask = 0x0001A515u,
PerCharacterCacheMask = 0x00005AEAu
}
public enum TutorialAction
+2 -1
View File
@@ -71,7 +71,8 @@ namespace Framework.Constants
Name = 1,
Level = 2,
Bid = 3,
Buyout = 4
Buyout = 4,
TimeRemaining = 5
}
public enum AuctionHouseBrowseMode
+4 -1
View File
@@ -2015,7 +2015,10 @@ namespace Framework.Constants
BarbersChoice = 62,
JailersTowerBuffs = 63,
MajorFactionRenown = 64,
PersonalTabardVendor = 65
PersonalTabardVendor = 65,
ForgeMaster = 66,
CharacterBanker = 67,
AccountBanker = 68,
}
[Flags]
+1 -1
View File
@@ -179,7 +179,7 @@ namespace Framework.Constants
None = 0x00,
Gossip = 0x01, // 100%
QuestGiver = 0x02, // 100%
Unk1 = 0x04,
AccountBanker = 0x04, //account banker
Unk2 = 0x08,
Trainer = 0x10, // 100%
TrainerClass = 0x20, // 100%
+5 -1
View File
@@ -89,6 +89,9 @@ namespace Framework.Constants
BarbersChoice = 52,
MajorFactionRenown = 53,
PersonalTabardVendor = 54,
ForgeMaster = 55,
CharacterBanker = 56,
AccountBanker = 57,
Max
}
@@ -164,7 +167,8 @@ namespace Framework.Constants
public enum GossipOptionFlags
{
None = 0x0,
QuestLabelPrepend = 0x1
QuestLabelPrepend = 0x1,
HideOptionIDFromClient = 0x2
}
[Flags]
+9 -1
View File
@@ -61,7 +61,7 @@ namespace Framework.Constants
EveryoneAssistant = 0x040, // Script_IsEveryoneAssistant()
GuildGroup = 0x100,
CrossFaction = 0x200,
RestrictPings = 0x400,
RestrictPings = 0x400, // deprecated
MaskBgRaid = FakeRaid | Raid
}
@@ -173,4 +173,12 @@ namespace Framework.Constants
ChallengeMode = 1,
PlayerCountdown = 2
}
public enum RestrictPingsTo
{
None = 0,
Lead = 1,
Assist = 2,
TankHealer = 3,
}
}
+10 -2
View File
@@ -11,7 +11,7 @@ namespace Framework.Constants
public const int MaxGemSockets = 3;
public const int MaxSpells = 5;
public const int MaxStats = 10;
public const int MaxBagSize = 36;
public const int MaxBagSize = 98;
public const byte NullBag = 0;
public const byte NullSlot = 255;
public const int MaxOutfitItems = 24;
@@ -1293,7 +1293,15 @@ namespace Framework.Constants
ReagentBagWrongSlot = 115,// Reagent Bags can only be placed in the reagent bag slot.
SlotOnlyReagentBag = 116,// Only Reagent Bags can be placed in the reagent bag slot.
ReagentBagItemType = 117,// Only Reagents can be placed in Reagent Bags.
CantBulkSellItemWithRefund = 118// Items that can be refunded can't be bulk sold.
CantBulkSellItemWithRefund = 118,// Items that can be refunded can't be bulk sold.
NoSoulboundItemInAccountBank = 119,// Soulbound items cannot be stored in the Warband Bank.
}
public enum BankType
{
Character = 0,
Guild = 1,
Account = 2
}
public enum BuyResult
+4 -5
View File
@@ -70,11 +70,10 @@ namespace Framework.Constants
public enum InstanceResetWarningType
{
WarningHours = 1, // WARNING! %s is scheduled to reset in %d hour(s).
WarningMin = 2, // WARNING! %s is scheduled to reset in %d minute(s)!
WarningMinSoon = 3, // WARNING! %s is scheduled to reset in %d minute(s). Please exit the zone or you will be returned to your bind location!
Welcome = 4, // Welcome to %s. This raid instance is scheduled to reset in %s.
Expired = 5
Welcome = 1, // Welcome to %s. Instance locks are scheduled to expire in %s.
Expired = 2, // Your instance lock for %s has expired.
WelcomeDaily = 3, // Welcome to %s. The daily reset is scheduled to occur in %s and will reset this instance.
WarningTime = 4, // any GlobalStrings tag that has 1 formattable argument, like DELVES_INSTANCE_RESET_WARNING
}
public enum InstanceResetMethod
File diff suppressed because it is too large Load Diff
+7 -1
View File
@@ -518,10 +518,16 @@ namespace Framework.Constants
// first slot for item stored (in any way in player items data)
Start = 0,
// last+1 slot for item stored (in any way in player items data)
End = 227,
End = 232,
Count = (End - Start)
}
enum AccountBankBagSlots
{
Start = 227,
End = 232
}
public enum PlayerTitle : ulong
{
Disabled = 0x0000000000000000,
+57 -34
View File
@@ -84,7 +84,7 @@ namespace Framework.Constants
public enum QuestType
{
TurnIn= 0,
TurnIn = 0,
WithMaxLevel = 1,
Normal = 2,
Task = 3,
@@ -417,39 +417,53 @@ namespace Framework.Constants
public enum QuestGiverStatus : ulong
{
None = 0x00,
Future = 0x02,
Trivial = 0x04,
TrivialRepeatableTurnin = 0x08,
TrivialDailyQuest = 0x10,
Reward = 0x20,
JourneyReward = 0x40,
CovenantCallingReward = 0x80,
RepeatableTurnin = 0x100,
DailyQuest = 0x200,
Quest = 0x400,
RewardCompleteNoPOI = 0x800,
RewardCompletePOI = 0x1000,
LegendaryQuest = 0x2000,
LegendaryRewardCompleteNoPOI = 0x4000,
LegendaryRewardCompletePOI = 0x8000,
JourneyQuest = 0x10000,
JourneyRewardCompleteNoPOI = 0x20000,
JourneyRewardCompletePOI = 0x40000,
CovenantCallingQuest = 0x80000,
CovenantCallingRewardCompleteNoPOI = 0x100000,
CovenantCallingRewardCompletePOI = 0x200000,
TrivialLegendaryQuest = 0x400000,
FutureLegendaryQuest = 0x800000,
LegendaryReward = 0x1000000,
ImportantReward = 0x2000000,
ImportantQuest = 0x4000000,
TrivialImportantQuest = 0x8000000,
FutureImportantQuest = 0x010000000,
ImportantQuestRewardCompleteNoPOI = 0x20000000,
ImportantQuestRewardCompletePOI = 0x40000000,
TrivialJourneyQuest = 0x80000000,
FutureJourneyQuest = 0x100000000,
None = 0x000000000000,
Future = 0x000000000002,
FutureJourneyQuest = 0x000000000004,
FutureLegendaryQuest = 0x000000000008,
FutureImportantQuest = 0x000000000010,
TrivialRepeatableTurnin = 0x000000000020,
Trivial = 0x000000000040,
TrivialDailyQuest = 0x000000000080,
TrivialRepeatableQuest = 0x000000000100,
TrivialMetaQuest = 0x000000000200,
TrivialJourneyQuest = 0x000000000400,
TrivialLegendaryQuest = 0x000000000800,
TrivialImportantQuest = 0x000000001000,
Reward = 0x000000002000,
RepeatableReward = 0x000000004000,
MetaReward = 0x000000008000,
JourneyReward = 0x000000010000,
CovenantCallingReward = 0x000000020000,
LegendaryReward = 0x000000040000,
ImportantReward = 0x000000080000,
RepeatableTurnin = 0x000000100000,
QuestAccountCompleted = 0x000000200000,
Quest = 0x000000400000,
DailyQuest = 0x000000800000,
RepeatableQuest = 0x000001000000,
MetaQuest = 0x000002000000,
CovenantCallingQuest = 0x000004000000,
JourneyQuestAccountCompleted = 0x000008000000,
JourneyQuest = 0x000010000000,
LegendaryQuestAccountCompleted = 0x000020000000,
LegendaryQuest = 0x000040000000,
ImportantQuestAccountCompleted = 0x000080000000,
ImportantQuest = 0x000100000000,
RewardCompleteNoPOI = 0x000200000000,
RewardCompletePOI = 0x000400000000,
RepeatableRewardCompleteNoPOI = 0x000800000000,
RepeatableRewardCompletePOI = 0x001000000000,
MetaQuestRewardCompleteNoPOI = 0x002000000000,
MetaQuestRewardCompletePOI = 0x004000000000,
CovenantCallingRewardCompleteNoPOI = 0x008000000000,
CovenantCallingRewardCompletePOI = 0x010000000000,
JourneyRewardCompleteNoPOI = 0x020000000000,
JourneyRewardCompletePOI = 0x040000000000,
LegendaryRewardCompleteNoPOI = 0x080000000000,
LegendaryRewardCompletePOI = 0x100000000000,
ImportantQuestRewardCompleteNoPOI = 0x200000000000,
ImportantQuestRewardCompletePOI = 0x400000000000,
}
[Flags]
@@ -554,6 +568,8 @@ namespace Framework.Constants
IgnoreSoulboundItems = 0x00200000,
DontDeferStartEffects = 0x00400000,
HideRequiredItemsPreTurnIn = 0x00800000,
AbandonOnDisable = 0x04000000,
}
public enum QuestSpecialFlags
@@ -598,4 +614,11 @@ namespace Framework.Constants
Threat,
CovenantCalling
}
public enum QuestRewardContextFlags
{
None = 0x0,
FirstCompletionBonus = 0x1,
RepeatCompletionBonus = 0x2
}
}
File diff suppressed because it is too large Load Diff
@@ -774,7 +774,8 @@ namespace Framework.Constants
CantFlyHere = 318,
DragonridingRidingRequirement = 319,
ItemModAppearanceGroupAlreadyKnown = 320,
Unknown = 321,
ItemCreationDisabledForEvent = 321,
Unknown = 322,
// Ok Cast Value - Here In Case A Future Version Removes Success And We Need To Use A Custom Value (Not Sent To Client Either Way)
SpellCastOk = Success
@@ -1416,8 +1417,48 @@ namespace Framework.Constants
YouDontHaveTheSwirlingMojoStone = 999, // You Don'T Have The Swirling Mojo Stone Equipped.
YouMustBeNearADragonflightOathstone = 1000, // You Must Be Near One Of The Five Dragonflight Oathstones In The Dragon Isles.
CanOnlyUseThisItemWhileAirborne = 1001, // You Can Only Use This Item While Airborne.
ThisPlayerIsNotOppositeFaction = 1002, // This Player Is Not Of The Opposite Faction.
ThisPlayerAlreadyHasThisMount = 1003, // This Player Already Has This Mount.
YourTargetIsInWarMode = 1004, // Your Target Is In War Mode.
CooldownReset = 1005, // Cooldown Reset
SoilNutrientsMustReplenish = 1006, // The Nutrients Of This Soil Must Replenish Before Further Growth.
TargetAlreadyHadSomeFeathersPlucked = 1007, // The Target Has Already Had Some Feathers Plucked. It Would Be Rude To Take More.
ThisCreatureHasAlreadyBeenAttunedWith = 1008, // This Creature Has Already Been Attuned With Recently.
YouAlreadyHaveSomeMulchPrepared = 1009, // You Already Have Some Mulch Prepared. Use Your Current Mulch First.
YouDontKnowHowToGatherThis = 1010, // You Don't Know How To Gather This.
YouDontHaveAnyItemsOfThisType = 1011, // You Don't Have Any Items Of This Type.
YouDontHaveAnyRadiantRemnants = 1012, // You Don't Have Any Radiant Remnants.
TargetsRingIsAlreadyBoundToAnotherPlayer = 1013, // Your Target's Ring Is Already Bound To Another Player.
TargetIsNotWearingThisRing = 1014, // Your Target Is Not Also Wearing This Ring.
CanOnlyBeUsedOnSocketablePvpTwwItems = 1015, // Can Only Be Used On Socket Eligible Pvp Items From The War Within Expansion.
HarvestbotsAlreadyActive = 1016, // Harvestbots Already Active.
AirshipDauntlessIsAlreadyActive = 1017, // The Airship Dauntless Is Already Active.
CannotSwapSpellsOnCooldownInCombat = 1026, // You Cannot Swap Spells On Cooldown While In Combat.
MustEquipCloakOfInfinitePotential = 1027, // You Must First Equip The Cloak Of Infinite Potential.
InsufficientBronze = 1028, // You Have Insufficient Bronze To Make This Trade.
RequiresSkyriding = 1029, // Requires Skyriding
YouAlreadyOverloadedThisGatheringNode = 1030, // You Have Already Overloaded This Gathering Node.
YouDontKnowHowToOverloadThisNode = 1031, // You Do Not Know How To Overload This Gathering Node.
TimerunnersCannotTeleportOutOfPandaria = 1032, // Timerunners Cannot Teleport Outside Of Pandaria.
SpecializeFurtherForTheseNotes = 1033, // Specialize Further Or Improve Your Hasty Handwriting To Make Sense Of These Notes.
ThereIsNothingLeftToInvent = 1034, // There Is Nothing Left To Invent And You Cannot Be Convinced Otherwise.
PlayerInPartyDoesntHaveThisTierUnlocked = 1035, // A Player In Your Party Does Not Have This Tier Unlocked
YouDontHaveAnyRadiantEchoes = 1036, // You Don't Have Any Radiant Echoes.
RequiresTwwPathfinderUnlocked = 1037, // Requires The War Within Pathfinder Unlocked To Use In This Area.
CanOnlyBeUsedWhileInCombat = 1039, // Can Only Be Used While In Combat.
NotHighEnoughLevelToEnterADelve = 1040, // You Are Not High Enough Level To Enter A Delve.
WondrousWisdomballIsNonresponsive = 1041, // For Some Reason The Wondrous Wisdomball Is Nonresponsive.
YouAlreadyHaveThisCurioInYourCollection = 1042, // You Already Have This Curio In Your Collection.
AlreadyHaveIdentifiedPrototype = 1043, // You Must Choose What To Do With Your Current Prototype Before Identifying New Ones.
YouAlreadyUsedKhazAlgarContract = 1044, // You Have Already Used A Khaz Algar Contract This Week.
YouAlreadyRevealedAllTodayPactLocations = 1051, // You Have Revealed Or Completed All Of Today's Pact Locations.
TimerunnersCannotCastThisSpell = 1053, // Timerunners Cannot Cast This Spell.
ThisEmblemHasNoMagicStored = 2001, // The Emblem Has No Magic Stored.
YouMustBeInVisageForm = 2222, // You Must Be In Visage Form To Do This.
TooCloseToAnotherMoltenRitual = 2424, // You Can'T Begin A Molten Ritual This Close To Another One.
ATrialIsBeingUndergoneNearby = 2223, // A Trial Is Already Being Undergone Nearby.
YouCannotUseVantusRuneInStoryMode = 2224, // You Cannot Use A Vantus Rune In Story Mode.
TooCloseToAnotherMoltenRitual = 2424, // You Can't Begin A Molten Ritual This Close To Another One.
EarthenCannotConsumeRegularFoodOrDrink = 2425, // Earthen Cannot Consume Traditional Food Or Drink.
}
public enum SpellMissInfo
@@ -473,7 +473,7 @@ namespace Framework.Database
PrepareStatement(CharStatements.UPD_ACCOUNT_ONLINE, "UPDATE characters SET online = 0 WHERE account = ?");
PrepareStatement(CharStatements.INS_CHARACTER_CUSTOMIZATION, "INSERT INTO character_customizations (guid, chrCustomizationOptionID, chrCustomizationChoiceID) VALUES (?, ?, ?)");
PrepareStatement(CharStatements.DEL_CHARACTER_CUSTOMIZATIONS, "DELETE FROM character_customizations WHERE guid = ?");
PrepareStatement(CharStatements.INS_GROUP, "INSERT INTO `groups` (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raidDifficulty, legacyRaidDifficulty, masterLooterGuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.INS_GROUP, "INSERT INTO `groups` (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raidDifficulty, legacyRaidDifficulty, masterLooterGuid, pingRestriction) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.INS_GROUP_MEMBER, "INSERT INTO group_member (guid, memberGuid, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_GROUP_MEMBER, "DELETE FROM group_member WHERE memberGuid = ?");
PrepareStatement(CharStatements.UPD_GROUP_LEADER, "UPDATE `groups` SET leaderGuid = ? WHERE guid = ?");
@@ -483,6 +483,7 @@ namespace Framework.Database
PrepareStatement(CharStatements.UPD_GROUP_DIFFICULTY, "UPDATE `groups` SET difficulty = ? WHERE guid = ?");
PrepareStatement(CharStatements.UPD_GROUP_RAID_DIFFICULTY, "UPDATE `groups` SET raidDifficulty = ? WHERE guid = ?");
PrepareStatement(CharStatements.UPD_GROUP_LEGACY_RAID_DIFFICULTY, "UPDATE `groups` SET legacyRaidDifficulty = ? WHERE guid = ?");
PrepareStatement(CharStatements.UPD_GROUP_PING_RESTRICTION, "UPDATE `groups` SET pingRestriction = ? WHERE guid = ?");
PrepareStatement(CharStatements.DEL_INVALID_SPELL_SPELLS, "DELETE FROM character_spell WHERE spell = ?");
PrepareStatement(CharStatements.UPD_DELETE_INFO, "UPDATE characters SET deleteInfos_Name = name, deleteInfos_Account = account, deleteDate = UNIX_TIMESTAMP(), name = '', account = 0 WHERE guid = ?");
PrepareStatement(CharStatements.UPD_RESTORE_DELETE_INFO, "UPDATE characters SET name = ?, account = ?, deleteDate = NULL, deleteInfos_Name = NULL, deleteInfos_Account = NULL WHERE deleteDate IS NOT NULL AND guid = ?");
@@ -1121,6 +1122,7 @@ namespace Framework.Database
UPD_GROUP_DIFFICULTY,
UPD_GROUP_RAID_DIFFICULTY,
UPD_GROUP_LEGACY_RAID_DIFFICULTY,
UPD_GROUP_PING_RESTRICTION,
DEL_INVALID_SPELL_SPELLS,
UPD_DELETE_INFO,
UPD_RESTORE_DELETE_INFO,
@@ -1771,6 +1771,8 @@ namespace Game
return (long)(left.BidAmount - right.BidAmount);
case AuctionHouseSortOrder.Buyout:
return (long)(left.BuyoutOrUnitPrice - right.BuyoutOrUnitPrice);
case AuctionHouseSortOrder.TimeRemaining:
return (long)(left.EndTime - right.EndTime).TotalMilliseconds;
default:
break;
}
+1 -1
View File
@@ -145,7 +145,7 @@ namespace Game.Chat
[CommandNonGroup("bank", RBACPermissions.CommandBank)]
static bool HandleBankCommand(CommandHandler handler)
{
handler.GetSession().SendShowBank(handler.GetSession().GetPlayer().GetGUID());
handler.GetSession().SendShowBank(handler.GetSession().GetPlayer().GetGUID(), PlayerInteractionType.Banker);
return true;
}
+1 -1
View File
@@ -107,7 +107,7 @@ namespace Game.Chat
flag = target.m_unitData.Flags;
if (!npcflag.HasValue)
npcflag = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1];
npcflag = (ulong)target.m_unitData.NpcFlags2 << 32 | target.m_unitData.NpcFlags;
if (!dyflag.HasValue)
dyflag = target.m_objectData.DynamicFlags;
+2 -2
View File
@@ -82,7 +82,7 @@ namespace Game.Chat
CreatureTemplate cInfo = target.GetCreatureTemplate();
uint faction = target.GetFaction();
ulong npcflags = (ulong)target.m_unitData.NpcFlags[1] << 32 | target.m_unitData.NpcFlags[0];
ulong npcflags = (ulong)target.m_unitData.NpcFlags2 << 32 | target.m_unitData.NpcFlags;
ulong mechanicImmuneMask = 0;
CreatureImmunities immunities = Global.SpellMgr.GetCreatureImmunities(cInfo.CreatureImmunitiesId);
if (immunities != null)
@@ -151,7 +151,7 @@ namespace Game.Chat
if (cInfo.FlagsExtra.HasAnyFlag((CreatureFlagsExtra)value))
handler.SendSysMessage("{0} (0x{1:X})", (CreatureFlagsExtra)value, value);
handler.SendSysMessage(CypherStrings.NpcinfoNpcFlags, target.m_unitData.NpcFlags[0]);
handler.SendSysMessage(CypherStrings.NpcinfoNpcFlags, target.m_unitData.NpcFlags);
foreach (uint value in Enum.GetValues(typeof(NPCFlags)))
if (npcflags.HasAnyFlag(value))
handler.SendSysMessage("{0} (0x{1:X})", (NPCFlags)value, value);
+2 -2
View File
@@ -53,8 +53,8 @@ namespace Game.DungeonFinding
SetLeader(guid, ObjectGuid.Create(HighGuid.Player, field.Read<ulong>(0)));
uint dungeon = field.Read<uint>(18);
LfgState state = (LfgState)field.Read<byte>(19);
uint dungeon = field.Read<uint>(19);
LfgState state = (LfgState)field.Read<byte>(20);
if (dungeon == 0 || state == 0)
return;
+1 -1
View File
@@ -1395,7 +1395,7 @@ namespace Game.Entities
CreatureData data = Global.ObjectMgr.NewOrExistCreatureData(m_spawnId);
uint displayId = GetNativeDisplayId();
ulong spawnNpcFlags = ((ulong)m_unitData.NpcFlags[1] << 32) | m_unitData.NpcFlags[0];
ulong spawnNpcFlags = ((ulong)GetNpcFlags2() << 32) | (uint)GetNpcFlags();
ulong? npcflag = null;
uint? unitFlags = null;
uint? unitFlags2 = null;
+16 -2
View File
@@ -245,7 +245,10 @@ namespace Game.Misc
GossipMenuAddon addon = Global.ObjectMgr.GetGossipMenuAddon(packet.GossipID);
if (addon != null)
{
packet.FriendshipFactionID = addon.FriendshipFactionID;
packet.LfgDungeonsID = addon.LfgDungeonsID;
}
NpcText text = Global.ObjectMgr.GetNpcText(titleTextId);
if (text != null)
@@ -282,8 +285,11 @@ namespace Game.Misc
gossipText.QuestType = item.QuestIcon;
gossipText.QuestFlags = (uint)quest.Flags;
gossipText.QuestFlagsEx = (uint)quest.FlagsEx;
gossipText.QuestFlagsEx2 = (uint)quest.FlagsEx2;
gossipText.Repeatable = quest.IsTurnIn() && quest.IsRepeatable() && !quest.IsDailyOrWeekly() && !quest.IsMonthly();
gossipText.ResetByScheduler = quest.IsResetByScheduler();
gossipText.Important = quest.IsImportant();
gossipText.Meta = quest.IsMeta();
gossipText.QuestTitle = quest.LogTitle;
Locale locale = _session.GetSessionDbLocaleIndex();
@@ -375,10 +381,13 @@ namespace Game.Misc
text.QuestType = questMenuItem.QuestIcon;
text.QuestFlags = (uint)quest.Flags;
text.QuestFlagsEx = (uint)quest.FlagsEx;
text.QuestFlagsEx2 = (uint)quest.FlagsEx2;
text.Repeatable = quest.IsTurnIn() && quest.IsRepeatable() && !quest.IsDailyOrWeekly() && !quest.IsMonthly();
text.ResetByScheduler = quest.IsResetByScheduler();
text.Important = quest.IsImportant();
text.QuestTitle = quest.LogTitle;
text.Meta = quest.IsMeta();
text.QuestTitle = quest.LogTitle;
if (localeConstant != Locale.enUS)
{
QuestTemplateLocale localeData = Global.ObjectMgr.GetQuestLocale(quest.Id);
@@ -446,6 +455,7 @@ namespace Game.Misc
packet.PortraitGiverMount = quest.QuestGiverPortraitMount;
packet.PortraitGiverModelSceneID = quest.QuestGiverPortraitModelSceneId;
packet.PortraitTurnIn = quest.QuestTurnInPortrait;
packet.QuestInfoID = (int)quest.QuestInfoID;
packet.QuestSessionBonus = 0; //quest.GetQuestSessionBonus(); // this is only sent while quest session is active
packet.AutoLaunched = autoLaunched;
packet.DisplayPopup = displayPopup;
@@ -481,9 +491,10 @@ namespace Game.Misc
{
var obj = new QuestObjectiveSimple();
obj.Id = objs[i].Id;
obj.Type = (byte)objs[i].Type;
obj.ObjectID = objs[i].ObjectID;
obj.Amount = objs[i].Amount;
obj.Type = (byte)objs[i].Type;
packet.Objectives.Add(obj);
}
@@ -554,6 +565,7 @@ namespace Game.Misc
offer.QuestID = quest.Id;
offer.AutoLaunched = autoLaunched;
offer.SuggestedPartyMembers = quest.SuggestedPlayers;
offer.QuestInfoID = (int)quest.QuestInfoID;
for (uint i = 0; i < SharedConst.QuestEmoteCount && quest.OfferRewardEmote[i] != 0; ++i)
offer.Emotes.Add(new QuestDescEmote(quest.OfferRewardEmote[i], quest.OfferRewardEmoteDelay[i]));
@@ -632,6 +644,7 @@ namespace Game.Misc
packet.QuestFlags[1] = (uint)quest.FlagsEx;
packet.QuestFlags[2] = (uint)quest.FlagsEx2;
packet.SuggestPartyMembers = quest.SuggestedPlayers;
packet.QuestInfoID = (int)quest.QuestInfoID;
// incomplete: FD
// incomplete quest with item objective but item objective is complete DD
@@ -795,6 +808,7 @@ namespace Game.Misc
public class GossipMenuAddon
{
public int FriendshipFactionID;
public uint LfgDungeonsID;
}
public class PointOfInterest
@@ -857,7 +857,7 @@ namespace Game.Entities
public uint GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false
public uint InfiniteAOI; // 10 Infinite AOI, enum { false, true, }; Default: false
public uint NotLOSBlocking; // 11 Not LOS Blocking, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 12 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 12 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint Collisionupdatedelayafteropen; // 13 Collision update delay(ms) after open, int, Min value: 0, Max value: 2147483647, Default value: 0
}
@@ -873,7 +873,7 @@ namespace Game.Entities
public uint closeTextID; // 7 closeTextID, References: BroadcastText, NoValue = 0
public uint requireLOS; // 8 require LOS, enum { false, true, }; Default: false
public uint conditionID1; // 9 conditionID1, References: PlayerCondition, NoValue = 0
public uint InteractRadiusOverride; // 10 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 10 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct questgiver
@@ -890,7 +890,7 @@ namespace Game.Entities
public uint GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false
public uint conditionID1; // 10 conditionID1, References: PlayerCondition, NoValue = 0
public uint NeverUsableWhileMounted; // 11 Never Usable While Mounted, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 12 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 12 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct chest
@@ -904,7 +904,7 @@ namespace Game.Entities
public uint triggeredEvent; // 6 triggeredEvent, References: GameEvents, NoValue = 0
public uint linkedTrap; // 7 linkedTrap, References: GameObjects, NoValue = 0
public uint questID; // 8 questID, References: QuestV2, NoValue = 0
public uint InteractRadiusOverride; // 9 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 9 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint requireLOS; // 10 require LOS, enum { false, true, }; Default: false
public uint leaveLoot; // 11 leaveLoot, enum { false, true, }; Default: false
public uint notInCombat; // 12 notInCombat, enum { false, true, }; Default: false
@@ -913,9 +913,9 @@ namespace Game.Entities
public uint usegrouplootrules; // 15 use group loot rules, enum { false, true, }; Default: false
public uint floatingTooltip; // 16 floatingTooltip, enum { false, true, }; Default: false
public uint conditionID1; // 17 conditionID1, References: PlayerCondition, NoValue = 0
public uint Unused; // 18 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public uint xpLevel; // 18 xpLevel, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public uint xpDifficulty; // 19 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, 5, }; Default: No Exp
public uint Unused2; // 20 Unused, int, Min value: 0, Max value: 123, Default value: 0
public uint Unused ; // 20 Unused, int, Min value: 0, Max value: 123, Default value: 0
public uint GroupXP; // 21 Group XP, enum { false, true, }; Default: false
public uint DamageImmuneOK; // 22 Damage Immune OK, enum { false, true, }; Default: false
public uint trivialSkillLow; // 23 trivialSkillLow, int, Min value: 0, Max value: 65535, Default value: 0
@@ -934,7 +934,7 @@ namespace Game.Entities
public struct binder
{
public uint InteractRadiusOverride; // 0 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 0 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct generic
@@ -948,7 +948,7 @@ namespace Game.Entities
public uint conditionID1; // 6 conditionID1, References: PlayerCondition, NoValue = 0
public uint LargeAOI; // 7 Large AOI, enum { false, true, }; Default: false
public uint UseGarrisonOwnerGuildColors; // 8 Use Garrison Owner Guild Colors, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 9 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 9 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint Allowunfriendlycrossfactionpartymemberstocollaborateonaritual;// 10 Allow unfriendly cross faction party members to collaborate on a ritual, enum { false, true, }; Default: false
}
@@ -975,7 +975,7 @@ namespace Game.Entities
public uint requireLOS; // 18 require LOS, enum { false, true, }; Default: false
public uint TriggerCondition; // 19 Trigger Condition, References: PlayerCondition, NoValue = 0
public uint Checkallunits; // 20 Check all units (spawned traps only check players), enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 21 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 21 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct chair
@@ -985,7 +985,7 @@ namespace Game.Entities
public uint onlyCreatorUse; // 2 onlyCreatorUse, enum { false, true, }; Default: false
public uint triggeredEvent; // 3 triggeredEvent, References: GameEvents, NoValue = 0
public uint conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0
public uint InteractRadiusOverride; // 5 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct spellFocus
@@ -999,7 +999,7 @@ namespace Game.Entities
public uint floatingTooltip; // 6 floatingTooltip, enum { false, true, }; Default: false
public uint floatOnWater; // 7 floatOnWater, enum { false, true, }; Default: false
public uint conditionID1; // 8 conditionID1, References: PlayerCondition, NoValue = 0
public uint InteractRadiusOverride; // 9 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 9 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint gossipID; // 10 gossipID, References: Gossip, NoValue = 0
public uint spellFocusType2; // 11 spellFocusType 2, References: SpellFocusObject, NoValue = 0
public uint spellFocusType3; // 12 spellFocusType 3, References: SpellFocusObject, NoValue = 0
@@ -1017,7 +1017,7 @@ namespace Game.Entities
public uint allowMounted; // 3 allowMounted, enum { false, true, }; Default: false
public uint conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0
public uint NeverUsableWhileMounted; // 5 Never Usable While Mounted, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 6 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 6 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct goober
@@ -1055,7 +1055,7 @@ namespace Game.Entities
public uint SyncAnimationtoObjectLifetime; // 30 Sync Animation to Object Lifetime (global track only), enum { false, true, }; Default: false
public uint NoFuzzyHit; // 31 No Fuzzy Hit, enum { false, true, }; Default: false
public uint LargeAOI; // 32 Large AOI, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 33 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 33 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct transport
@@ -1084,7 +1084,7 @@ namespace Game.Entities
public uint Reached10thfloor; // 21 Reached 10th floor, References: GameEvents, NoValue = 0
public uint onlychargeheightcheck; // 22 only charge height check. (yards), int, Min value: 0, Max value: 65535, Default value: 0
public uint onlychargetimecheck; // 23 only charge time check, int, Min value: 0, Max value: 65535, Default value: 0
public uint InteractRadiusOverride; // 24 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 24 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct areadamage
@@ -1097,7 +1097,7 @@ namespace Game.Entities
public uint autoClose; // 5 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint openTextID; // 6 openTextID, References: BroadcastText, NoValue = 0
public uint closeTextID; // 7 closeTextID, References: BroadcastText, NoValue = 0
public uint InteractRadiusOverride; // 8 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 8 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct camera
@@ -1107,7 +1107,7 @@ namespace Game.Entities
public uint eventID; // 2 eventID, References: GameEvents, NoValue = 0
public uint openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0
public uint conditionID1; // 4 conditionID1, References: PlayerCondition, NoValue = 0
public uint InteractRadiusOverride; // 5 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct moTransport
@@ -1123,19 +1123,19 @@ namespace Game.Entities
public uint allowstopping; // 8 allow stopping, enum { false, true, }; Default: false
public uint InitStopped; // 9 Init Stopped, enum { false, true, }; Default: false
public uint TrueInfiniteAOI; // 10 True Infinite AOI (programmer only!), enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 11 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 11 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint Allowareaexplorationwhileonthistransport;// 12 Allow area exploration while on this transport, enum { false, true, }; Default: false
}
public struct duelflag
{
public uint InteractRadiusOverride; // 0 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 0 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint Willthisduelgountilaplayerdies; // 1 Will this duel go until a player dies?, enum { false, true, }; Default: false
}
public struct fishingnode
{
public uint InteractRadiusOverride; // 0 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 0 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct ritual
@@ -1149,13 +1149,13 @@ namespace Game.Entities
public uint castersGrouped; // 6 castersGrouped, enum { false, true, }; Default: true
public uint ritualNoTargetCheck; // 7 ritualNoTargetCheck, enum { false, true, }; Default: true
public uint conditionID1; // 8 conditionID1, References: PlayerCondition, NoValue = 0
public uint InteractRadiusOverride; // 9 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 9 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct mailbox
{
public uint conditionID1; // 0 conditionID1, References: PlayerCondition, NoValue = 0
public uint InteractRadiusOverride; // 1 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 1 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct guardpost
@@ -1163,7 +1163,7 @@ namespace Game.Entities
public uint creatureID; // 0 creatureID, References: Creature, NoValue = 0
public uint charges; // 1 charges, int, Min value: 0, Max value: 65535, Default value: 1
public uint Preferonlyifinlineofsight; // 2 Prefer only if in line of sight (expensive), enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 3 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct spellcaster
@@ -1176,7 +1176,7 @@ namespace Game.Entities
public uint conditionID1; // 5 conditionID1, References: PlayerCondition, NoValue = 0
public uint playerCast; // 6 playerCast, enum { false, true, }; Default: false
public uint NeverUsableWhileMounted; // 7 Never Usable While Mounted, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 8 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 8 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct meetingstone
@@ -1184,7 +1184,7 @@ namespace Game.Entities
public uint Unused; // 0 Unused, int, Min value: 0, Max value: 65535, Default value: 1
public uint Unused2; // 1 Unused, int, Min value: 1, Max value: 65535, Default value: 60
public uint areaID; // 2 areaID, References: AreaTable, NoValue = 0
public uint InteractRadiusOverride; // 3 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint Preventmeetingstonefromtargetinganunfriendlypartymemberoutsideofinstances;// 4 Prevent meeting stone from targeting an unfriendly party member outside of instances, enum { false, true, }; Default: false
}
@@ -1203,7 +1203,7 @@ namespace Game.Entities
public uint GiganticAOI; // 10 Gigantic AOI, enum { false, true, }; Default: false
public uint InfiniteAOI; // 11 Infinite AOI, enum { false, true, }; Default: false
public uint cooldown; // 12 cooldown, int, Min value: 0, Max value: 2147483647, Default value: 3000
public uint InteractRadiusOverride; // 13 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 13 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct fishinghole
@@ -1213,7 +1213,7 @@ namespace Game.Entities
public uint minRestock; // 2 minRestock, int, Min value: 0, Max value: 65535, Default value: 0
public uint maxRestock; // 3 maxRestock, int, Min value: 0, Max value: 65535, Default value: 0
public uint open; // 4 open, References: Lock_, NoValue = 0
public uint InteractRadiusOverride; // 5 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct flagdrop
@@ -1228,7 +1228,7 @@ namespace Game.Entities
public uint GiganticAOI; // 7 Gigantic AOI, enum { false, true, }; Default: false
public uint InfiniteAOI; // 8 Infinite AOI, enum { false, true, }; Default: false
public uint cooldown; // 9 cooldown, int, Min value: 0, Max value: 2147483647, Default value: 3000
public uint InteractRadiusOverride; // 10 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 10 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct controlzone
@@ -1261,7 +1261,7 @@ namespace Game.Entities
public uint UncontestedTime; // 25 Uncontested Time, int, Min value: 0, Max value: 65535, Default value: 0
public uint FrequentHeartbeat; // 26 Frequent Heartbeat, enum { false, true, }; Default: false
public uint EnablingWorldStateExpression; // 27 Enabling World State Expression, References: WorldStateExpression, NoValue = 0
public uint InteractRadiusOverride; // 28 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 28 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct auraGenerator
@@ -1273,7 +1273,7 @@ namespace Game.Entities
public uint auraID2; // 4 auraID2, References: Spell, NoValue = 0
public uint conditionID2; // 5 conditionID2, References: PlayerCondition, NoValue = 0
public uint serverOnly; // 6 serverOnly, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 7 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 7 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct dungeonDifficulty
@@ -1289,7 +1289,7 @@ namespace Game.Entities
public uint LargeAOI; // 8 Large AOI, enum { false, true, }; Default: false
public uint GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false
public uint Legacy; // 10 Legacy, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 11 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 11 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct barberChair
@@ -1297,7 +1297,7 @@ namespace Game.Entities
public uint chairheight; // 0 chairheight, int, Min value: 0, Max value: 2, Default value: 1
public int HeightOffset; // 1 Height Offset (inches), int, Min value: -100, Max value: 100, Default value: 0
public uint SitAnimKit; // 2 Sit Anim Kit, References: AnimKit, NoValue = 0
public uint InteractRadiusOverride; // 3 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint CustomizationScope; // 4 Customization Scope, int, Min value: 0, Max value: 2147483647, Default value: 0
public uint Preventteleportingtheplayeroutofthebarbershopchair;// 5 Prevent teleporting the player out of the barbershop chair, enum { false, true, }; Default: false
}
@@ -1328,16 +1328,16 @@ namespace Game.Entities
public int Unused10; // 21 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public uint DamageEvent; // 22 Damage Event, References: GameEvents, NoValue = 0
public uint Displaymouseoverasanameplate; // 23 Display mouseover as a nameplate, enum { false, true, }; Default: false
public int Thexoffsetofthedestructiblenameplateifitisenabled;// 24 The x offset (in hundredths) of the destructible nameplate, if it is enabled, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public int Theyoffsetofthedestructiblenameplateifitisenabled;// 25 The y offset (in hundredths) of the destructible nameplate, if it is enabled, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public int Thezoffsetofthedestructiblenameplateifitisenabled;// 26 The z offset (in hundredths) of the destructible nameplate, if it is enabled, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 27 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public int Thexoffsetofthedestructiblenameplateifitisenabled;// 24 The x offset (Yards * 100) of the destructible nameplate, if it is enabled, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public int Theyoffsetofthedestructiblenameplateifitisenabled;// 25 The y offset (Yards * 100) of the destructible nameplate, if it is enabled, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public int Thezoffsetofthedestructiblenameplateifitisenabled;// 26 The z offset (Yards * 100) of the destructible nameplate, if it is enabled, int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 27 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct guildbank
{
public uint conditionID1; // 0 conditionID1, References: PlayerCondition, NoValue = 0
public uint InteractRadiusOverride; // 1 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 1 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct trapDoor
@@ -1350,7 +1350,7 @@ namespace Game.Entities
public uint GiganticAOI; // 5 Gigantic AOI, enum { false, true, }; Default: false
public uint InfiniteAOI; // 6 Infinite AOI, enum { false, true, }; Default: false
public uint DoorisOpaque; // 7 Door is Opaque (Disable portal on close), enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 8 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 8 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct newflag
@@ -1369,27 +1369,27 @@ namespace Game.Entities
public uint worldState1; // 11 worldState1, References: WorldState, NoValue = 0
public uint ReturnonDefenderInteract; // 12 Return on Defender Interact, enum { false, true, }; Default: false
public uint SpawnVignette; // 13 Spawn Vignette, References: vignette, NoValue = 0
public uint InteractRadiusOverride; // 14 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 14 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct newflagdrop
{
public uint open; // 0 open, References: Lock_, NoValue = 0
public uint SpawnVignette; // 1 Spawn Vignette, References: vignette, NoValue = 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct garrisonbuilding
{
public int SpawnMap; // 0 Spawn Map, References: Map, NoValue = -1
public uint InteractRadiusOverride; // 1 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 1 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct garrisonplot
{
public uint PlotInstance; // 0 Plot Instance, References: GarrPlotInstance, NoValue = 0
public int SpawnMap; // 1 Spawn Map, References: Map, NoValue = -1
public uint InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct clientcreature
@@ -1429,7 +1429,7 @@ namespace Game.Entities
public uint SpellVisual4; // 20 Spell Visual 4, References: SpellVisual, NoValue = 0
public uint SpellVisual5; // 21 Spell Visual 5, References: SpellVisual, NoValue = 0
public uint SpawnVignette; // 22 Spawn Vignette, References: vignette, NoValue = 0
public uint InteractRadiusOverride; // 23 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 23 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct phaseablemo
@@ -1438,14 +1438,14 @@ namespace Game.Entities
public int AreaNameSet; // 1 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public uint DoodadSetA; // 2 Doodad Set A, int, Min value: 0, Max value: 2147483647, Default value: 0
public uint DoodadSetB; // 3 Doodad Set B, int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 4 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 4 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct garrisonmonument
{
public uint TrophyTypeID; // 0 Trophy Type ID, References: TrophyType, NoValue = 0
public uint TrophyInstanceID; // 1 Trophy Instance ID, References: TrophyInstance, NoValue = 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct garrisonshipment
@@ -1453,13 +1453,13 @@ namespace Game.Entities
public uint ShipmentContainer; // 0 Shipment Container, References: CharShipmentContainer, NoValue = 0
public uint GiganticAOI; // 1 Gigantic AOI, enum { false, true, }; Default: false
public uint LargeAOI; // 2 Large AOI, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 3 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct garrisonmonumentplaque
{
public uint TrophyInstanceID; // 0 Trophy Instance ID, References: TrophyInstance, NoValue = 0
public uint InteractRadiusOverride; // 1 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 1 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct itemforge
@@ -1470,7 +1470,7 @@ namespace Game.Entities
public uint CameraMode; // 3 Camera Mode, References: CameraMode, NoValue = 0
public uint FadeRegionRadius; // 4 Fade Region Radius, int, Min value: 0, Max value: 2147483647, Default value: 0
public uint ForgeType; // 5 Forge Type, enum { Artifact Forge, Relic Forge, Heart Forge, Soulbind Forge, Anima Reservoir, }; Default: Relic Forge
public uint InteractRadiusOverride; // 6 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 6 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint GarrTalentTreeID; // 7 GarrTalentTree ID, References: GarrTalentTree, NoValue = 0
}
@@ -1481,13 +1481,13 @@ namespace Game.Entities
public uint GiganticAOI; // 2 Gigantic AOI, enum { false, true, }; Default: false
public uint spellFocusType; // 3 spellFocusType, References: SpellFocusObject, NoValue = 0
public uint radius; // 4 radius, int, Min value: 0, Max value: 50, Default value: 10
public uint InteractRadiusOverride; // 5 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint ItemInteractionID; // 6 Item Interaction ID, References: UiItemInteraction, NoValue = 0
}
public struct keystonereceptacle
{
public uint InteractRadiusOverride; // 0 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 0 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct gatheringnode
@@ -1516,7 +1516,7 @@ namespace Game.Entities
public uint PlayOpenAnimationonOpening; // 21 Play Open Animation on Opening, enum { false, true, }; Default: false
public uint turnpersonallootsecurityoff; // 22 turn personal loot security off, enum { false, true, }; Default: false
public uint ClearObjectVignetteonOpening; // 23 Clear Object Vignette on Opening, enum { false, true, }; Default: false
public uint InteractRadiusOverride; // 24 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 24 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint Overrideminimaptrackingicon; // 25 Override minimap tracking icon, References: UiTextureAtlasMember, NoValue = 0
}
@@ -1526,7 +1526,7 @@ namespace Game.Entities
public uint WhenAvailable; // 1 When Available, References: GameObjectDisplayInfo, NoValue = 0
public uint open; // 2 open, References: Lock_, NoValue = 0
public uint openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0
public uint InteractRadiusOverride; // 4 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 4 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct multi
@@ -1548,7 +1548,7 @@ namespace Game.Entities
public uint DoodadSetC; // 3 Doodad Set C, int, Min value: 0, Max value: 2147483647, Default value: 0
public int SpawnMap; // 4 Spawn Map, References: Map, NoValue = -1
public int AreaNameSet; // 5 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 6 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 6 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct pvpReward
@@ -1557,7 +1557,7 @@ namespace Game.Entities
public uint WhenAvailable; // 1 When Available, References: GameObjectDisplayInfo, NoValue = 0
public uint open; // 2 open, References: Lock_, NoValue = 0
public uint openTextID; // 3 openTextID, References: BroadcastText, NoValue = 0
public uint InteractRadiusOverride; // 4 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 4 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct playerchoicechest
@@ -1569,7 +1569,7 @@ namespace Game.Entities
public uint MawPowerFilter; // 4 Maw Power Filter, References: MawPowerFilter, NoValue = 0
public uint Script; // 5 Script, References: SpellScript, NoValue = 0
public uint SpellVisual1; // 6 Spell Visual 1, References: SpellVisual, NoValue = 0
public uint InteractRadiusOverride; // 7 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 7 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint Dontupdateplayerinteractability; // 8 Don't update player interactability, enum { false, true, }; Default: false
}
@@ -1577,21 +1577,21 @@ namespace Game.Entities
{
public uint PlayerChoice; // 0 Player Choice, References: PlayerChoice, NoValue = 0
public uint CustomItemBonusFilter; // 1 Custom Item Bonus Filter, References: CustomItemBonusFilter, NoValue = 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct garrtalenttree
{
public uint UiMapID; // 0 Ui Map ID, References: UiMap, NoValue = 0
public uint GarrTalentTreeID; // 1 GarrTalentTree ID, References: GarrTalentTree, NoValue = 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
}
public struct weeklyrewardchest
{
public uint WhenAvailable; // 0 When Available, References: GameObjectDisplayInfo, NoValue = 0
public uint open; // 1 open, References: Lock_, NoValue = 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint InteractRadiusOverride; // 2 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint ExpansionLevel; // 3 Expansion Level, int, Min value: 0, Max value: 2147483647, Default value: 0
}
+1 -1
View File
@@ -2342,7 +2342,7 @@ namespace Game.Entities
}
public ItemContext GetContext() { return (ItemContext)(int)m_itemData.Context; }
public void SetContext(ItemContext context) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Context), (int)context); }
public void SetContext(ItemContext context) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Context), (byte)context); }
public void SetPetitionId(uint petitionId)
{
@@ -69,6 +69,8 @@ namespace Game.Entities
return updateField._value;
}
public int Size() { return _value.GetByteCount(); }
public void SetValue(string value) { _value = value; }
public string GetValue() { return _value; }
@@ -411,7 +413,8 @@ namespace Game.Entities
public void ClearChanged<U>(UpdateFieldArray<U> updateField, int index) where U : new()
{
_changesMask.Reset(updateField.FirstElementBit + index);
if (updateField.FirstElementBit >= 0)
_changesMask.Reset(updateField.FirstElementBit + index);
}
public void ClearChanged<U>(DynamicUpdateField<U> updateField, int index) where U : new()
@@ -518,9 +521,10 @@ namespace Game.Entities
updateField[index]._updateMask.Resize((uint)(updateField[index]._values.Count + 31) / 32);
}
//MarkChanged(updateField, index);
_changesMask.Set(updateField.Bit);
_changesMask.Set(updateField.FirstElementBit);
if (updateField.FirstElementBit >= 0)
_changesMask.Set(updateField.FirstElementBit);
updateField[index].MarkChanged(dynamicIndex);
return new DynamicUpdateFieldSetter<U>(updateField[index], dynamicIndex);
@@ -547,13 +551,15 @@ namespace Game.Entities
public void MarkChanged<U>(UpdateFieldArray<U> updateField, int index) where U : new()
{
_changesMask.Set(updateField.Bit);
_changesMask.Set(updateField.FirstElementBit + index);
if (updateField.FirstElementBit >= 0)
_changesMask.Set(updateField.FirstElementBit + index);
}
public void MarkChanged(UpdateFieldArrayString updateField, int index)
{
_changesMask.Set(updateField.Bit);
_changesMask.Set(updateField.FirstElementBit + index);
if (updateField.FirstElementBit >= 0)
_changesMask.Set(updateField.FirstElementBit + index);
}
public void WriteCompleteDynamicFieldUpdateMask(int size, WorldPacket data, int bitsForSize = 32)
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -654,7 +654,7 @@ namespace Game.Entities
// *data << int32(Players[i].Pets[j].Power);
// *data << int32(Players[i].Pets[j].Speed);
// *data << int32(Players[i].Pets[j].NpcTeamMemberID);
// *data << uint16(Players[i].Pets[j].BreedQuality);
// *data << uint8(Players[i].Pets[j].BreedQuality);
// *data << uint16(Players[i].Pets[j].StatusFlags);
// *data << int8(Players[i].Pets[j].Slot);
+4 -4
View File
@@ -3779,8 +3779,8 @@ namespace Game.Entities
stmt.AddValue(index++, GetLootSpecId());
ss.Clear();
for (int i = 0; i < m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex].Size(); ++i)
ss.Append($"{(uint)(m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex][i] & 0xFFFFFFFF)} {(uint)((m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex][i] >> 32) & 0xFFFFFFFF)} ");
for (int i = 0; i < m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex].Size(); ++i)
ss.Append($"{(uint)(m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex][i] & 0xFFFFFFFF)} {(uint)((m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex][i] >> 32) & 0xFFFFFFFF)} ");
stmt.AddValue(index++, ss.ToString());
@@ -3931,8 +3931,8 @@ namespace Game.Entities
stmt.AddValue(index++, GetLootSpecId());
ss.Clear();
for (int i = 0; i < m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex].Size(); ++i)
ss.Append($"{(uint)(m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex][i] & 0xFFFFFFFF)} {(uint)((m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex][i] >> 32) & 0xFFFFFFFF)} ");
for (int i = 0; i < m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex].Size(); ++i)
ss.Append($"{(uint)(m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex][i] & 0xFFFFFFFF)} {(uint)((m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex][i] >> 32) & 0xFFFFFFFF)} ");
stmt.AddValue(index++, ss.ToString());
@@ -85,6 +85,7 @@ namespace Game.Entities
float m_lastFallZ;
TeleportLocation teleportDest;
TeleportToOptions m_teleport_options;
int m_newWorldCounter;
bool mSemaphoreTeleport_Near;
bool mSemaphoreTeleport_Far;
PlayerDelayedOperations m_DelayedOperations;
+6 -1
View File
@@ -2447,9 +2447,14 @@ namespace Game.Entities
packet.QuestLogItemID = item.GetTemplate().QuestLogItemId;
packet.Quantity = quantity;
packet.QuantityInInventory = GetItemCount(item.GetEntry());
QuestObjective questObjective = GetQuestObjectiveForItem(item.GetEntry(), false);
if (questObjective != null)
packet.QuantityInQuestLog = GetQuestObjectiveData(questObjective);
packet.BattlePetSpeciesID = (int)item.GetModifier(ItemModifier.BattlePetSpeciesId);
packet.BattlePetBreedID = (int)item.GetModifier(ItemModifier.BattlePetBreedData) & 0xFFFFFF;
packet.BattlePetBreedQuality = (item.GetModifier(ItemModifier.BattlePetBreedData) >> 24) & 0xFF;
packet.BattlePetBreedQuality = (byte)((item.GetModifier(ItemModifier.BattlePetBreedData) >> 24) & 0xFF);
packet.BattlePetLevel = (int)item.GetModifier(ItemModifier.BattlePetLevel);
packet.ItemGUID = item.GetGUID();
+27 -11
View File
@@ -2095,20 +2095,28 @@ namespace Game.Entities
case QuestStatus.Complete:
if (quest.IsImportant())
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.ImportantQuestRewardCompleteNoPOI : QuestGiverStatus.ImportantQuestRewardCompletePOI;
else if (quest.IsMeta())
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.MetaQuestRewardCompleteNoPOI : QuestGiverStatus.MetaQuestRewardCompletePOI;
else if (quest.GetQuestTag() == QuestTagType.CovenantCalling)
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.CovenantCallingRewardCompleteNoPOI : QuestGiverStatus.CovenantCallingRewardCompletePOI;
else if (quest.HasFlagEx(QuestFlagsEx.Legendary))
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.LegendaryRewardCompleteNoPOI : QuestGiverStatus.LegendaryRewardCompletePOI;
else if (quest.IsDailyOrWeekly())
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.RepeatableRewardCompleteNoPOI : QuestGiverStatus.RepeatableRewardCompletePOI;
else
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.RewardCompleteNoPOI : QuestGiverStatus.RewardCompletePOI;
break;
case QuestStatus.Incomplete:
if (quest.IsImportant())
result |= QuestGiverStatus.ImportantReward;
else if (quest.IsMeta())
result |= QuestGiverStatus.MetaReward;
else if (quest.GetQuestTag() == QuestTagType.CovenantCalling)
result |= QuestGiverStatus.CovenantCallingReward;
else if (quest.HasFlagEx(QuestFlagsEx.Legendary))
result |= QuestGiverStatus.LegendaryReward;
else if (quest.IsDailyOrWeekly())
result |= QuestGiverStatus.RepeatableReward;
else
result |= QuestGiverStatus.Reward;
break;
@@ -2116,12 +2124,16 @@ namespace Game.Entities
break;
}
if (quest.IsTurnIn() && CanTakeQuest(quest, false) && quest.IsRepeatable() && !quest.IsDailyOrWeekly() && !quest.IsMonthly())
if (quest.IsTurnIn() && CanTakeQuest(quest, false))
{
if (GetLevel() > (GetQuestLevel(quest) + WorldConfig.GetIntValue(WorldCfg.QuestLowLevelHideDiff)))
result |= QuestGiverStatus.RepeatableTurnin;
else
result |= QuestGiverStatus.TrivialRepeatableTurnin;
if (quest.IsRepeatable())
{
if (GetLevel() > (GetQuestLevel(quest) + WorldConfig.GetIntValue(WorldCfg.QuestLowLevelHideDiff)))
result |= QuestGiverStatus.RepeatableTurnin;
else
result |= QuestGiverStatus.TrivialRepeatableTurnin;
}
result |= quest.HasFlag(QuestFlags.HideRewardPoi) ? QuestGiverStatus.RewardCompleteNoPOI : QuestGiverStatus.RewardCompletePOI;
}
}
@@ -2143,12 +2155,14 @@ namespace Game.Entities
bool isTrivial = GetLevel() > (GetQuestLevel(quest) + WorldConfig.GetIntValue(WorldCfg.QuestLowLevelHideDiff));
if (quest.IsImportant())
result |= isTrivial ? QuestGiverStatus.TrivialImportantQuest : QuestGiverStatus.ImportantQuest;
else if (quest.IsMeta())
result |= isTrivial ? QuestGiverStatus.TrivialMetaQuest : QuestGiverStatus.MetaQuest;
else if (quest.GetQuestTag() == QuestTagType.CovenantCalling)
result |= QuestGiverStatus.CovenantCallingQuest;
else if (quest.HasFlagEx(QuestFlagsEx.Legendary))
result |= isTrivial ? QuestGiverStatus.TrivialLegendaryQuest : QuestGiverStatus.LegendaryQuest;
else if (quest.IsDaily())
result |= isTrivial ? QuestGiverStatus.TrivialDailyQuest : QuestGiverStatus.DailyQuest;
else if (quest.IsDailyOrWeekly())
result |= isTrivial ? QuestGiverStatus.TrivialRepeatableQuest : QuestGiverStatus.RepeatableQuest;
else
result |= isTrivial ? QuestGiverStatus.Trivial : QuestGiverStatus.Quest;
}
@@ -3373,9 +3387,11 @@ namespace Game.Entities
{
ObjectFieldData objMask = new();
UnitData unitMask = new();
for (int i = 0; i < creature.m_unitData.NpcFlags.GetSize(); ++i)
if (creature.m_unitData.NpcFlags[i] != 0)
unitMask.MarkChanged(creature.m_unitData.NpcFlags, i);
if (creature.m_unitData.NpcFlags != 0)
unitMask.MarkChanged(m_unitData.NpcFlags);
if (creature.m_unitData.NpcFlags2 != 0)
unitMask.MarkChanged(m_unitData.NpcFlags2);
if (objMask.GetUpdateMask().IsAnySet() || unitMask.GetUpdateMask().IsAnySet())
creature.BuildValuesUpdateForPlayerWithMask(udata, objMask.GetUpdateMask(), unitMask.GetUpdateMask(), this);
@@ -3396,7 +3412,7 @@ namespace Game.Entities
{
ObjectFieldData objMask = new();
UnitData unitMask = new();
unitMask.MarkChanged(m_unitData.NpcFlags, 0); // NpcFlags[0] has UNIT_NPC_FLAG_SPELLCLICK
unitMask.MarkChanged(m_unitData.NpcFlags); // NpcFlags has UNIT_NPC_FLAG_SPELLCLICK
creature.BuildValuesUpdateForPlayerWithMask(udata, objMask.GetUpdateMask(), unitMask.GetUpdateMask(), this);
break;
}
+14 -7
View File
@@ -2200,6 +2200,8 @@ namespace Game.Entities
if (!GetSession().PlayerLogout())
{
++m_newWorldCounter;
SuspendToken suspendToken = new();
suspendToken.SequenceIndex = m_movementCounter; // not incrementing
suspendToken.Reason = options.HasAnyFlag(TeleportToOptions.Seamless) ? 2 : 1u;
@@ -2946,7 +2948,8 @@ namespace Game.Entities
PlayerInteractionType.Renown, PlayerInteractionType.BlackMarketAuctioneer, PlayerInteractionType.PerksProgramVendor,
PlayerInteractionType.ProfessionsCraftingOrder, PlayerInteractionType.Professions, PlayerInteractionType.ProfessionsCustomerOrder,
PlayerInteractionType.TraitSystem, PlayerInteractionType.BarbersChoice, PlayerInteractionType.MajorFactionRenown,
PlayerInteractionType.PersonalTabardVendor
PlayerInteractionType.PersonalTabardVendor, PlayerInteractionType.ForgeMaster, PlayerInteractionType.CharacterBanker,
PlayerInteractionType.AccountBanker
};
PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[(int)gossipOptionNpc];
@@ -6469,8 +6472,8 @@ namespace Game.Entities
int offset = (areaEntry.AreaBit / PlayerConst.ExploredZonesBits);
ulong val = 1ul << (areaEntry.AreaBit % PlayerConst.ExploredZonesBits);
if (offset >= m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex].Size()
|| (m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex][offset] & val) == 0)
if (offset >= m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex].Size()
|| (m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex][offset] & val) == 0)
{
AddExploredZones(offset, val);
@@ -6521,12 +6524,14 @@ namespace Game.Entities
public void AddExploredZones(int pos, ulong mask)
{
SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.DataFlags, (int)PlayerDataFlag.ExploredZonesIndex, pos), mask);
BitVectors bitVectors = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BitVectors);
SetUpdateFieldFlagValue(bitVectors.ModifyValue(bitVectors.Values, (int)PlayerDataFlag.ExploredZonesIndex, pos), mask);
}
public void RemoveExploredZones(int pos, ulong mask)
{
RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.DataFlags, (int)PlayerDataFlag.ExploredZonesIndex, pos), mask);
BitVectors bitVectors = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BitVectors);
RemoveUpdateFieldFlagValue(bitVectors.ModifyValue(bitVectors.Values, (int)PlayerDataFlag.ExploredZonesIndex, pos), mask);
}
public bool HasExploredZone(uint areaId)
@@ -6539,11 +6544,11 @@ namespace Game.Entities
return false;
int playerIndexOffset = area.AreaBit / PlayerConst.ExploredZonesBits;
if (playerIndexOffset >= m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex].Size())
if (playerIndexOffset >= m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex].Size())
return false;
ulong mask = 1ul << (area.AreaBit % PlayerConst.ExploredZonesBits);
return (m_activePlayerData.DataFlags[(int)PlayerDataFlag.ExploredZonesIndex][playerIndexOffset] & mask) != 0;
return (m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.ExploredZonesIndex][playerIndexOffset] & mask) != 0;
}
void SendExplorationExperience(uint Area, uint Experience)
@@ -7354,6 +7359,8 @@ namespace Game.Entities
public void SetSemaphoreTeleportNear(bool semphsetting) { mSemaphoreTeleport_Near = semphsetting; }
public void SetSemaphoreTeleportFar(bool semphsetting) { mSemaphoreTeleport_Far = semphsetting; }
public int GetNewWorldCounter() { return m_newWorldCounter; }
public bool IsReagentBankUnlocked() { return HasPlayerFlagEx(PlayerFlagsEx.ReagentBankUnlocked); }
public void UnlockReagentBank() { SetPlayerFlagEx(PlayerFlagsEx.ReagentBankUnlocked); }
+6 -6
View File
@@ -1714,12 +1714,12 @@ namespace Game.Entities
public virtual void UpdateNearbyPlayersInteractions()
{
for (int i = 0; i < m_unitData.NpcFlags.GetSize(); ++i)
if (m_unitData.NpcFlags[i] != 0)
{
m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, i);
ForceUpdateFieldChange();
}
if (m_unitData.NpcFlags != 0)
m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags);
if (m_unitData.NpcFlags2 != 0)
m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags2);
ForceUpdateFieldChange();
}
}
}
@@ -345,6 +345,36 @@ namespace Game.Entities
return true;
}
bool SetEnableFullSpeedTurning(bool enable)
{
if (!IsPlayer())
return false;
if (enable == HasUnitMovementFlag2(MovementFlag2.FullSpeedTurning))
return false;
if (enable)
AddUnitMovementFlag2(MovementFlag2.FullSpeedTurning);
else
RemoveUnitMovementFlag2(MovementFlag2.FullSpeedTurning);
ServerOpcodes[] fullSpeedTurningOpcodeTable = [ServerOpcodes.MoveDisableFullSpeedTurning, ServerOpcodes.MoveEnableFullSpeedTurning];
Player playerMover = GetUnitBeingMoved()?.ToPlayer();
if (playerMover != null)
{
MoveSetFlag packet = new(fullSpeedTurningOpcodeTable[enable ? 1 : 0]);
packet.MoverGUID = GetGUID();
packet.SequenceIndex = m_movementCounter++;
playerMover.SendPacket(packet);
MoveUpdate moveUpdate = new();
moveUpdate.Status = m_movementInfo;
SendMessageToSet(moveUpdate, playerMover);
}
return true;
}
public bool SetCanTransitionBetweenSwimAndFly(bool enable)
{
if (!IsTypeId(TypeId.Player))
+10 -10
View File
@@ -867,17 +867,17 @@ namespace Game.Entities
m_areaTrigger.Last()?.Remove();
}
public NPCFlags GetNpcFlags() { return (NPCFlags)m_unitData.NpcFlags[0]; }
public bool HasNpcFlag(NPCFlags flags) { return (m_unitData.NpcFlags[0] & (uint)flags) != 0; }
public void SetNpcFlag(NPCFlags flags) { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 0), (uint)flags); }
public void RemoveNpcFlag(NPCFlags flags) { RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 0), (uint)flags); }
public void ReplaceAllNpcFlags(NPCFlags flags) { SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 0), (uint)flags); }
public NPCFlags GetNpcFlags() { return (NPCFlags)m_unitData.NpcFlags.GetValue(); }
public bool HasNpcFlag(NPCFlags flags) { return (m_unitData.NpcFlags & (uint)flags) != 0; }
public void SetNpcFlag(NPCFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags), (uint)flags); }
public void RemoveNpcFlag(NPCFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags), (uint)flags); }
public void ReplaceAllNpcFlags(NPCFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags), (uint)flags); }
public NPCFlags2 GetNpcFlags2() { return (NPCFlags2)m_unitData.NpcFlags[1]; }
public bool HasNpcFlag2(NPCFlags2 flags) { return (m_unitData.NpcFlags[1] & (uint)flags) != 0; }
public void SetNpcFlag2(NPCFlags2 flags) { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 1), (uint)flags); }
public void RemoveNpcFlag2(NPCFlags2 flags) { RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 1), (uint)flags); }
public void ReplaceAllNpcFlags2(NPCFlags2 flags) { SetUpdateFieldValue(ref m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags, 1), (uint)flags); }
public NPCFlags2 GetNpcFlags2() { return (NPCFlags2)m_unitData.NpcFlags2.GetValue(); }
public bool HasNpcFlag2(NPCFlags2 flags) { return (m_unitData.NpcFlags2 & (uint)flags) != 0; }
public void SetNpcFlag2(NPCFlags2 flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags2), (uint)flags); }
public void RemoveNpcFlag2(NPCFlags2 flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags2), (uint)flags); }
public void ReplaceAllNpcFlags2(NPCFlags2 flags) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NpcFlags2), (uint)flags); }
public bool IsVendor() { return HasNpcFlag(NPCFlags.Vendor); }
public bool IsTrainer() { return HasNpcFlag(NPCFlags.Trainer); }
+121 -11
View File
@@ -657,8 +657,8 @@ namespace Game
_gossipMenuAddonStorage.Clear();
// 0 1
SQLResult result = DB.World.Query("SELECT MenuID, FriendshipFactionID FROM gossip_menu_addon");
// 0 1 2
SQLResult result = DB.World.Query("SELECT MenuID, FriendshipFactionID, LfgDungeonsID FROM gossip_menu_addon");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 gossip_menu_addon IDs. DB table `gossip_menu_addon` is empty!");
@@ -670,20 +670,30 @@ namespace Game
uint menuID = result.Read<uint>(0);
GossipMenuAddon addon = new();
addon.FriendshipFactionID = result.Read<int>(1);
addon.LfgDungeonsID = result.Read<uint>(2);
var faction = CliDB.FactionStorage.LookupByKey(addon.FriendshipFactionID);
if (faction != null)
if (addon.FriendshipFactionID != 0)
{
if (!CliDB.FriendshipReputationStorage.ContainsKey(faction.FriendshipRepID))
var faction = CliDB.FactionStorage.LookupByKey(addon.FriendshipFactionID);
if (faction != null)
{
Log.outError(LogFilter.Sql, $"Table gossip_menu_addon: ID {menuID} is using FriendshipFactionID {addon.FriendshipFactionID} referencing non-existing FriendshipRepID {faction.FriendshipRepID}");
if (!CliDB.FriendshipReputationStorage.ContainsKey(faction.FriendshipRepID))
{
Log.outError(LogFilter.Sql, $"Table gossip_menu_addon: ID {menuID} is using FriendshipFactionID {addon.FriendshipFactionID} referencing non-existing FriendshipRepID {faction.FriendshipRepID}");
addon.FriendshipFactionID = 0;
}
}
else
{
Log.outError(LogFilter.Sql, $"Table gossip_menu_addon: ID {menuID} is using non-existing FriendshipFactionID {addon.FriendshipFactionID}");
addon.FriendshipFactionID = 0;
}
}
else
if (addon.LfgDungeonsID != 0 && !CliDB.LFGDungeonsStorage.ContainsKey(addon.LfgDungeonsID))
{
Log.outError(LogFilter.Sql, $"Table gossip_menu_addon: ID {menuID} is using non-existing FriendshipFactionID {addon.FriendshipFactionID}");
addon.FriendshipFactionID = 0;
Log.outError(LogFilter.Sql, $"Table gossip_menu_addon: ID {menuID} is using non-existing LfgDungeonsID {addon.LfgDungeonsID}");
addon.LfgDungeonsID = 0;
}
_gossipMenuAddonStorage[menuID] = addon;
@@ -7055,7 +7065,7 @@ namespace Game
//90 91 92 93 94 95 96 97
"RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " +
//98 99 100 101 102 103 104 105 106
"AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, ManagedWorldStateID, QuestSessionBonus, " +
"AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, ResetByScheduler, Expansion, ManagedWorldStateID, QuestSessionBonus, " +
//107 108 109 110 111 112 113 114 115
"LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog " +
" FROM quest_template");
@@ -7078,7 +7088,6 @@ namespace Game
}
while (result.NextRow());
// Load `quest_reward_choice_items`
// 0 1 2 3 4 5 6
result = DB.World.Query("SELECT QuestID, Type1, Type2, Type3, Type4, Type5, Type6 FROM quest_reward_choice_items");
@@ -7255,6 +7264,107 @@ namespace Game
} while (result.NextRow());
}
// Load `quest_description_conditional`
// 0 1 2 3 4
result = DB.World.Query("SELECT QuestId, PlayerConditionId, QuestgiverCreatureId, Text, locale FROM `quest_description_conditional` ORDER BY OrderIndex");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 quest objectives. DB table `quest_objectives` is empty.");
}
else
{
do
{
uint questId = result.Read<uint>(0);
var quest = _questTemplates.LookupByKey(questId);
if (quest != null)
quest.LoadConditionalConditionalQuestDescription(result.GetFields());
else
Log.outError(LogFilter.Sql, "Table `quest_objectives` has objective for quest {0} but such quest does not exist", questId);
} while (result.NextRow());
}
// Load `quest_request_items_conditional`
// 0 1 2 3 4
result = DB.World.Query("SELECT QuestId, PlayerConditionId, QuestgiverCreatureId, Text, locale FROM `quest_request_items_conditional` ORDER BY OrderIndex");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 quest objectives. DB table `quest_objectives` is empty.");
}
else
{
do
{
uint questId = result.Read<uint>(0);
var quest = _questTemplates.LookupByKey(questId);
if (quest != null)
quest.LoadConditionalConditionalRequestItemsText(result.GetFields());
else
Log.outError(LogFilter.Sql, "Table `quest_objectives` has objective for quest {0} but such quest does not exist", questId);
} while (result.NextRow());
}
// Load `quest_offer_reward_conditional`
// 0 1 2 3 4
result = DB.World.Query("SELECT QuestId, PlayerConditionId, QuestgiverCreatureId, Text, locale FROM `quest_offer_reward_conditional` ORDER BY OrderIndex");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 quest objectives. DB table `quest_objectives` is empty.");
}
else
{
do
{
uint questId = result.Read<uint>(0);
var quest = _questTemplates.LookupByKey(questId);
if (quest != null)
quest.LoadConditionalConditionalOfferRewardText(result.GetFields());
else
Log.outError(LogFilter.Sql, "Table `quest_objectives` has objective for quest {0} but such quest does not exist", questId);
} while (result.NextRow());
}
// Load `quest_completion_log_conditional`
// 0 1 2 3 4
result = DB.World.Query("SELECT QuestId, PlayerConditionId, QuestgiverCreatureId, Text, locale FROM `quest_completion_log_conditional` ORDER BY OrderIndex");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 quest objectives. DB table `quest_objectives` is empty.");
}
else
{
do
{
uint questId = result.Read<uint>(0);
var quest = _questTemplates.LookupByKey(questId);
if (quest != null)
quest.LoadConditionalConditionalQuestCompletionLog(result.GetFields());
else
Log.outError(LogFilter.Sql, "Table `quest_objectives` has objective for quest {0} but such quest does not exist", questId);
} while (result.NextRow());
}
// Load `quest_treasure_pickers`
result = DB.World.Query("SELECT QuestID, TreasurePickerID FROM `quest_treasure_pickers` ORDER BY OrderIndex");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 quest objectives. DB table `quest_objectives` is empty.");
}
else
{
do
{
uint questId = result.Read<uint>(0);
var quest = _questTemplates.LookupByKey(questId);
if (quest != null)
quest.LoadTreasurePickers(result.GetFields());
else
Log.outError(LogFilter.Sql, "Table `quest_objectives` has objective for quest {0} but such quest does not exist", questId);
} while (result.NextRow());
}
// Load `quest_visual_effect` join table with quest_objectives because visual effects are based on objective ID (core stores objectives by their index in quest)
// 0 1 2 3 4
result = DB.World.Query("SELECT v.ID, o.ID, o.QuestID, v.Index, v.VisualEffect FROM quest_visual_effect AS v LEFT JOIN quest_objectives AS o ON v.ID = o.ID ORDER BY v.Index DESC");
+13 -9
View File
@@ -146,6 +146,7 @@ namespace Game.Groups
stmt.AddValue(index++, (byte)m_raidDifficulty);
stmt.AddValue(index++, (byte)m_legacyRaidDifficulty);
stmt.AddValue(index++, m_masterLooterGuid.GetCounter());
stmt.AddValue(index++, (sbyte)m_pingRestriction);
DB.Characters.Execute(stmt);
@@ -191,6 +192,8 @@ namespace Game.Groups
m_masterLooterGuid = ObjectGuid.Create(HighGuid.Player, field.Read<ulong>(16));
m_pingRestriction = (RestrictPingsTo)field.Read<sbyte>(18);
if (m_groupFlags.HasAnyFlag(GroupFlags.Lfg))
Global.LFGMgr._LoadFromDB(field, GetGUID());
}
@@ -819,6 +822,8 @@ namespace Game.Groups
partyUpdate.SequenceNum = player.NextGroupUpdateSequenceNumber(m_groupCategory);
partyUpdate.PingRestriction = m_pingRestriction;
partyUpdate.MyIndex = -1;
byte index = 0;
for (var i = 0; i < m_memberSlots.Count; ++i, ++index)
@@ -1883,23 +1888,20 @@ namespace Game.Groups
SendUpdate();
}
public bool IsRestrictPingsToAssistants()
public RestrictPingsTo GetRestrictPings()
{
return m_groupFlags.HasFlag(GroupFlags.RestrictPings);
return m_pingRestriction;
}
public void SetRestrictPingsToAssistants(bool restrictPingsToAssistants)
public void SetRestrictPingsTo(RestrictPingsTo restrictTo)
{
if (restrictPingsToAssistants)
m_groupFlags |= GroupFlags.RestrictPings;
else
m_groupFlags &= ~GroupFlags.RestrictPings;
m_pingRestriction = restrictTo;
if (!IsBGGroup() && !IsBFGroup())
{
PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.UPD_GROUP_TYPE);
PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.UPD_GROUP_PING_RESTRICTION);
stmt.AddValue(0, (ushort)m_groupFlags);
stmt.AddValue(0, (sbyte)m_pingRestriction);
stmt.AddValue(1, m_dbStoreId);
DB.Characters.Execute(stmt);
@@ -1982,6 +1984,8 @@ namespace Game.Groups
uint m_activeMarkers;
CountdownInfo[] _countdowns = new CountdownInfo[3];
RestrictPingsTo m_pingRestriction;
}
public class MemberSlot
+2 -2
View File
@@ -107,8 +107,8 @@ namespace Game.Groups
// 0 1 2 3 4 5 6 7 8 9
SQLResult result = DB.Characters.Query("SELECT g.leaderGuid, g.lootMethod, g.looterGuid, g.lootThreshold, g.icon1, g.icon2, g.icon3, g.icon4, g.icon5, g.icon6" +
// 10 11 12 13 14 15 16 17 18 19
", g.icon7, g.icon8, g.groupType, g.difficulty, g.raiddifficulty, g.legacyRaidDifficulty, g.masterLooterGuid, g.guid, lfg.dungeon, lfg.state FROM `groups` g LEFT JOIN lfg_data lfg ON lfg.guid = g.guid ORDER BY g.guid ASC");
// 10 11 12 13 14 15 16 17 18 19 20
", g.icon7, g.icon8, g.groupType, g.difficulty, g.raiddifficulty, g.legacyRaidDifficulty, g.masterLooterGuid, g.guid, g.pingRestriction, lfg.dungeon, lfg.state FROM `groups` g LEFT JOIN lfg_data lfg ON lfg.guid = g.guid ORDER BY g.guid ASC");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 group definitions. DB table `groups` is empty!");
-1
View File
@@ -1239,7 +1239,6 @@ namespace Game.Guilds
eventPacket.Name = player.GetName();
eventPacket.VirtualRealmAddress = Global.WorldMgr.GetVirtualRealmAddress();
eventPacket.LoggedOn = loggedOn;
eventPacket.Mobile = false;
if (broadcast)
BroadcastPacket(eventPacket);
+1 -1
View File
@@ -982,7 +982,7 @@ namespace Game
SendPacket(commodityQuoteResult);
}
public void SendAuctionHello(ObjectGuid guid, Creature unit)
public void SendAuctionHello(ObjectGuid guid, Unit unit)
{
if (GetPlayer().GetLevel() < WorldConfig.GetIntValue(WorldCfg.AuctionLevelReq))
{
+30 -6
View File
@@ -21,6 +21,9 @@ namespace Game
return;
}
if (packet.BankType != BankType.Character)
return;
Item item = GetPlayer().GetItemByPos(packet.Bag, packet.Slot);
if (item == null)
return;
@@ -45,19 +48,40 @@ namespace Game
}
[WorldPacketHandler(ClientOpcodes.BankerActivate, Processing = PacketProcessing.Inplace)]
void HandleBankerActivate(Hello packet)
void HandleBankerActivate(BankerActivate bankerActivate)
{
Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.Banker, NPCFlags2.None);
if (bankerActivate.InteractionType != PlayerInteractionType.Banker)
return;
Creature unit = GetPlayer().GetNPCIfCanInteractWith(bankerActivate.Banker, NPCFlags.AccountBanker | NPCFlags.Banker, NPCFlags2.None);
if (unit == null)
{
Log.outError(LogFilter.Network, "HandleBankerActivate: {0} not found or you can not interact with him.", packet.Unit.ToString());
Log.outError(LogFilter.Network, $"HandleBankerActivate: {bankerActivate.Banker} not found or you can not interact with him.");
return;
}
switch (bankerActivate.InteractionType)
{
case PlayerInteractionType.Banker:
if (!unit.HasNpcFlag(NPCFlags.AccountBanker) || !unit.HasNpcFlag(NPCFlags.Banker))
return;
break;
case PlayerInteractionType.CharacterBanker:
if (!unit.HasNpcFlag(NPCFlags.Banker))
return;
break;
case PlayerInteractionType.AccountBanker:
if (!unit.HasNpcFlag(NPCFlags.AccountBanker))
return;
break;
default:
break;
}
if (GetPlayer().HasUnitState(UnitState.Died))
GetPlayer().RemoveAurasByType(AuraType.FeignDeath);
SendShowBank(packet.Unit);
SendShowBank(bankerActivate.Banker, bankerActivate.InteractionType);
}
[WorldPacketHandler(ClientOpcodes.AutostoreBankItem, Processing = PacketProcessing.Inplace)]
@@ -281,13 +305,13 @@ namespace Game
}
}
public void SendShowBank(ObjectGuid guid)
public void SendShowBank(ObjectGuid guid, PlayerInteractionType interactionType)
{
_player.PlayerTalkClass.GetInteractionData().Reset();
_player.PlayerTalkClass.GetInteractionData().SourceGuid = guid;
NPCInteractionOpenResult npcInteraction = new();
npcInteraction.Npc = guid;
npcInteraction.InteractionType = PlayerInteractionType.Banker;
npcInteraction.InteractionType = interactionType;
npcInteraction.Success = true;
SendPacket(npcInteraction);
}
+2 -2
View File
@@ -70,7 +70,7 @@ namespace Game
{
do
{
EnumCharactersResult.CharacterInfo charInfo = new(result.GetFields());
EnumCharactersResult.CharacterInfoBasic charInfo = new(result.GetFields());
var customizationsForChar = customizations.LookupByKey(charInfo.Guid.GetCounter());
if (!customizationsForChar.Empty())
@@ -149,7 +149,7 @@ namespace Game
{
do
{
EnumCharactersResult.CharacterInfo charInfo = new(result.GetFields());
EnumCharactersResult.CharacterInfoBasic charInfo = new(result.GetFields());
Log.outInfo(LogFilter.Network, "Loading undeleted char guid {0} from account {1}.", charInfo.Guid.ToString(), GetAccountId());
+20 -3
View File
@@ -646,8 +646,24 @@ namespace Game
if (group == null)
return false;
if (group.IsRestrictPingsToAssistants() && !group.IsLeader(player.GetGUID()) && !group.IsAssistant(player.GetGUID()))
return false;
if (group.IsLeader(player.GetGUID()))
return true;
switch (group.GetRestrictPings())
{
case RestrictPingsTo.None:
return true;
case RestrictPingsTo.Lead:
return false;
case RestrictPingsTo.Assist:
if (!group.IsAssistant(player.GetGUID()))
return false;
break;
case RestrictPingsTo.TankHealer:
if (!group.GetLfgRoles(player.GetGUID()).HasAnyFlag(LfgRoles.Tank | LfgRoles.Healer))
return false;
break;
}
return true;
}
@@ -662,7 +678,7 @@ namespace Game
if (!group.IsLeader(GetPlayer().GetGUID()))
return;
group.SetRestrictPingsToAssistants(setRestrictPingsToAssistants.RestrictPingsToAssistants);
group.SetRestrictPingsTo(setRestrictPingsToAssistants.RestrictTo);
}
[WorldPacketHandler(ClientOpcodes.SendPingUnit)]
@@ -709,6 +725,7 @@ namespace Game
broadcastPingWorldPoint.Point = pingWorldPoint.Point;
broadcastPingWorldPoint.Type = pingWorldPoint.Type;
broadcastPingWorldPoint.PinFrameID = pingWorldPoint.PinFrameID;
broadcastPingWorldPoint.Transport = pingWorldPoint.Transport;
broadcastPingWorldPoint.Write();
for (GroupReference itr = group.GetFirstMember(); itr != null; itr = itr.Next())
+7
View File
@@ -1062,6 +1062,13 @@ namespace Game
GetPlayer().DestroyItem(item.GetBagSlot(), item.GetSlot(), true);
}
void HandleSortAccountBankBags(SortAccountBankBags sortAccountBankBags)
{
// TODO: Implement sorting
// Placeholder to prevent completely locking out bags clientside
SendPacket(new BagCleanupFinished());
}
[WorldPacketHandler(ClientOpcodes.SortBags, Processing = PacketProcessing.Inplace)]
void HandleSortBags(SortBags sortBags)
{
+1
View File
@@ -462,6 +462,7 @@ namespace Game
packet.MapID = loc.Location.GetMapId();
packet.Loc.Pos = loc.Location;
packet.Reason = (uint)(!_player.IsBeingTeleportedSeamlessly() ? NewWorldReason.Normal : NewWorldReason.Seamless);
packet.Counter = _player.GetNewWorldCounter();
SendPacket(packet);
if (_player.IsBeingTeleportedSeamlessly())
@@ -54,6 +54,7 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WritePackedGuid(TriggerGUID);
_worldPacket.WritePackedGuid(Unused_1100);
_worldPacket.WriteBit(AreaTriggerSpline != null);
_worldPacket.WriteBit(AreaTriggerOrbit != null);
@@ -74,6 +75,7 @@ namespace Game.Networking.Packets
public AreaTriggerOrbitInfo AreaTriggerOrbit;
public AreaTriggerMovementScriptInfo? AreaTriggerMovementScript;
public ObjectGuid TriggerGUID;
public ObjectGuid Unused_1100;
}
class AreaTriggerPlaySpellVisual : ServerPacket
@@ -55,15 +55,15 @@ namespace Game.Networking.Packets
uint itemClassFilterCount = _worldPacket.ReadBits<uint>(3);
uint sortSize = _worldPacket.ReadBits<uint>(2);
for (var i = 0; i < sortSize; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
if (TaintedBy.HasValue)
TaintedBy.Value.Read(_worldPacket);
Name = _worldPacket.ReadString(nameLength);
for (var i = 0; i < itemClassFilterCount; ++i)// AuctionListFilterClass filterClass in ItemClassFilters)
for (var i = 0; i < itemClassFilterCount; ++i)
ItemClassFilters[i] = new AuctionListFilterClass(_worldPacket);
for (var i = 0; i < sortSize; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
}
}
@@ -141,14 +141,14 @@ namespace Game.Networking.Packets
uint auctionIDCount = _worldPacket.ReadBits<uint>(7);
uint sortCount = _worldPacket.ReadBits<uint>(2);
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
if (TaintedBy.HasValue)
TaintedBy.Value.Read(_worldPacket);
for (var i = 0; i < auctionIDCount; ++i)
AuctionItemIDs[i] = _worldPacket.ReadUInt32();
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
}
}
@@ -170,14 +170,14 @@ namespace Game.Networking.Packets
uint bucketKeysCount = _worldPacket.ReadBits<uint>(7);
uint sortCount = _worldPacket.ReadBits<uint>(2);
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
if (TaintedBy.HasValue)
TaintedBy.Value.Read(_worldPacket);
for (var i = 0; i < bucketKeysCount; ++i)
BucketKeys[i] = new AuctionBucketKey(_worldPacket);
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
}
}
@@ -201,13 +201,14 @@ namespace Game.Networking.Packets
TaintedBy = new();
uint sortCount = _worldPacket.ReadBits<uint>(2);
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
BucketKey = new AuctionBucketKey(_worldPacket);
if (TaintedBy.HasValue)
TaintedBy.Value.Read(_worldPacket);
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
}
}
@@ -234,11 +235,11 @@ namespace Game.Networking.Packets
uint sortCount = _worldPacket.ReadBits<uint>(2);
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
if (TaintedBy.HasValue)
TaintedBy.Value.Read(_worldPacket);
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
}
}
@@ -260,11 +261,11 @@ namespace Game.Networking.Packets
uint sortCount = _worldPacket.ReadBits<uint>(2);
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
if (TaintedBy.HasValue)
TaintedBy.Value.Read(_worldPacket);
for (var i = 0; i < sortCount; ++i)
Sorts[i] = new AuctionSortDef(_worldPacket);
}
}
@@ -357,12 +357,12 @@ namespace Game.Networking.Packets
public override void Read()
{
Serial = (ConnectToSerial)_worldPacket.ReadUInt32();
Con = _worldPacket.ReadUInt8();
Serial = (ConnectToSerial)_worldPacket.ReadUInt32();
}
public ConnectToSerial Serial;
byte Con;
public byte Con;
}
class EnterEncryptedMode : ServerPacket
@@ -84,13 +84,13 @@ namespace Game.Networking.Packets
public override void Read()
{
Tier = _worldPacket.ReadInt32();
AzeritePowerID = _worldPacket.ReadInt32();
ContainerSlot = _worldPacket.ReadUInt8();
Slot = _worldPacket.ReadUInt8();
Tier = _worldPacket.ReadUInt8();
AzeritePowerID = _worldPacket.ReadInt32();
}
public int Tier;
public byte Tier;
public int AzeritePowerID;
public byte ContainerSlot;
public byte Slot;
@@ -2,12 +2,14 @@
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
using Game.Entities;
using Framework.Constants;
namespace Game.Networking.Packets
{
public class AutoBankItem : ClientPacket
{
public InvUpdate Inv;
public BankType BankType;
public byte Bag;
public byte Slot;
@@ -16,6 +18,7 @@ namespace Game.Networking.Packets
public override void Read()
{
Inv = new InvUpdate(_worldPacket);
BankType = (BankType)_worldPacket.ReadInt8();
Bag = _worldPacket.ReadUInt8();
Slot = _worldPacket.ReadUInt8();
}
@@ -94,4 +97,18 @@ namespace Game.Networking.Packets
public ObjectGuid Banker;
}
class BankerActivate : ClientPacket
{
public ObjectGuid Banker;
public PlayerInteractionType InteractionType;
public BankerActivate(WorldPacket packet) : base(packet) { }
public override void Read()
{
Banker = _worldPacket.ReadPackedGuid();
InteractionType = (PlayerInteractionType)_worldPacket.ReadInt32();
}
}
}
@@ -177,7 +177,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt64(EventID);
_worldPacket.WriteUInt8((byte)GetEventType);
_worldPacket.WriteInt32(TextureID);
_worldPacket.WriteUInt32((uint)Flags);
_worldPacket.WriteUInt16((ushort)Flags);
Date.Write(_worldPacket);
LockDate.Write(_worldPacket);
_worldPacket.WriteUInt64(EventGuildID);
@@ -216,7 +216,7 @@ namespace Game.Networking.Packets
{
_worldPacket.WriteUInt64(EventID);
Date.Write(_worldPacket);
_worldPacket.WriteUInt32((uint)Flags);
_worldPacket.WriteUInt16((ushort)Flags);
_worldPacket.WriteUInt8((byte)EventType);
_worldPacket.WriteInt32(TextureID);
_worldPacket.WriteUInt64(EventClubID);
@@ -229,6 +229,7 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(OwnerGuid);
_worldPacket.WriteBits(EventName.GetByteCount(), 8);
_worldPacket.WriteBit(Unknown_1100);
_worldPacket.FlushBits();
_worldPacket.WriteString(EventName);
}
@@ -245,6 +246,7 @@ namespace Game.Networking.Packets
public CalendarEventType EventType;
public CalendarModerationRank ModeratorStatus;
public string EventName;
public bool Unknown_1100;
}
class CalendarInvitePkt : ClientPacket
@@ -390,7 +392,7 @@ namespace Game.Networking.Packets
OriginalDate.Write(_worldPacket);
Date.Write(_worldPacket);
LockDate.Write(_worldPacket);
_worldPacket.WriteUInt32((uint)Flags);
_worldPacket.WriteUInt16((ushort)Flags);
_worldPacket.WriteInt32(TextureID);
_worldPacket.WriteUInt8((byte)EventType);
@@ -794,7 +796,7 @@ namespace Game.Networking.Packets
TextureID = data.ReadUInt32();
Time = new();
Time.Read(data);
Flags = data.ReadUInt32();
Flags = data.ReadUInt16();
byte titleLen = data.ReadBits<byte>(8);
ushort descLen = data.ReadBits<ushort>(11);
@@ -811,7 +813,7 @@ namespace Game.Networking.Packets
public byte EventType;
public uint TextureID;
public WowTime Time;
public uint Flags;
public ushort Flags;
}
struct CalendarSendCalendarInviteInfo
@@ -859,7 +861,7 @@ namespace Game.Networking.Packets
data.WriteUInt64(EventID);
data.WriteUInt8((byte)EventType);
Date.Write(data);
data.WriteUInt32((uint)Flags);
data.WriteUInt16((ushort)Flags);
data.WriteInt32(TextureID);
data.WriteUInt64(EventClubID);
data.WritePackedGuid(OwnerGuid);
@@ -27,17 +27,21 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteBit(Success);
_worldPacket.WriteBit(Realmless);
_worldPacket.WriteBit(IsDeletedCharacters);
_worldPacket.WriteBit(IsNewPlayerRestrictionSkipped);
_worldPacket.WriteBit(IsNewPlayerRestricted);
_worldPacket.WriteBit(IsNewPlayer);
_worldPacket.WriteBit(IsTrialAccountRestricted);
_worldPacket.WriteBit(DisabledClassesMask.HasValue);
_worldPacket.WriteBit(DontCreateCharacterDisplays);
_worldPacket.WriteInt32(Characters.Count);
_worldPacket.WriteInt32(RegionwideCharacters.Count);
_worldPacket.WriteInt32(MaxCharacterLevel);
_worldPacket.WriteInt32(RaceUnlockData.Count);
_worldPacket.WriteInt32(UnlockedConditionalAppearances.Count);
_worldPacket.WriteInt32(RaceLimitDisables.Count);
_worldPacket.WriteInt32(WarbandGroups.Count);
if (DisabledClassesMask.HasValue)
_worldPacket.WriteUInt32(DisabledClassesMask.Value);
@@ -48,7 +52,13 @@ namespace Game.Networking.Packets
foreach (RaceLimitDisableInfo raceLimitDisableInfo in RaceLimitDisables)
raceLimitDisableInfo.Write(_worldPacket);
foreach (CharacterInfo charInfo in Characters)
foreach (WarbandGroup warbandGroup in WarbandGroups)
warbandGroup.Write(_worldPacket);
foreach (CharacterInfoBasic charInfo in Characters)
charInfo.Write(_worldPacket);
foreach (RegionwideCharacterListEntry charInfo in RegionwideCharacters)
charInfo.Write(_worldPacket);
foreach (RaceUnlock raceUnlock in RaceUnlockData)
@@ -56,25 +66,30 @@ namespace Game.Networking.Packets
}
public bool Success;
public bool Realmless;
public bool IsDeletedCharacters; // used for character undelete list
public bool IsNewPlayerRestrictionSkipped; // allows client to skip new player restrictions
public bool IsNewPlayerRestricted; // forbids using level boost and class trials
public bool IsNewPlayer; // forbids hero classes and allied races
public bool IsTrialAccountRestricted;
public bool DontCreateCharacterDisplays;
public int MaxCharacterLevel = 1;
public uint? DisabledClassesMask = new();
public List<CharacterInfo> Characters = new(); // all characters on the list
public List<RaceUnlock> RaceUnlockData = new(); //
public List<CharacterInfoBasic> Characters = new(); // all characters on the list
public List<RegionwideCharacterListEntry> RegionwideCharacters = new();
public List<RaceUnlock> RaceUnlockData = new();
public List<UnlockedConditionalAppearance> UnlockedConditionalAppearances = new();
public List<RaceLimitDisableInfo> RaceLimitDisables = new();
public List<WarbandGroup> WarbandGroups = new();
public class CharacterInfo
public class CharacterInfoBasic
{
public CharacterInfo(SQLFields fields)
public CharacterInfoBasic(SQLFields fields)
{
Guid = ObjectGuid.Create(HighGuid.Player, fields.Read<ulong>(0));
VirtualRealmAddress = Global.WorldMgr.GetVirtualRealmAddress();
Name = fields.Read<string>(1);
RaceId = fields.Read<byte>(2);
ClassId = (Class)fields.Read<byte>(3);
@@ -116,8 +131,6 @@ namespace Game.Networking.Packets
else if (atLoginFlags.HasAnyFlag(AtLoginFlags.ChangeRace))
Flags2 = CharacterCustomizeFlags.Race;
Flags3 = 0;
Flags4 = 0;
FirstLogin = atLoginFlags.HasAnyFlag(AtLoginFlags.FirstLogin);
// show pet at selection character in character list only for non-ghost character
@@ -132,7 +145,6 @@ namespace Game.Networking.Packets
}
}
BoostInProgress = false;
ProfessionIds[0] = 0;
ProfessionIds[1] = 0;
@@ -168,41 +180,42 @@ namespace Game.Networking.Packets
public void Write(WorldPacket data)
{
data.WritePackedGuid(Guid);
data.WriteUInt64(GuildClubMemberID);
data.WriteUInt32(VirtualRealmAddress);
data.WriteUInt8(ListPosition);
data.WriteUInt8(RaceId);
data.WriteUInt8((byte)ClassId);
data.WriteUInt8(SexId);
data.WriteUInt8((byte)ClassId);
data.WriteInt16(SpecID);
data.WriteInt32(Customizations.Count);
data.WriteUInt8(ExperienceLevel);
data.WriteUInt32(ZoneId);
data.WriteUInt32(MapId);
data.WriteUInt32(ZoneId);
data.WriteVector3(PreloadPos);
data.WriteUInt64(GuildClubMemberID);
data.WritePackedGuid(GuildGuid);
data.WriteUInt32((uint)Flags);
data.WriteUInt32((uint)Flags2);
data.WriteUInt32(Flags3);
data.WriteUInt8(unkWod61x);
data.WriteUInt32(PetCreatureDisplayId);
data.WriteUInt32(PetExperienceLevel);
data.WriteUInt32(PetCreatureFamilyId);
data.WriteUInt32(ProfessionIds[0]);
data.WriteUInt32(ProfessionIds[1]);
foreach (var visualItem in VisualItems)
visualItem.Write(data);
data.WriteInt64(LastPlayedTime);
data.WriteInt16(SpecID);
data.WriteInt32(Unknown703);
data.WriteInt64(LastPlayedTime);
data.WriteInt32(LastLoginVersion);
data.WriteUInt32(Flags4);
data.WriteInt32(MailSenders.Count);
data.WriteInt32(MailSenderTypes.Count);
data.WriteUInt32(OverrideSelectScreenFileDataID);
PersonalTabard.Write(data);
data.WriteUInt32(ProfessionIds[0]);
data.WriteUInt32(ProfessionIds[1]);
data.WriteInt32(TimerunningSeasonID);
data.WriteUInt32(OverrideSelectScreenFileDataID);
foreach (ChrCustomizationChoice customization in Customizations)
{
@@ -210,29 +223,15 @@ namespace Game.Networking.Packets
data.WriteUInt32(customization.ChrCustomizationChoiceID);
}
foreach (var mailSenderType in MailSenderTypes)
data.WriteUInt32(mailSenderType);
data.WriteBits(Name.GetByteCount(), 6);
data.WriteBit(FirstLogin);
data.WriteBit(BoostInProgress);
data.WriteBits(unkWod61x, 5);
data.WriteBit(RpeResetAvailable);
data.WriteBit(RpeResetQuestClearAvailable);
foreach (string str in MailSenders)
data.WriteBits(str.GetByteCount() + 1, 6);
data.FlushBits();
foreach (string str in MailSenders)
if (!str.IsEmpty())
data.WriteCString(str);
data.WriteString(Name);
}
public ObjectGuid Guid;
public uint VirtualRealmAddress;
public ulong GuildClubMemberID; // same as bgs.protocol.club.v1.MemberId.unique_id, guessed basing on SMSG_QUERY_PLAYER_NAME_RESPONSE (that one is known)
public string Name;
public byte ListPosition; // Order of the characters in list
@@ -248,7 +247,6 @@ namespace Game.Networking.Packets
public CharacterFlags Flags; // Character flag @see enum CharacterFlags
public CharacterCustomizeFlags Flags2; // Character customization flags @see enum CharacterCustomizeFlags
public uint Flags3; // Character flags 3 @todo research
public uint Flags4;
public bool FirstLogin;
public byte unkWod61x;
public long LastPlayedTime;
@@ -260,24 +258,20 @@ namespace Game.Networking.Packets
public uint PetCreatureDisplayId;
public uint PetExperienceLevel;
public uint PetCreatureFamilyId;
public bool BoostInProgress; // @todo
public uint[] ProfessionIds = new uint[2]; // @todo
public VisualItemInfo[] VisualItems = new VisualItemInfo[19];
public List<string> MailSenders = new();
public List<uint> MailSenderTypes = new();
public bool RpeResetAvailable = false;
public bool RpeResetQuestClearAvailable = false;
public CustomTabardInfo PersonalTabard = new();
public CustomTabardInfo PersonalTabard;
public struct VisualItemInfo
{
public void Write(WorldPacket data)
{
data.WriteUInt32(DisplayId);
data.WriteUInt32(DisplayEnchantId);
data.WriteUInt32(SecondaryItemModifiedAppearanceID);
data.WriteUInt8(InvType);
data.WriteUInt32(DisplayEnchantId);
data.WriteUInt8(Subclass);
data.WriteUInt32(SecondaryItemModifiedAppearanceID);
data.WriteUInt32(ItemID);
}
public uint DisplayId;
@@ -285,6 +279,7 @@ namespace Game.Networking.Packets
public uint SecondaryItemModifiedAppearanceID; // also -1 is some special value
public byte InvType;
public byte Subclass;
public uint ItemID;
}
public struct PetInfo
@@ -295,6 +290,85 @@ namespace Game.Networking.Packets
}
}
public class CharacterRestrictionAndMailData
{
public bool BoostInProgress; ///< @todo
public uint Flags4;
public List<string> MailSenders = new();
public List<uint> MailSenderTypes = new();
public bool RpeResetAvailable;
public bool RpeResetQuestClearAvailable;
public void Write(WorldPacket data)
{
Cypher.Assert(MailSenders.Count == MailSenderTypes.Count);
data.WriteBit(BoostInProgress);
data.WriteBit(RpeResetAvailable);
data.WriteBit(RpeResetQuestClearAvailable);
data.FlushBits();
data.WriteUInt32(Flags4);
data.WriteInt32(MailSenders.Count);
data.WriteInt32(MailSenderTypes.Count);
if (!MailSenderTypes.Empty())
foreach (var type in MailSenderTypes)
data.WriteUInt32(type);
foreach (string str in MailSenders)
data.WriteBits(str.GetByteCount() + 1, 6);
data.FlushBits();
foreach (string str in MailSenders)
if (!str.IsEmpty())
data.WriteCString(str);
}
}
public struct CharacterInfo
{
public CharacterInfoBasic Basic;
public CharacterRestrictionAndMailData RestrictionsAndMails;
public CharacterInfo(SQLFields fields)
{
Basic = new(fields);
}
public void Write(WorldPacket data)
{
Basic.Write(data);
RestrictionsAndMails.Write(data);
}
}
public struct RegionwideCharacterListEntry
{
public CharacterInfoBasic Basic;
public ulong Money;
public float CurrentSeasonMythicPlusOverallScore;
public uint CurrentSeasonBestPvpRating;
public sbyte PvpRatingBracket;
public short PvpRatingAssociatedSpecID;
public RegionwideCharacterListEntry(SQLFields fields)
{
Basic = new(fields);
}
public void Write(WorldPacket data)
{
Basic.Write(data);
data.WriteUInt64(Money);
data.WriteFloat(CurrentSeasonMythicPlusOverallScore);
data.WriteUInt32(CurrentSeasonBestPvpRating);
data.WriteInt8(PvpRatingBracket);
data.WriteInt16(PvpRatingAssociatedSpecID);
}
}
public struct RaceUnlock
{
public void Write(WorldPacket data)
@@ -883,6 +957,7 @@ namespace Game.Networking.Packets
NewSex = _worldPacket.ReadUInt8();
CustomizedRace = _worldPacket.ReadInt32();
CustomizedChrModelID = _worldPacket.ReadInt32();
UnalteredVisualRaceID = _worldPacket.ReadInt32();
for (var i = 0; i < customizationCount; ++i)
{
@@ -900,6 +975,7 @@ namespace Game.Networking.Packets
public Array<ChrCustomizationChoice> Customizations = new(250);
public int CustomizedRace;
public int CustomizedChrModelID;
public int UnalteredVisualRaceID;
}
public class BarberShopResult : ServerPacket
@@ -1211,4 +1287,38 @@ namespace Game.Networking.Packets
BackgroundColor = data.ReadInt32();
}
}
public struct WarbandGroupMember
{
public int WarbandScenePlacementID;
public int Type;
public ObjectGuid Guid;
public void Write(WorldPacket data)
{
data.WriteInt32(WarbandScenePlacementID);
data.WriteInt32(Type);
if (Type == 0)
data.WritePackedGuid(Guid);
}
}
public class WarbandGroup
{
public ulong GroupID;
public byte Unknown_1100;
public int Flags; ///< enum WarbandGroupFlags { Collapsed = 1 }
public List<WarbandGroupMember> Members = new();
public void Write(WorldPacket data)
{
data.WriteUInt64(GroupID);
data.WriteUInt8(Unknown_1100);
data.WriteInt32(Flags);
data.WriteInt32(Members.Count);
foreach (WarbandGroupMember member in Members)
member.Write(data);
}
}
}
@@ -152,7 +152,7 @@ namespace Game.Networking.Packets
{
_worldPacket.WritePackedGuid(powerDrainTarget.Victim);
_worldPacket.WriteUInt32(powerDrainTarget.Points);
_worldPacket.WriteUInt32(powerDrainTarget.PowerType);
_worldPacket.WriteInt8((sbyte)powerDrainTarget.PowerType);
_worldPacket.WriteFloat(powerDrainTarget.Amplitude);
}
@@ -663,7 +663,7 @@ namespace Game.Networking.Packets
{
public ObjectGuid Victim;
public uint Points;
public uint PowerType;
public PowerType PowerType;
public float Amplitude;
}
@@ -169,8 +169,8 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(Powers.Count);
foreach (var power in Powers)
{
_worldPacket.WriteInt32(power.Power);
_worldPacket.WriteUInt8(power.PowerType);
_worldPacket.WriteInt32(power.Power);
}
}
@@ -180,16 +180,16 @@ namespace Game.Networking.Packets
class InterruptPowerRegen : ServerPacket
{
public int PowerType;
public sbyte PowerType;
public InterruptPowerRegen(PowerType powerType) : base(ServerOpcodes.InterruptPowerRegen, ConnectionType.Instance)
{
PowerType = (int)powerType;
PowerType = (sbyte)powerType;
}
public override void Write()
{
_worldPacket.WriteInt32(PowerType);
_worldPacket.WriteInt8(PowerType);
}
}
@@ -41,6 +41,11 @@ namespace Game.Networking.Packets
public ItemInstance OldItem = new();
public ItemInstance NewItem = new();
public int EnchantID;
public int ConcentrationCurrencyID;
public int ConcentrationSpent;
public int IngenuityRefund;
public bool HasIngenuityProc;
public bool ApplyConcentration;
public void Write(WorldPacket data)
{
@@ -59,6 +64,9 @@ namespace Game.Networking.Packets
data.WritePackedGuid(ItemGUID);
data.WriteInt32(Quantity);
data.WriteInt32(EnchantID);
data.WriteInt32(ConcentrationCurrencyID);
data.WriteInt32(ConcentrationSpent);
data.WriteInt32(IngenuityRefund);
foreach (SpellReducedReagent spellReducedReagent in ResourcesReturned)
spellReducedReagent.Write(data);
@@ -67,6 +75,8 @@ namespace Game.Networking.Packets
data.WriteBit(field_29);
data.WriteBit(field_2A);
data.WriteBit(BonusCraft);
data.WriteBit(HasIngenuityProc);
data.WriteBit(ApplyConcentration);
data.FlushBits();
OldItem.Write(data);
@@ -14,9 +14,9 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteUInt64(GUID);
_worldPacket.WriteInt32(Type);
_worldPacket.WriteUInt32(SetID);
_worldPacket.WriteUInt64(GUID);
}
public ulong GUID; // Set Identifier
@@ -159,11 +159,11 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteInt32(Reason);
_worldPacket.WriteUInt64(GUID);
_worldPacket.WriteUInt8(Reason);
}
public ulong GUID; //Set Identifier
public byte Reason;
public int Reason;
}
}
@@ -35,7 +35,7 @@ namespace Game.Networking.Packets
}
public GarrisonError Result;
public uint GarrSiteID;
public uint GarrSiteID;
}
class GetGarrisonInfo : ClientPacket
@@ -103,7 +103,7 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteInt32((int)GarrTypeID);
_worldPacket.WriteUInt8((byte)GarrTypeID);
_worldPacket.WriteUInt32((uint)Result);
BuildingInfo.Write(_worldPacket);
_worldPacket.WriteBit(PlayActivationCinematic);
@@ -136,7 +136,7 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteInt32((int)GarrTypeID);
_worldPacket.WriteUInt8((byte)GarrTypeID);
_worldPacket.WriteUInt32((uint)Result);
_worldPacket.WriteUInt32(GarrPlotInstanceID);
_worldPacket.WriteUInt32(GarrBuildingID);
@@ -154,7 +154,7 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteInt32((int)GarrTypeID);
_worldPacket.WriteUInt8((byte)GarrTypeID);
_worldPacket.WriteUInt32((uint)Result);
_worldPacket.WriteUInt32(BuildingID);
}
@@ -170,14 +170,14 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteInt32((int)GarrTypeID);
_worldPacket.WriteUInt8((byte)GarrTypeID);
_worldPacket.WriteUInt32((uint)Result);
_worldPacket.WriteUInt32(BuildingID);
}
public GarrisonType GarrTypeID;
public uint BuildingID;
public GarrisonError Result;
public uint BuildingID;
}
class GarrisonRequestBlueprintAndSpecializationData : ClientPacket
@@ -193,7 +193,7 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteUInt32((uint)GarrTypeID);
_worldPacket.WriteUInt8((byte)GarrTypeID);
_worldPacket.WriteInt32(BlueprintsKnown != null ? BlueprintsKnown.Count : 0);
_worldPacket.WriteInt32(SpecializationsKnown != null ? SpecializationsKnown.Count : 0);
if (BlueprintsKnown != null)
@@ -206,8 +206,8 @@ namespace Game.Networking.Packets
}
public GarrisonType GarrTypeID;
public List<uint> SpecializationsKnown = null;
public List<uint> BlueprintsKnown = null;
public List<uint> SpecializationsKnown = null;
}
class GarrisonGetMapData : ClientPacket
@@ -237,7 +237,7 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteInt32((int)GarrTypeID);
_worldPacket.WriteUInt8((byte)GarrTypeID);
PlotInfo.Write(_worldPacket);
}
@@ -263,8 +263,8 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteInt32((int)GarrTypeID);
_worldPacket .WriteUInt32((uint)Result);
_worldPacket.WriteUInt8((byte)GarrTypeID);
_worldPacket.WriteUInt32((uint)Result);
Follower.Write(_worldPacket);
}
@@ -279,15 +279,15 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteUInt64(FollowerDBID);
_worldPacket.WriteInt32(GarrTypeID);
_worldPacket.WriteUInt8(GarrTypeID);
_worldPacket.WriteUInt32(Result);
_worldPacket.WriteUInt64(FollowerDBID);
_worldPacket.WriteUInt32(Destroyed);
}
public ulong FollowerDBID;
public int GarrTypeID;
public byte GarrTypeID;
public uint Result;
public ulong FollowerDBID;
public uint Destroyed;
}
@@ -310,12 +310,12 @@ namespace Game.Networking.Packets
{
data.WriteUInt32(GarrPlotInstanceID);
data.WriteXYZO(PlotPos);
data.WriteUInt32(PlotType);
data.WriteUInt8(PlotType);
}
public uint GarrPlotInstanceID;
public Position PlotPos;
public uint PlotType;
public byte PlotType;
}
public class GarrisonBuildingInfo
@@ -600,7 +600,7 @@ namespace Game.Networking.Packets
{
public void Write(WorldPacket data)
{
data.WriteUInt32((uint)GarrTypeID);
data.WriteUInt8((byte)GarrTypeID);
data.WriteUInt32(GarrSiteID);
data.WriteUInt32(GarrSiteLevelID);
data.WriteInt32(Buildings.Count);
@@ -700,11 +700,11 @@ namespace Game.Networking.Packets
{
public void Write(WorldPacket data)
{
data.WriteInt32(GarrFollowerTypeID);
data.WriteUInt8(GarrFollowerTypeID);
data.WriteUInt32(Count);
}
public int GarrFollowerTypeID;
public byte GarrFollowerTypeID;
public uint Count;
}
@@ -183,9 +183,14 @@ namespace Game.Networking.Packets
public class AcceptGuildInvite : ClientPacket
{
public ObjectGuid GuildGuid;
public AcceptGuildInvite(WorldPacket packet) : base(packet) { }
public override void Read() { }
public override void Read()
{
GuildGuid = _worldPacket.ReadPackedGuid();
}
}
public class GuildDeclineInvitation : ClientPacket
@@ -297,7 +302,6 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(Name.GetByteCount(), 6);
_worldPacket.WriteBit(LoggedOn);
_worldPacket.WriteBit(Mobile);
_worldPacket.WriteString(Name);
}
@@ -305,7 +309,6 @@ namespace Game.Networking.Packets
public ObjectGuid Guid;
public uint VirtualRealmAddress;
public string Name;
public bool Mobile;
public bool LoggedOn;
}
@@ -139,9 +139,11 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteUInt8((byte)Type);
_worldPacket.WriteInt32((int)Type);
_worldPacket.WriteUInt32(MapID);
_worldPacket.WriteUInt32((uint)DifficultyID);
_worldPacket.WriteInt32(TimeLeft);
_worldPacket.WriteBits(WarningMessage, 8);
_worldPacket.WriteBit(Locked);
_worldPacket.WriteBit(Extended);
_worldPacket.FlushBits();
@@ -150,6 +152,8 @@ namespace Game.Networking.Packets
public InstanceResetWarningType Type;
public uint MapID;
public Difficulty DifficultyID;
public int TimeLeft;
public string WarningMessage; // GlobalStrings tag
public bool Locked;
public bool Extended;
}
+17 -8
View File
@@ -411,10 +411,11 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(QuestLogItemID);
_worldPacket.WriteUInt32(Quantity);
_worldPacket.WriteUInt32(QuantityInInventory);
_worldPacket.WriteInt32(QuantityInQuestLog);
_worldPacket.WriteInt32(DungeonEncounterID);
_worldPacket.WriteInt32(BattlePetSpeciesID);
_worldPacket.WriteInt32(BattlePetBreedID);
_worldPacket.WriteUInt32(BattlePetBreedQuality);
_worldPacket.WriteUInt8(BattlePetBreedQuality);
_worldPacket.WriteInt32(BattlePetLevel);
_worldPacket.WritePackedGuid(ItemGUID);
_worldPacket.WriteInt32(Toasts.Count);
@@ -448,10 +449,11 @@ namespace Game.Networking.Packets
// only set if different than real ID (similar to CreatureTemplate.KillCredit)
public uint Quantity;
public uint QuantityInInventory;
public int QuantityInQuestLog;
public int DungeonEncounterID;
public int BattlePetSpeciesID;
public int BattlePetBreedID;
public uint BattlePetBreedQuality;
public byte BattlePetBreedQuality;
public int BattlePetLevel;
public ObjectGuid ItemGUID;
public List<UiEventToast> Toasts = new();
@@ -634,6 +636,13 @@ namespace Game.Networking.Packets
public ObjectGuid Item;
}
class SortAccountBankBags : ClientPacket
{
public SortAccountBankBags(WorldPacket packet) : base(packet) { }
public override void Read() { }
}
class SortBags : ClientPacket
{
public SortBags(WorldPacket packet) : base(packet) { }
@@ -683,7 +692,7 @@ namespace Game.Networking.Packets
class ChangeBagSlotFlag : ClientPacket
{
public int BagIndex;
public byte BagIndex;
public BagSlotFlags FlagToChange;
public bool On;
@@ -691,7 +700,7 @@ namespace Game.Networking.Packets
public override void Read()
{
BagIndex = _worldPacket.ReadInt32();
BagIndex = _worldPacket.ReadUInt8();
FlagToChange = (BagSlotFlags)_worldPacket.ReadUInt32();
On = _worldPacket.HasBit();
}
@@ -699,7 +708,7 @@ namespace Game.Networking.Packets
class ChangeBankBagSlotFlag : ClientPacket
{
public int BagIndex;
public byte BagIndex;
public BagSlotFlags FlagToChange;
public bool On;
@@ -707,7 +716,7 @@ namespace Game.Networking.Packets
public override void Read()
{
BagIndex = _worldPacket.ReadInt32();
BagIndex = _worldPacket.ReadUInt8();
FlagToChange = (BagSlotFlags)_worldPacket.ReadUInt32();
On = _worldPacket.HasBit();
}
@@ -870,14 +879,14 @@ namespace Game.Networking.Packets
public void Read(WorldPacket data)
{
Value = data.ReadUInt32();
Type = (ItemModifier)data.ReadUInt8();
Value = data.ReadUInt32();
}
public void Write(WorldPacket data)
{
data.WriteUInt32(Value);
data.WriteUInt8((byte)Type);
data.WriteUInt32(Value);
}
public override int GetHashCode()
@@ -621,12 +621,14 @@ namespace Game.Networking.Packets
Loc.Write(_worldPacket);
_worldPacket.WriteUInt32(Reason);
_worldPacket.WriteXYZ(MovementOffset);
_worldPacket.WriteInt32(Counter);
}
public uint MapID;
public uint Reason;
public TeleportLocation Loc = new();
public Position MovementOffset; // Adjusts all pending movement events by this offset
public int Counter;
}
public class WorldPortResponse : ClientPacket
@@ -54,6 +54,7 @@ namespace Game.Networking.Packets
{
_worldPacket.WritePackedGuid(GossipGUID);
_worldPacket.WriteUInt32(GossipID);
_worldPacket.WriteUInt32(LfgDungeonsID);
_worldPacket.WriteInt32(FriendshipFactionID);
_worldPacket.WriteInt32(GossipOptions.Count);
_worldPacket.WriteInt32(GossipText.Count);
@@ -81,6 +82,7 @@ namespace Game.Networking.Packets
public int? TextID; // in classic variants this still holds npc_text id
public int? BroadcastTextID;
public uint GossipID;
public uint LfgDungeonsID;
}
public class GossipSelectOption : ClientPacket
@@ -346,6 +348,7 @@ namespace Game.Networking.Packets
public TreasureLootList Treasure = new();
public int? SpellID;
public int? OverrideIconID;
public string FailureDescription;
public void Write(WorldPacket data)
{
@@ -361,6 +364,7 @@ namespace Game.Networking.Packets
data.WriteBits((byte)Status, 2);
data.WriteBit(SpellID.HasValue);
data.WriteBit(OverrideIconID.HasValue);
data.WriteBits(FailureDescription.GetByteCount() + 1, 8);
data.FlushBits();
Treasure.Write(data);
@@ -373,6 +377,9 @@ namespace Game.Networking.Packets
if (OverrideIconID.HasValue)
data.WriteInt32(OverrideIconID.Value);
if (!FailureDescription.IsEmpty())
data.WriteCString(FailureDescription);
}
}
@@ -382,10 +389,13 @@ namespace Game.Networking.Packets
public uint ContentTuningID;
public int QuestType;
public bool Repeatable;
public bool ResetByScheduler;
public bool Important;
public bool Meta;
public string QuestTitle;
public uint QuestFlags;
public uint QuestFlagsEx;
public uint QuestFlagsEx2;
public void Write(WorldPacket data)
{
@@ -394,9 +404,12 @@ namespace Game.Networking.Packets
data.WriteInt32(QuestType);
data.WriteUInt32(QuestFlags);
data.WriteUInt32(QuestFlagsEx);
data.WriteUInt32(QuestFlagsEx2);
data.WriteBit(Repeatable);
data.WriteBit(ResetByScheduler);
data.WriteBit(Important);
data.WriteBit(Meta);
data.WriteBits(QuestTitle.GetByteCount(), 9);
data.FlushBits();
+10 -3
View File
@@ -769,6 +769,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(SequenceNum);
_worldPacket.WritePackedGuid(LeaderGUID);
_worldPacket.WriteUInt8(LeaderFactionGroup);
_worldPacket.WriteInt32((int)PingRestriction);
_worldPacket.WriteInt32(PlayerList.Count);
_worldPacket.WriteBit(LfgInfos.HasValue);
_worldPacket.WriteBit(LootSettings.HasValue);
@@ -799,6 +800,8 @@ namespace Game.Networking.Packets
public int MyIndex;
public int SequenceNum;
public RestrictPingsTo PingRestriction;
public List<PartyPlayerInfo> PlayerList = new();
public PartyLFGInfo? LfgInfos;
@@ -939,14 +942,14 @@ namespace Game.Networking.Packets
class SetRestrictPingsToAssistants : ClientPacket
{
public byte? PartyIndex;
public bool RestrictPingsToAssistants;
public RestrictPingsTo RestrictTo;
public SetRestrictPingsToAssistants(WorldPacket packet) : base(packet) { }
public override void Read()
{
bool hasPartyIndex = _worldPacket.HasBit();
RestrictPingsToAssistants = _worldPacket.HasBit();
RestrictTo = (RestrictPingsTo)_worldPacket.ReadInt32();
if (hasPartyIndex)
PartyIndex = _worldPacket.ReadUInt8();
}
@@ -995,6 +998,7 @@ namespace Game.Networking.Packets
public Vector3 Point;
public PingSubjectType Type = PingSubjectType.Max;
public uint PinFrameID;
public ObjectGuid Transport;
public SendPingWorldPoint(WorldPacket packet) : base(packet) { }
@@ -1003,8 +1007,9 @@ namespace Game.Networking.Packets
SenderGUID = _worldPacket.ReadPackedGuid();
MapID = _worldPacket.ReadUInt32();
Point = _worldPacket.ReadVector3();
Type = (PingSubjectType)_worldPacket.ReadUInt8();
Type = (PingSubjectType)_worldPacket.ReadUInt32();
PinFrameID = _worldPacket.ReadUInt32();
Transport = _worldPacket.ReadPackedGuid();
}
}
@@ -1015,6 +1020,7 @@ namespace Game.Networking.Packets
public Vector3 Point;
public PingSubjectType Type = PingSubjectType.Max;
public uint PinFrameID;
public ObjectGuid Transport;
public ReceivePingWorldPoint() : base(ServerOpcodes.ReceivePingWorldPoint) { }
@@ -1025,6 +1031,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteVector3(Point);
_worldPacket.WriteUInt8((byte)Type);
_worldPacket.WriteUInt32(PinFrameID);
_worldPacket.WritePackedGuid(Transport);
}
}
@@ -319,9 +319,9 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(Player);
_worldPacket.WriteInt32(ActualMapID);
_worldPacket.WriteVector3(Position);
_worldPacket.WriteInt32(MapID);
_worldPacket.WritePackedGuid(Transport);
_worldPacket.WriteVector3(Position);
}
public ObjectGuid Player;
+76 -28
View File
@@ -195,7 +195,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(Info.Objectives.Count);
_worldPacket.WriteUInt64(Info.AllowableRaces.RawValue);
_worldPacket.WriteInt32(Info.TreasurePickerID);
_worldPacket.WriteInt32(Info.TreasurePickerID.Count);
_worldPacket.WriteInt32(Info.Expansion);
_worldPacket.WriteInt32(Info.ManagedWorldStateID);
_worldPacket.WriteInt32(Info.QuestSessionBonus);
@@ -207,6 +207,10 @@ namespace Game.Networking.Packets
foreach (QuestCompleteDisplaySpell rewardDisplaySpell in Info.RewardDisplaySpell)
rewardDisplaySpell.Write(_worldPacket);
if (!Info.TreasurePickerID.Empty())
foreach (var id in Info.TreasurePickerID)
_worldPacket.WriteInt32(id);
_worldPacket.WriteBits(Info.LogTitle.GetByteCount(), 9);
_worldPacket.WriteBits(Info.LogDescription.GetByteCount(), 12);
_worldPacket.WriteBits(Info.QuestDescription.GetByteCount(), 12);
@@ -217,12 +221,13 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(Info.PortraitTurnInName.GetByteCount(), 8);
_worldPacket.WriteBits(Info.QuestCompletionLog.GetByteCount(), 11);
_worldPacket.WriteBit(Info.ReadyForTranslation);
_worldPacket.WriteBit(Info.ResetByScheduler);
_worldPacket.FlushBits();
foreach (QuestObjective questObjective in Info.Objectives)
{
_worldPacket.WriteUInt32(questObjective.Id);
_worldPacket.WriteUInt8((byte)questObjective.Type);
_worldPacket.WriteInt32((int)questObjective.Type);
_worldPacket.WriteInt8(questObjective.StorageIndex);
_worldPacket.WriteInt32(questObjective.ObjectID);
_worldPacket.WriteInt32(questObjective.Amount);
@@ -463,6 +468,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(DescEmotes.Count);
_worldPacket.WriteInt32(Objectives.Count);
_worldPacket.WriteInt32(QuestStartItemID);
_worldPacket.WriteInt32(QuestInfoID);
_worldPacket.WriteInt32(QuestSessionBonus);
_worldPacket.WriteInt32(QuestGiverCreatureID);
_worldPacket.WriteInt32(ConditionalDescriptionText.Count);
@@ -479,9 +485,9 @@ namespace Game.Networking.Packets
foreach (QuestObjectiveSimple obj in Objectives)
{
_worldPacket.WriteUInt32(obj.Id);
_worldPacket.WriteUInt8(obj.Type);
_worldPacket.WriteInt32(obj.ObjectID);
_worldPacket.WriteInt32(obj.Amount);
_worldPacket.WriteUInt8(obj.Type);
}
_worldPacket.WriteBits(QuestTitle.GetByteCount(), 9);
@@ -527,6 +533,7 @@ namespace Game.Networking.Packets
public uint PortraitGiverMount;
public int PortraitGiverModelSceneID;
public int QuestStartItemID;
public int QuestInfoID;
public int QuestSessionBonus;
public int QuestGiverCreatureID;
public string PortraitGiverText = "";
@@ -562,6 +569,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(Collect.Count);
_worldPacket.WriteInt32(Currency.Count);
_worldPacket.WriteInt32(StatusFlags);
_worldPacket.WriteInt32(QuestInfoID);
foreach (QuestObjectiveCollect obj in Collect)
{
@@ -603,6 +611,7 @@ namespace Game.Networking.Packets
public List<QuestObjectiveCollect> Collect = new();
public List<QuestCurrency> Currency = new();
public int StatusFlags;
public int QuestInfoID;
public uint[] QuestFlags = new uint[3];
public string QuestTitle = "";
public string CompletionText = "";
@@ -1078,7 +1087,7 @@ namespace Game.Networking.Packets
public uint CompleteSoundKitID;
public uint AreaGroupID;
public long TimeAllowed;
public int TreasurePickerID;
public List<int> TreasurePickerID = new();
public int Expansion;
public int ManagedWorldStateID;
public int QuestSessionBonus;
@@ -1098,6 +1107,24 @@ namespace Game.Networking.Packets
public uint[] RewardCurrencyID = new uint[SharedConst.QuestRewardCurrencyCount];
public uint[] RewardCurrencyQty = new uint[SharedConst.QuestRewardCurrencyCount];
public bool ReadyForTranslation;
public bool ResetByScheduler;
}
public struct QuestRewardItem
{
public uint ItemID;
public uint ItemQty;
public QuestRewardContextFlags? ContextFlags;
public void Write(WorldPacket data)
{
data.WriteUInt32(ItemID);
data.WriteUInt32(ItemQty);
data.WriteBit(ContextFlags.HasValue);
data.FlushBits();
if (ContextFlags.HasValue)
data.WriteInt32((int)ContextFlags);
}
}
public struct QuestChoiceItem
@@ -1105,21 +1132,47 @@ namespace Game.Networking.Packets
public LootItemType LootItemType;
public ItemInstance Item;
public uint Quantity;
public QuestRewardContextFlags? ContextFlags;
public void Read(WorldPacket data)
{
data.ResetBitPos();
LootItemType = (LootItemType)data.ReadBits<byte>(2);
bool hasContextFlags = data.HasBit();
Item = new ItemInstance();
Item.Read(data);
Quantity = data.ReadUInt32();
if (hasContextFlags)
ContextFlags = (QuestRewardContextFlags)data.ReadInt32();
}
public void Write(WorldPacket data)
{
data.WriteBits((byte)LootItemType, 2);
data.WriteBit(ContextFlags.HasValue);
Item.Write(data);
data.WriteUInt32(Quantity);
if (ContextFlags.HasValue)
data.WriteInt32((int)ContextFlags.Value);
}
}
public struct QuestRewardCurrency
{
public uint CurrencyID;
public uint CurrencyQty;
public int BonusQty;
public QuestRewardContextFlags? ContextFlags;
public void Write(WorldPacket data)
{
data.WriteUInt32(CurrencyID);
data.WriteUInt32(CurrencyQty);
data.WriteInt32(BonusQty);
data.WriteBit(ContextFlags.HasValue);
data.FlushBits();
if (ContextFlags.HasValue)
data.WriteInt32((int)ContextFlags);
}
}
@@ -1138,29 +1191,23 @@ namespace Game.Networking.Packets
public uint SpellCompletionID;
public uint SkillLineID;
public uint NumSkillUps;
public uint TreasurePickerID;
public List<int> TreasurePickerID = new();
public QuestChoiceItem[] ChoiceItems = new QuestChoiceItem[SharedConst.QuestRewardChoicesCount];
public uint[] ItemID = new uint[SharedConst.QuestRewardItemCount];
public uint[] ItemQty = new uint[SharedConst.QuestRewardItemCount];
public QuestRewardItem[] Items = new QuestRewardItem[SharedConst.QuestRewardItemCount];
public uint[] FactionID = new uint[SharedConst.QuestRewardReputationsCount];
public int[] FactionValue = new int[SharedConst.QuestRewardReputationsCount];
public int[] FactionOverride = new int[SharedConst.QuestRewardReputationsCount];
public int[] FactionCapIn = new int[SharedConst.QuestRewardReputationsCount];
public uint[] CurrencyID = new uint[SharedConst.QuestRewardCurrencyCount];
public uint[] CurrencyQty = new uint[SharedConst.QuestRewardCurrencyCount];
public QuestRewardCurrency[] Currencies = new QuestRewardCurrency[SharedConst.QuestRewardCurrencyCount];
public bool IsBoostSpell;
public void Write(WorldPacket data)
{
foreach (QuestRewardItem item in Items)
item.Write(data);
data.WriteUInt32(ChoiceItemCount);
data.WriteUInt32(ItemCount);
for (int i = 0; i < SharedConst.QuestRewardItemCount; ++i)
{
data.WriteUInt32(ItemID[i]);
data.WriteUInt32(ItemQty[i]);
}
data.WriteUInt32(Money);
data.WriteUInt32(XP);
data.WriteUInt64(ArtifactXP);
@@ -1181,22 +1228,21 @@ namespace Game.Networking.Packets
data.WriteInt32(id);
data.WriteUInt32(SpellCompletionID);
for (int i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{
data.WriteUInt32(CurrencyID[i]);
data.WriteUInt32(CurrencyQty[i]);
}
data.WriteUInt32(SkillLineID);
data.WriteUInt32(NumSkillUps);
data.WriteUInt32(TreasurePickerID);
data.WriteInt32(TreasurePickerID.Count);
if (!TreasurePickerID.Empty())
foreach (var id in TreasurePickerID)
data.WriteInt32(id);
foreach (var choice in ChoiceItems)
choice.Write(data);
foreach (QuestRewardCurrency currency in Currencies)
currency.Write(data);
data.WriteBit(IsBoostSpell);
data.FlushBits();
foreach (QuestChoiceItem choiceItem in ChoiceItems)
choiceItem.Write(data);
}
}
@@ -1223,8 +1269,9 @@ namespace Game.Networking.Packets
data.WriteUInt32(QuestFlags[1]); // FlagsEx
data.WriteUInt32(QuestFlags[2]); // FlagsEx2
data.WriteUInt32(SuggestedPartyMembers);
data.WriteInt32(QuestInfoID);
data.WriteInt32(Emotes.Count);
foreach (QuestDescEmote emote in Emotes)
{
data.WriteInt32(emote.Type);
@@ -1246,14 +1293,15 @@ namespace Game.Networking.Packets
public QuestRewards Rewards = new();
public List<QuestDescEmote> Emotes = new();
public uint[] QuestFlags = new uint[3]; // Flags and FlagsEx
public int QuestInfoID;
}
public struct QuestObjectiveSimple
{
public uint Id;
public byte Type;
public int ObjectID;
public int Amount;
public byte Type;
}
public struct QuestObjectiveCollect
@@ -8,27 +8,22 @@ namespace Game.Networking.Packets
{
public class InitializeFactions : ServerPacket
{
const ushort FactionCount = 1000;
public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { }
public override void Write()
{
for (ushort i = 0; i < FactionCount; ++i)
{
_worldPacket.WriteUInt16((ushort)((ushort)FactionFlags[i] & 0xFF));
_worldPacket.WriteInt32(FactionStandings[i]);
}
_worldPacket.WriteInt32(Factions.Count);
_worldPacket.WriteInt32(Bonuses.Count);
for (ushort i = 0; i < FactionCount; ++i)
_worldPacket.WriteBit(FactionHasBonus[i]);
foreach (FactionData faction in Factions)
faction.Write(_worldPacket);
_worldPacket.FlushBits();
foreach (FactionBonusData bonus in Bonuses)
bonus.Write(_worldPacket);
}
public int[] FactionStandings = new int[FactionCount];
public bool[] FactionHasBonus = new bool[FactionCount]; //@todo: implement faction bonus
public ReputationFlags[] FactionFlags = new ReputationFlags[FactionCount];
public List<FactionData> Factions = new();
public List<FactionBonusData> Bonuses = new();
}
class RequestForcedReactions : ClientPacket
@@ -73,6 +68,33 @@ namespace Game.Networking.Packets
public bool ShowVisual;
}
public struct FactionData
{
public uint FactionID;
public ushort Flags;
public int Standing;
public void Write(WorldPacket data)
{
data.WriteUInt32(FactionID);
data.WriteUInt16(Flags);
data.WriteInt32(Standing);
}
}
public struct FactionBonusData
{
public uint FactionID;
public bool FactionHasBonus;
public void Write(WorldPacket data)
{
data.WriteUInt32(FactionID);
data.WriteBit(FactionHasBonus);
data.FlushBits();
}
}
struct ForcedReaction
{
public void Write(WorldPacket data)
@@ -18,6 +18,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(SceneScriptPackageID);
_worldPacket.WritePackedGuid(TransportGUID);
_worldPacket.WriteXYZO(Location);
_worldPacket.WriteInt32(MovieID);
_worldPacket.WriteBit(Encrypted);
_worldPacket.FlushBits();
}
@@ -26,6 +27,7 @@ namespace Game.Networking.Packets
public uint PlaybackFlags;
public uint SceneInstanceID;
public uint SceneScriptPackageID;
public int MovieID;
public ObjectGuid TransportGUID;
public Position Location;
public bool Encrypted;
@@ -69,7 +69,6 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(Level);
_worldPacket.WriteUInt32((uint)ClassID);
_worldPacket.WriteBits(Notes.GetByteCount(), 10);
_worldPacket.WriteBit(Mobile);
_worldPacket.FlushBits();
_worldPacket.WriteString(Notes);
}
@@ -83,7 +82,6 @@ namespace Game.Networking.Packets
public uint Level;
public uint AreaID;
public FriendsResult FriendResult;
public bool Mobile;
}
public class AddFriend : ClientPacket
@@ -204,7 +202,6 @@ namespace Game.Networking.Packets
data.WriteUInt32(Level);
data.WriteUInt32((uint)ClassID);
data.WriteBits(Notes.GetByteCount(), 10);
data.WriteBit(Mobile);
data.FlushBits();
data.WriteString(Notes);
}
@@ -219,7 +216,6 @@ namespace Game.Networking.Packets
uint AreaID;
uint Level;
Class ClassID;
bool Mobile;
}
public struct QualifiedGUID
+11 -7
View File
@@ -668,6 +668,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteVector3(SourceRotation);
_worldPacket.WriteVector3(TargetLocation);
_worldPacket.WritePackedGuid(Target);
_worldPacket.WritePackedGuid(TargetTransport);
_worldPacket.WriteUInt32(SpellVisualID);
_worldPacket.WriteFloat(TravelSpeed);
_worldPacket.WriteFloat(LaunchDelay);
@@ -677,6 +678,7 @@ namespace Game.Networking.Packets
}
public ObjectGuid Target; // Exclusive with TargetLocation
public ObjectGuid TargetTransport;
public Position SourceLocation;
public uint SpellVisualID;
public bool SpeedAsTime;
@@ -1294,14 +1296,14 @@ namespace Game.Networking.Packets
//Structs
public struct SpellLogPowerData
{
public SpellLogPowerData(int powerType, int amount, int cost)
public SpellLogPowerData(sbyte powerType, int amount, int cost)
{
PowerType = powerType;
Amount = amount;
Cost = cost;
}
public int PowerType;
public sbyte PowerType;
public int Amount;
public int Cost;
}
@@ -1314,7 +1316,7 @@ namespace Game.Networking.Packets
AttackPower = (int)unit.GetTotalAttackPowerValue(unit.GetClass() == Class.Hunter ? WeaponAttackType.RangedAttack : WeaponAttackType.BaseAttack);
SpellPower = unit.SpellBaseDamageBonusDone(SpellSchoolMask.Spell);
Armor = unit.GetArmor();
PowerData.Add(new SpellLogPowerData((int)unit.GetPowerType(), unit.GetPower(unit.GetPowerType()), 0));
PowerData.Add(new SpellLogPowerData((sbyte)unit.GetPowerType(), unit.GetPower(unit.GetPowerType()), 0));
}
public void Initialize(Spell spell)
@@ -1330,13 +1332,13 @@ namespace Game.Networking.Packets
bool primaryPowerAdded = false;
foreach (SpellPowerCost cost in spell.GetPowerCost())
{
PowerData.Add(new SpellLogPowerData((int)cost.Power, unitCaster.GetPower(cost.Power), (int)cost.Amount));
PowerData.Add(new SpellLogPowerData((sbyte)cost.Power, unitCaster.GetPower(cost.Power), (int)cost.Amount));
if (cost.Power == primaryPowerType)
primaryPowerAdded = true;
}
if (!primaryPowerAdded)
PowerData.Insert(0, new SpellLogPowerData((int)primaryPowerType, unitCaster.GetPower(primaryPowerType), 0));
PowerData.Insert(0, new SpellLogPowerData((sbyte)primaryPowerType, unitCaster.GetPower(primaryPowerType), 0));
}
}
@@ -1351,7 +1353,7 @@ namespace Game.Networking.Packets
foreach (SpellLogPowerData powerData in PowerData)
{
data.WriteInt32(powerData.PowerType);
data.WriteInt8(powerData.PowerType);
data.WriteInt32(powerData.Amount);
data.WriteInt32(powerData.Cost);
}
@@ -1812,6 +1814,7 @@ namespace Game.Networking.Packets
public Array<SpellCraftingReagent> RemovedModifications = new(6);
public Array<SpellExtraCurrencyCost> OptionalCurrencies = new(5 /*MAX_ITEM_EXT_COST_CURRENCIES*/);
public ulong? CraftingOrderID;
public byte CraftingFlags; // 1 = ApplyConcentration
public ObjectGuid CraftingNPC;
public uint[] Misc = new uint[2];
@@ -1830,6 +1833,7 @@ namespace Game.Networking.Packets
var optionalCurrenciesCount = data.ReadUInt32();
var optionalReagentsCount = data.ReadUInt32();
var removedModificationsCount = data.ReadUInt32();
CraftingFlags = data.ReadUInt8();
for (var i = 0; i < optionalCurrenciesCount; ++i)
OptionalCurrencies[i].Read(data);
@@ -1906,8 +1910,8 @@ namespace Game.Networking.Packets
public void Write(WorldPacket data)
{
data.WriteInt32(Cost);
data.WriteInt8((sbyte)Type);
data.WriteInt32(Cost);
}
}
@@ -35,6 +35,8 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(ActiveSeason);
_worldPacket.WriteInt32(GameRuleValues.Count);
_worldPacket.WriteInt32(ActiveTimerunningSeasonID);
_worldPacket.WriteInt32(RemainingTimerunningSeasonSeconds);
_worldPacket.WriteInt16(MaxPlayerNameQueriesPerPacket);
_worldPacket.WriteInt16(PlayerNameQueryTelemetryInterval);
@@ -87,19 +89,25 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(ChatDisabledByPlayer);
_worldPacket.WriteBit(LFGListCustomRequiresAuthenticator);
_worldPacket.WriteBit(AddonsDisabled);
_worldPacket.WriteBit(TimerunningEnabled);
_worldPacket.WriteBit(WarGamesEnabled);
_worldPacket.WriteBit(ContentTrackingEnabled);
_worldPacket.WriteBit(IsSellAllJunkEnabled);
_worldPacket.WriteBit(IsGroupFinderEnabled);
_worldPacket.WriteBit(IsGroupFinderEnabled);
_worldPacket.WriteBit(IsLFDEnabled);
_worldPacket.WriteBit(IsLFREnabled);
_worldPacket.WriteBit(IsPremadeGroupEnabled);
_worldPacket.WriteBit(CanShowSetRoleButton);
_worldPacket.WriteBit(false); // unused 10.2.7
_worldPacket.WriteBit(false); // unused 10.2.7
_worldPacket.WriteBit(GuildEventsEditsEnabled);
_worldPacket.WriteBit(GuildTradeSkillsEnabled);
_worldPacket.WriteBits(Unknown1027.GetByteCount(), 7);
_worldPacket.WriteBit(BNSendWhisperUseV2Services);
_worldPacket.WriteBit(BNSendGameDataUseV2Services);
_worldPacket.WriteBit(IsAccountCurrencyTransferEnabled);
_worldPacket.FlushBits();
@@ -194,6 +202,7 @@ namespace Game.Networking.Packets
public bool ChatDisabledByPlayer;
public bool LFGListCustomRequiresAuthenticator;
public bool AddonsDisabled;
public bool TimerunningEnabled;
public bool WarGamesEnabled; // classic only
public bool ContentTrackingEnabled;
public bool IsSellAllJunkEnabled;
@@ -202,11 +211,18 @@ namespace Game.Networking.Packets
public bool IsLFREnabled = true; // classic only
public bool IsPremadeGroupEnabled = true; // classic only
public bool CanShowSetRoleButton = true;
public bool GuildEventsEditsEnabled = true;
public bool GuildTradeSkillsEnabled = true;
public bool BNSendWhisperUseV2Services = true; ///< BNSendWhisper will send to v2.WhisperService instead of v1.NotificationService
public bool BNSendGameDataUseV2Services = true; ///< BNSendGameData will send to v2.NotificationService instead of v1.NotificationService
public bool IsAccountCurrencyTransferEnabled;
public SocialQueueConfig QuickJoinConfig;
public SquelchInfo Squelch;
public RafSystemFeatureInfo RAFSystem;
public List<GameRuleValuePair> GameRuleValues = new();
public int ActiveTimerunningSeasonID;
public int RemainingTimerunningSeasonSeconds;
public string Unknown1027; // related to movement lua functions used by keybinds
public AddonChatThrottleParams AddonChatThrottle;
@@ -290,10 +306,11 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(IsBoostEnabled);
_worldPacket.WriteBit(TrialBoostEnabled);
_worldPacket.WriteBit(TokenBalanceEnabled);
_worldPacket.WriteBit(PaidCharacterTransfersBetweenBnetAccountsEnabled);
_worldPacket.WriteBit(LiveRegionCharacterListEnabled);
_worldPacket.WriteBit(LiveRegionCharacterCopyEnabled);
_worldPacket.WriteBit(LiveRegionAccountCopyEnabled);
_worldPacket.WriteBit(LiveRegionAccountCopyEnabled);
_worldPacket.WriteBit(LiveRegionKeyBindingsCopyEnabled);
_worldPacket.WriteBit(Unknown901CheckoutRelated);
_worldPacket.WriteBit(false); // unused, 10.0.2
@@ -301,13 +318,18 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(IsNameReservationEnabled);
_worldPacket.WriteBit(LaunchETA.HasValue);
_worldPacket.WriteBit(TimerunningEnabled);
_worldPacket.WriteBit(AddonsDisabled);
_worldPacket.WriteBit(AddonsDisabled);
_worldPacket.WriteBit(Unused1000);
_worldPacket.WriteBit(AccountSaveDataExportEnabled);
_worldPacket.WriteBit(AccountLockedByExport);
_worldPacket.WriteBits(RealmHiddenAlert.GetByteCount() + 1, 11);
_worldPacket.WriteBit(BNSendWhisperUseV2Services);
_worldPacket.WriteBit(BNSendGameDataUseV2Services);
_worldPacket.WriteBit(CharacterSelectListModeRealmless);
_worldPacket.FlushBits();
if (EuropaTicketSystemStatus.HasValue)
@@ -363,6 +385,7 @@ namespace Game.Networking.Packets
public bool IsBoostEnabled; // classic only
public bool TrialBoostEnabled; // NYI
public bool TokenBalanceEnabled; // NYI
public bool PaidCharacterTransfersBetweenBnetAccountsEnabled;
public bool LiveRegionCharacterListEnabled; // NYI
public bool LiveRegionCharacterCopyEnabled; // NYI
public bool LiveRegionAccountCopyEnabled; // NYI
@@ -374,6 +397,9 @@ namespace Game.Networking.Packets
public bool Unused1000;
public bool AccountSaveDataExportEnabled;
public bool AccountLockedByExport;
public bool BNSendWhisperUseV2Services = true; ///< BNSendWhisper will send to v2.WhisperService instead of v1.NotificationService
public bool BNSendGameDataUseV2Services = true; ///< BNSendGameData will send to v2.NotificationService instead of v1.NotificationService
public bool CharacterSelectListModeRealmless;
public EuropaTicketConfig? EuropaTicketSystemStatus;
public List<int> LiveRegionCharacterCopySourceRegions = new();
public uint TokenPollTimeSeconds; // NYI
+64 -1
View File
@@ -148,6 +148,51 @@ namespace Game.Networking.Packets
}
}
public class TraitSubTreeCache
{
public int TraitSubTreeID;
public List<TraitEntryPacket> Entries = new();
public bool Active;
public TraitSubTreeCache() { }
public TraitSubTreeCache(TraitSubTreeCache ufSubTreeCache)
{
TraitSubTreeID = ufSubTreeCache.TraitSubTreeID;
foreach (var ufEntry in ufSubTreeCache.Entries)
Entries.Add(ufEntry);
Active = ufSubTreeCache.Active;
}
public void Read(WorldPacket data)
{
TraitSubTreeID = data.ReadInt32();
uint entriesSize = data.ReadUInt32();
//if (entriesSize > 100)
//throw new Exception(entriesSize, 100);
for (var i = 0; i < entriesSize; ++i)
{
var entry = new TraitEntryPacket();
entry.Read(data);
Entries.Add(entry);
}
Active = data.HasBit();
}
public void Write(WorldPacket data)
{
data.WriteInt32(TraitSubTreeID);
data.WriteInt32(Entries.Count);
foreach (var traitEntry in Entries)
traitEntry.Write(data);
data.WriteBit(Active);
data.FlushBits();
}
}
public class TraitConfigPacket
{
public int ID;
@@ -158,9 +203,11 @@ namespace Game.Networking.Packets
public uint SkillLineID;
public int TraitSystemID;
public List<TraitEntryPacket> Entries = new();
public List<TraitSubTreeCache> SubTrees = new();
public string Name = "";
public TraitConfigPacket() { }
public TraitConfigPacket(TraitConfig ufConfig)
{
ID = ufConfig.ID;
@@ -179,7 +226,9 @@ namespace Game.Networking.Packets
{
ID = data.ReadInt32();
Type = (TraitConfigType)data.ReadInt32();
var entriesCount = data.ReadInt32();
int entriesCount = data.ReadInt32();
int subtreesSize = data.ReadInt32();
switch (Type)
{
case TraitConfigType.Combat:
@@ -205,6 +254,14 @@ namespace Game.Networking.Packets
}
uint nameLength = data.ReadBits<uint>(9);
for (var i = 0; i < subtreesSize; ++i)
{
TraitSubTreeCache subtrees = new();
subtrees.Read(data);
SubTrees.Add(subtrees);
}
Name = data.ReadString(nameLength);
}
@@ -213,6 +270,8 @@ namespace Game.Networking.Packets
data.WriteInt32(ID);
data.WriteInt32((int)Type);
data.WriteInt32(Entries.Count);
data.WriteInt32(SubTrees.Count);
switch (Type)
{
case TraitConfigType.Combat:
@@ -234,6 +293,10 @@ namespace Game.Networking.Packets
traitEntry.Write(data);
data.WriteBits(Name.GetByteCount(), 9);
foreach (TraitSubTreeCache traitSubTreeCache in SubTrees)
traitSubTreeCache.Write(data);
data.FlushBits();
data.WriteString(Name);
+29 -11
View File
@@ -103,7 +103,7 @@ namespace Game
AreaGroupID = fields.Read<uint>(100);
LimitTime = fields.Read<uint>(101);
AllowableRaces = new(fields.Read<ulong>(102));
TreasurePickerID = fields.Read<int>(103);
ResetByScheduler = fields.Read<bool>(103);
Expansion = fields.Read<int>(104);
ManagedWorldStateID = fields.Read<int>(105);
QuestSessionBonus = fields.Read<int>(106);
@@ -301,7 +301,7 @@ namespace Game
}
}
void LoadConditionalConditionalQuestDescription(SQLFields fields)
public void LoadConditionalConditionalQuestDescription(SQLFields fields)
{
Locale locale = fields.Read<string>(4).ToEnum<Locale>();
if (!WorldConfig.GetBoolValue(WorldCfg.LoadLocales) && locale != SharedConst.DefaultLocale)
@@ -325,7 +325,7 @@ namespace Game
ObjectManager.AddLocaleString(fields.Read<string>(3), locale, text.Text);
}
void LoadConditionalConditionalRequestItemsText(SQLFields fields)
public void LoadConditionalConditionalRequestItemsText(SQLFields fields)
{
Locale locale = fields.Read<string>(4).ToEnum<Locale>();
if (!WorldConfig.GetBoolValue(WorldCfg.LoadLocales) && locale != SharedConst.DefaultLocale)
@@ -350,7 +350,7 @@ namespace Game
ObjectManager.AddLocaleString(fields.Read<string>(3), locale, text.Text);
}
void LoadConditionalConditionalOfferRewardText(SQLFields fields)
public void LoadConditionalConditionalOfferRewardText(SQLFields fields)
{
Locale locale = fields.Read<string>(4).ToEnum<Locale>();
if (!WorldConfig.GetBoolValue(WorldCfg.LoadLocales) && locale != SharedConst.DefaultLocale)
@@ -375,7 +375,7 @@ namespace Game
ObjectManager.AddLocaleString(fields.Read<string>(3), locale, text.Text);
}
void LoadConditionalConditionalQuestCompletionLog(SQLFields fields)
public void LoadConditionalConditionalQuestCompletionLog(SQLFields fields)
{
Locale locale = fields.Read<string>(4).ToEnum<Locale>();
if (!WorldConfig.GetBoolValue(WorldCfg.LoadLocales) && locale != SharedConst.DefaultLocale)
@@ -400,6 +400,11 @@ namespace Game
ObjectManager.AddLocaleString(fields.Read<string>(3), locale, text.Text);
}
public void LoadTreasurePickers(SQLFields fields)
{
TreasurePickerID.Add(fields.Read<int>(1));
}
public uint XPValue(Player player)
{
return XPValue(player, ContentTuningId, RewardXPDifficulty, RewardXPMultiplier, Expansion);
@@ -497,6 +502,17 @@ namespace Game
return false;
}
public bool IsMeta()
{
var questInfo = CliDB.QuestInfoStorage.LookupByKey(QuestInfoID);
if (questInfo != null)
return (questInfo.Modifiers & 0x800) != 0;
return false;
}
public bool IsResetByScheduler() { return ResetByScheduler; }
public void BuildQuestRewards(QuestRewards rewards, Player player)
{
rewards.ChoiceItemCount = GetRewChoiceItemsCount();
@@ -521,7 +537,7 @@ namespace Game
rewards.SpellCompletionID = RewardSpell;
rewards.SkillLineID = RewardSkillId;
rewards.NumSkillUps = RewardSkillPoints;
rewards.TreasurePickerID = (uint)TreasurePickerID;
rewards.TreasurePickerID = TreasurePickerID;
for (int i = 0; i < SharedConst.QuestRewardChoicesCount; ++i)
{
@@ -533,8 +549,8 @@ namespace Game
for (int i = 0; i < SharedConst.QuestRewardItemCount; ++i)
{
rewards.ItemID[i] = RewardItemId[i];
rewards.ItemQty[i] = RewardItemCount[i];
rewards.Items[i].ItemID = RewardItemId[i];
rewards.Items[i].ItemQty = RewardItemCount[i];
}
for (int i = 0; i < SharedConst.QuestRewardReputationsCount; ++i)
@@ -547,8 +563,8 @@ namespace Game
for (int i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{
rewards.CurrencyID[i] = RewardCurrencyId[i];
rewards.CurrencyQty[i] = RewardCurrencyCount[i];
rewards.Currencies[i].CurrencyID = RewardCurrencyId[i];
rewards.Currencies[i].CurrencyQty = RewardCurrencyCount[i];
}
}
@@ -783,6 +799,7 @@ namespace Game
response.Info.CompleteSoundKitID = SoundTurnIn;
response.Info.AreaGroupID = AreaGroupID;
response.Info.TimeAllowed = LimitTime;
response.Info.ResetByScheduler = IsResetByScheduler();
response.Write();
return response;
@@ -894,7 +911,7 @@ namespace Game
public uint AreaGroupID;
public long LimitTime;
public RaceMask<ulong> AllowableRaces { get; set; }
public int TreasurePickerID;
public List<int> TreasurePickerID = new();
public int Expansion;
public int ManagedWorldStateID;
public int QuestSessionBonus;
@@ -908,6 +925,7 @@ namespace Game
public string PortraitTurnInText = "";
public string PortraitTurnInName = "";
public string QuestCompletionLog = "";
public bool ResetByScheduler;
// quest_description_conditional
public List<QuestConditionalText> ConditionalQuestDescription = new();
+12 -4
View File
@@ -321,12 +321,20 @@ namespace Game
{
InitializeFactions initFactions = new();
foreach (var pair in _factions)
foreach (var (_, factionState) in _factions)
{
initFactions.FactionFlags[pair.Key] = pair.Value.Flags;
initFactions.FactionStandings[pair.Key] = pair.Value.Standing;
FactionData factionData = new();
factionData.FactionID = factionState.Id;
factionData.Flags = (ushort)factionState.Flags;
factionData.Standing = factionState.Standing;
initFactions.Factions.Add(factionData);
// @todo faction bonus
pair.Value.needSend = false;
FactionBonusData bonus = new();
bonus.FactionID = factionState.Id;
bonus.FactionHasBonus = false;
factionState.needSend = false;
initFactions.Bonuses.Add(bonus);
}
_player.SendPacket(initFactions);
+1 -1
View File
@@ -4356,7 +4356,7 @@ namespace Game.Spells
spellLogEffectPowerDrainParams.Victim = target.GetGUID();
spellLogEffectPowerDrainParams.Points = points;
spellLogEffectPowerDrainParams.PowerType = (uint)powerType;
spellLogEffectPowerDrainParams.PowerType = powerType;
spellLogEffectPowerDrainParams.Amplitude = amplitude;
GetExecuteLogEffect(effect).PowerDrainTargets.Add(spellLogEffectPowerDrainParams);
+16
View File
@@ -4358,6 +4358,10 @@ namespace Game.Entities
// ENDOF STORMSONG VALLEY SPELLS
//
// THE WANDERING ISLE SPELLS
//
// Summon Master Li Fei
ApplySpellFix(new[] { 102445 }, spellInfo =>
{
@@ -4367,6 +4371,18 @@ namespace Game.Entities
});
});
// Summon Living Air
ApplySpellFix([102207], spellInfo =>
{
ApplySpellEffectFix(spellInfo, 0, spellEffectInfo =>
{
spellEffectInfo.TargetA = new SpellImplicitTargetInfo(Targets.DestTargetRandom);
});
});
// END OF THE WANDERING ISLE SPELLS
//
// Earthquake
ApplySpellFix(new[] { 61882 }, spellInfo =>
{