Core/PacketIO: Updated to 11.0.0
Port From (https://github.com/TrinityCore/TrinityCore/commit/e59eef5432c7b70679d33f4911c88d0f7d75fd39)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -71,7 +71,8 @@ namespace Framework.Constants
|
||||
Name = 1,
|
||||
Level = 2,
|
||||
Bid = 3,
|
||||
Buyout = 4
|
||||
Buyout = 4,
|
||||
TimeRemaining = 5
|
||||
}
|
||||
|
||||
public enum AuctionHouseBrowseMode
|
||||
|
||||
@@ -2015,7 +2015,10 @@ namespace Framework.Constants
|
||||
BarbersChoice = 62,
|
||||
JailersTowerBuffs = 63,
|
||||
MajorFactionRenown = 64,
|
||||
PersonalTabardVendor = 65
|
||||
PersonalTabardVendor = 65,
|
||||
ForgeMaster = 66,
|
||||
CharacterBanker = 67,
|
||||
AccountBanker = 68,
|
||||
}
|
||||
|
||||
[Flags]
|
||||
|
||||
@@ -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%
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+1128
-1101
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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -245,8 +245,11 @@ 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)
|
||||
packet.BroadcastTextID = (int)text.Data.SelectRandomElementByWeight(data => data.Probability).BroadcastTextID;
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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;
|
||||
@@ -3257,7 +3267,7 @@ namespace Game
|
||||
}
|
||||
|
||||
foreach (var unusedSpells in spellsByTrainer)
|
||||
Log.outError(LogFilter.Sql, $"Table `trainer_spell` references non-existing trainer (TrainerId: {unusedSpells.Key}) for SpellId {unusedSpells.Value.SpellId}, ignoring");
|
||||
Log.outError(LogFilter.Sql, $"Table `trainer_spell` references non-existing trainer (TrainerId: {unusedSpells.Key}) for SpellId {unusedSpells.Value.SpellId}, ignoring");
|
||||
|
||||
SQLResult trainerLocalesResult = DB.World.Query("SELECT Id, locale, Greeting_lang FROM trainer_locale");
|
||||
if (!trainerLocalesResult.IsEmpty())
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -302,7 +302,7 @@ namespace Game.Networking.Packets
|
||||
|
||||
public uint GarrPlotInstanceID;
|
||||
}
|
||||
|
||||
|
||||
//Structs
|
||||
public struct GarrisonPlotInfo
|
||||
{
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
@@ -174,12 +221,14 @@ namespace Game.Networking.Packets
|
||||
Entries.Add(new TraitEntryPacket(ufEntry));
|
||||
Name = ufConfig.Name;
|
||||
}
|
||||
|
||||
|
||||
public void Read(WorldPacket data)
|
||||
{
|
||||
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
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 =>
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user