Updated to 8.2.0.31429 (scripts disabled atm, they still need updated)

Code Port from TrinityCore https://github.com/TrinityCore/TrinityCore
Casc from WoW-Tools https://github.com/WoW-Tools/CASCExplorer
This commit is contained in:
hondacrx
2019-08-14 11:20:42 -04:00
parent e4d500f4b5
commit 125e3b3ac7
232 changed files with 12268 additions and 14670 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
<Import Project="..\..\default.props" /> <Import Project="..\..\default.props" />
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework> <TargetFramework>netcoreapp2.2</TargetFramework>
<StartupObject>BNetServer.Server</StartupObject> <StartupObject>BNetServer.Server</StartupObject>
<ApplicationIcon>Red.ico</ApplicationIcon> <ApplicationIcon>Red.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
+9 -9
View File
@@ -212,13 +212,13 @@ namespace Framework.Constants
CommandDebugBg = 304, CommandDebugBg = 304,
CommandDebugEntervehicle = 305, CommandDebugEntervehicle = 305,
CommandDebugGetitemstate = 306, CommandDebugGetitemstate = 306,
CommandDebugGetitemvalue = 307, CommandDebugGetitemvalue = 307, // DEPRECATED: DON'T REUSE
CommandDebugGetvalue = 308, CommandDebugGetvalue = 308, // DEPRECATED: DON'T REUSE
CommandDebugHostil = 309, CommandDebugHostil = 309,
CommandDebugItemexpire = 310, CommandDebugItemexpire = 310,
CommandDebugLootrecipient = 311, CommandDebugLootrecipient = 311,
CommandDebugLos = 312, CommandDebugLos = 312,
CommandDebugMod32value = 313, CommandDebugMod32value = 313, // DEPRECATED: DON'T REUSE
CommandDebugMoveflags = 314, CommandDebugMoveflags = 314,
CommandDebugPlay = 315, CommandDebugPlay = 315,
CommandDebugPlayCinematic = 316, CommandDebugPlayCinematic = 316,
@@ -237,13 +237,13 @@ namespace Framework.Constants
CommandDebugSendSetphaseshift = 329, CommandDebugSendSetphaseshift = 329,
CommandDebugSendSpellfail = 330, CommandDebugSendSpellfail = 330,
CommandDebugSetaurastate = 331, CommandDebugSetaurastate = 331,
CommandDebugSetbit = 332, CommandDebugSetbit = 332, // DEPRECATED: DON'T REUSE
CommandDebugSetitemvalue = 333, CommandDebugSetitemvalue = 333, // DEPRECATED: DON'T REUSE
CommandDebugSetvalue = 334, CommandDebugSetvalue = 334, // DEPRECATED: DON'T REUSE
CommandDebugSetvid = 335, CommandDebugSetvid = 335,
CommandDebugSpawnvehicle = 336, CommandDebugSpawnvehicle = 336,
CommandDebugThreat = 337, CommandDebugThreat = 337,
CommandDebugUpdate = 338, CommandDebugUpdate = 338, // DEPRECATED: DON'T REUSE
CommandDebugUws = 339, CommandDebugUws = 339,
CommandWpgps = 340, CommandWpgps = 340,
CommandDeserter = 341, CommandDeserter = 341,
@@ -451,7 +451,7 @@ namespace Framework.Constants
CommandDemorph = 543, CommandDemorph = 543,
CommandModify = 544, CommandModify = 544,
CommandModifyArenapoints = 545, CommandModifyArenapoints = 545,
CommandModifyBit = 546, CommandModifyBit = 546, // DEPRECATED: DON'T REUSE
CommandModifyDrunk = 547, CommandModifyDrunk = 547,
CommandModifyEnergy = 548, CommandModifyEnergy = 548,
CommandModifyFaction = 549, CommandModifyFaction = 549,
@@ -558,7 +558,7 @@ namespace Framework.Constants
CommandReloadSupportSystem = 650, CommandReloadSupportSystem = 650,
CommandReloadGossipMenu = 651, CommandReloadGossipMenu = 651,
CommandReloadGossipMenuOption = 652, CommandReloadGossipMenuOption = 652,
CommandReloadItemEnchantmentTemplate = 653, CommandReloadItemRandomBonusListTemplate = 653,
CommandReloadItemLootTemplate = 654, CommandReloadItemLootTemplate = 654,
CommandReloadItemSetNames = 655, CommandReloadItemSetNames = 655,
CommandReloadLfgDungeonRewards = 656, CommandReloadLfgDungeonRewards = 656,
@@ -411,7 +411,7 @@ namespace Framework.Constants
ReachAccountHonorLevel = 213, ReachAccountHonorLevel = 213,
HeartOfAzerothArtifactPowerEarned = 214, HeartOfAzerothArtifactPowerEarned = 214,
HeartOfAzerothLevelReached = 215, HeartOfAzerothLevelReached = 215,
TotalTypes TotalTypes = 217
} }
public enum CriteriaDataType public enum CriteriaDataType
+14 -9
View File
@@ -110,7 +110,7 @@ namespace Framework.Constants
Unk1 = 0x01, Unk1 = 0x01,
} }
public enum NPCFlags : ulong public enum NPCFlags : uint
{ {
None = 0x00, None = 0x00,
Gossip = 0x01, // 100% Gossip = 0x01, // 100%
@@ -145,14 +145,19 @@ namespace Framework.Constants
VaultKeeper = 0x20000000, // Void Storage VaultKeeper = 0x20000000, // Void Storage
WildBattlePet = 0x40000000, // Pet That Player Can Fight (Battle Pet) WildBattlePet = 0x40000000, // Pet That Player Can Fight (Battle Pet)
BlackMarket = 0x80000000, // Black Market BlackMarket = 0x80000000, // Black Market
ItemUpgradeMaster = 0x100000000, }
GarrisonArchitect = 0x200000000,
Steering = 0x400000000, public enum NPCFlags2
ShipmentCrafter = 0x1000000000, {
GarrisonMissionNpc = 0x2000000000, None = 0x00,
TradeskillNpc = 0x4000000000, ItemUpgradeMaster = 0x01,
BlackMarketView = 0x8000000000, GarrisonArchitect = 0x02,
ContributionCollector = 0x40000000000, Steering = 0x04,
ShipmentCrafter = 0x10,
GarrisonMissionNpc = 0x20,
TradeskillNpc = 0x40,
BlackMarketView = 0x80,
ContributionCollector = 0x400,
} }
public enum CreatureTypeFlags : uint public enum CreatureTypeFlags : uint
-1
View File
@@ -29,7 +29,6 @@ namespace Framework.Constants
public const int MaxOutfitItems = 24; public const int MaxOutfitItems = 24;
public const int MaxItemExtCostItems = 5; public const int MaxItemExtCostItems = 5;
public const int MaxItemExtCostCurrencies = 5; public const int MaxItemExtCostCurrencies = 5;
public const int MaxItemRandomProperties = 5;
public const int MaxItemEnchantmentEffects = 3; public const int MaxItemEnchantmentEffects = 3;
public const int MaxProtoSpells = 5; public const int MaxProtoSpells = 5;
public const int MaxEquipmentSetIndex = 20; public const int MaxEquipmentSetIndex = 20;
@@ -21,8 +21,8 @@ namespace Framework.Constants
public enum SessionStatus public enum SessionStatus
{ {
Authed = 0, // Player authenticated (_player == NULL, m_playerRecentlyLogout = false or will be reset before handler call, m_GUID have garbage) Authed = 0, // Player authenticated (_player == NULL, m_playerRecentlyLogout = false or will be reset before handler call, m_GUID have garbage)
Loggedin, // Player in game (_player != NULL, m_GUID == _player->GetGUID(), inWorld()) Loggedin, // Player in game (_player != NULL, m_GUID == _player.GetGUID(), inWorld())
Transfer, // Player transferring to another map (_player != NULL, m_GUID == _player->GetGUID(), !inWorld()) Transfer, // Player transferring to another map (_player != NULL, m_GUID == _player.GetGUID(), !inWorld())
LoggedinOrRecentlyLogout, // _player != NULL or _player == NULL && m_playerRecentlyLogout && m_playerLogout, m_GUID store last _player guid) LoggedinOrRecentlyLogout, // _player != NULL or _player == NULL && m_playerRecentlyLogout && m_playerLogout, m_GUID store last _player guid)
} }
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -32,7 +32,8 @@ namespace Framework.Constants
Corpse = 10, Corpse = 10,
AreaTrigger = 11, AreaTrigger = 11,
SceneObject = 12, SceneObject = 12,
Conversation = 13 Conversation = 13,
Max = 14
} }
public enum TypeMask public enum TypeMask
+4 -45
View File
@@ -30,14 +30,11 @@ namespace Framework.Constants
public const int MaxMasterySpells = 2; public const int MaxMasterySpells = 2;
public const int ReqPrimaryTreeTalents = 31; public const int ReqPrimaryTreeTalents = 31;
public const int ExploredZonesSize = 320; public const int ExploredZonesSize = 192;
public const ulong MaxMoneyAmount = 99999999999UL; public const ulong MaxMoneyAmount = 99999999999UL;
public const int MaxActionButtons = 132; public const int MaxActionButtons = 132;
public const int MaxActionButtonActionValue = 0x00FFFFFF + 1; public const int MaxActionButtonActionValue = 0x00FFFFFF + 1;
public const uint KnowTitlesSize = 6;
public const uint MaxTitleIndex = KnowTitlesSize * 64;
public const int MaxDailyQuests = 25; public const int MaxDailyQuests = 25;
public const int QuestsCompletedBitsSize = 1750; public const int QuestsCompletedBitsSize = 1750;
@@ -45,7 +42,7 @@ namespace Framework.Constants
public const uint infinityCooldownDelayCheck = Time.Month / 2; public const uint infinityCooldownDelayCheck = Time.Month / 2;
public const int MaxPlayerSummonDelay = 2 * Time.Minute; public const int MaxPlayerSummonDelay = 2 * Time.Minute;
public const int TaxiMaskSize = 286; public const int TaxiMaskSize = 311;
// corpse reclaim times // corpse reclaim times
public const int DeathExpireStep = (5 * Time.Minute); public const int DeathExpireStep = (5 * Time.Minute);
@@ -76,45 +73,6 @@ namespace Framework.Constants
public const int Gold = Silver * 100; public const int Gold = Silver * 100;
} }
public struct PlayerFieldOffsets
{
public const byte BytesOffsetSkinId = 0;
public const byte BytesOffsetFaceId = 1;
public const byte BytesOffsetHairStyleId = 2;
public const byte BytesOffsetHairColorId = 3;
public const byte Bytes2OffsetCustomDisplayOption = 0; // 3 Bytes
public const byte Bytes2OffsetFacialStyle = 3;
public const byte Bytes3OffsetPartyType = 0;
public const byte Bytes3OffsetBankBagSlots = 1;
public const byte Bytes3OffsetGender = 2;
public const byte Bytes3OffsetInebriation = 3;
public const byte Bytes4OffsetPvpTitle = 0;
public const byte Bytes4OffsetArenaFaction = 1;
public const byte FieldBytesOffsetRafGrantableLevel = 0;
public const byte FieldBytesOffsetActionBarToggles = 1;
public const byte FieldBytesOffsetLifetimeMaxPvpRank = 2;
public const byte FieldBytesOffsetNumRespecs = 3;
public const byte FieldBytes2OffsetIgnorePowerRegenPredictionMask = 0;
public const byte FieldBytes2OffsetAuraVision = 1;
public const byte FieldBytes2OffsetNumBackpackSlots = 2;
public const byte FieldBytes3OffsetOverrideSpellsId = 2; // Uint16!
public const byte FieldBytes3OffsetOverrideSpellsIdUint16Offset = FieldBytes3OffsetOverrideSpellsId / 2;
public const byte FieldKillsOffsetTodayKills = 0;
public const byte FieldKillsOffsetYesterdayKills = 1;
public const byte RestStateXp = 0;
public const byte RestRestedXp = 1;
public const byte RestStateHonor = 2;
public const byte RestRestedHonor = 3;
}
public enum TradeSlots public enum TradeSlots
{ {
Invalid = -1, Invalid = -1,
@@ -737,7 +695,8 @@ namespace Framework.Constants
None = 0x00, None = 0x00,
BonusLevel90 = 0x01, BonusLevel90 = 0x01,
BonusLevel100 = 0x02, BonusLevel100 = 0x02,
BonusLevel110 = 0x04 BonusLevel110 = 0x04,
BonusLevel120 = 0x08
} }
public enum HeirloomItemFlags public enum HeirloomItemFlags
File diff suppressed because it is too large Load Diff
@@ -709,7 +709,8 @@ namespace Framework.Constants
WrongFaction = 292, WrongFaction = 292,
NotEnoughCurrency = 293, NotEnoughCurrency = 293,
BattleForAzerothRidingRequirement = 294, BattleForAzerothRidingRequirement = 294,
Unknown = 295, MountEquipmentError = 295,
Unknown = 296,
// 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) // 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 SpellCastOk = Success
@@ -1711,7 +1712,7 @@ namespace Framework.Constants
Unk4 = 0x10, // 4 Unk4 = 0x10, // 4
AbsorbEnvironmentalDamage = 0x20, // 5 AbsorbEnvironmentalDamage = 0x20, // 5
Unk6 = 0x40, // 6 Unk6 = 0x40, // 6
RankIgnoresCasterLevel = 0x80, // 7 Spell_C_GetSpellRank returns SpellLevels->MaxLevel * 5 instead of std::min(SpellLevels->MaxLevel, caster->Level) * 5 RankIgnoresCasterLevel = 0x80, // 7 Spell_C_GetSpellRank returns SpellLevels.MaxLevel * 5 instead of std::min(SpellLevels.MaxLevel, caster.Level) * 5
Unk8 = 0x100, // 8 Unk8 = 0x100, // 8
Unk9 = 0x200, // 9 Unk9 = 0x200, // 9
Unk10 = 0x400, // 10 Unk10 = 0x400, // 10
@@ -2090,7 +2091,17 @@ namespace Framework.Constants
RespecAzeriteEmpoweredItem = 259, RespecAzeriteEmpoweredItem = 259,
SummonStabledPet = 260, SummonStabledPet = 260,
ScrapItem = 261, ScrapItem = 261,
TotalSpellEffects, Unk262 = 262,
RepairItem = 263,
RemoveGem = 264,
LearnAzeriteEssencePower = 265,
Unk266 = 266,
Unk267 = 267,
ApplyMountEquipment = 268,
UpgradeItem = 269,
Unk270 = 270,
ApplyAreaAuraPartyNonrandom = 271,
TotalSpellEffects
} }
public enum SpellEffectHandle public enum SpellEffectHandle
+7 -28
View File
@@ -242,7 +242,7 @@ namespace Framework.Constants
/// <summary> /// <summary>
/// UnitStandStateType /// UnitStandStateType
/// </summary> /// </summary>
public enum UnitStandStateType public enum UnitStandStateType : byte
{ {
Stand = 0, Stand = 0,
Sit = 1, Sit = 1,
@@ -256,23 +256,7 @@ namespace Framework.Constants
Submerged = 9 Submerged = 9
} }
public struct UnitBytes0Offsets public enum UnitVisFlags
{
public const byte Race = 0;
public const byte Class = 1;
public const byte PlayerClass = 2;
public const byte Gender = 3;
}
public struct UnitBytes1Offsets
{
public const byte StandState = 0;
public const byte PetTalents = 1; // unused
public const byte VisFlag = 2;
public const byte AnimTier = 3;
}
public enum UnitStandFlags
{ {
Unk1 = 0x01, Unk1 = 0x01,
Creep = 0x02, Creep = 0x02,
@@ -284,22 +268,16 @@ namespace Framework.Constants
public enum UnitBytes1Flags public enum UnitBytes1Flags
{ {
None = 0x00,
AlwaysStand = 0x01, AlwaysStand = 0x01,
Hover = 0x02, Hover = 0x02,
Unk3 = 0x04, Unk3 = 0x04,
All = 0xFF All = 0xFF
} }
public struct UnitBytes2Offsets public enum UnitPVPStateFlags
{
public const byte SheathState = 0;
public const byte PvpFlag = 1;
public const byte PetFlags = 2;
public const byte ShapeshiftForm = 3;
}
public enum UnitBytes2Flags
{ {
None = 0x00,
PvP = 0x01, PvP = 0x01,
Unk1 = 0x02, Unk1 = 0x02,
FFAPvp = 0x04, FFAPvp = 0x04,
@@ -310,8 +288,9 @@ namespace Framework.Constants
Unk7 = 0x80, Unk7 = 0x80,
} }
public enum UnitPetFlags public enum UnitPetFlags : byte
{ {
None = 0x00,
CanBeRenamed = 0x01, CanBeRenamed = 0x01,
CanBeAbandoned = 0x02 CanBeAbandoned = 0x02
} }
File diff suppressed because it is too large Load Diff
@@ -1,455 +0,0 @@
/*
* Copyright (C) 2012-2019 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Framework.Constants
{
public enum ObjectFields
{
Guid = 0x000, // Size: 4, Flags: Public
Entry = 0x004, // Size: 1, Flags: Dynamic
DynamicFlags = 0x005, // Size: 1, Flags: Dynamic, Urgent
ScaleX = 0x006, // Size: 1, Flags: Public
End = 0x007,
}
public enum ItemFields
{
Owner = ObjectFields.End + 0x000, // Size: 4, Flags: Public
Contained = ObjectFields.End + 0x004, // Size: 4, Flags: Public
Creator = ObjectFields.End + 0x008, // Size: 4, Flags: Public
GiftCreator = ObjectFields.End + 0x00c, // Size: 4, Flags: Public
StackCount = ObjectFields.End + 0x010, // Size: 1, Flags: Owner
Duration = ObjectFields.End + 0x011, // Size: 1, Flags: Owner
SpellCharges = ObjectFields.End + 0x012, // Size: 5, Flags: Owner
Flags = ObjectFields.End + 0x017, // Size: 1, Flags: Public
Enchantment = ObjectFields.End + 0x018, // Size: 39, Flags: Public
PropertySeed = ObjectFields.End + 0x03f, // Size: 1, Flags: Public
RandomPropertiesId = ObjectFields.End + 0x040, // Size: 1, Flags: Public
Durability = ObjectFields.End + 0x041, // Size: 1, Flags: Owner
MaxDurability = ObjectFields.End + 0x042, // Size: 1, Flags: Owner
CreatePlayedTime = ObjectFields.End + 0x043, // Size: 1, Flags: Public
ModifiersMask = ObjectFields.End + 0x044, // Size: 1, Flags: Owner
Context = ObjectFields.End + 0x045, // Size: 1, Flags: Public
ArtifactXp = ObjectFields.End + 0x046, // Size: 2, Flags: OWNER
AppearanceModId = ObjectFields.End + 0x048, // Size: 1, Flags: OWNER
End = ObjectFields.End + 0x049
}
public enum ItemDynamicFields
{
Modifiers = 0x000, // Flags: Owner
BonusListIds = 0x001, // Flags: Owner, 0x100
ArtifactPowers = 0x002, // Flags: OWNER
Gems = 0x003, // Flags: OWNER
End = 0x004
}
public enum ContainerFields
{
Slot1 = ItemFields.End + 0x000, // Size: 144, Flags: Public
NumSlots = ItemFields.End + 0x090, // Size: 1, Flags: Public
End = ItemFields.End + 0x091
}
public enum AzeriteEmpoweredItemFields
{
Selections = ItemFields.End + 0x000, // Size: 4, Flags: PUBLIC
End = ItemFields.End + 0x004,
}
public enum AzeriteEmpoweredItemDynamicFields
{
End = ItemDynamicFields.End + 0x000,
}
public enum AzeriteItemFields
{
Xp = ItemFields.End + 0x000, // Size: 2, Flags: PUBLIC
Level = ItemFields.End + 0x002, // Size: 1, Flags: PUBLIC
AuraLevel = ItemFields.End + 0x003, // Size: 1, Flags: PUBLIC
KnowledgeLevel = ItemFields.End + 0x004, // Size: 1, Flags: OWNER
DebugKnowledgeWeek = ItemFields.End + 0x005, // Size: 1, Flags: OWNER
End = ItemFields.End + 0x006,
}
public enum AzeriteItemDynamicFields
{
End = ItemDynamicFields.End + 0x000,
}
public enum UnitFields
{
Charm = ObjectFields.End + 0x000, // Size: 4, Flags: Public
Summon = ObjectFields.End + 0x004, // Size: 4, Flags: Public
Critter = ObjectFields.End + 0x008, // Size: 4, Flags: Privaten
CharmedBy = ObjectFields.End + 0x00c, // Size: 4, Flags: Public
SummonedBy = ObjectFields.End + 0x010, // Size: 4, Flags: Public
CreatedBy = ObjectFields.End + 0x014, // Size: 4, Flags: Public
DemonCreator = ObjectFields.End + 0x018, // Size: 4, Flags: Public
LookAtControllerTarget = ObjectFields.End + 0x01c, // Size: 4, Flags: Public
Target = ObjectFields.End + 0x020, // Size: 4, Flags: Public
BattlePetCompanionGuid = ObjectFields.End + 0x024, // Size: 4, Flags: Public
BattlePetDbId = ObjectFields.End + 0x028, // Size: 2, Flags: Public
ChannelData = ObjectFields.End + 0x02a, // Size: 2, Flags: Public, Urgent
SummonedByHomeRealm = ObjectFields.End + 0x02c, // Size: 1, Flags: Public
Bytes0 = ObjectFields.End + 0x02d, // Size: 1, Flags: Public
DisplayPower = ObjectFields.End + 0x02e, // Size: 1, Flags: Public
OverrideDisplayPowerId = ObjectFields.End + 0x02f, // Size: 1, Flags: Public
Health = ObjectFields.End + 0x030, // Size: 2, Flags: Public
Power = ObjectFields.End + 0x032, // Size: 6, Flags: Public, UrgentSelfOnly
MaxHealth = ObjectFields.End + 0x038, // Size: 2, Flags: Public
MaxPower = ObjectFields.End + 0x03a, // Size: 6, Flags: Public
PowerRegenFlatModifier = ObjectFields.End + 0x040, // Size: 6, Flags: Private, Owner, UnitAll
PowerRegenInterruptedFlatModifier = ObjectFields.End + 0x046, // Size: 6, Flags: Private, Owner, UnitAll
Level = ObjectFields.End + 0x04c, // Size: 1, Flags: Public
EffectiveLevel = ObjectFields.End + 0x04d, // Size: 1, Flags: Public
ContentTuningId = ObjectFields.End + 0x04e, // Size: 1, Flags: Public
ScalingLevelMin = ObjectFields.End + 0x04f, // Size: 1, Flags: Public
ScalingLevelMax = ObjectFields.End + 0x050, // Size: 1, Flags: Public
ScalingLevelDelta = ObjectFields.End + 0x051, // Size: 1, Flags: Public
ScalingFactionGroup = ObjectFields.End + 0x052, // Size: 1, Flags: Public
ScalingHealthItemLevelCurveId = ObjectFields.End + 0x053, // Size: 1, Flags: Public
ScalingDamageItemLevelCurveId = ObjectFields.End + 0x054, // Size: 1, Flags: Public
FactionTemplate = ObjectFields.End + 0x055, // Size: 1, Flags: Public
VirtualItemSlotId = ObjectFields.End + 0x056, // Size: 6, Flags: Public
Flags = ObjectFields.End + 0x05c, // Size: 1, Flags: Public, Urgent
Flags2 = ObjectFields.End + 0x05d, // Size: 1, Flags: Public, Urgent
Flags3 = ObjectFields.End + 0x05e, // Size: 1, Flags: Public, UrgentScalingLevelDelta
AuraState = ObjectFields.End + 0x05f, // Size: 1, Flags: Public
BaseAttackTime = ObjectFields.End + 0x060, // Size: 2, Flags: Public
RangedAttackTime = ObjectFields.End + 0x062, // Size: 1, Flags: Private
BoundingRadius = ObjectFields.End + 0x063, // Size: 1, Flags: Public
CombatReach = ObjectFields.End + 0x064, // Size: 1, Flags: Public
DisplayId = ObjectFields.End + 0x065, // Size: 1, Flags: Dynamic, Urgent
DisplayScale = ObjectFields.End + 0x066, // Size: 1, Flags: Dynamic, Urgent
NativeDisplayId = ObjectFields.End + 0x067, // Size: 1, Flags: Public, Urgent
NativeXDisplayScale = ObjectFields.End + 0x068, // Size: 1, Flags: Public, Urgent
MountDisplayId = ObjectFields.End + 0x069, // Size: 1, Flags: Public, Urgent
MinDamage = ObjectFields.End + 0x06a, // Size: 1, Flags: Private, Owner, SpecialInfo
MaxDamage = ObjectFields.End + 0x06b, // Size: 1, Flags: Private, Owner, SpecialInfo
MinOffHandDamage = ObjectFields.End + 0x06c, // Size: 1, Flags: Private, Owner, SpecialInfo
MaxOffHandDamage = ObjectFields.End + 0x06d, // Size: 1, Flags: Private, Owner, SpecialInfo
Bytes1 = ObjectFields.End + 0x06e, // Size: 1, Flags: Public
PetNumber = ObjectFields.End + 0x06f, // Size: 1, Flags: Public
PetNameTimestamp = ObjectFields.End + 0x070, // Size: 1, Flags: Public
PetExperience = ObjectFields.End + 0x071, // Size: 1, Flags: Owner
PetNextLevelExp = ObjectFields.End + 0x072, // Size: 1, Flags: Owner
ModCastSpeed = ObjectFields.End + 0x073, // Size: 1, Flags: Public
ModCastHaste = ObjectFields.End + 0x074, // Size: 1, Flags: Public
ModHaste = ObjectFields.End + 0x075, // Size: 1, Flags: Public
ModRangedHaste = ObjectFields.End + 0x076, // Size: 1, Flags: Public
ModHasteRegen = ObjectFields.End + 0x077, // Size: 1, Flags: Public
ModTimeRate = ObjectFields.End + 0x078, // Size: 1, Flags: Public
CreatedBySpell = ObjectFields.End + 0x079, // Size: 1, Flags: Public
NpcFlags = ObjectFields.End + 0x07a, // Size: 2, Flags: Public, Dynamic
NpcEmotestate = ObjectFields.End + 0x07c, // Size: 1, Flags: Public
Stat = ObjectFields.End + 0x07d, // Size: 4, Flags: Private, Owner
PosStat = ObjectFields.End + 0x081, // Size: 4, Flags: Private, Owner
NegStat = ObjectFields.End + 0x085, // Size: 4, Flags: Private, Owner
Resistances = ObjectFields.End + 0x089, // Size: 7, Flags: Private, Owner, SpecialInfo
BonusResistanceMods = ObjectFields.End + 0x090, // Size: 7, Flags: Private, Owner
BaseMana = ObjectFields.End + 0x097, // Size: 1, Flags: Public
BaseHealth = ObjectFields.End + 0x098, // Size: 1, Flags: Private, Owner
Bytes2 = ObjectFields.End + 0x099, // Size: 1, Flags: Public
AttackPower = ObjectFields.End + 0x09a, // Size: 1, Flags: Private, Owner
AttackPowerModPos = ObjectFields.End + 0x09b, // Size: 1, Flags: Private, Owner
AttackPowerModNeg = ObjectFields.End + 0x09c, // Size: 1, Flags: Private, Owner
AttackPowerMultiplier = ObjectFields.End + 0x09d, // Size: 1, Flags: Private, Owner
RangedAttackPower = ObjectFields.End + 0x09e, // Size: 1, Flags: Private, Owner
RangedAttackPowerModPos = ObjectFields.End + 0x09f, // Size: 1, Flags: Private, Owner
RangedAttackPowerModNeg = ObjectFields.End + 0x0a0, // Size: 1, Flags: Private, Owner
RangedAttackPowerMultiplier = ObjectFields.End + 0x0a1, // Size: 1, Flags: Private, Owner
MainHandWeaponAttackPower = ObjectFields.End + 0x0a2, // Size: 1, Flags: Private, Owner
OffHandWeaponAttackPower = ObjectFields.End + 0x0a3, // Size: 1, Flags: Private, Owner
RangedHandWeaponAttackPower = ObjectFields.End + 0x0a4, // Size: 1, Flags: Private, Owner
AttackSpeedAura = ObjectFields.End + 0x0a5, // Size: 1, Flags: Private, Owner
Lifesteal = ObjectFields.End + 0x0a6, // Size: 1, Flags: Private, Owner
MinRangedDamage = ObjectFields.End + 0x0a7, // Size: 1, Flags: Private, Owner
MaxRangedDamage = ObjectFields.End + 0x0a8, // Size: 1, Flags: Private, Owner
PowerCostModifier = ObjectFields.End + 0x0a9, // Size: 7, Flags: Private, Owner
PowerCostMultiplier = ObjectFields.End + 0x0b0, // Size: 7, Flags: Private, Owner
MaxHealthModifier = ObjectFields.End + 0x0b7, // Size: 1, Flags: Private, Owner
HoverHeight = ObjectFields.End + 0x0b8, // Size: 1, Flags: Public
MinItemLevelCutoff = ObjectFields.End + 0x0b9, // Size: 1, Flags: Public
MinItemLevel = ObjectFields.End + 0x0ba, // Size: 1, Flags: Public
MaxItemlevel = ObjectFields.End + 0x0bb, // Size: 1, Flags: Public
WildBattlepetLevel = ObjectFields.End + 0x0bc, // Size: 1, Flags: Public
BattlepetCompanionNameTimestamp = ObjectFields.End + 0x0bd, // Size: 1, Flags: Public
InteractSpellid = ObjectFields.End + 0x0be, // Size: 1, Flags: Public
StateSpellVisualId = ObjectFields.End + 0x0bf, // Size: 1, Flags: Dynamic, Urgent
StateAnimId = ObjectFields.End + 0x0c0, // Size: 1, Flags: Dynamic, Urgent
StateAnimKitId = ObjectFields.End + 0x0c1, // Size: 1, Flags: Dynamic, Urgent
StateWorldEffectId = ObjectFields.End + 0x0c2, // Size: 4, Flags: Dynamic, Urgent
ScaleDuration = ObjectFields.End + 0x0c6, // Size: 1, Flags: Public
LooksLikeMountId = ObjectFields.End + 0x0c7, // Size: 1, Flags: Public
LooksLikeCreatureId = ObjectFields.End + 0x0c8, // Size: 1, Flags: Public
LookAtControllerId = ObjectFields.End + 0x0c9, // Size: 1, Flags: Public
GuildGuid = ObjectFields.End + 0x0ca, // Size: 4, Flags: Public
End = ObjectFields.End + 0x0ce
}
public enum UnitDynamicFields
{
PassiveSpells = 0x000, // Flags: Public, Urgent
WorldEffects = 0x001, // Flags: Public, Urgent
ChannelObjects = 0x002, // Flags: PUBLIC, URGENT
End = 0x003
}
public enum PlayerFields
{
DuelArbiter = UnitFields.End + 0x000, // Size: 4, Flags: Public
WowAccount = UnitFields.End + 0x004, // Size: 4, Flags: Public
LootTargetGuid = UnitFields.End + 0x008, // Size: 4, Flags: Public
Flags = UnitFields.End + 0x00c, // Size: 1, Flags: Public
FlagsEx = UnitFields.End + 0x00d, // Size: 1, Flags: Public
GuildRank = UnitFields.End + 0x00e, // Size: 1, Flags: Public
GuildDeleteDate = UnitFields.End + 0x00f, // Size: 1, Flags: Public
GuildLevel = UnitFields.End + 0x010, // Size: 1, Flags: Public
Bytes = UnitFields.End + 0x011, // Size: 1, Flags: Public
Bytes2 = UnitFields.End + 0x012, // Size: 1, Flags: Public
Bytes3 = UnitFields.End + 0x013, // Size: 1, Flags: Public
Bytes4 = UnitFields.End + 0x014, // Size: 1, Flags: Public
DuelTeam = UnitFields.End + 0x015, // Size: 1, Flags: Public
GuildTimestamp = UnitFields.End + 0x016, // Size: 1, Flags: Public
QuestLog = UnitFields.End + 0x017, // Size: 1600, Flags: PartyMember
VisibleItem = UnitFields.End + 0x657, // Size: 38, Flags: Public
ChosenTitle = UnitFields.End + 0x67d, // Size: 1, Flags: Public
FakeInebriation = UnitFields.End + 0x67e, // Size: 1, Flags: Public
VirtualRealm = UnitFields.End + 0x67f, // Size: 1, Flags: Public
CurrentSpecId = UnitFields.End + 0x680, // Size: 1, Flags: Public
TaxiMountAnimKitId = UnitFields.End + 0x681, // Size: 1, Flags: Public
AvgItemLevel = UnitFields.End + 0x682, // Size: 4, Flags: Public
CurrentBattlePetBreedQuality = UnitFields.End + 0x686, // Size: 1, Flags: Public
HonorLevel = UnitFields.End + 0x687, // Size: 1, Flags: Public
End = UnitFields.End + 0x688
}
public enum PlayerDynamicFields
{
ArenaCooldowns = UnitDynamicFields.End + 0x000, // Flags: Public
End = UnitDynamicFields.End + 0x001,
}
public enum ActivePlayerFields
{
InvSlotHead = PlayerFields.End + 0x000, // Size: 780, Flags: Public
Farsight = PlayerFields.End + 0x30c, // Size: 4, Flags: Public
SummonedBattlePetId = PlayerFields.End + 0x310, // Size: 4, Flags: Public
KnownTitles = PlayerFields.End + 0x314, // Size: 12, Flags: Public
Coinage = PlayerFields.End + 0x320, // Size: 2, Flags: Public
Xp = PlayerFields.End + 0x322, // Size: 1, Flags: Public
NextLevelXp = PlayerFields.End + 0x323, // Size: 1, Flags: Public
TrialXp = PlayerFields.End + 0x324, // Size: 1, Flags: Public
SkillLineId = PlayerFields.End + 0x325, // Size: 128, Flags: Public
SkillLineStep = PlayerFields.End + 0x3a5, // Size: 128, Flags: Public
SkillLineRank = PlayerFields.End + 0x425, // Size: 128, Flags: Public
SkillLineStartRank = PlayerFields.End + 0x4a5, // Size: 128, Flags: Public
SkillLineMaxRank = PlayerFields.End + 0x525, // Size: 128, Flags: Public
SkillLineTempBonus = PlayerFields.End + 0x5a5, // Size: 128, Flags: Public
SkillLinePermBonus = PlayerFields.End + 0x625, // Size: 128, Flags: Public
CharacterPoints = PlayerFields.End + 0x6a5, // Size: 1, Flags: Public
MaxTalentTiers = PlayerFields.End + 0x6a6, // Size: 1, Flags: Public
TrackCreatures = PlayerFields.End + 0x6a7, // Size: 1, Flags: Public
TrackResources = PlayerFields.End + 0x6a8, // Size: 2, Flags: Public
Expertise = PlayerFields.End + 0x6aa, // Size: 1, Flags: Public
OffhandExpertise = PlayerFields.End + 0x6ab, // Size: 1, Flags: Public
RangedExpertise = PlayerFields.End + 0x6ac, // Size: 1, Flags: Public
CombatRatingExpertise = PlayerFields.End + 0x6ad, // Size: 1, Flags: Public
BlockPercentage = PlayerFields.End + 0x6ae, // Size: 1, Flags: Public
DodgePercentage = PlayerFields.End + 0x6af, // Size: 1, Flags: Public
DodgePercentageFromAttribute = PlayerFields.End + 0x6b0, // Size: 1, Flags: Public
ParryPercentage = PlayerFields.End + 0x6b1, // Size: 1, Flags: Public
ParryPercentageFromAttribute = PlayerFields.End + 0x6b2, // Size: 1, Flags: Public
CritPercentage = PlayerFields.End + 0x6b3, // Size: 1, Flags: Public
RangedCritPercentage = PlayerFields.End + 0x6b4, // Size: 1, Flags: Public
OffhandCritPercentage = PlayerFields.End + 0x6b5, // Size: 1, Flags: Public
SpellCritPercentage1 = PlayerFields.End + 0x6b6, // Size: 1, Flags: Public
ShieldBlock = PlayerFields.End + 0x6b7, // Size: 1, Flags: Public
ShieldBlockCritPercentage = PlayerFields.End + 0x6b8, // Size: 1, Flags: Public
Mastery = PlayerFields.End + 0x6b9, // Size: 1, Flags: Public
Speed = PlayerFields.End + 0x6ba, // Size: 1, Flags: Public
Avoidance = PlayerFields.End + 0x6bb, // Size: 1, Flags: Public
Sturdiness = PlayerFields.End + 0x6bc, // Size: 1, Flags: Public
Versatility = PlayerFields.End + 0x6bd, // Size: 1, Flags: Public
VersatilityBonus = PlayerFields.End + 0x6be, // Size: 1, Flags: Public
PvpPowerDamage = PlayerFields.End + 0x6bf, // Size: 1, Flags: Public
PvpPowerHealing = PlayerFields.End + 0x6c0, // Size: 1, Flags: Public
ExploredZones = PlayerFields.End + 0x6c1, // Size: 320, Flags: Public
RestInfo = PlayerFields.End + 0x801, // Size: 4, Flags: Public
ModDamageDonePos = PlayerFields.End + 0x805, // Size: 7, Flags: Public
ModDamageDoneNeg = PlayerFields.End + 0x80c, // Size: 7, Flags: Public
ModDamageDonePct = PlayerFields.End + 0x813, // Size: 7, Flags: Public
ModHealingDonePos = PlayerFields.End + 0x81a, // Size: 1, Flags: Public
ModHealingPct = PlayerFields.End + 0x81b, // Size: 1, Flags: Public
ModHealingDonePct = PlayerFields.End + 0x81c, // Size: 1, Flags: Public
ModPeriodicHealingDonePercent = PlayerFields.End + 0x81d, // Size: 1, Flags: Public
WeaponDmgMultipliers = PlayerFields.End + 0x81e, // Size: 3, Flags: Public
WeaponAtkSpeedMultipliers = PlayerFields.End + 0x821, // Size: 3, Flags: Public
ModSpellPowerPct = PlayerFields.End + 0x824, // Size: 1, Flags: Public
ModResiliencePercent = PlayerFields.End + 0x825, // Size: 1, Flags: Public
OverrideSpellPowerByApPct = PlayerFields.End + 0x826, // Size: 1, Flags: Public
OverrideApBySpellPowerPercent = PlayerFields.End + 0x827, // Size: 1, Flags: Public
ModTargetResistance = PlayerFields.End + 0x828, // Size: 1, Flags: Public
ModTargetPhysicalResistance = PlayerFields.End + 0x829, // Size: 1, Flags: Public
LocalFlags = PlayerFields.End + 0x82a, // Size: 1, Flags: Public
Bytes = PlayerFields.End + 0x82b, // Size: 1, Flags: Public
PvpMedals = PlayerFields.End + 0x82c, // Size: 1, Flags: Public
BuyBackPrice = PlayerFields.End + 0x82d, // Size: 12, Flags: Public
BuyBackTimestamp = PlayerFields.End + 0x839, // Size: 12, Flags: Public
Kills = PlayerFields.End + 0x845, // Size: 1, Flags: Public
LifetimeHonorableKills = PlayerFields.End + 0x846, // Size: 1, Flags: Public
WatchedFactionIndex = PlayerFields.End + 0x847, // Size: 1, Flags: Public
CombatRating = PlayerFields.End + 0x848, // Size: 32, Flags: Public
ArenaTeamInfo = PlayerFields.End + 0x868, // Size: 54, Flags: Public
MaxLevel = PlayerFields.End + 0x89e, // Size: 1, Flags: Public
ScalingPlayerLevelDelta = PlayerFields.End + 0x89f, // Size: 1, Flags: Public
MaxCreatureScalingLevel = PlayerFields.End + 0x8a0, // Size: 1, Flags: Public
NoReagentCost = PlayerFields.End + 0x8a1, // Size: 4, Flags: Public
PetSpellPower = PlayerFields.End + 0x8a5, // Size: 1, Flags: Public
ProfessionSkillLine = PlayerFields.End + 0x8a6, // Size: 2, Flags: Public
UiHitModifier = PlayerFields.End + 0x8a8, // Size: 1, Flags: Public
UiSpellHitModifier = PlayerFields.End + 0x8a9, // Size: 1, Flags: Public
HomeRealmTimeOffset = PlayerFields.End + 0x8aa, // Size: 1, Flags: Public
ModPetHaste = PlayerFields.End + 0x8ab, // Size: 1, Flags: Public
Bytes2 = PlayerFields.End + 0x8ac, // Size: 1, Flags: Public
Bytes3 = PlayerFields.End + 0x8ad, // Size: 1, Flags: Public, UrgentSelfOnly
LfgBonusFactionId = PlayerFields.End + 0x8ae, // Size: 1, Flags: Public
LootSpecId = PlayerFields.End + 0x8af, // Size: 1, Flags: Public
OverrideZonePvpType = PlayerFields.End + 0x8b0, // Size: 1, Flags: Public, UrgentSelfOnly
BagSlotFlags = PlayerFields.End + 0x8b1, // Size: 4, Flags: Public
BankBagSlotFlags = PlayerFields.End + 0x8b5, // Size: 7, Flags: Public
InsertItemsLeftToRight = PlayerFields.End + 0x8bc, // Size: 1, Flags: Public
QuestCompleted = PlayerFields.End + 0x8bd, // Size: 1750, Flags: Public
Honor = PlayerFields.End + 0xf93, // Size: 1, Flags: Public
HonorNextLevel = PlayerFields.End + 0xf94, // Size: 1, Flags: Public
PvpTierMaxFromWins = PlayerFields.End + 0xf95, // Size: 1, Flags: Public
PvpLastWeeksTierMaxFromWins = PlayerFields.End + 0xf96, // Size: 1, Flags: Public
End = PlayerFields.End + 0xf97,
}
public enum ActivePlayerDynamicFields
{
ReserachSite = PlayerDynamicFields.End + 0x000, // Flags: Public
ResearchSiteProgress = PlayerDynamicFields.End + 0x001, // Flags: Public
DailyQuests = PlayerDynamicFields.End + 0x002, // Flags: Public
AvailableQuestLineXQuestId = PlayerDynamicFields.End + 0x003, // Flags: Public
Heirlooms = PlayerDynamicFields.End + 0x005, // Flags: Public
HeirloomFlags = PlayerDynamicFields.End + 0x006, // Flags: Public
Toys = PlayerDynamicFields.End + 0x007, // Flags: Public
Transmog = PlayerDynamicFields.End + 0x008, // Flags: Public
ConditionalTransmog = PlayerDynamicFields.End + 0x009, // Flags: Public
SelfResSpells = PlayerDynamicFields.End + 0x00a, // Flags: Public
CharacterRestrictions = PlayerDynamicFields.End + 0x00b, // Flags: Public
SpellPctModByLabel = PlayerDynamicFields.End + 0x00c, // Flags: Public
SpellFlatModByLabel = PlayerDynamicFields.End + 0x00d, // Flags: Public
Reserach = PlayerDynamicFields.End + 0x00e, // Flags: Public
End = PlayerDynamicFields.End + 0x00f,
}
public enum GameObjectFields
{
CreatedBy = ObjectFields.End + 0x000, // Size: 4, Flags: Public
GuildGuid = ObjectFields.End + 0x004, // Size: 4, Flags: Public
DisplayId = ObjectFields.End + 0x008, // Size: 1, Flags: Dynamic, Urgent
Flags = ObjectFields.End + 0x009, // Size: 1, Flags: Public, Urgent
ParentRotation = ObjectFields.End + 0x00a, // Size: 4, Flags: Public
Faction = ObjectFields.End + 0x00e, // Size: 1, Flags: Public
Level = ObjectFields.End + 0x00f, // Size: 1, Flags: Public
Bytes1 = ObjectFields.End + 0x010, // Size: 1, Flags: Public, Urgent
SpellVisualId = ObjectFields.End + 0x011, // Size: 1, Flags: Public, Dynamic, Urgent
StateSpellVisualId = ObjectFields.End + 0x012, // Size: 1, Flags: Dynamic, Urgent
StateAnimId = ObjectFields.End + 0x013, // Size: 1, Flags: Dynamic, Urgent
StateAnimKitId = ObjectFields.End + 0x014, // Size: 1, Flags: Dynamic, Urgent
StateWorldEffectId = ObjectFields.End + 0x015, // Size: 4, Flags: Dynamic, Urgent
CustomParam = ObjectFields.End + 0x019, // Size: 1, Flags: Public, Urgent
End = ObjectFields.End + 0x01a,
}
public enum GameObjectDynamicFields
{
EnableDoodadSets = 0x000, // Flags: PUBLIC
End = 0x001
}
public enum DynamicObjectFields
{
Caster = ObjectFields.End + 0x000, // Size: 4, Flags: Public
Type = ObjectFields.End + 0x004, // Size: 1, Flags: Public
SpellXSpellVisualId = ObjectFields.End + 0x005, // Size: 1, Flags: Public
SpellId = ObjectFields.End + 0x006, // Size: 1, Flags: Public
Radius = ObjectFields.End + 0x007, // Size: 1, Flags: Public
CastTime = ObjectFields.End + 0x008, // Size: 1, Flags: Public
End = ObjectFields.End + 0x009
}
public enum CorpseFields
{
Owner = ObjectFields.End + 0x000, // Size: 4, Flags: Public
Party = ObjectFields.End + 0x004, // Size: 4, Flags: Public
GuildGuid = ObjectFields.End + 0x008, // Size: 4, Flags: PUBLIC
DisplayId = ObjectFields.End + 0x00C, // Size: 1, Flags: Public
Item = ObjectFields.End + 0x00D, // Size: 19, Flags: Public
Bytes1 = ObjectFields.End + 0x020, // Size: 1, Flags: Public
Bytes2 = ObjectFields.End + 0x021, // Size: 1, Flags: Public
Flags = ObjectFields.End + 0x022, // Size: 1, Flags: Public
DynamicFlags = ObjectFields.End + 0x023, // Size: 1, Flags: Dynamic
FactionTemplate = ObjectFields.End + 0x024, // Size: 1, Flags: Public
CustomDisplayOption = ObjectFields.End + 0x025, // Size: 1, Flags: PUBLIC
End = ObjectFields.End + 0x026
}
public enum AreaTriggerFields
{
OverrideScaleCurve = ObjectFields.End + 0x000, // Size: 7, Flags: Public, Urgent
ExtraScaleCurve = ObjectFields.End + 0x007, // Size: 7, Flags: Public, Urgent
Caster = ObjectFields.End + 0x00e, // Size: 4, Flags: Public
Duration = ObjectFields.End + 0x012, // Size: 1, Flags: Public
TimeToTarget = ObjectFields.End + 0x013, // Size: 1, Flags: Public, Urgent
TimeToTargetScale = ObjectFields.End + 0x014, // Size: 1, Flags: Public, Urgent
TimeToTargetExtraScale = ObjectFields.End + 0x015, // Size: 1, Flags: Public, Urgent
SpellId = ObjectFields.End + 0x016, // Size: 1, Flags: Public
SpellForVisuals = ObjectFields.End + 0x017, // Size: 1, Flags: PUBLIC
SpellXSpellVisualId = ObjectFields.End + 0x018, // Size: 1, Flags: Dynamic
BoundsRadius2d = ObjectFields.End + 0x019, // Size: 1, Flags: Dynamic, Urgent
DecalPropertiesId = ObjectFields.End + 0x01A, // Size: 1, Flags: Public
CreatingEffectGuid = ObjectFields.End + 0x01B, // Size: 4, Flags: PUBLIC
End = ObjectFields.End + 0x01F
}
public enum SceneObjectFields
{
ScriptPackageId = ObjectFields.End + 0x000, // Size: 1, Flags: Public
RndSeedVal = ObjectFields.End + 0x001, // Size: 1, Flags: Public
Createdby = ObjectFields.End + 0x002, // Size: 4, Flags: Public
SceneType = ObjectFields.End + 0x006, // Size: 1, Flags: Public
End = ObjectFields.End + 0x007
}
public enum ConversationFields
{
LastLineEndTime = ObjectFields.End + 0x000, // Size: 1, Flags: DYNAMIC
End = ObjectFields.End + 0x001
}
public enum ConversationDynamicFields
{
Actors = 0x000, // Flags: Public
Lines = 0x001, // Flags: 0x100
End = 0x002
}
}
@@ -42,4 +42,13 @@ namespace Framework.Constants
//UPDATEFLAG_SCENEOBJECT = 0x10000, //UPDATEFLAG_SCENEOBJECT = 0x10000,
//UPDATEFLAG_SCENE_PENDING_INSTANCE = 0x20000 //UPDATEFLAG_SCENE_PENDING_INSTANCE = 0x20000
} }
public enum UpdateFieldFlag
{
None = 0,
Owner = 0x01,
PartyMember = 0x02,
UnitAll = 0x04,
Empath = 0x08
}
} }
+37 -44
View File
@@ -15,6 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using Security.Cryptography;
using System; using System;
using System.Security.Cryptography; using System.Security.Cryptography;
@@ -25,66 +26,54 @@ namespace Framework.Cryptography
static readonly byte[] ServerEncryptionKey = { 0x08, 0xF1, 0x95, 0x9F, 0x47, 0xE5, 0xD2, 0xDB, 0xA1, 0x3D, 0x77, 0x8F, 0x3F, 0x3E, 0xE7, 0x00 }; static readonly byte[] ServerEncryptionKey = { 0x08, 0xF1, 0x95, 0x9F, 0x47, 0xE5, 0xD2, 0xDB, 0xA1, 0x3D, 0x77, 0x8F, 0x3F, 0x3E, 0xE7, 0x00 };
static readonly byte[] ServerDecryptionKey = { 0x40, 0xAA, 0xD3, 0x92, 0x26, 0x71, 0x43, 0x47, 0x3A, 0x31, 0x08, 0xA6, 0xE7, 0xDC, 0x98, 0x2A }; static readonly byte[] ServerDecryptionKey = { 0x40, 0xAA, 0xD3, 0x92, 0x26, 0x71, 0x43, 0x47, 0x3A, 0x31, 0x08, 0xA6, 0xE7, 0xDC, 0x98, 0x2A };
public void Initialize(byte[] sessionKey) public void Initialize(byte[] key)
{ {
if (IsInitialized) if (IsInitialized)
throw new InvalidOperationException("PacketCrypt already initialized!"); throw new InvalidOperationException("PacketCrypt already initialized!");
SARC4Encrypt = new SARC4(); _clientDecrypt = new AuthenticatedAesCng();
SARC4Decrypt = new SARC4(); _clientDecrypt.Key = key;
_clientDecrypt.CngMode = CngChainingMode.Gcm;
_clientDecrypt.TagSize = 96;
var encryptSHA1 = new HMACSHA1(ServerEncryptionKey); _serverEncrypt = new AuthenticatedAesCng();
var decryptSHA1 = new HMACSHA1(ServerDecryptionKey); _serverEncrypt.Key = key;
_serverEncrypt.CngMode = CngChainingMode.Gcm;
SARC4Encrypt.PrepareKey(encryptSHA1.ComputeHash(sessionKey)); _serverEncrypt.TagSize = 96;
SARC4Decrypt.PrepareKey(decryptSHA1.ComputeHash(sessionKey));
var PacketEncryptionDummy = new byte[0x400];
var PacketDecryptionDummy = new byte[0x400];
SARC4Encrypt.ProcessBuffer(PacketEncryptionDummy, PacketEncryptionDummy.Length);
SARC4Decrypt.ProcessBuffer(PacketDecryptionDummy, PacketDecryptionDummy.Length);
IsInitialized = true; IsInitialized = true;
} }
public void Initialize(byte[] sessionKey, byte[] serverSeed, byte[] clientSeed) public bool Encrypt(ref byte[] data, int length, ref byte[] tag)
{ {
if (IsInitialized) if (IsInitialized)
throw new InvalidOperationException("PacketCrypt already initialized!"); {
_serverEncrypt.IV = BitConverter.GetBytes(_serverCounter).Combine(BitConverter.GetBytes(0x52565253));
SARC4Encrypt = new SARC4(); using (IAuthenticatedCryptoTransform encryptor = _serverEncrypt.CreateAuthenticatedEncryptor())
SARC4Decrypt = new SARC4(); {
data = encryptor.TransformFinalBlock(data, 0, length);
tag = encryptor.GetTag();
}
}
var encryptSHA1 = new HMACSHA1(serverSeed); ++_serverCounter;
var decryptSHA1 = new HMACSHA1(clientSeed); return true;
SARC4Encrypt.PrepareKey(encryptSHA1.ComputeHash(sessionKey));
SARC4Decrypt.PrepareKey(decryptSHA1.ComputeHash(sessionKey));
var PacketEncryptionDummy = new byte[0x400];
var PacketDecryptionDummy = new byte[0x400];
SARC4Encrypt.ProcessBuffer(PacketEncryptionDummy, PacketEncryptionDummy.Length);
SARC4Decrypt.ProcessBuffer(PacketDecryptionDummy, PacketDecryptionDummy.Length);
IsInitialized = true;
} }
public void Encrypt(byte[] data, int count) public bool Decrypt(ref byte[] data, int length, byte[] tag)
{ {
if (!IsInitialized) if (IsInitialized)
throw new InvalidOperationException("PacketCrypt not initialized!"); {
_clientDecrypt.IV = BitConverter.GetBytes(_clientCounter).Combine(BitConverter.GetBytes(0x544E4C43));
_clientDecrypt.Tag = tag;
SARC4Encrypt.ProcessBuffer(data, count); using (ICryptoTransform decryptor = _clientDecrypt.CreateDecryptor())
} data = decryptor.TransformFinalBlock(data, 0, length);
}
public void Decrypt(byte[] data, int count) ++_clientCounter;
{ return true;
if (!IsInitialized)
throw new InvalidOperationException("PacketCrypt not initialized!");
SARC4Decrypt.ProcessBuffer(data, count);
} }
public void Dispose() public void Dispose()
@@ -93,7 +82,11 @@ namespace Framework.Cryptography
} }
public bool IsInitialized { get; set; } public bool IsInitialized { get; set; }
SARC4 SARC4Encrypt;
SARC4 SARC4Decrypt; AuthenticatedAesCng _clientDecrypt;
AuthenticatedAesCng _serverEncrypt;
ulong _clientCounter;
ulong _serverCounter;
} }
} }
+17 -88
View File
@@ -15,103 +15,32 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using System; using System.Security.Cryptography;
using System.Numerics;
namespace Framework.Cryptography namespace Framework.Cryptography
{ {
public class RsaCrypt : IDisposable public class RsaCrypt
{ {
public RsaCrypt() public static RSACryptoServiceProvider RSA;
static RsaCrypt()
{ {
Dispose(); RSA = new RSACryptoServiceProvider(2048);
RSA.ImportParameters(RsaStore.RSAParameters);
} }
public void InitializeEncryption<T>(T p, T q, T dp, T dq, T iq, bool isBigEndian = false)
{
_p = p.ToBigInteger(isBigEndian);
_q = q.ToBigInteger(isBigEndian);
_dp = dp.ToBigInteger(isBigEndian);
_dq = dq.ToBigInteger(isBigEndian);
_iq = iq.ToBigInteger(isBigEndian);
if (_p.IsZero && _q.IsZero)
throw new InvalidOperationException("'0' isn't allowed for p or q");
else
_isEncryptionInitialized = true;
}
public void InitializeDecryption<T>(T e, T n, bool reverseBytes = false)
{
_e = e.ToBigInteger(reverseBytes);
_n = n.ToBigInteger(reverseBytes);
_isDecryptionInitialized = true;
}
public byte[] Encrypt<T>(T data, bool isBigEndian = false)
{
if (!_isEncryptionInitialized)
throw new InvalidOperationException("Encryption not initialized");
var bData = data.ToBigInteger(isBigEndian);
var m1 = BigInteger.ModPow(bData % _p, _dp, _p);
var m2 = BigInteger.ModPow(bData % _q, _dq, _q);
var h = (_iq * (m1 - m2)) % _p;
// Be sure to use the positive remainder
if (h.Sign == -1)
h = _p + h;
var m = m2 + h * _q;
return m.ToByteArray();
}
public byte[] Decrypt<T>(T data, bool isBigEndian = false)
{
if (!_isDecryptionInitialized)
throw new InvalidOperationException("Encryption not initialized");
var c = data.ToBigInteger(isBigEndian);
return BigInteger.ModPow(c, _e, _n).ToByteArray();
}
public void Dispose()
{
_e = 0;
_n = 0;
_p = 0;
_q = 0;
_dp = 0;
_dq = 0;
_iq = 0;
_isEncryptionInitialized = false;
_isDecryptionInitialized = false;
}
BigInteger _e;
BigInteger _n;
BigInteger _p;
BigInteger _q;
BigInteger _dp;
BigInteger _dq;
BigInteger _iq;
bool _isEncryptionInitialized;
bool _isDecryptionInitialized;
} }
public class RsaStore public class RsaStore
{ {
public static byte[] DP = { 0xE1, 0xA6, 0x22, 0xAB, 0xFF, 0x57, 0x83, 0x45, 0x3F, 0x93, 0x76, 0xC8, 0xFA, 0xD9, 0x17, 0xE1, 0x49, 0x73, 0xC2, 0x13, 0x28, 0x0B, 0x1F, 0xE2, 0x9A, 0xF4, 0x7F, 0x7C, 0x37, 0x56, 0xA1, 0xDF, 0x51, 0x97, 0x2F, 0x15, 0x10, 0x97, 0xCD, 0x2A, 0x40, 0x09, 0xFC, 0x0A, 0xC3, 0x3F, 0x88, 0x86, 0xA9, 0x51, 0x13, 0xE1, 0x76, 0xCF, 0xA8, 0x37, 0x9A, 0x91, 0x3B, 0xD0, 0x70, 0xA1, 0xD7, 0x03, 0x71, 0x59, 0x6C, 0xB3, 0x41, 0xB8, 0x32, 0x68, 0x56, 0xC8, 0xB8, 0xD1, 0xF9, 0x1D, 0x04, 0xC5, 0x13, 0xB5, 0x8E, 0x57, 0x73, 0x02, 0x97, 0x7B, 0x33, 0x60, 0x68, 0xA9, 0xC2, 0x40, 0x96, 0x3C, 0x57, 0x4E, 0x4F, 0xC0, 0xAB, 0x21, 0x5C, 0xBA, 0x7D, 0x65, 0xAA, 0x1B, 0xD6, 0x43, 0x06, 0xCE, 0x3E, 0x0C, 0xB9, 0xB2, 0x82, 0xB0, 0xC9, 0x54, 0x59, 0x32, 0xC5, 0x88, 0x08, 0x9C, 0x9B, 0xBF }; public static RSAParameters RSAParameters = new RSAParameters()
public static byte[] DQ = { 0xE3, 0xB1, 0xED, 0x52, 0xEF, 0xE6, 0x88, 0x40, 0x50, 0x89, 0x4C, 0x99, 0xE5, 0xF7, 0xED, 0x03, 0x1C, 0x54, 0x11, 0x24, 0x2F, 0x9D, 0xE8, 0xE6, 0x39, 0xFA, 0x19, 0xF4, 0x06, 0x55, 0x0B, 0x8B, 0x95, 0xC8, 0xB1, 0xE2, 0x7C, 0x75, 0x3B, 0x2A, 0x40, 0xC3, 0xE7, 0xE0, 0x25, 0x18, 0xBF, 0xB5, 0x03, 0x1B, 0x5A, 0x57, 0x92, 0x3C, 0x85, 0x7D, 0x7F, 0x43, 0x56, 0x1F, 0x1E, 0x80, 0xC3, 0xBA, 0xF0, 0x53, 0xD7, 0x6A, 0xD0, 0xF2, 0xDD, 0x9C, 0xC6, 0x53, 0xE7, 0xB4, 0xD3, 0x9D, 0xAB, 0xBF, 0xE0, 0x97, 0x50, 0x92, 0x23, 0xB9, 0xB7, 0xDC, 0xAA, 0xC4, 0x20, 0x93, 0x5A, 0xF5, 0xDE, 0x76, 0x28, 0x93, 0x91, 0x44, 0x1E, 0x4C, 0x15, 0x2F, 0x7F, 0x45, 0x3C, 0x3B, 0x7D, 0x36, 0x3B, 0x24, 0xC7, 0x8C, 0x65, 0x43, 0xAE, 0x65, 0x84, 0xBC, 0xF9, 0x76, 0x4E, 0x3C, 0x44, 0x05, 0xBC, 0xFA }; {
public static byte[] InverseQ = { 0x63, 0xC1, 0x14, 0x2B, 0x57, 0x0B, 0x8A, 0x3C, 0x27, 0xDB, 0x96, 0x82, 0x27, 0xEB, 0xF6, 0x45, 0x6D, 0x07, 0x50, 0xE8, 0x4A, 0xD4, 0xB6, 0x7A, 0x3C, 0x8B, 0x4D, 0x65, 0xF0, 0x50, 0x70, 0x84, 0x71, 0x2B, 0xC6, 0x6D, 0x28, 0x2D, 0x76, 0x38, 0x73, 0x93, 0xDB, 0x44, 0xD7, 0xC0, 0x7F, 0xD9, 0x57, 0x18, 0x28, 0x57, 0xF1, 0x13, 0x38, 0xA4, 0x91, 0x67, 0x1E, 0x13, 0x73, 0x55, 0xFC, 0x7B, 0xAF, 0x50, 0xFA, 0xFD, 0x16, 0x12, 0x6F, 0xA4, 0x95, 0x15, 0x9C, 0x07, 0x18, 0xA6, 0x46, 0xFD, 0xB3, 0xCF, 0xA5, 0x0E, 0x05, 0x30, 0xEC, 0x2C, 0xCD, 0x62, 0xDD, 0x6F, 0xB1, 0xFE, 0x6C, 0x05, 0x2F, 0x11, 0xA6, 0xA0, 0x98, 0xAC, 0x9B, 0x15, 0xF0, 0x04, 0xC4, 0x7B, 0x79, 0xAA, 0x51, 0x25, 0x2A, 0x84, 0x73, 0xE6, 0x77, 0x47, 0xA3, 0xEB, 0xCF, 0x6D, 0xC8, 0x96, 0x3A, 0x1B, 0x02, 0x52 }; Modulus = new byte[] { 0xee, 0xb3, 0xdc, 0xd4, 0xd3, 0xc3, 0xb4, 0x54, 0x51, 0xce, 0x66, 0x5b, 0xcb, 0x32, 0xb8, 0xf0, 0xf7, 0x92, 0x53, 0xc6, 0x19, 0xf2, 0x0c, 0x85, 0x2f, 0x8a, 0x26, 0xa9, 0x7a, 0x45, 0x9f, 0x60, 0xc4, 0xeb, 0xcd, 0xea, 0x7f, 0x8d, 0x59, 0xd8, 0x57, 0xb2, 0x60, 0x7b, 0x09, 0x4c, 0x9b, 0x68, 0xb8, 0xc7, 0xed, 0xef, 0x1e, 0x80, 0x0d, 0xe6, 0x6b, 0x37, 0x5b, 0x53, 0x90, 0xeb, 0x18, 0x13, 0x0d, 0x7f, 0x43, 0x64, 0x83, 0xda, 0x98, 0xe6, 0xac, 0xc2, 0x30, 0xa2, 0x82, 0xa5, 0xc6, 0xcb, 0xc7, 0xfb, 0x86, 0x9f, 0x9f, 0xa9, 0x02, 0x6a, 0x03, 0x49, 0xc5, 0x38, 0xfb, 0xc0, 0xc8, 0x55, 0xcc, 0xc0, 0xce, 0x25, 0x91, 0xbe, 0x85, 0xcf, 0xd1, 0xd1, 0x37, 0xce, 0xcc, 0x83, 0xd2, 0xea, 0x30, 0x80, 0x07, 0x7b, 0x80, 0x9f, 0x9d, 0x44, 0x54, 0x22, 0x29, 0xbe, 0x86, 0xda, 0xdb, 0x48, 0xc5, 0xa9, 0xf9, 0x13, 0x36, 0x95, 0x23, 0x76, 0xf1, 0x0e, 0xdc, 0x84, 0x0d, 0x94, 0x02, 0x12, 0xa8, 0x97, 0xf3, 0x3b, 0x14, 0xee, 0xaa, 0x6f, 0x98, 0x05, 0x27, 0x4e, 0x1f, 0xa3, 0x60, 0xa5, 0xa9, 0xda, 0xd8, 0x17, 0xdf, 0x33, 0xcb, 0xe2, 0x13, 0x54, 0x8b, 0x18, 0xb0, 0xca, 0xb9, 0xbb, 0x88, 0x64, 0x06, 0xdf, 0x75, 0xa6, 0xd7, 0x61, 0x00, 0xbb, 0xb0, 0x5a, 0x0e, 0x7a, 0xd4, 0x77, 0x08, 0x4d, 0x15, 0xe2, 0x10, 0x83, 0xb0, 0x04, 0xaa, 0x9e, 0x8b, 0x77, 0xa9, 0x06, 0x89, 0x5d, 0x08, 0x5d, 0x0f, 0xb8, 0x2e, 0x6b, 0xc1, 0xcb, 0x64, 0xcf, 0x6e, 0x5c, 0xdb, 0x4f, 0x58, 0x65, 0x08, 0x51, 0xfb, 0x0d, 0x48, 0x1a, 0x6f, 0xb6, 0x3d, 0x1f, 0x0b, 0xdd, 0xfe, 0x1b, 0x1d, 0xf0, 0xbf, 0xb0, 0x27, 0x6b, 0xf5, 0x8e, 0xbc, 0xc7, 0x40, 0x01, 0xff, 0xa7, 0x0b, 0x80, 0xd6, 0x5f },
public static byte[] P = { 0x7D, 0xBD, 0xB9, 0xE1, 0x2D, 0xAE, 0x42, 0x56, 0x6E, 0x2B, 0xE2, 0x89, 0xD9, 0xBB, 0x0C, 0x1F, 0x67, 0x28, 0xC1, 0x4D, 0x91, 0x3C, 0xAD, 0x5F, 0xF0, 0x43, 0x86, 0x5C, 0x27, 0xDC, 0x58, 0xB3, 0x0E, 0x75, 0x77, 0x78, 0x49, 0x35, 0xE7, 0xE7, 0xDF, 0xFD, 0x74, 0xAB, 0x4E, 0xFE, 0xD3, 0xAB, 0x6B, 0x96, 0xF7, 0x89, 0xB2, 0x5A, 0x6A, 0x25, 0x03, 0x5A, 0x92, 0x1A, 0xF1, 0xFC, 0x05, 0x4E, 0xCE, 0xDD, 0x37, 0xA4, 0x02, 0x53, 0x76, 0xCB, 0xC2, 0xD9, 0x63, 0xCB, 0x51, 0x94, 0xEC, 0x5C, 0x39, 0xCC, 0xB2, 0x17, 0x0C, 0xA3, 0x43, 0x9A, 0xD0, 0x83, 0x27, 0x67, 0x52, 0x64, 0x37, 0x0E, 0x38, 0xB7, 0x9B, 0xF4, 0x2D, 0xB8, 0x0F, 0x30, 0x72, 0xD3, 0x15, 0xF3, 0x2C, 0x39, 0x55, 0x72, 0x2C, 0x55, 0x80, 0x63, 0xA0, 0xA1, 0x6F, 0x28, 0xF3, 0xF3, 0x5A, 0x6F, 0x68, 0x59, 0xB3, 0xF3 }; Exponent = new byte[] { 0x01, 0x00, 0x01 },
public static byte[] Q = { 0x0B, 0x1A, 0x13, 0x07, 0x12, 0xEF, 0xDD, 0x97, 0x01, 0x9A, 0x21, 0x7D, 0xFA, 0xA3, 0xB7, 0xE2, 0x39, 0x2E, 0x04, 0x92, 0x96, 0x45, 0x2A, 0xEB, 0x57, 0x03, 0xAC, 0xB1, 0x83, 0xCD, 0x25, 0x4F, 0x2C, 0xA9, 0xA1, 0x54, 0x26, 0x54, 0xCF, 0xE6, 0x1B, 0x53, 0x51, 0x3A, 0xC1, 0x15, 0xF4, 0x17, 0xBB, 0x17, 0x1F, 0x37, 0x66, 0x36, 0x1A, 0xD4, 0xB1, 0x5B, 0x49, 0xA8, 0xF1, 0x02, 0xB0, 0x42, 0xA9, 0x66, 0xA0, 0xE2, 0x52, 0x2C, 0x8C, 0x89, 0xA2, 0xDD, 0xA6, 0xF1, 0xA3, 0xDF, 0xB6, 0x80, 0x63, 0xB8, 0x10, 0xDA, 0xDE, 0x84, 0x56, 0xFA, 0xFB, 0x72, 0x65, 0x5E, 0xA3, 0x9C, 0x78, 0x65, 0xD0, 0x73, 0x07, 0x34, 0x1D, 0xE1, 0x4D, 0x77, 0xE8, 0x00, 0x0F, 0x80, 0x1C, 0x5A, 0x21, 0x55, 0x0A, 0x8C, 0xF4, 0x93, 0xF5, 0xF8, 0x40, 0xF2, 0x40, 0xEA, 0x52, 0x12, 0x40, 0xF0, 0xBF, 0xFA }; P = new byte[] { 0xf3, 0xb3, 0x59, 0x68, 0x6f, 0x5a, 0xf3, 0xf3, 0x28, 0x6f, 0xa1, 0xa0, 0x63, 0x80, 0x55, 0x2c, 0x72, 0x55, 0x39, 0x2c, 0xf3, 0x15, 0xd3, 0x72, 0x30, 0x0f, 0xb8, 0x2d, 0xf4, 0x9b, 0xb7, 0x38, 0x0e, 0x37, 0x64, 0x52, 0x67, 0x27, 0x83, 0xd0, 0x9a, 0x43, 0xa3, 0x0c, 0x17, 0xb2, 0xcc, 0x39, 0x5c, 0xec, 0x94, 0x51, 0xcb, 0x63, 0xd9, 0xc2, 0xcb, 0x76, 0x53, 0x02, 0xa4, 0x37, 0xdd, 0xce, 0x4e, 0x05, 0xfc, 0xf1, 0x1a, 0x92, 0x5a, 0x03, 0x25, 0x6a, 0x5a, 0xb2, 0x89, 0xf7, 0x96, 0x6b, 0xab, 0xd3, 0xfe, 0x4e, 0xab, 0x74, 0xfd, 0xdf, 0xe7, 0xe7, 0x35, 0x49, 0x78, 0x77, 0x75, 0x0e, 0xb3, 0x58, 0xdc, 0x27, 0x5c, 0x86, 0x43, 0xf0, 0x5f, 0xad, 0x3c, 0x91, 0x4d, 0xc1, 0x28, 0x67, 0x1f, 0x0c, 0xbb, 0xd9, 0x89, 0xe2, 0x2b, 0x6e, 0x56, 0x42, 0xae, 0x2d, 0xe1, 0xb9, 0xbd, 0x7d },
public static byte[] WherePacketHmac = { 0x2C, 0x1F, 0x1D, 0x80, 0xC3, 0x8C, 0x23, 0x64, 0xDA, 0x90, 0xCA, 0x8E, 0x2C, 0xFC, 0x0C, 0xCE, 0x09, 0xD3, 0x62, 0xF9, 0xF3, 0x8B, 0xBE, 0x9F, 0x19, 0xEF, 0x58, 0xA1, 0x1C, 0x34, 0x14, 0x41, 0x3F, 0x23, 0xFD, 0xD3, 0xE8, 0x14, 0xEC, 0x2A, 0xFD, 0x4F, 0x95, 0xBA, 0x30, 0x7E, 0x56, 0x5D, 0x83, 0x95, 0x81, 0x69, 0xB0, 0x5A, 0xB4, 0x9D, 0xA8, 0x55, 0xFF, 0xFC, 0xEE, 0x58, 0x0A, 0x2F }; Q = new byte[] { 0xfa, 0xbf, 0xf0, 0x40, 0x12, 0x52, 0xea, 0x40, 0xf2, 0x40, 0xf8, 0xf5, 0x93, 0xf4, 0x8c, 0x0a, 0x55, 0x21, 0x5a, 0x1c, 0x80, 0x0f, 0x00, 0xe8, 0x77, 0x4d, 0xe1, 0x1d, 0x34, 0x07, 0x73, 0xd0, 0x65, 0x78, 0x9c, 0xa3, 0x5e, 0x65, 0x72, 0xfb, 0xfa, 0x56, 0x84, 0xde, 0xda, 0x10, 0xb8, 0x63, 0x80, 0xb6, 0xdf, 0xa3, 0xf1, 0xa6, 0xdd, 0xa2, 0x89, 0x8c, 0x2c, 0x52, 0xe2, 0xa0, 0x66, 0xa9, 0x42, 0xb0, 0x02, 0xf1, 0xa8, 0x49, 0x5b, 0xb1, 0xd4, 0x1a, 0x36, 0x66, 0x37, 0x1f, 0x17, 0xbb, 0x17, 0xf4, 0x15, 0xc1, 0x3a, 0x51, 0x53, 0x1b, 0xe6, 0xcf, 0x54, 0x26, 0x54, 0xa1, 0xa9, 0x2c, 0x4f, 0x25, 0xcd, 0x83, 0xb1, 0xac, 0x03, 0x57, 0xeb, 0x2a, 0x45, 0x96, 0x92, 0x04, 0x2e, 0x39, 0xe2, 0xb7, 0xa3, 0xfa, 0x7d, 0x21, 0x9a, 0x01, 0x97, 0xdd, 0xef, 0x12, 0x07, 0x13, 0x1a, 0x0b },
DP = new byte[] { 0xbf, 0x9b, 0x9c, 0x08, 0x88, 0xc5, 0x32, 0x59, 0x54, 0xc9, 0xb0, 0x82, 0xb2, 0xb9, 0x0c, 0x3e, 0xce, 0x06, 0x43, 0xd6, 0x1b, 0xaa, 0x65, 0x7d, 0xba, 0x5c, 0x21, 0xab, 0xc0, 0x4f, 0x4e, 0x57, 0x3c, 0x96, 0x40, 0xc2, 0xa9, 0x68, 0x60, 0x33, 0x7b, 0x97, 0x02, 0x73, 0x57, 0x8e, 0xb5, 0x13, 0xc5, 0x04, 0x1d, 0xf9, 0xd1, 0xb8, 0xc8, 0x56, 0x68, 0x32, 0xb8, 0x41, 0xb3, 0x6c, 0x59, 0x71, 0x03, 0xd7, 0xa1, 0x70, 0xd0, 0x3b, 0x91, 0x9a, 0x37, 0xa8, 0xcf, 0x76, 0xe1, 0x13, 0x51, 0xa9, 0x86, 0x88, 0x3f, 0xc3, 0x0a, 0xfc, 0x09, 0x40, 0x2a, 0xcd, 0x97, 0x10, 0x15, 0x2f, 0x97, 0x51, 0xdf, 0xa1, 0x56, 0x37, 0x7c, 0x7f, 0xf4, 0x9a, 0xe2, 0x1f, 0x0b, 0x28, 0x13, 0xc2, 0x73, 0x49, 0xe1, 0x17, 0xd9, 0xfa, 0xc8, 0x76, 0x93, 0x3f, 0x45, 0x83, 0x57, 0xff, 0xab, 0x22, 0xa6, 0xe1 },
DQ = new byte[] { 0xfa, 0xbc, 0x05, 0x44, 0x3c, 0x4e, 0x76, 0xf9, 0xbc, 0x84, 0x65, 0xae, 0x43, 0x65, 0x8c, 0xc7, 0x24, 0x3b, 0x36, 0x7d, 0x3b, 0x3c, 0x45, 0x7f, 0x2f, 0x15, 0x4c, 0x1e, 0x44, 0x91, 0x93, 0x28, 0x76, 0xde, 0xf5, 0x5a, 0x93, 0x20, 0xc4, 0xaa, 0xdc, 0xb7, 0xb9, 0x23, 0x92, 0x50, 0x97, 0xe0, 0xbf, 0xab, 0x9d, 0xd3, 0xb4, 0xe7, 0x53, 0xc6, 0x9c, 0xdd, 0xf2, 0xd0, 0x6a, 0xd7, 0x53, 0xf0, 0xba, 0xc3, 0x80, 0x1e, 0x1f, 0x56, 0x43, 0x7f, 0x7d, 0x85, 0x3c, 0x92, 0x57, 0x5a, 0x1b, 0x03, 0xb5, 0xbf, 0x18, 0x25, 0xe0, 0xe7, 0xc3, 0x40, 0x2a, 0x3b, 0x75, 0x7c, 0xe2, 0xb1, 0xc8, 0x95, 0x8b, 0x0b, 0x55, 0x06, 0xf4, 0x19, 0xfa, 0x39, 0xe6, 0xe8, 0x9d, 0x2f, 0x24, 0x11, 0x54, 0x1c, 0x03, 0xed, 0xf7, 0xe5, 0x99, 0x4c, 0x89, 0x50, 0x40, 0x88, 0xe6, 0xef, 0x52, 0xed, 0xb1, 0xe3 },
InverseQ = new byte[] { 0x52, 0x02, 0x1b, 0x3a, 0x96, 0xc8, 0x6d, 0xcf, 0xeb, 0xa3, 0x47, 0x77, 0xe6, 0x73, 0x84, 0x2a, 0x25, 0x51, 0xaa, 0x79, 0x7b, 0xc4, 0x04, 0xf0, 0x15, 0x9b, 0xac, 0x98, 0xa0, 0xa6, 0x11, 0x2f, 0x05, 0x6c, 0xfe, 0xb1, 0x6f, 0xdd, 0x62, 0xcd, 0x2c, 0xec, 0x30, 0x05, 0x0e, 0xa5, 0xcf, 0xb3, 0xfd, 0x46, 0xa6, 0x18, 0x07, 0x9c, 0x15, 0x95, 0xa4, 0x6f, 0x12, 0x16, 0xfd, 0xfa, 0x50, 0xaf, 0x7b, 0xfc, 0x55, 0x73, 0x13, 0x1e, 0x67, 0x91, 0xa4, 0x38, 0x13, 0xf1, 0x57, 0x28, 0x18, 0x57, 0xd9, 0x7f, 0xc0, 0xd7, 0x44, 0xdb, 0x93, 0x73, 0x38, 0x76, 0x2d, 0x28, 0x6d, 0xc6, 0x2b, 0x71, 0x84, 0x70, 0x50, 0xf0, 0x65, 0x4d, 0x8b, 0x3c, 0x7a, 0xb6, 0xd4, 0x4a, 0xe8, 0x50, 0x07, 0x6d, 0x45, 0xf6, 0xeb, 0x27, 0x82, 0x96, 0xdb, 0x27, 0x3c, 0x8a, 0x0b, 0x57, 0x2b, 0x14, 0xc1, 0x63 },
D = new byte[] { 0x22, 0x9a, 0xe6, 0xaf, 0xe0, 0x07, 0x66, 0x34, 0x37, 0x2b, 0xe2, 0x00, 0xfa, 0xc3, 0x5e, 0xb6, 0x68, 0x5d, 0xc9, 0x51, 0x55, 0xdf, 0x96, 0x5b, 0x14, 0x9a, 0x45, 0xa2, 0x9a, 0x3c, 0x4f, 0xaf, 0xba, 0xbc, 0xa8, 0xbc, 0x8f, 0x43, 0x51, 0xbc, 0x20, 0x72, 0x96, 0xb4, 0x1f, 0x94, 0x00, 0x8f, 0xbd, 0x02, 0x17, 0x07, 0x6c, 0x77, 0x8a, 0x0c, 0x56, 0x8c, 0xce, 0xeb, 0x9d, 0x7d, 0xc7, 0x9e, 0xb3, 0x7d, 0x38, 0xaa, 0xf0, 0xc6, 0x97, 0x16, 0x12, 0x03, 0x91, 0x03, 0x6e, 0x47, 0x54, 0x3b, 0xa4, 0xc1, 0x5d, 0x31, 0xf4, 0xf6, 0x8e, 0x88, 0x09, 0xf3, 0xfe, 0xe8, 0x94, 0xee, 0xcc, 0xdc, 0x4b, 0x73, 0xc4, 0x2f, 0x04, 0x23, 0x07, 0xc9, 0x2a, 0x14, 0xd7, 0xaf, 0x5e, 0x4c, 0xda, 0x1d, 0xe3, 0x6c, 0x1c, 0x29, 0x96, 0x6b, 0x0d, 0x64, 0xa3, 0x81, 0xd4, 0x65, 0x6f, 0xad, 0x78, 0xce, 0x9b, 0x52, 0xad, 0x39, 0x9e, 0x02, 0x4d, 0x33, 0x34, 0x5a, 0xb3, 0xda, 0x2d, 0x50, 0xd3, 0xf5, 0xac, 0x7c, 0xa7, 0x29, 0x23, 0x98, 0x5c, 0x35, 0xea, 0xf1, 0x8f, 0x8f, 0xf4, 0x79, 0x0e, 0x4c, 0xbd, 0x56, 0x96, 0x9b, 0xb5, 0xf6, 0x4e, 0xbb, 0xf0, 0x04, 0x5b, 0x6e, 0x7d, 0x5c, 0x31, 0x22, 0x42, 0x04, 0xeb, 0x07, 0x81, 0x20, 0xf9, 0x2e, 0x06, 0x26, 0x31, 0xea, 0x03, 0x33, 0xd9, 0x06, 0x63, 0x32, 0xff, 0x18, 0x65, 0x0c, 0xae, 0x28, 0x31, 0x77, 0x9f, 0xa9, 0x74, 0x9c, 0x7c, 0x3e, 0x30, 0xd1, 0x1c, 0x6e, 0xb8, 0x21, 0x6b, 0xea, 0x5c, 0x4b, 0x3d, 0x9c, 0xf4, 0x4b, 0x7e, 0x41, 0x2b, 0x59, 0x08, 0x5a, 0x62, 0x24, 0xba, 0xff, 0xbd, 0x79, 0x0b, 0x88, 0xe0, 0x7a, 0xf5, 0x0b, 0x25, 0x70, 0x72, 0x1e, 0x1f, 0x91, 0xfb, 0xeb, 0xa7, 0xce, 0x31, 0xf2, 0xdb, 0xc0, 0x16, 0x79 },
};
} }
} }
@@ -21,7 +21,7 @@ namespace Framework.Database
{ {
public override void PreparedStatements() public override void PreparedStatements()
{ {
const string SelectItemInstanceContent = "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyType, ii.randomPropertyId, " + const string SelectItemInstanceContent = "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomBonusListId, " +
"ii.durability, ii.playedTime, ii.text, ii.upgradeId, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.context, ii.bonusListIDs, " + "ii.durability, ii.playedTime, ii.text, ii.upgradeId, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.context, ii.bonusListIDs, " +
"iit.itemModifiedAppearanceAllSpecs, iit.itemModifiedAppearanceSpec1, iit.itemModifiedAppearanceSpec2, iit.itemModifiedAppearanceSpec3, iit.itemModifiedAppearanceSpec4, " + "iit.itemModifiedAppearanceAllSpecs, iit.itemModifiedAppearanceSpec1, iit.itemModifiedAppearanceSpec2, iit.itemModifiedAppearanceSpec3, iit.itemModifiedAppearanceSpec4, " +
"iit.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, " + "iit.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, " +
@@ -168,8 +168,8 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1"); PrepareStatement(CharStatements.DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1");
PrepareStatement(CharStatements.INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)"); PrepareStatement(CharStatements.INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)");
PrepareStatement(CharStatements.REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)"); PrepareStatement(CharStatements.REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)");
PrepareStatement(CharStatements.REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyType, randomPropertyId, durability, playedTime, text, upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, text, upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyType = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ?, upgradeId = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?"); PrepareStatement(CharStatements.UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomBonusListId = ?, durability = ?, playedTime = ?, text = ?, upgradeId = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?");
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ?, upgradeId = ? WHERE guid = ?"); PrepareStatement(CharStatements.UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ?, upgradeId = ? WHERE guid = ?");
PrepareStatement(CharStatements.DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?"); PrepareStatement(CharStatements.DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?");
PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?"); PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?");
@@ -625,8 +625,8 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_CHAR_FISHINGSTEPS, "DELETE FROM character_fishingsteps WHERE guid = ?"); PrepareStatement(CharStatements.DEL_CHAR_FISHINGSTEPS, "DELETE FROM character_fishingsteps WHERE guid = ?");
// Void Storage // Void Storage
PrepareStatement(CharStatements.SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomPropertyType, randomProperty, suffixFactor, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?"); PrepareStatement(CharStatements.SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?");
PrepareStatement(CharStatements.REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomPropertyType, randomProperty, suffixFactor, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, "DELETE FROM character_void_storage WHERE playerGuid = ?"); PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, "DELETE FROM character_void_storage WHERE playerGuid = ?");
PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM character_void_storage WHERE slot = ? AND playerGuid = ?"); PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM character_void_storage WHERE slot = ? AND playerGuid = ?");
@@ -643,10 +643,10 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_GUILD_FINDER_GUILD_SETTINGS, "DELETE FROM guild_finder_guild_settings WHERE guildId = ?"); PrepareStatement(CharStatements.DEL_GUILD_FINDER_GUILD_SETTINGS, "DELETE FROM guild_finder_guild_settings WHERE guildId = ?");
// Items that hold loot or money // Items that hold loot or money
PrepareStatement(CharStatements.SEL_ITEMCONTAINER_ITEMS, "SELECT item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_type, rnd_prop, rnd_suffix, context, bonus_list_ids FROM item_loot_items WHERE container_id = ?"); PrepareStatement(CharStatements.SEL_ITEMCONTAINER_ITEMS, "SELECT item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_bonus, context, bonus_list_ids FROM item_loot_items WHERE container_id = ?");
PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEMS, "DELETE FROM item_loot_items WHERE container_id = ?"); PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEMS, "DELETE FROM item_loot_items WHERE container_id = ?");
PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEM, "DELETE FROM item_loot_items WHERE container_id = ? AND item_id = ?"); PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEM, "DELETE FROM item_loot_items WHERE container_id = ? AND item_id = ?");
PrepareStatement(CharStatements.INS_ITEMCONTAINER_ITEMS, "INSERT INTO item_loot_items (container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_type, rnd_prop, rnd_suffix, context, bonus_list_ids) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.INS_ITEMCONTAINER_ITEMS, "INSERT INTO item_loot_items (container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_bonus, context, bonus_list_ids) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.SEL_ITEMCONTAINER_MONEY, "SELECT money FROM item_loot_money WHERE container_id = ?"); PrepareStatement(CharStatements.SEL_ITEMCONTAINER_MONEY, "SELECT money FROM item_loot_money WHERE container_id = ?");
PrepareStatement(CharStatements.DEL_ITEMCONTAINER_MONEY, "DELETE FROM item_loot_money WHERE container_id = ?"); PrepareStatement(CharStatements.DEL_ITEMCONTAINER_MONEY, "DELETE FROM item_loot_money WHERE container_id = ?");
PrepareStatement(CharStatements.INS_ITEMCONTAINER_MONEY, "INSERT INTO item_loot_money (container_id, money) VALUES (?, ?)"); PrepareStatement(CharStatements.INS_ITEMCONTAINER_MONEY, "INSERT INTO item_loot_money (container_id, money) VALUES (?, ?)");
@@ -23,11 +23,11 @@ namespace Framework.Database
{ {
// Achievement.db2 // Achievement.db2
PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT, "SELECT Description, Title, Reward, ID, InstanceID, Faction, Supercedes, Category, MinimumCriteria, " + PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT, "SELECT Description, Title, Reward, ID, InstanceID, Faction, Supercedes, Category, MinimumCriteria, " +
"Points, Flags, UiOrder, IconFileID, CriteriaTree, SharesCriteria FROM achievement ORDER BY ID DESC"); "Points, Flags, UiOrder, IconFileID, RewardItemID, CriteriaTree, SharesCriteria FROM achievement ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT_LOCALE, "SELECT ID, Description_lang, Title_lang, Reward_lang FROM achievement_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT_LOCALE, "SELECT ID, Description_lang, Title_lang, Reward_lang FROM achievement_locale WHERE locale = ?");
// AnimationData.db2 // AnimationData.db2
PrepareStatement(HotfixStatements.SEL_ANIMATION_DATA, "SELECT ID, Fallback, BehaviorTier, BehaviorID, Flags1, Flags2 FROM animation_data ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ANIMATION_DATA, "SELECT ID, BehaviorID, BehaviorTier, Fallback, Flags1, Flags2 FROM animation_data ORDER BY ID DESC");
// AnimKit.db2 // AnimKit.db2
PrepareStatement(HotfixStatements.SEL_ANIM_KIT, "SELECT ID, OneShotDuration, OneShotStopAnimKitID, LowDefAnimKitID FROM anim_kit ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ANIM_KIT, "SELECT ID, OneShotDuration, OneShotStopAnimKitID, LowDefAnimKitID FROM anim_kit ORDER BY ID DESC");
@@ -58,7 +58,7 @@ namespace Framework.Database
// ArtifactAppearance.db2 // ArtifactAppearance.db2
PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE, "SELECT Name, ID, ArtifactAppearanceSetID, DisplayIndex, UnlockPlayerConditionID, " + PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE, "SELECT Name, ID, ArtifactAppearanceSetID, DisplayIndex, UnlockPlayerConditionID, " +
"ItemAppearanceModifierID, UiSwatchColor, UiModelSaturation, UiModelOpacity, OverrideShapeshiftFormID, OverrideShapeshiftDisplayID, " + "ItemAppearanceModifierID, UiSwatchColor, UiModelSaturation, UiModelOpacity, OverrideShapeshiftFormID, OverrideShapeshiftDisplayID, " +
"UiItemAppearanceID, UiAltItemAppearanceID, Flags, UiCameraID FROM artifact_appearance ORDER BY ID DESC"); "UiItemAppearanceID, UiAltItemAppearanceID, Flags, UiCameraID, UsablePlayerConditionID FROM artifact_appearance ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE_LOCALE, "SELECT ID, Name_lang FROM artifact_appearance_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_ARTIFACT_APPEARANCE_LOCALE, "SELECT ID, Name_lang FROM artifact_appearance_locale WHERE locale = ?");
// ArtifactAppearanceSet.db2 // ArtifactAppearanceSet.db2
@@ -170,8 +170,9 @@ namespace Framework.Database
// ChrClasses.db2 // ChrClasses.db2
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, ID, CreateScreenFileDataID, " + PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, ID, CreateScreenFileDataID, " +
"SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, StartingLevel, Flags, CinematicSequenceID, DefaultSpec, PrimaryStatPriority, " + "SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, StartingLevel, SpellTextureBlobFileDataID, Flags, CinematicSequenceID, " +
"DisplayPower, RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet FROM chr_classes ORDER BY ID DESC"); "DefaultSpec, PrimaryStatPriority, DisplayPower, RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet" +
" FROM chr_classes ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang FROM chr_classes_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang FROM chr_classes_locale WHERE locale = ?");
// ChrClassesXPowerTypes.db2 // ChrClassesXPowerTypes.db2
@@ -206,7 +207,10 @@ namespace Framework.Database
" FROM cinematic_sequences ORDER BY ID DESC"); " FROM cinematic_sequences ORDER BY ID DESC");
// ContentTuning.db2 // ContentTuning.db2
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, MinLevel, MaxLevel, Flags, ExpectedStatModID, DifficultyESMID FROM content_tuning" + PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, MinLevel, MaxLevel, Flags, ExpansionID FROM content_tuning ORDER BY ID DESC");
// ContentTuningXExpected.db2
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, ContentTuningID FROM content_tuning_x_expected" +
" ORDER BY ID DESC"); " ORDER BY ID DESC");
// ConversationLine.db2 // ConversationLine.db2
@@ -235,7 +239,8 @@ namespace Framework.Database
"FootprintTextureID, FootprintTextureLength, FootprintTextureWidth, FootprintParticleScale, FoleyMaterialID, FootstepCameraEffectID, " + "FootprintTextureID, FootprintTextureLength, FootprintTextureWidth, FootprintParticleScale, FoleyMaterialID, FootstepCameraEffectID, " +
"DeathThudCameraEffectID, SoundID, SizeClass, CollisionWidth, CollisionHeight, WorldEffectScale, CreatureGeosetDataID, HoverHeight, " + "DeathThudCameraEffectID, SoundID, SizeClass, CollisionWidth, CollisionHeight, WorldEffectScale, CreatureGeosetDataID, HoverHeight, " +
"AttachedEffectScale, ModelScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, MountHeight, OverrideLootEffectScale, " + "AttachedEffectScale, ModelScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, MountHeight, OverrideLootEffectScale, " +
"OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale FROM creature_model_data ORDER BY ID DESC"); "OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale, Unknown820_1, Unknown820_2, Unknown820_31, Unknown820_32" +
" FROM creature_model_data ORDER BY ID DESC");
// CreatureType.db2 // CreatureType.db2
PrepareStatement(HotfixStatements.SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC");
@@ -252,7 +257,7 @@ namespace Framework.Database
// CurrencyTypes.db2 // CurrencyTypes.db2
PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " + PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " +
"MaxEarnablePerWeek, Flags, Quality, FactionID FROM currency_types ORDER BY ID DESC"); "MaxEarnablePerWeek, Flags, Quality, FactionID, ItemGroupSoundsID FROM currency_types ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES_LOCALE, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES_LOCALE, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?");
// Curve.db2 // Curve.db2
@@ -275,8 +280,8 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_DIFFICULTY_LOCALE, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_DIFFICULTY_LOCALE, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?");
// DungeonEncounter.db2 // DungeonEncounter.db2
PrepareStatement(HotfixStatements.SEL_DUNGEON_ENCOUNTER, "SELECT Name, ID, MapID, DifficultyID, OrderIndex, Bit, CreatureDisplayID, Flags, SpellIconFileID" + PrepareStatement(HotfixStatements.SEL_DUNGEON_ENCOUNTER, "SELECT Name, ID, MapID, DifficultyID, OrderIndex, CompleteWorldStateID, Bit, CreatureDisplayID, " +
" FROM dungeon_encounter ORDER BY ID DESC"); "Flags, SpellIconFileID, Faction FROM dungeon_encounter ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_DUNGEON_ENCOUNTER_LOCALE, "SELECT ID, Name_lang FROM dungeon_encounter_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_DUNGEON_ENCOUNTER_LOCALE, "SELECT ID, Name_lang FROM dungeon_encounter_locale WHERE locale = ?");
// DurabilityCosts.db2 // DurabilityCosts.db2
@@ -392,7 +397,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_GLYPH_BINDABLE_SPELL, "SELECT ID, SpellID, GlyphPropertiesID FROM glyph_bindable_spell ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_GLYPH_BINDABLE_SPELL, "SELECT ID, SpellID, GlyphPropertiesID FROM glyph_bindable_spell ORDER BY ID DESC");
// GlyphProperties.db2 // GlyphProperties.db2
PrepareStatement(HotfixStatements.SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, SpellIconID, GlyphType, GlyphExclusiveCategoryID FROM glyph_properties" + PrepareStatement(HotfixStatements.SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, GlyphType, GlyphExclusiveCategoryID, SpellIconFileDataID FROM glyph_properties" +
" ORDER BY ID DESC"); " ORDER BY ID DESC");
// GlyphRequiredSpec.db2 // GlyphRequiredSpec.db2
@@ -412,16 +417,17 @@ namespace Framework.Database
// Heirloom.db2 // Heirloom.db2
PrepareStatement(HotfixStatements.SEL_HEIRLOOM, "SELECT SourceText, ID, ItemID, LegacyUpgradedItemID, StaticUpgradedItemID, SourceTypeEnum, Flags, " + PrepareStatement(HotfixStatements.SEL_HEIRLOOM, "SELECT SourceText, ID, ItemID, LegacyUpgradedItemID, StaticUpgradedItemID, SourceTypeEnum, Flags, " +
"LegacyItemID, UpgradeItemID1, UpgradeItemID2, UpgradeItemID3, UpgradeItemBonusListID1, UpgradeItemBonusListID2, UpgradeItemBonusListID3" + "LegacyItemID, UpgradeItemID1, UpgradeItemID2, UpgradeItemID3, UpgradeItemID4, UpgradeItemBonusListID1, UpgradeItemBonusListID2, " +
" FROM heirloom ORDER BY ID DESC"); "UpgradeItemBonusListID3, UpgradeItemBonusListID4 FROM heirloom ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_HEIRLOOM_LOCALE, "SELECT ID, SourceText_lang FROM heirloom_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_HEIRLOOM_LOCALE, "SELECT ID, SourceText_lang FROM heirloom_locale WHERE locale = ?");
// Holidays.db2 // Holidays.db2
PrepareStatement(HotfixStatements.SEL_HOLIDAYS, "SELECT ID, Region, Looping, HolidayNameID, HolidayDescriptionID, Priority, CalendarFilterType, Flags, " + PrepareStatement(HotfixStatements.SEL_HOLIDAYS, "SELECT ID, Region, Looping, HolidayNameID, HolidayDescriptionID, Priority, CalendarFilterType, Flags, " +
"Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, Duration10, Date1, Date2, Date3, Date4, " + "Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, Duration10, Date1, Date2, Date3, Date4, " +
"Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, Date16, CalendarFlags1, CalendarFlags2, CalendarFlags3, " + "Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, Date16, Date17, Date18, Date19, Date20, Date21, Date22, " +
"CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, TextureFileDataID1, " + "Date23, Date24, Date25, Date26, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, " +
"TextureFileDataID2, TextureFileDataID3 FROM holidays ORDER BY ID DESC"); "CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3 FROM holidays" +
" ORDER BY ID DESC");
// ImportPriceArmor.db2 // ImportPriceArmor.db2
PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothModifier, LeatherModifier, ChainModifier, PlateModifier FROM import_price_armor" + PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothModifier, LeatherModifier, ChainModifier, PlateModifier FROM import_price_armor" +
@@ -471,7 +477,7 @@ namespace Framework.Database
"ParentItemBonusTreeID FROM item_bonus_tree_node ORDER BY ID DESC"); "ParentItemBonusTreeID FROM item_bonus_tree_node ORDER BY ID DESC");
// ItemChildEquipment.db2 // ItemChildEquipment.db2
PrepareStatement(HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ChildItemID, ChildItemEquipSlot, ParentItemID FROM item_child_equipment" + PrepareStatement(HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ParentItemID, ChildItemID, ChildItemEquipSlot FROM item_child_equipment" +
" ORDER BY ID DESC"); " ORDER BY ID DESC");
// ItemClass.db2 // ItemClass.db2
@@ -516,7 +522,8 @@ namespace Framework.Database
" FROM item_extended_cost ORDER BY ID DESC"); " FROM item_extended_cost ORDER BY ID DESC");
// ItemLevelSelector.db2 // ItemLevelSelector.db2
PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR, "SELECT ID, MinItemLevel, ItemLevelSelectorQualitySetID FROM item_level_selector ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR, "SELECT ID, MinItemLevel, ItemLevelSelectorQualitySetID, AzeriteUnlockMappingSet" +
" FROM item_level_selector ORDER BY ID DESC");
// ItemLevelSelectorQuality.db2 // ItemLevelSelectorQuality.db2
PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR_QUALITY, "SELECT ID, QualityItemBonusListID, Quality, ParentILSQualitySetID" + PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR_QUALITY, "SELECT ID, QualityItemBonusListID, Quality, ParentILSQualitySetID" +
@@ -540,16 +547,6 @@ namespace Framework.Database
// ItemPriceBase.db2 // ItemPriceBase.db2
PrepareStatement(HotfixStatements.SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, Armor, Weapon FROM item_price_base ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, Armor, Weapon FROM item_price_base ORDER BY ID DESC");
// ItemRandomProperties.db2
PrepareStatement(HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, Enchantment5" +
" FROM item_random_properties ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES_LOCALE, "SELECT ID, Name_lang FROM item_random_properties_locale WHERE locale = ?");
// ItemRandomSuffix.db2
PrepareStatement(HotfixStatements.SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, Enchantment5, " +
"AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_ITEM_RANDOM_SUFFIX_LOCALE, "SELECT ID, Name_lang FROM item_random_suffix_locale WHERE locale = ?");
// ItemSearchName.db2 // ItemSearchName.db2
PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME, "SELECT AllowableRace, Display, ID, OverallQualityID, ExpansionID, MinFactionID, MinReputation, " + PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME, "SELECT AllowableRace, Display, ID, OverallQualityID, ExpansionID, MinFactionID, MinReputation, " +
"AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4" + "AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4" +
@@ -573,12 +570,12 @@ namespace Framework.Database
"StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " + "StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " +
"MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " + "MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " +
"FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " + "FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " +
"TotemCategoryID, InstanceBound, ZoneBound, ItemSet, ItemRandomSuffixGroupID, RandomSelect, LockID, StartQuestID, PageID, ItemDelay, " + "TotemCategoryID, InstanceBound, ZoneBound, ItemSet, LockID, StartQuestID, PageID, ItemDelay, ScalingStatDistributionID, MinFactionID, " +
"ScalingStatDistributionID, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, " + "RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, " +
"SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, " + "SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, " +
"StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, " + "StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, " +
"StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, " + "StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, " +
"MinReputation, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse ORDER BY ID DESC"); "RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE_LOCALE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" + PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE_LOCALE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" +
" FROM item_sparse_locale WHERE locale = ?"); " FROM item_sparse_locale WHERE locale = ?");
@@ -633,13 +630,13 @@ namespace Framework.Database
// Map.db2 // Map.db2
PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, " + PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, " +
"CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " + "CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " +
"TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, Flags1, Flags2 FROM map ORDER BY ID DESC"); "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2 FROM map ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_MAP_LOCALE, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " + PrepareStatement(HotfixStatements.SEL_MAP_LOCALE, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " +
"PvpLongDescription_lang FROM map_locale WHERE locale = ?"); "PvpLongDescription_lang FROM map_locale WHERE locale = ?");
// MapDifficulty.db2 // MapDifficulty.db2
PrepareStatement(HotfixStatements.SEL_MAP_DIFFICULTY, "SELECT ID, Message, ItemContextPickerID, ContentTuningID, DifficultyID, LockID, ResetInterval, " + PrepareStatement(HotfixStatements.SEL_MAP_DIFFICULTY, "SELECT ID, Message, DifficultyID, LockID, ResetInterval, MaxPlayers, ItemContext, " +
"MaxPlayers, ItemContext, Flags, MapID FROM map_difficulty ORDER BY ID DESC"); "ItemContextPickerID, Flags, ContentTuningID, MapID FROM map_difficulty ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_MAP_DIFFICULTY_LOCALE, "SELECT ID, Message_lang FROM map_difficulty_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_MAP_DIFFICULTY_LOCALE, "SELECT ID, Message_lang FROM map_difficulty_locale WHERE locale = ?");
// ModifierTree.db2 // ModifierTree.db2
@@ -653,7 +650,7 @@ namespace Framework.Database
// MountCapability.db2 // MountCapability.db2
PrepareStatement(HotfixStatements.SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, ReqRidingSkill, ReqAreaID, ReqSpellAuraID, ReqSpellKnownID, ModSpellAuraID, " + PrepareStatement(HotfixStatements.SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, ReqRidingSkill, ReqAreaID, ReqSpellAuraID, ReqSpellKnownID, ModSpellAuraID, " +
"ReqMapID FROM mount_capability ORDER BY ID DESC"); "ReqMapID, PlayerConditionID FROM mount_capability ORDER BY ID DESC");
// MountTypeXCapability.db2 // MountTypeXCapability.db2
PrepareStatement(HotfixStatements.SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" + PrepareStatement(HotfixStatements.SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" +
@@ -764,8 +761,8 @@ namespace Framework.Database
"Difficulty8, Difficulty9, Difficulty10 FROM quest_xp ORDER BY ID DESC"); "Difficulty8, Difficulty9, Difficulty10 FROM quest_xp ORDER BY ID DESC");
// RandPropPoints.db2 // RandPropPoints.db2
PrepareStatement(HotfixStatements.SEL_RAND_PROP_POINTS, "SELECT ID, DamageReplaceStat, Epic1, Epic2, Epic3, Epic4, Epic5, Superior1, Superior2, Superior3, " + PrepareStatement(HotfixStatements.SEL_RAND_PROP_POINTS, "SELECT ID, DamageReplaceStat, DamageSecondary, Epic1, Epic2, Epic3, Epic4, Epic5, Superior1, " +
"Superior4, Superior5, Good1, Good2, Good3, Good4, Good5 FROM rand_prop_points ORDER BY ID DESC"); "Superior2, Superior3, Superior4, Superior5, Good1, Good2, Good3, Good4, Good5 FROM rand_prop_points ORDER BY ID DESC");
// RewardPack.db2 // RewardPack.db2
PrepareStatement(HotfixStatements.SEL_REWARD_PACK, "SELECT ID, CharTitleID, Money, ArtifactXPDifficulty, ArtifactXPMultiplier, ArtifactXPCategoryID, " + PrepareStatement(HotfixStatements.SEL_REWARD_PACK, "SELECT ID, CharTitleID, Money, ArtifactXPDifficulty, ArtifactXPMultiplier, ArtifactXPCategoryID, " +
@@ -889,7 +886,7 @@ namespace Framework.Database
// SpellItemEnchantment.db2 // SpellItemEnchantment.db2
PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " + PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " +
"EffectScalingPoints2, EffectScalingPoints3, TransmogCost, IconFileDataID, TransmogPlayerConditionID, EffectPointsMin1, EffectPointsMin2, " + "EffectScalingPoints2, EffectScalingPoints3, TransmogPlayerConditionID, TransmogCost, IconFileDataID, EffectPointsMin1, EffectPointsMin2, " +
"EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ScalingClass, " + "EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ScalingClass, " +
"ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment ORDER BY ID DESC"); "ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_LOCALE, "SELECT ID, Name_lang, HordeName_lang FROM spell_item_enchantment_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_LOCALE, "SELECT ID, Name_lang, HordeName_lang FROM spell_item_enchantment_locale WHERE locale = ?");
@@ -909,9 +906,9 @@ namespace Framework.Database
// SpellMisc.db2 // SpellMisc.db2
PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, DifficultyID, CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, " + PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, DifficultyID, CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, " +
"MinDuration, SpellIconFileDataID, ActiveIconFileDataID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, " + "MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, " +
"Attributes7, Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, SpellID FROM spell_misc" + "Attributes6, Attributes7, Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, SpellID" +
" ORDER BY ID DESC"); " FROM spell_misc ORDER BY ID DESC");
// SpellName.db2 // SpellName.db2
PrepareStatement(HotfixStatements.SEL_SPELL_NAME, "SELECT ID, Name FROM spell_name ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_SPELL_NAME, "SELECT ID, Name FROM spell_name ORDER BY ID DESC");
@@ -985,8 +982,8 @@ namespace Framework.Database
// TaxiNodes.db2 // TaxiNodes.db2
PrepareStatement(HotfixStatements.SEL_TAXI_NODES, "SELECT Name, PosX, PosY, PosZ, MapOffsetX, MapOffsetY, FlightMapOffsetX, FlightMapOffsetY, ID, " + PrepareStatement(HotfixStatements.SEL_TAXI_NODES, "SELECT Name, PosX, PosY, PosZ, MapOffsetX, MapOffsetY, FlightMapOffsetX, FlightMapOffsetY, ID, " +
"ContinentID, ConditionID, CharacterBitNumber, Flags, UiTextureKitID, Facing, SpecialIconConditionID, VisibilityConditionID, " + "ContinentID, ConditionID, CharacterBitNumber, Flags, UiTextureKitID, MinimapAtlasMemberID, Facing, SpecialIconConditionID, " +
"MountCreatureID1, MountCreatureID2 FROM taxi_nodes ORDER BY ID DESC"); "VisibilityConditionID, MountCreatureID1, MountCreatureID2 FROM taxi_nodes ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_TAXI_NODES_LOCALE, "SELECT ID, Name_lang FROM taxi_nodes_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_TAXI_NODES_LOCALE, "SELECT ID, Name_lang FROM taxi_nodes_locale WHERE locale = ?");
// TaxiPath.db2 // TaxiPath.db2
@@ -1009,7 +1006,7 @@ namespace Framework.Database
// TransmogSet.db2 // TransmogSet.db2
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " + PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " +
"ParentTransmogSetID, ExpansionID, UiOrder FROM transmog_set ORDER BY ID DESC"); "ParentTransmogSetID, Unknown810, ExpansionID, PatchID, UiOrder FROM transmog_set ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_LOCALE, "SELECT ID, Name_lang FROM transmog_set_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_LOCALE, "SELECT ID, Name_lang FROM transmog_set_locale WHERE locale = ?");
// TransmogSetGroup.db2 // TransmogSetGroup.db2
@@ -1037,8 +1034,8 @@ namespace Framework.Database
"Region2Z, ID, UiMapID, OrderIndex, MapID, AreaID, WmoDoodadPlacementID, WmoGroupID FROM ui_map_assignment ORDER BY ID DESC"); "Region2Z, ID, UiMapID, OrderIndex, MapID, AreaID, WmoDoodadPlacementID, WmoGroupID FROM ui_map_assignment ORDER BY ID DESC");
// UiMapLink.db2 // UiMapLink.db2
PrepareStatement(HotfixStatements.SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID FROM ui_map_link" + PrepareStatement(HotfixStatements.SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID, " +
" ORDER BY ID DESC"); "OverrideHighlightFileDataID, OverrideHighlightAtlasID FROM ui_map_link ORDER BY ID DESC");
// UiMapXMapArt.db2 // UiMapXMapArt.db2
PrepareStatement(HotfixStatements.SEL_UI_MAP_X_MAP_ART, "SELECT ID, PhaseID, UiMapArtID, UiMapID FROM ui_map_x_map_art ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_UI_MAP_X_MAP_ART, "SELECT ID, PhaseID, UiMapArtID, UiMapID FROM ui_map_x_map_art ORDER BY ID DESC");
@@ -1189,6 +1186,8 @@ namespace Framework.Database
SEL_CONTENT_TUNING, SEL_CONTENT_TUNING,
SEL_CONTENT_TUNING_X_EXPECTED,
SEL_CONVERSATION_LINE, SEL_CONVERSATION_LINE,
SEL_CREATURE_DISPLAY_INFO, SEL_CREATURE_DISPLAY_INFO,
@@ -1359,12 +1358,6 @@ namespace Framework.Database
SEL_ITEM_PRICE_BASE, SEL_ITEM_PRICE_BASE,
SEL_ITEM_RANDOM_PROPERTIES,
SEL_ITEM_RANDOM_PROPERTIES_LOCALE,
SEL_ITEM_RANDOM_SUFFIX,
SEL_ITEM_RANDOM_SUFFIX_LOCALE,
SEL_ITEM_SEARCH_NAME, SEL_ITEM_SEARCH_NAME,
SEL_ITEM_SEARCH_NAME_LOCALE, SEL_ITEM_SEARCH_NAME_LOCALE,
@@ -27,8 +27,7 @@ namespace Framework.Database
PrepareStatement(LoginStatements.SEL_REALMLIST, "SELECT id, name, address, localAddress, localSubnetMask, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild, Region, Battlegroup FROM realmlist WHERE flag <> 3 ORDER BY name"); PrepareStatement(LoginStatements.SEL_REALMLIST, "SELECT id, name, address, localAddress, localSubnetMask, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild, Region, Battlegroup FROM realmlist WHERE flag <> 3 ORDER BY name");
PrepareStatement(LoginStatements.DEL_EXPIRED_IP_BANS, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()"); PrepareStatement(LoginStatements.DEL_EXPIRED_IP_BANS, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()");
PrepareStatement(LoginStatements.UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()"); PrepareStatement(LoginStatements.UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()");
PrepareStatement(LoginStatements.SEL_IP_INFO, "(SELECT unbandate > UNIX_TIMESTAMP() OR unbandate = bandate AS banned, NULL as country FROM ip_banned WHERE ip = ?) " + PrepareStatement(LoginStatements.SEL_IP_INFO, "SELECT unbandate > UNIX_TIMESTAMP() OR unbandate = bandate AS banned, NULL as country FROM ip_banned WHERE ip = ?");
"UNION (SELECT NULL AS banned, country FROM ip2nation WHERE INET_NTOA(ip) = ?)");
PrepareStatement(LoginStatements.INS_IP_AUTO_BANNED, "INSERT INTO ip_banned (ip, bandate, unbandate, bannedby, banreason) VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Cypher Auth', 'Failed login autoban')"); PrepareStatement(LoginStatements.INS_IP_AUTO_BANNED, "INSERT INTO ip_banned (ip, bandate, unbandate, bannedby, banreason) VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Cypher Auth', 'Failed login autoban')");
PrepareStatement(LoginStatements.SEL_IP_BANNED_ALL, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) ORDER BY unbandate"); PrepareStatement(LoginStatements.SEL_IP_BANNED_ALL, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) ORDER BY unbandate");
@@ -38,7 +37,6 @@ namespace Framework.Database
PrepareStatement(LoginStatements.DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?"); PrepareStatement(LoginStatements.DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?");
PrepareStatement(LoginStatements.UPD_ACCOUNT_INFO_CONTINUED_SESSION, "UPDATE account SET sessionkey = ? WHERE id = ?"); PrepareStatement(LoginStatements.UPD_ACCOUNT_INFO_CONTINUED_SESSION, "UPDATE account SET sessionkey = ? WHERE id = ?");
PrepareStatement(LoginStatements.SEL_ACCOUNT_INFO_CONTINUED_SESSION, "SELECT username, sessionkey FROM account WHERE id = ?"); PrepareStatement(LoginStatements.SEL_ACCOUNT_INFO_CONTINUED_SESSION, "SELECT username, sessionkey FROM account WHERE id = ?");
PrepareStatement(LoginStatements.SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1");
PrepareStatement(LoginStatements.SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?"); PrepareStatement(LoginStatements.SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?");
PrepareStatement(LoginStatements.SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?"); PrepareStatement(LoginStatements.SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?");
PrepareStatement(LoginStatements.SEL_ACCOUNT_INFO_BY_NAME, "SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, ba.lock_country, a.expansion, a.mutetime, ba.locale, a.recruiter, a.os, ba.id, aa.gmLevel, " + PrepareStatement(LoginStatements.SEL_ACCOUNT_INFO_BY_NAME, "SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, ba.lock_country, a.expansion, a.mutetime, ba.locale, a.recruiter, a.os, ba.id, aa.gmLevel, " +
@@ -95,7 +93,6 @@ namespace Framework.Database
PrepareStatement(LoginStatements.SEL_LAST_IP, "SELECT last_ip FROM account WHERE id = ?"); PrepareStatement(LoginStatements.SEL_LAST_IP, "SELECT last_ip FROM account WHERE id = ?");
PrepareStatement(LoginStatements.SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?"); PrepareStatement(LoginStatements.SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?");
PrepareStatement(LoginStatements.DEL_ACCOUNT, "DELETE FROM account WHERE id = ?"); PrepareStatement(LoginStatements.DEL_ACCOUNT, "DELETE FROM account WHERE id = ?");
PrepareStatement(LoginStatements.SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1");
PrepareStatement(LoginStatements.SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1"); PrepareStatement(LoginStatements.SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1");
PrepareStatement(LoginStatements.GET_EMAIL_BY_ID, "SELECT email FROM account WHERE id = ?"); PrepareStatement(LoginStatements.GET_EMAIL_BY_ID, "SELECT email FROM account WHERE id = ?");
// 0: uint32, 1: uint32, 2: uint8, 3: uint32, 4: string // Complete name: "Login_Insert_AccountLoginDeLete_IP_Logging" // 0: uint32, 1: uint32, 2: uint8, 3: uint32, 4: string // Complete name: "Login_Insert_AccountLoginDeLete_IP_Logging"
@@ -191,7 +188,6 @@ namespace Framework.Database
UPD_ACCOUNT_INFO_CONTINUED_SESSION, UPD_ACCOUNT_INFO_CONTINUED_SESSION,
SEL_ACCOUNT_INFO_CONTINUED_SESSION, SEL_ACCOUNT_INFO_CONTINUED_SESSION,
UPD_VS, UPD_VS,
SEL_LOGON_COUNTRY,
SEL_ACCOUNT_ID_BY_NAME, SEL_ACCOUNT_ID_BY_NAME,
SEL_ACCOUNT_LIST_BY_NAME, SEL_ACCOUNT_LIST_BY_NAME,
SEL_ACCOUNT_INFO_BY_NAME, SEL_ACCOUNT_INFO_BY_NAME,
+2 -1
View File
@@ -221,7 +221,7 @@ namespace Framework.Database
try try
{ {
string query = File.ReadAllText(path); string query = File.ReadAllText(path);
if (query.Length > 1048576) //Default size limit of querys if (Encoding.UTF8.GetByteCount(query) > 1048576) //Default size limit of querys
Apply("SET GLOBAL max_allowed_packet=1073741824;"); Apply("SET GLOBAL max_allowed_packet=1073741824;");
using (var connection = _connectionInfo.GetConnection()) using (var connection = _connectionInfo.GetConnection())
@@ -229,6 +229,7 @@ namespace Framework.Database
connection.Open(); connection.Open();
using (MySqlCommand cmd = connection.CreateCommand()) using (MySqlCommand cmd = connection.CreateCommand())
{ {
cmd.CommandTimeout = 120;
cmd.CommandText = query; cmd.CommandText = query;
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
return true; return true;
+2 -1
View File
@@ -12,7 +12,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.5.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
<PackageReference Include="MySqlConnector" Version="0.48.2" /> <PackageReference Include="MySqlConnector" Version="0.56.0" />
<PackageReference Include="Security.Cryptography" Version="1.7.2" />
<PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" /> <PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.5.2" /> <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.5.2" />
</ItemGroup> </ItemGroup>
+41 -36
View File
@@ -162,30 +162,30 @@ namespace Framework.IO
//BitPacking //BitPacking
public byte ReadBit() public byte ReadBit()
{ {
if (BitPosition == 8) if (_bitPosition == 8)
{ {
BitValue = ReadUInt8(); BitValue = ReadUInt8();
BitPosition = 0; _bitPosition = 0;
} }
int returnValue = BitValue; int returnValue = BitValue;
BitValue = (byte)(2 * returnValue); BitValue = (byte)(2 * returnValue);
++BitPosition; ++_bitPosition;
return (byte)(returnValue >> 7); return (byte)(returnValue >> 7);
} }
public bool HasBit() public bool HasBit()
{ {
if (BitPosition == 8) if (_bitPosition == 8)
{ {
BitValue = ReadUInt8(); BitValue = ReadUInt8();
BitPosition = 0; _bitPosition = 0;
} }
int returnValue = BitValue; int returnValue = BitValue;
BitValue = (byte)(2 * returnValue); BitValue = (byte)(2 * returnValue);
++BitPosition; ++_bitPosition;
return Convert.ToBoolean(returnValue >> 7); return Convert.ToBoolean(returnValue >> 7);
} }
@@ -203,64 +203,64 @@ namespace Framework.IO
#endregion #endregion
#region Write Methods #region Write Methods
public void WriteInt8<T>(T data) public void WriteInt8(sbyte data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToSByte(data)); writeStream.Write(data);
} }
public void WriteInt16<T>(T data) public void WriteInt16(short data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToInt16(data)); writeStream.Write(data);
} }
public void WriteInt32<T>(T data) public void WriteInt32(int data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToInt32(data)); writeStream.Write(data);
} }
public void WriteInt64<T>(T data) public void WriteInt64(long data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToInt64(data)); writeStream.Write(data);
} }
public void WriteUInt8<T>(T data) public void WriteUInt8(byte data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToByte(data)); writeStream.Write(data);
} }
public void WriteUInt16<T>(T data) public void WriteUInt16(ushort data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToUInt16(data)); writeStream.Write(data);
} }
public void WriteUInt32<T>(T data) public void WriteUInt32(uint data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToUInt32(data)); writeStream.Write(data);
} }
public void WriteUInt64<T>(T data) public void WriteUInt64(ulong data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToUInt64(data)); writeStream.Write(data);
} }
public void WriteFloat<T>(T data) public void WriteFloat(float data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToSingle(data)); writeStream.Write(data);
} }
public void WriteDouble<T>(T data) public void WriteDouble(double data)
{ {
FlushBits(); FlushBits();
writeStream.Write(Convert.ToDouble(data)); writeStream.Write(data);
} }
/// <summary> /// <summary>
@@ -329,16 +329,16 @@ namespace Framework.IO
public bool WriteBit(object bit) public bool WriteBit(object bit)
{ {
--BitPosition; --_bitPosition;
if (Convert.ToBoolean(bit)) if (Convert.ToBoolean(bit))
BitValue |= (byte)(1 << BitPosition); BitValue |= (byte)(1 << _bitPosition);
if (BitPosition == 0) if (_bitPosition == 0)
{ {
writeStream.Write(BitValue); writeStream.Write(BitValue);
BitPosition = 8; _bitPosition = 8;
BitValue = 0; BitValue = 0;
} }
return Convert.ToBoolean(bit); return Convert.ToBoolean(bit);
@@ -363,22 +363,27 @@ namespace Framework.IO
} }
#endregion #endregion
public bool HasUnfinishedBitPack()
{
return _bitPosition != 8;
}
public void FlushBits() public void FlushBits()
{ {
if (BitPosition == 8) if (_bitPosition == 8)
return; return;
writeStream.Write(BitValue); writeStream.Write(BitValue);
BitValue = 0; BitValue = 0;
BitPosition = 8; _bitPosition = 8;
} }
public void ResetBitPos() public void ResetBitPos()
{ {
if (BitPosition > 7) if (_bitPosition > 7)
return; return;
BitPosition = 8; _bitPosition = 8;
BitValue = 0; BitValue = 0;
} }
@@ -412,12 +417,12 @@ namespace Framework.IO
public void Clear() public void Clear()
{ {
BitPosition = 8; _bitPosition = 8;
BitValue = 0; BitValue = 0;
writeStream = new BinaryWriter(new MemoryStream()); writeStream = new BinaryWriter(new MemoryStream());
} }
byte BitPosition = 8; byte _bitPosition = 8;
byte BitValue; byte BitValue;
BinaryWriter writeStream; BinaryWriter writeStream;
BinaryReader readStream; BinaryReader readStream;
@@ -103,6 +103,11 @@ namespace System.Collections.Generic
int cur = list.Count; int cur = list.Count;
if (size < cur) if (size < cur)
list.RemoveRange((int)size, cur - (int)size); list.RemoveRange((int)size, cur - (int)size);
else
{
for (var i = list.Count; i < size; ++i)
list.Add(default(T));
}
} }
public static void RandomResize<T>(this IList<T> list, uint size) public static void RandomResize<T>(this IList<T> list, uint size)
+1 -1
View File
@@ -70,7 +70,7 @@ namespace Game.AI
return new VehicleAI(creature); return new VehicleAI(creature);
else if (creature.HasUnitTypeMask(UnitTypeMask.ControlableGuardian) && ((Guardian)creature).GetOwner().IsTypeId(TypeId.Player)) else if (creature.HasUnitTypeMask(UnitTypeMask.ControlableGuardian) && ((Guardian)creature).GetOwner().IsTypeId(TypeId.Player))
return new PetAI(creature); return new PetAI(creature);
else if (creature.HasFlag64(UnitFields.NpcFlags, NPCFlags.SpellClick)) else if (creature.HasNpcFlag(NPCFlags.SpellClick))
return new NullCreatureAI(creature); return new NullCreatureAI(creature);
else if (creature.IsGuard()) else if (creature.IsGuard())
return new GuardAI(creature); return new GuardAI(creature);
+2 -2
View File
@@ -333,9 +333,9 @@ namespace Game.AI
if (point) if (point)
{ {
point.SetObjectScale(SharedConst.BoundaryVisualizeCreatureScale); point.SetObjectScale(SharedConst.BoundaryVisualizeCreatureScale);
point.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToPc | UnitFlags.Stunned | UnitFlags.ImmuneToNpc); point.AddUnitFlag(UnitFlags.ImmuneToPc | UnitFlags.Stunned | UnitFlags.ImmuneToNpc);
if (!hasOutOfBoundsNeighbor) if (!hasOutOfBoundsNeighbor)
point.SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); point.AddUnitFlag(UnitFlags.NotSelectable);
} }
Q.Remove(front); Q.Remove(front);
} }
+2 -2
View File
@@ -65,14 +65,14 @@ namespace Game.AI
public override void JustDied(Unit unit) public override void JustDied(Unit unit)
{ {
// We died while possessed, disable our loot // We died while possessed, disable our loot
me.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Lootable); me.RemoveDynamicFlag(UnitDynFlags.Lootable);
} }
public override void KilledUnit(Unit victim) public override void KilledUnit(Unit victim)
{ {
// We killed a creature, disable victim's loot // We killed a creature, disable victim's loot
if (victim.IsTypeId(TypeId.Unit)) if (victim.IsTypeId(TypeId.Unit))
victim.RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Lootable); me.RemoveDynamicFlag(UnitDynFlags.Lootable);
} }
public override void OnCharmed(bool apply) public override void OnCharmed(bool apply)
+10 -10
View File
@@ -392,7 +392,7 @@ namespace Game.AI
public PlayerAI(Player player) : base(player) public PlayerAI(Player player) : base(player)
{ {
me = player; me = player;
_selfSpec = player.GetUInt32Value(PlayerFields.CurrentSpecId); _selfSpec = player.GetPrimarySpecialization();
_isSelfHealer = IsPlayerHealer(player); _isSelfHealer = IsPlayerHealer(player);
_isSelfRangedAttacker = IsPlayerRangedAttacker(player); _isSelfRangedAttacker = IsPlayerRangedAttacker(player);
} }
@@ -414,15 +414,15 @@ namespace Game.AI
default: default:
return false; return false;
case Class.Paladin: case Class.Paladin:
return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.PaladinHoly; return who.GetPrimarySpecialization() == (uint)TalentSpecialization.PaladinHoly;
case Class.Priest: case Class.Priest:
return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.PriestDiscipline || who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.PriestHoly; return who.GetPrimarySpecialization() == (uint)TalentSpecialization.PriestDiscipline || who.GetPrimarySpecialization() == (uint)TalentSpecialization.PriestHoly;
case Class.Shaman: case Class.Shaman:
return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.ShamanRestoration; return who.GetPrimarySpecialization() == (uint)TalentSpecialization.ShamanRestoration;
case Class.Monk: case Class.Monk:
return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.MonkMistweaver; return who.GetPrimarySpecialization() == (uint)TalentSpecialization.MonkMistweaver;
case Class.Druid: case Class.Druid:
return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.DruidRestoration; return who.GetPrimarySpecialization() == (uint)TalentSpecialization.DruidRestoration;
} }
} }
bool IsPlayerRangedAttacker(Player who) bool IsPlayerRangedAttacker(Player who)
@@ -454,11 +454,11 @@ namespace Game.AI
return false; return false;
} }
case Class.Priest: case Class.Priest:
return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.PriestShadow; return who.GetPrimarySpecialization() == (uint)TalentSpecialization.PriestShadow;
case Class.Shaman: case Class.Shaman:
return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.ShamanElemental; return who.GetPrimarySpecialization() == (uint)TalentSpecialization.ShamanElemental;
case Class.Druid: case Class.Druid:
return who.GetUInt32Value(PlayerFields.CurrentSpecId) == (uint)TalentSpecialization.DruidBalance; return who.GetPrimarySpecialization() == (uint)TalentSpecialization.DruidBalance;
} }
} }
@@ -659,7 +659,7 @@ namespace Game.AI
return (!who || who == me) ? _isSelfHealer : IsPlayerHealer(who); return (!who || who == me) ? _isSelfHealer : IsPlayerHealer(who);
} }
public bool IsRangedAttacker(Player who = null) { return (!who || who == me) ? _isSelfRangedAttacker : IsPlayerRangedAttacker(who); } public bool IsRangedAttacker(Player who = null) { return (!who || who == me) ? _isSelfRangedAttacker : IsPlayerRangedAttacker(who); }
uint GetSpec(Player who = null) { return (!who || who == me) ? _selfSpec : who.GetUInt32Value(PlayerFields.CurrentSpecId); } uint GetSpec(Player who = null) { return (!who || who == me) ? _selfSpec : who.GetPrimarySpecialization(); }
void SetIsRangedAttacker(bool state) { _isSelfRangedAttacker = state; } // this allows overriding of the default ranged attacker detection void SetIsRangedAttacker(bool state) { _isSelfRangedAttacker = state; } // this allows overriding of the default ranged attacker detection
public virtual Unit SelectAttackTarget() { return me.GetCharmer() ? me.GetCharmer().GetVictim() : null; } public virtual Unit SelectAttackTarget() { return me.GetCharmer() ? me.GetCharmer().GetVictim() : null; }
+1 -1
View File
@@ -125,7 +125,7 @@ namespace Game.AI
return null; return null;
//Silenced so we can't cast //Silenced so we can't cast
if (me.HasFlag(UnitFields.Flags, UnitFlags.Silenced)) if (me.HasUnitFlag(UnitFlags.Silenced))
return null; return null;
//Using the extended script system we first create a list of viable spells //Using the extended script system we first create a list of viable spells
@@ -133,7 +133,7 @@ namespace Game.AI
//add a small delay before going to first waypoint, normal in near all cases //add a small delay before going to first waypoint, normal in near all cases
m_uiWPWaitTimer = 1000; m_uiWPWaitTimer = 1000;
if (me.getFaction() != me.GetCreatureTemplate().Faction) if (me.GetFaction() != me.GetCreatureTemplate().Faction)
me.RestoreFaction(); me.RestoreFaction();
Reset(); Reset();
@@ -162,7 +162,7 @@ namespace Game.AI
{ {
me.GetMotionMaster().MoveTargetedHome(); me.GetMotionMaster().MoveTargetedHome();
if (HasImmuneToNPCFlags) if (HasImmuneToNPCFlags)
me.SetFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc); me.AddUnitFlag(UnitFlags.ImmuneToNpc);
Reset(); Reset();
} }
} }
@@ -463,11 +463,12 @@ namespace Game.AI
} }
//disable npcflags //disable npcflags
me.SetUInt64Value(UnitFields.NpcFlags, (ulong)NPCFlags.None); me.SetNpcFlags(NPCFlags.None);
if (me.HasFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc)) me.SetNpcFlags2(NPCFlags2.None);
if (me.HasUnitFlag(UnitFlags.ImmuneToNpc))
{ {
HasImmuneToNPCFlags = true; HasImmuneToNPCFlags = true;
me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc); me.RemoveUnitFlag(UnitFlags.ImmuneToNpc);
} }
Log.outDebug(LogFilter.Scripts, $"EscortAI started. ActiveAttacker = {m_bIsActiveAttacker}, Run = {m_bIsRunning}, PlayerGUID = {m_uiPlayerGUID.ToString()}"); Log.outDebug(LogFilter.Scripts, $"EscortAI started. ActiveAttacker = {m_bIsActiveAttacker}, Run = {m_bIsRunning}, PlayerGUID = {m_uiPlayerGUID.ToString()}");
@@ -168,7 +168,7 @@ namespace Game.AI
if (!IsCombatMovementAllowed()) if (!IsCombatMovementAllowed())
SetCombatMovement(true); SetCombatMovement(true);
if (me.getFaction() != me.GetCreatureTemplate().Faction) if (me.GetFaction() != me.GetCreatureTemplate().Faction)
me.SetFaction(me.GetCreatureTemplate().Faction); me.SetFaction(me.GetCreatureTemplate().Faction);
Reset(); Reset();
@@ -318,7 +318,8 @@ namespace Game.AI
Log.outDebug(LogFilter.Scripts, "FollowerAI start with WAYPOINT_MOTION_TYPE, set to MoveIdle."); Log.outDebug(LogFilter.Scripts, "FollowerAI start with WAYPOINT_MOTION_TYPE, set to MoveIdle.");
} }
me.SetUInt64Value(UnitFields.NpcFlags, (uint)NPCFlags.None); me.SetNpcFlags(NPCFlags.None);
me.SetNpcFlags2(NPCFlags2.None);
AddFollowState(eFollowState.Inprogress); AddFollowState(eFollowState.Inprogress);
+5 -5
View File
@@ -131,8 +131,8 @@ namespace Game.AI
if (invoker && invoker.GetTypeId() == TypeId.Player) if (invoker && invoker.GetTypeId() == TypeId.Player)
{ {
mEscortNPCFlags = me.GetUInt32Value(UnitFields.NpcFlags); mEscortNPCFlags = me.m_unitData.NpcFlags[0];
me.SetFlag(UnitFields.NpcFlags, 0); me.SetNpcFlags(NPCFlags.None);
} }
GetScript().ProcessEventsFor(SmartEvents.WaypointStart, null, mCurrentWPID, GetScript().GetPathId()); GetScript().ProcessEventsFor(SmartEvents.WaypointStart, null, mCurrentWPID, GetScript().GetPathId());
@@ -227,7 +227,7 @@ namespace Game.AI
if (mEscortNPCFlags != 0) if (mEscortNPCFlags != 0)
{ {
me.SetFlag(UnitFields.NpcFlags, mEscortNPCFlags); me.SetNpcFlags((NPCFlags)mEscortNPCFlags);
mEscortNPCFlags = 0; mEscortNPCFlags = 0;
} }
@@ -591,7 +591,7 @@ namespace Game.AI
mDespawnState = 0; mDespawnState = 0;
mEscortState = SmartEscortState.None; mEscortState = SmartEscortState.None;
me.SetVisible(true); me.SetVisible(true);
if (me.getFaction() != me.GetCreatureTemplate().Faction) if (me.GetFaction() != me.GetCreatureTemplate().Faction)
me.RestoreFaction(); me.RestoreFaction();
mJustReset = true; mJustReset = true;
JustReachedHome(); JustReachedHome();
@@ -646,7 +646,7 @@ namespace Game.AI
public override void AttackStart(Unit who) public override void AttackStart(Unit who)
{ {
// dont allow charmed npcs to act on their own // dont allow charmed npcs to act on their own
if (me.HasFlag(UnitFields.Flags, UnitFlags.PlayerControlled)) if (me.HasUnitFlag(UnitFlags.PlayerControlled))
{ {
if (who && mCanAutoAttack) if (who && mCanAutoAttack)
me.Attack(who, true); me.Attack(who, true);
@@ -1715,7 +1715,7 @@ namespace Game.AI
[FieldOffset(16)] [FieldOffset(16)]
public Raw raw; public Raw raw;
[FieldOffset(32)] [FieldOffset(40)]
public string param_string; public string param_string;
#region Structs #region Structs
+51 -17
View File
@@ -221,7 +221,7 @@ namespace Game.AI
CreatureTemplate ci = Global.ObjectMgr.GetCreatureTemplate(obj.ToCreature().GetEntry()); CreatureTemplate ci = Global.ObjectMgr.GetCreatureTemplate(obj.ToCreature().GetEntry());
if (ci != null) if (ci != null)
{ {
if (obj.ToCreature().getFaction() != ci.Faction) if (obj.ToCreature().GetFaction() != ci.Faction)
{ {
obj.ToCreature().SetFaction(ci.Faction); obj.ToCreature().SetFaction(ci.Faction);
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_FACTION: Creature entry {0}, GuidLow {1} set faction to {2}", Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_FACTION: Creature entry {0}, GuidLow {1} set faction to {2}",
@@ -647,7 +647,7 @@ namespace Game.AI
{ {
if (IsUnit(obj)) if (IsUnit(obj))
{ {
obj.ToUnit().SetUInt32Value(UnitFields.NpcEmotestate, e.Action.emote.emoteId); obj.ToUnit().SetEmoteState((Emote)e.Action.emote.emoteId);
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_EMOTE_STATE. Unit {0} set emotestate to {1}", Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_EMOTE_STATE. Unit {0} set emotestate to {1}",
obj.GetGUID().ToString(), e.Action.emote.emoteId); obj.GetGUID().ToString(), e.Action.emote.emoteId);
} }
@@ -668,13 +668,13 @@ namespace Game.AI
{ {
if (e.Action.unitFlag.type == 0) if (e.Action.unitFlag.type == 0)
{ {
obj.ToUnit().SetFlag(UnitFields.Flags, e.Action.unitFlag.flag); obj.ToUnit().AddUnitFlag((UnitFlags)e.Action.unitFlag.flag);
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_UNIT_FLAG. Unit {0} added flag {1} to UNIT_FIELD_FLAGS", Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_UNIT_FLAG. Unit {0} added flag {1} to UNIT_FIELD_FLAGS",
obj.GetGUID().ToString(), e.Action.unitFlag.flag); obj.GetGUID().ToString(), e.Action.unitFlag.flag);
} }
else else
{ {
obj.ToUnit().SetFlag(UnitFields.Flags2, e.Action.unitFlag.flag); obj.ToUnit().AddUnitFlag2((UnitFlags2)e.Action.unitFlag.flag);
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_UNIT_FLAG. Unit {0} added flag {1} to UNIT_FIELD_FLAGS_2", Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_SET_UNIT_FLAG. Unit {0} added flag {1} to UNIT_FIELD_FLAGS_2",
obj.GetGUID().ToString(), e.Action.unitFlag.flag); obj.GetGUID().ToString(), e.Action.unitFlag.flag);
} }
@@ -696,13 +696,13 @@ namespace Game.AI
{ {
if (e.Action.unitFlag.type == 0) if (e.Action.unitFlag.type == 0)
{ {
obj.ToUnit().RemoveFlag(UnitFields.Flags2, e.Action.unitFlag.flag); obj.ToUnit().RemoveUnitFlag((UnitFlags)e.Action.unitFlag.flag);
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_REMOVE_UNIT_FLAG. Unit {0} removed flag {1} to UNIT_FIELD_FLAGS", Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_REMOVE_UNIT_FLAG. Unit {0} removed flag {1} to UNIT_FIELD_FLAGS",
obj.GetGUID().ToString(), e.Action.unitFlag.flag); obj.GetGUID().ToString(), e.Action.unitFlag.flag);
} }
else else
{ {
obj.ToUnit().RemoveFlag(UnitFields.Flags2, e.Action.unitFlag.flag); obj.ToUnit().RemoveUnitFlag2((UnitFlags2)e.Action.unitFlag.flag);
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_REMOVE_UNIT_FLAG. Unit {0} removed flag {1} to UNIT_FIELD_FLAGS_2", Log.outDebug(LogFilter.ScriptsAi, "SmartScript.ProcessAction. SMART_ACTION_REMOVE_UNIT_FLAG. Unit {0} removed flag {1} to UNIT_FIELD_FLAGS_2",
obj.GetGUID().ToString(), e.Action.unitFlag.flag); obj.GetGUID().ToString(), e.Action.unitFlag.flag);
} }
@@ -1756,7 +1756,7 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsUnit(obj)) if (IsUnit(obj))
obj.ToUnit().SetUInt64Value(UnitFields.NpcFlags, e.Action.unitFlag.flag); obj.ToUnit().SetNpcFlags((NPCFlags)e.Action.unitFlag.flag);
break; break;
} }
case SmartActions.AddNpcFlag: case SmartActions.AddNpcFlag:
@@ -1767,7 +1767,7 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsUnit(obj)) if (IsUnit(obj))
obj.ToUnit().SetFlag64(UnitFields.NpcFlags, e.Action.unitFlag.flag); obj.ToUnit().AddNpcFlag((NPCFlags)e.Action.unitFlag.flag);
break; break;
} }
case SmartActions.RemoveNpcFlag: case SmartActions.RemoveNpcFlag:
@@ -1778,7 +1778,7 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsUnit(obj)) if (IsUnit(obj))
obj.ToUnit().RemoveFlag64(UnitFields.NpcFlags, e.Action.unitFlag.flag); obj.ToUnit().RemoveNpcFlag((NPCFlags)e.Action.unitFlag.flag);
break; break;
} }
case SmartActions.CrossCast: case SmartActions.CrossCast:
@@ -1937,7 +1937,25 @@ namespace Game.AI
break; break;
foreach (var obj in targets) foreach (var obj in targets)
if (IsUnit(obj)) if (IsUnit(obj))
obj.ToUnit().SetByteFlag(UnitFields.Bytes1, (byte)e.Action.setunitByte.type, e.Action.setunitByte.byte1); {
switch (e.Action.setunitByte.type)
{
case 0:
obj.ToUnit().SetStandState((UnitStandStateType)e.Action.setunitByte.byte1);
break;
case 1:
// pet talent points
break;
case 2:
obj.ToUnit().AddVisFlags((UnitVisFlags)e.Action.setunitByte.byte1);
break;
case 3:
// this is totally wrong to maintain compatibility with existing scripts
// TODO: fix with animtier overhaul
obj.ToUnit().SetAnimTier((UnitBytes1Flags)(obj.ToUnit().m_unitData.AnimTier | e.Action.setunitByte.byte1), false);
break;
}
}
break; break;
} }
case SmartActions.RemoveUnitFieldBytes1: case SmartActions.RemoveUnitFieldBytes1:
@@ -1948,7 +1966,23 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsUnit(obj)) if (IsUnit(obj))
obj.ToUnit().RemoveByteFlag(UnitFields.Bytes1, (byte)e.Action.delunitByte.type, e.Action.delunitByte.byte1); {
switch (e.Action.setunitByte.type)
{
case 0:
obj.ToUnit().SetStandState(UnitStandStateType.Stand);
break;
case 1:
// pet talent points
break;
case 2:
obj.ToUnit().RemoveVisFlags((UnitVisFlags)e.Action.setunitByte.byte1);
break;
case 3:
obj.ToUnit().SetAnimTier((UnitBytes1Flags)(obj.ToUnit().m_unitData.AnimTier & ~e.Action.setunitByte.byte1), false);
break;
}
}
break; break;
} }
case SmartActions.InterruptSpell: case SmartActions.InterruptSpell:
@@ -1981,7 +2015,7 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsUnit(obj)) if (IsUnit(obj))
obj.ToUnit().SetUInt32Value(ObjectFields.DynamicFlags, e.Action.unitFlag.flag); obj.ToUnit().SetDynamicFlags((UnitDynFlags)e.Action.unitFlag.flag);
break; break;
} }
case SmartActions.AddDynamicFlag: case SmartActions.AddDynamicFlag:
@@ -1992,7 +2026,7 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsUnit(obj)) if (IsUnit(obj))
obj.ToUnit().SetFlag(ObjectFields.DynamicFlags, e.Action.unitFlag.flag); obj.ToUnit().AddDynamicFlag((UnitDynFlags)e.Action.unitFlag.flag);
break; break;
} }
case SmartActions.RemoveDynamicFlag: case SmartActions.RemoveDynamicFlag:
@@ -2003,7 +2037,7 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsUnit(obj)) if (IsUnit(obj))
obj.ToUnit().RemoveFlag(ObjectFields.DynamicFlags, e.Action.unitFlag.flag); obj.ToUnit().RemoveDynamicFlag((UnitDynFlags)e.Action.unitFlag.flag);
break; break;
} }
case SmartActions.JumpToPos: case SmartActions.JumpToPos:
@@ -2163,7 +2197,7 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsGameObject(obj)) if (IsGameObject(obj))
obj.ToGameObject().SetUInt32Value(GameObjectFields.Flags, e.Action.goFlag.flag); obj.ToGameObject().SetFlags((GameObjectFlags)e.Action.goFlag.flag);
break; break;
} }
case SmartActions.AddGoFlag: case SmartActions.AddGoFlag:
@@ -2174,7 +2208,7 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsGameObject(obj)) if (IsGameObject(obj))
obj.ToGameObject().SetFlag(GameObjectFields.Flags, e.Action.goFlag.flag); obj.ToGameObject().AddFlag((GameObjectFlags)e.Action.goFlag.flag);
break; break;
} }
case SmartActions.RemoveGoFlag: case SmartActions.RemoveGoFlag:
@@ -2185,7 +2219,7 @@ namespace Game.AI
foreach (var obj in targets) foreach (var obj in targets)
if (IsGameObject(obj)) if (IsGameObject(obj))
obj.ToGameObject().RemoveFlag(GameObjectFields.Flags, e.Action.goFlag.flag); obj.ToGameObject().RemoveFlag((GameObjectFlags)e.Action.goFlag.flag);
break; break;
} }
case SmartActions.SummonCreatureGroup: case SmartActions.SummonCreatureGroup:
@@ -514,7 +514,7 @@ namespace Game.Achievements
//! Since no common attributes were found, (not even in titleRewardFlags field) //! Since no common attributes were found, (not even in titleRewardFlags field)
//! we explicitly check by ID. Maybe in the future we could move the achievement_reward //! we explicitly check by ID. Maybe in the future we could move the achievement_reward
//! condition fields to the condition system. //! condition fields to the condition system.
uint titleId = reward.TitleId[achievement.Id == 1793 ? _owner.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender) : (_owner.GetTeam() == Team.Alliance ? 0 : 1)]; uint titleId = reward.TitleId[achievement.Id == 1793 ? _owner.m_playerData.NativeSex : (_owner.GetTeam() == Team.Alliance ? 0 : 1)];
if (titleId != 0) if (titleId != 0)
{ {
CharTitlesRecord titleEntry = CliDB.CharTitlesStorage.LookupByKey(titleId); CharTitlesRecord titleEntry = CliDB.CharTitlesStorage.LookupByKey(titleId);
+4 -4
View File
@@ -284,7 +284,7 @@ namespace Game.Achievements
SetCriteriaProgress(criteria, referencePlayer.GetReputationMgr().GetVisibleFactionCount(), referencePlayer); SetCriteriaProgress(criteria, referencePlayer.GetReputationMgr().GetVisibleFactionCount(), referencePlayer);
break; break;
case CriteriaTypes.EarnHonorableKill: case CriteriaTypes.EarnHonorableKill:
SetCriteriaProgress(criteria, referencePlayer.GetUInt32Value(ActivePlayerFields.LifetimeHonorableKills), referencePlayer); SetCriteriaProgress(criteria, referencePlayer.m_activePlayerData.LifetimeHonorableKills, referencePlayer);
break; break;
case CriteriaTypes.HighestGoldValueOwned: case CriteriaTypes.HighestGoldValueOwned:
SetCriteriaProgress(criteria, referencePlayer.GetMoney(), referencePlayer, ProgressType.Highest); SetCriteriaProgress(criteria, referencePlayer.GetMoney(), referencePlayer, ProgressType.Highest);
@@ -1063,12 +1063,12 @@ namespace Game.Achievements
if (area.AreaBit < 0) if (area.AreaBit < 0)
continue; continue;
int playerIndexOffset = (int)((uint)area.AreaBit / 32); int playerIndexOffset = (int)((uint)area.AreaBit / 64);
if (playerIndexOffset >= PlayerConst.ExploredZonesSize) if (playerIndexOffset >= PlayerConst.ExploredZonesSize)
continue; continue;
uint mask = 1u << (int)((uint)area.AreaBit % 32); ulong mask = 1ul << (int)((uint)area.AreaBit % 64);
if (Convert.ToBoolean(referencePlayer.GetUInt32Value(ActivePlayerFields.ExploredZones + playerIndexOffset) & mask)) if (Convert.ToBoolean(referencePlayer.m_activePlayerData.ExploredZones[playerIndexOffset] & mask))
{ {
matchFound = true; matchFound = true;
break; break;
+1 -1
View File
@@ -29,7 +29,7 @@ namespace Game.Arenas
TeamId = (int)(team == Team.Alliance ? BattlegroundTeamId.Alliance : BattlegroundTeamId.Horde); TeamId = (int)(team == Team.Alliance ? BattlegroundTeamId.Alliance : BattlegroundTeamId.Horde);
} }
public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData)
{ {
base.BuildPvPLogPlayerDataPacket(out playerData); base.BuildPvPLogPlayerDataPacket(out playerData);
+1 -33
View File
@@ -555,38 +555,6 @@ namespace Game
string name = proto.GetName(player.GetSession().GetSessionDbcLocale()); string name = proto.GetName(player.GetSession().GetSessionDbcLocale());
if (string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(name))
continue; continue;
// DO NOT use GetItemEnchantMod(proto.RandomProperty) as it may return a result
// that matches the search but it may not equal item.GetItemRandomPropertyId()
// used in BuildAuctionInfo() which then causes wrong items to be listed
int propRefID = item.GetItemRandomPropertyId();
if (propRefID != 0)
{
string suffix = null;
// Append the suffix to the name (ie: of the Monkey) if one exists
// These are found in ItemRandomProperties.dbc, not ItemRandomSuffix.dbc
// even though the DBC names seem misleading
if (propRefID < 0)
{
ItemRandomSuffixRecord itemRandSuffix = CliDB.ItemRandomSuffixStorage.LookupByKey(-propRefID);
if (itemRandSuffix != null)
suffix = itemRandSuffix.Name[player.GetSession().GetSessionDbcLocale()];
}
else
{
ItemRandomPropertiesRecord itemRandProp = CliDB.ItemRandomPropertiesStorage.LookupByKey(propRefID);
if (itemRandProp != null)
suffix = itemRandProp.Name[player.GetSession().GetSessionDbcLocale()];
}
// dbc local name
if (!string.IsNullOrEmpty(suffix))
{
// Append the suffix (ie: of the Monkey) to the name using localization
// or default enUS if localization is invalid
name += ' ' + suffix;
}
}
} }
// Add the item if no search term or if entered search term was found // Add the item if no search term or if entered search term was found
@@ -645,7 +613,7 @@ namespace Game
} }
byte i = 0; byte i = 0;
foreach (ItemDynamicFieldGems gemData in item.GetGems()) foreach (SocketedGem gemData in item.m_itemData.Gems)
{ {
if (gemData.ItemId != 0) if (gemData.ItemId != 0)
{ {
+3 -3
View File
@@ -501,7 +501,7 @@ namespace Game.BattleFields
{ {
creature.CombatStop(); creature.CombatStop();
creature.SetReactState(ReactStates.Passive); creature.SetReactState(ReactStates.Passive);
creature.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); creature.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable);
creature.DisappearAndDie(); creature.DisappearAndDie();
creature.SetVisible(false); creature.SetVisible(false);
} }
@@ -509,14 +509,14 @@ namespace Game.BattleFields
public void ShowNpc(Creature creature, bool aggressive) public void ShowNpc(Creature creature, bool aggressive)
{ {
creature.SetVisible(true); creature.SetVisible(true);
creature.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); creature.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable);
if (!creature.IsAlive()) if (!creature.IsAlive())
creature.Respawn(true); creature.Respawn(true);
if (aggressive) if (aggressive)
creature.SetReactState(ReactStates.Aggressive); creature.SetReactState(ReactStates.Aggressive);
else else
{ {
creature.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable); creature.AddUnitFlag(UnitFlags.NonAttackable);
creature.SetReactState(ReactStates.Passive); creature.SetReactState(ReactStates.Passive);
} }
} }
@@ -187,7 +187,7 @@ namespace Game.BattleFields
// Update faction of relic, only attacker can click on // Update faction of relic, only attacker can click on
relic.SetFaction(WGConst.WintergraspFaction[GetAttackerTeam()]); relic.SetFaction(WGConst.WintergraspFaction[GetAttackerTeam()]);
// Set in use (not allow to click on before last door is broken) // Set in use (not allow to click on before last door is broken)
relic.SetFlag(GameObjectFields.Flags, GameObjectFlags.InUse | GameObjectFlags.NotSelectable); relic.AddFlag(GameObjectFlags.InUse | GameObjectFlags.NotSelectable);
m_titansRelicGUID = relic.GetGUID(); m_titansRelicGUID = relic.GetGUID();
} }
else else
@@ -1157,7 +1157,7 @@ namespace Game.BattleFields
} }
_wg.SetRelicInteractible(true); _wg.SetRelicInteractible(true);
if (_wg.GetRelic()) if (_wg.GetRelic())
_wg.GetRelic().RemoveFlag(GameObjectFields.Flags, GameObjectFlags.InUse | GameObjectFlags.NotSelectable); _wg.GetRelic().RemoveFlag(GameObjectFlags.InUse | GameObjectFlags.NotSelectable);
else else
Log.outError(LogFilter.Server, "BattlefieldWG: Titan Relic not found."); Log.outError(LogFilter.Server, "BattlefieldWG: Titan Relic not found.");
break; break;
+7 -13
View File
@@ -426,7 +426,7 @@ namespace Game.BattleGrounds
player.SendPacket(battlefieldStatus); player.SendPacket(battlefieldStatus);
// Correctly display EnemyUnitFrame // Correctly display EnemyUnitFrame
player.SetByteValue(PlayerFields.Bytes4, 3, (byte)player.GetBGTeam()); player.SetArenaFaction((byte)player.GetBGTeam());
player.RemoveAurasDueToSpell(BattlegroundConst.SpellArenaPreparation); player.RemoveAurasDueToSpell(BattlegroundConst.SpellArenaPreparation);
player.ResetAllPowers(); player.ResetAllPowers();
@@ -974,7 +974,7 @@ namespace Game.BattleGrounds
public virtual void AddPlayer(Player player) public virtual void AddPlayer(Player player)
{ {
// remove afk from player // remove afk from player
if (player.HasFlag(PlayerFields.Flags, PlayerFlags.AFK)) if (player.isAFK())
player.ToggleAFK(); player.ToggleAFK();
// score struct must be created in inherited class // score struct must be created in inherited class
@@ -985,7 +985,7 @@ namespace Game.BattleGrounds
BattlegroundPlayer bp = new BattlegroundPlayer(); BattlegroundPlayer bp = new BattlegroundPlayer();
bp.OfflineRemoveTime = 0; bp.OfflineRemoveTime = 0;
bp.Team = team; bp.Team = team;
bp.ActiveSpec = player.GetInt32Value(PlayerFields.CurrentSpecId); bp.ActiveSpec = (int)player.GetPrimarySpecialization();
// Add to list/maps // Add to list/maps
m_Players[guid] = bp; m_Players[guid] = bp;
@@ -1221,12 +1221,9 @@ namespace Game.BattleGrounds
{ {
pvpLogData = new PVPLogData(); pvpLogData = new PVPLogData();
if (GetStatus() == BattlegroundStatus.WaitLeave)
pvpLogData.Winner.Set((byte)GetWinner());
foreach (var score in PlayerScores) foreach (var score in PlayerScores)
{ {
PVPLogData.PlayerData playerData; PVPLogData.PVPMatchPlayerStatistics playerData;
score.Value.BuildPvPLogPlayerDataPacket(out playerData); score.Value.BuildPvPLogPlayerDataPacket(out playerData);
@@ -1234,14 +1231,14 @@ namespace Game.BattleGrounds
if (player) if (player)
{ {
playerData.IsInWorld = true; playerData.IsInWorld = true;
playerData.PrimaryTalentTree = (int)player.GetUInt32Value(PlayerFields.CurrentSpecId); playerData.PrimaryTalentTree = (int)player.GetPrimarySpecialization();
playerData.Sex = (int)player.GetGender(); playerData.Sex = (int)player.GetGender();
playerData.PlayerRace = player.GetRace(); playerData.PlayerRace = player.GetRace();
playerData.PlayerClass = (int)player.GetClass(); playerData.PlayerClass = (int)player.GetClass();
playerData.HonorLevel = (int)player.GetHonorLevel(); playerData.HonorLevel = (int)player.GetHonorLevel();
} }
pvpLogData.Players.Add(playerData); pvpLogData.Statistics.Add(playerData);
} }
pvpLogData.PlayerCount[(int)BattlegroundTeamId.Horde] = (sbyte)GetPlayersCountByTeam(Team.Horde); pvpLogData.PlayerCount[(int)BattlegroundTeamId.Horde] = (sbyte)GetPlayersCountByTeam(Team.Horde);
@@ -1534,9 +1531,6 @@ namespace Game.BattleGrounds
// casting visual effect // casting visual effect
creature.SetChannelSpellId(BattlegroundConst.SpellSpiritHealChannel); creature.SetChannelSpellId(BattlegroundConst.SpellSpiritHealChannel);
creature.SetChannelSpellXSpellVisualId(BattlegroundConst.SpellSpiritHealChannelVisual); creature.SetChannelSpellXSpellVisualId(BattlegroundConst.SpellSpiritHealChannelVisual);
// correct cast speed
creature.SetFloatValue(UnitFields.ModCastSpeed, 1.0f);
creature.SetFloatValue(UnitFields.ModCastHaste, 1.0f);
//creature.CastSpell(creature, SPELL_SPIRIT_HEAL_CHANNEL, true); //creature.CastSpell(creature, SPELL_SPIRIT_HEAL_CHANNEL, true);
return true; return true;
} }
@@ -1649,7 +1643,7 @@ namespace Game.BattleGrounds
if (!isArena()) if (!isArena())
{ {
// To be able to remove insignia -- ONLY IN Battlegrounds // To be able to remove insignia -- ONLY IN Battlegrounds
victim.SetFlag(UnitFields.Flags, UnitFlags.Skinnable); victim.AddUnitFlag(UnitFlags.Skinnable);
RewardXPAtKill(killer, victim); RewardXPAtKill(killer, victim);
} }
} }
@@ -702,7 +702,7 @@ namespace Game.BattleGrounds
CreatureTemplate cInfo = Global.ObjectMgr.GetCreatureTemplate(entry); CreatureTemplate cInfo = Global.ObjectMgr.GetCreatureTemplate(entry);
if (cInfo != null) if (cInfo != null)
{ {
if (!cInfo.Npcflag.HasAnyFlag(NPCFlags.BattleMaster)) if (!cInfo.Npcflag.HasAnyFlag((uint)NPCFlags.BattleMaster))
Log.outError(LogFilter.Sql, "Creature (Entry: {0}) listed in `battlemaster_entry` is not a battlemaster.", entry); Log.outError(LogFilter.Sql, "Creature (Entry: {0}) listed in `battlemaster_entry` is not a battlemaster.", entry);
} }
else else
@@ -733,10 +733,10 @@ namespace Game.BattleGrounds
var templates = Global.ObjectMgr.GetCreatureTemplates(); var templates = Global.ObjectMgr.GetCreatureTemplates();
foreach (var creature in templates) foreach (var creature in templates)
{ {
if (creature.Value.Npcflag.HasAnyFlag(NPCFlags.BattleMaster) && !mBattleMastersMap.ContainsKey(creature.Value.Entry)) if (creature.Value.Npcflag.HasAnyFlag((uint)NPCFlags.BattleMaster) && !mBattleMastersMap.ContainsKey(creature.Value.Entry))
{ {
Log.outError(LogFilter.Sql, "CreatureTemplate (Entry: {0}) has UNIT_NPC_FLAG_BATTLEMASTER but no data in `battlemaster_entry` table. Removing flag!", creature.Value.Entry); Log.outError(LogFilter.Sql, "CreatureTemplate (Entry: {0}) has UNIT_NPC_FLAG_BATTLEMASTER but no data in `battlemaster_entry` table. Removing flag!", creature.Value.Entry);
templates[creature.Key].Npcflag &= ~NPCFlags.BattleMaster; templates[creature.Key].Npcflag &= ~(uint)NPCFlags.BattleMaster;
} }
} }
} }
@@ -57,9 +57,9 @@ namespace Game.BattleGrounds
} }
} }
public virtual void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) public virtual void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData)
{ {
playerData = new PVPLogData.PlayerData(); playerData = new PVPLogData.PVPMatchPlayerStatistics();
playerData.PlayerGUID = PlayerGuid; playerData.PlayerGUID = PlayerGuid;
playerData.Kills = KillingBlows; playerData.Kills = KillingBlows;
playerData.Faction = (byte)TeamId; playerData.Faction = (byte)TeamId;
@@ -833,7 +833,7 @@ namespace Game.BattleGrounds.Zones
} }
} }
public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData)
{ {
base.BuildPvPLogPlayerDataPacket(out playerData); base.BuildPvPLogPlayerDataPacket(out playerData);
@@ -999,7 +999,7 @@ namespace Game.BattleGrounds.Zones
} }
} }
public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData)
{ {
base.BuildPvPLogPlayerDataPacket(out playerData); base.BuildPvPLogPlayerDataPacket(out playerData);
@@ -689,9 +689,9 @@ namespace Game.BattleGrounds.Zones
if (dem) if (dem)
{ {
if (start) if (start)
dem.SetFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); dem.AddUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable);
else else
dem.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable); dem.RemoveUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable);
} }
} }
} }
@@ -768,9 +768,9 @@ namespace Game.BattleGrounds.Zones
if (go) if (go)
{ {
if (CanInteractWithObject(objectId)) if (CanInteractWithObject(objectId))
go.RemoveFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); go.RemoveFlag(GameObjectFlags.NotSelectable);
else else
go.SetFlag(GameObjectFields.Flags, GameObjectFlags.NotSelectable); go.AddFlag(GameObjectFlags.NotSelectable);
} }
} }
@@ -1153,7 +1153,7 @@ namespace Game.BattleGrounds.Zones
} }
} }
public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData)
{ {
base.BuildPvPLogPlayerDataPacket(out playerData); base.BuildPvPLogPlayerDataPacket(out playerData);
@@ -966,7 +966,7 @@ namespace Game.BattleGrounds.Zones
} }
} }
public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PlayerData playerData) public override void BuildPvPLogPlayerDataPacket(out PVPLogData.PVPMatchPlayerStatistics playerData)
{ {
base.BuildPvPLogPlayerDataPacket(out playerData); base.BuildPvPLogPlayerDataPacket(out playerData);
+3 -3
View File
@@ -406,7 +406,7 @@ namespace Game.BattlePets
return; return;
// TODO: set proper CreatureID for spell DEFAULT_SUMMON_BATTLE_PET_SPELL (default EffectMiscValueA is 40721 - Murkimus the Gladiator) // TODO: set proper CreatureID for spell DEFAULT_SUMMON_BATTLE_PET_SPELL (default EffectMiscValueA is 40721 - Murkimus the Gladiator)
_owner.GetPlayer().SetGuidValue(ActivePlayerFields.SummonedBattlePetId, guid); _owner.GetPlayer().SetSummonedBattlePetGUID(guid);
_owner.GetPlayer().CastSpell(_owner.GetPlayer(), speciesEntry.SummonSpellID != 0 ? speciesEntry.SummonSpellID : SharedConst.DefaultSummonBattlePetSpell); _owner.GetPlayer().CastSpell(_owner.GetPlayer(), speciesEntry.SummonSpellID != 0 ? speciesEntry.SummonSpellID : SharedConst.DefaultSummonBattlePetSpell);
// TODO: set pet level, quality... update fields // TODO: set pet level, quality... update fields
@@ -416,10 +416,10 @@ namespace Game.BattlePets
{ {
Player ownerPlayer = _owner.GetPlayer(); Player ownerPlayer = _owner.GetPlayer();
Creature pet = ObjectAccessor.GetCreatureOrPetOrVehicle(ownerPlayer, ownerPlayer.GetCritterGUID()); Creature pet = ObjectAccessor.GetCreatureOrPetOrVehicle(ownerPlayer, ownerPlayer.GetCritterGUID());
if (pet && ownerPlayer.GetGuidValue(ActivePlayerFields.SummonedBattlePetId) == pet.GetGuidValue(UnitFields.BattlePetCompanionGuid)) if (pet && ownerPlayer.m_activePlayerData.SummonedBattlePetGUID == pet.GetBattlePetCompanionGUID())
{ {
pet.DespawnOrUnsummon(); pet.DespawnOrUnsummon();
ownerPlayer.SetGuidValue(ActivePlayerFields.SummonedBattlePetId, ObjectGuid.Empty); ownerPlayer.SetSummonedBattlePetGUID(ObjectGuid.Empty);
} }
} }
+1 -1
View File
@@ -546,7 +546,7 @@ namespace Game
Player invitee = Global.ObjAccessor.FindPlayer(inviteeGuid); Player invitee = Global.ObjAccessor.FindPlayer(inviteeGuid);
uint inviteeLevel = invitee ? invitee.getLevel() : Player.GetLevelFromDB(inviteeGuid); uint inviteeLevel = invitee ? invitee.getLevel() : Player.GetLevelFromDB(inviteeGuid);
uint inviteeGuildId = invitee ? invitee.GetGuildId() : Player.GetGuildIdFromDB(inviteeGuid); ulong inviteeGuildId = invitee ? invitee.GetGuildId() : Player.GetGuildIdFromDB(inviteeGuid);
CalendarEventInviteInfo inviteInfo = new CalendarEventInviteInfo(); CalendarEventInviteInfo inviteInfo = new CalendarEventInviteInfo();
inviteInfo.Guid = inviteeGuid; inviteInfo.Guid = inviteeGuid;
@@ -65,9 +65,9 @@ namespace Game.Chat
LocaleConstant localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale); LocaleConstant localeIdx = Global.WorldMgr.GetAvailableDbcLocale(locale);
ChannelNotifyJoined notify = new ChannelNotifyJoined(); ChannelNotifyJoined notify = new ChannelNotifyJoined();
//notify->ChannelWelcomeMsg = ""; //notify.ChannelWelcomeMsg = "";
notify.ChatChannelID = (int)_source.GetChannelId(); notify.ChatChannelID = (int)_source.GetChannelId();
//notify->InstanceID = 0; //notify.InstanceID = 0;
notify.ChannelFlags = _source.GetFlags(); notify.ChannelFlags = _source.GetFlags();
notify.Channel = _source.GetName(localeIdx); notify.Channel = _source.GetName(localeIdx);
return notify; return notify;
+2 -2
View File
@@ -750,7 +750,7 @@ namespace Game.Chat
var ipBytes = System.Net.IPAddress.Parse(handler.GetSession().GetRemoteAddress()).GetAddressBytes(); var ipBytes = System.Net.IPAddress.Parse(handler.GetSession().GetRemoteAddress()).GetAddressBytes();
Array.Reverse(ipBytes); Array.Reverse(ipBytes);
PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_LOGON_COUNTRY); /*PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_LOGON_COUNTRY);
stmt.AddValue(0, BitConverter.ToUInt32(ipBytes, 0)); stmt.AddValue(0, BitConverter.ToUInt32(ipBytes, 0));
SQLResult result = DB.Login.Query(stmt); SQLResult result = DB.Login.Query(stmt);
@@ -767,7 +767,7 @@ namespace Game.Chat
{ {
handler.SendSysMessage("[IP2NATION] Table empty"); handler.SendSysMessage("[IP2NATION] Table empty");
Log.outDebug(LogFilter.Server, "[IP2NATION] Table empty"); Log.outDebug(LogFilter.Server, "[IP2NATION] Table empty");
} }*/
} }
else if (param == "off") else if (param == "off")
{ {
@@ -285,7 +285,8 @@ namespace Game.Chat.Commands
} }
[CommandGroup("lock", RBACPermissions.CommandBnetAccount, true)] [CommandGroup("lock", RBACPermissions.CommandBnetAccount, true)]
class LockCommands { class LockCommands
{
[Command("country", RBACPermissions.CommandBnetAccountLockCountry, true)] [Command("country", RBACPermissions.CommandBnetAccountLockCountry, true)]
static bool HandleLockCountryCommand(StringArguments args, CommandHandler handler) static bool HandleLockCountryCommand(StringArguments args, CommandHandler handler)
{ {
@@ -300,7 +301,7 @@ namespace Game.Chat.Commands
{ {
if (param == "on") if (param == "on")
{ {
PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_LOGON_COUNTRY); /*PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_LOGON_COUNTRY);
var ipBytes = System.Net.IPAddress.Parse(handler.GetSession().GetRemoteAddress()).GetAddressBytes(); var ipBytes = System.Net.IPAddress.Parse(handler.GetSession().GetRemoteAddress()).GetAddressBytes();
Array.Reverse(ipBytes); Array.Reverse(ipBytes);
stmt.AddValue(0, BitConverter.ToUInt32(ipBytes, 0)); stmt.AddValue(0, BitConverter.ToUInt32(ipBytes, 0));
@@ -318,7 +319,7 @@ namespace Game.Chat.Commands
{ {
handler.SendSysMessage("[IP2NATION] Table empty"); handler.SendSysMessage("[IP2NATION] Table empty");
Log.outDebug(LogFilter.Server, "[IP2NATION] Table empty"); Log.outDebug(LogFilter.Server, "[IP2NATION] Table empty");
} }*/
} }
else if (param == "off") else if (param == "off")
{ {
@@ -52,7 +52,7 @@ namespace Game.Chat
if (string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(name))
continue; continue;
string activeStr = target.GetUInt32Value(PlayerFields.ChosenTitle) == titleInfo.MaskID string activeStr = target.m_playerData.PlayerTitle == titleInfo.MaskID
? handler.GetCypherString(CypherStrings.Active) : ""; ? handler.GetCypherString(CypherStrings.Active) : "";
string titleNameStr = string.Format(name.ConvertFormatSyntax(), targetName); string titleNameStr = string.Format(name.ConvertFormatSyntax(), targetName);
@@ -600,7 +600,7 @@ namespace Game.Chat
if (!int.TryParse(daysStr, out keepDays) || keepDays < 0) if (!int.TryParse(daysStr, out keepDays) || keepDays < 0)
return false; return false;
} }
// config option value 0 -> disabled and can't be used // config option value 0 . disabled and can't be used
else if (keepDays <= 0) else if (keepDays <= 0)
return false; return false;
@@ -777,7 +777,7 @@ namespace Game.Chat
{ {
player.GiveLevel((uint)newLevel); player.GiveLevel((uint)newLevel);
player.InitTalentForLevel(); player.InitTalentForLevel();
player.SetUInt32Value(ActivePlayerFields.Xp, 0); player.SetXP(0);
if (handler.needReportToTarget(player)) if (handler.needReportToTarget(player))
{ {
+2 -2
View File
@@ -245,9 +245,9 @@ namespace Game.Chat.Commands
for (ushort i = 0; i < PlayerConst.ExploredZonesSize; ++i) for (ushort i = 0; i < PlayerConst.ExploredZonesSize; ++i)
{ {
if (flag != 0) if (flag != 0)
handler.GetSession().GetPlayer().SetFlag(ActivePlayerFields.ExploredZones + i, 0xFFFFFFFF); handler.GetSession().GetPlayer().AddExploredZones(i, 0xFFFFFFFFFFFFFFFF);
else else
handler.GetSession().GetPlayer().SetFlag(ActivePlayerFields.ExploredZones + i, 0); handler.GetSession().GetPlayer().RemoveExploredZones(i, 0xFFFFFFFFFFFFFFFF);
} }
return true; return true;
-237
View File
@@ -435,78 +435,6 @@ namespace Game.Chat
return true; return true;
} }
[Command("getitemvalue", RBACPermissions.CommandDebugGetitemvalue)]
static bool HandleDebugGetItemValueCommand(StringArguments args, CommandHandler handler)
{
if (args.Empty())
return false;
if (!ulong.TryParse(args.NextString(), out ulong guid))
return false;
if (!uint.TryParse(args.NextString(), out uint index))
return false;
Item item = handler.GetSession().GetPlayer().GetItemByGuid(ObjectGuid.Create(HighGuid.Item, guid));
if (!item)
return false;
if (index >= item.valuesCount)
return false;
uint value = item.GetUInt32Value(index);
handler.SendSysMessage("Item {0}: value at {1} is {2}", guid, index, value);
return true;
}
[Command("getvalue", RBACPermissions.CommandDebugGetvalue)]
static bool HandleDebugGetValueCommand(StringArguments args, CommandHandler handler)
{
if (args.Empty())
return false;
string fieldStr = args.NextString();
string valueStr = args.NextString();
if (string.IsNullOrEmpty(fieldStr))
return false;
Unit target = handler.getSelectedUnit();
if (!target)
{
handler.SendSysMessage(CypherStrings.SelectCharOrCreature);
return false;
}
if (!uint.TryParse(fieldStr, out uint field))
return false;
ObjectGuid guid = target.GetGUID();
if (field >= target.valuesCount)
{
handler.SendSysMessage(CypherStrings.TooBigIndex, field, guid.ToString(), target.valuesCount);
return false;
}
if (!bool.TryParse(valueStr, out bool isInt32))
isInt32 = true;
if (isInt32)
{
uint value = target.GetUInt32Value(field);
handler.SendSysMessage(CypherStrings.GetUintField, guid.ToString(), field, value);
}
else
{
float value = target.GetFloatValue(field);
handler.SendSysMessage(CypherStrings.GetFloatField, guid.ToString(), field, value);
}
return true;
}
[Command("hostil", RBACPermissions.CommandDebugHostil)] [Command("hostil", RBACPermissions.CommandDebugHostil)]
static bool HandleDebugHostileRefListCommand(StringArguments args, CommandHandler handler) static bool HandleDebugHostileRefListCommand(StringArguments args, CommandHandler handler)
{ {
@@ -570,31 +498,6 @@ namespace Game.Chat
return true; return true;
} }
[Command("Mod32Value", RBACPermissions.CommandDebugMod32value)]
static bool HandleDebugMod32ValueCommand(StringArguments args, CommandHandler handler)
{
if (args.Empty())
return false;
uint field = args.NextUInt32();
int value = args.NextInt32();
if (field >= handler.GetSession().GetPlayer().valuesCount)
{
handler.SendSysMessage(CypherStrings.TooBigIndex, field, handler.GetSession().GetPlayer().GetGUID().ToString(), handler.GetSession().GetPlayer().valuesCount);
return false;
}
uint currentValue = handler.GetSession().GetPlayer().GetUInt32Value(field);
currentValue += (uint)value;
handler.GetSession().GetPlayer().SetUInt32Value(field, currentValue);
handler.SendSysMessage(CypherStrings.Change32bitField, field, currentValue);
return true;
}
[Command("moveflags", RBACPermissions.CommandDebugMoveflags)] [Command("moveflags", RBACPermissions.CommandDebugMoveflags)]
static bool HandleDebugMoveflagsCommand(StringArguments args, CommandHandler handler) static bool HandleDebugMoveflagsCommand(StringArguments args, CommandHandler handler)
{ {
@@ -794,103 +697,6 @@ namespace Game.Chat
return true; return true;
} }
[Command("setbit", RBACPermissions.CommandDebugSetbit)]
static bool HandleDebugSet32BitCommand(StringArguments args, CommandHandler handler)
{
if (args.Empty())
return false;
WorldObject target = handler.GetSelectedObject();
if (!target)
{
handler.SendSysMessage(CypherStrings.SelectCharOrCreature);
return false;
}
uint field = args.NextUInt32();
uint val = args.NextUInt32();
if (val > 32) //uint = 32 bits
return false;
uint value = (uint)(val != 0 ? 1 << ((int)val - 1) : 0);
target.SetUInt32Value(field, value);
handler.SendSysMessage(CypherStrings.Set32bitField, field, value);
return true;
}
[Command("setitemvalue", RBACPermissions.CommandDebugSetitemvalue)]
static bool HandleDebugSetItemValueCommand(StringArguments args, CommandHandler handler)
{
if (args.Empty())
return false;
if (!ulong.TryParse(args.NextString(), out ulong guid))
return false;
if (!uint.TryParse(args.NextString(), out uint index))
return false;
if (!uint.TryParse(args.NextString(), out uint value))
return false;
Item item = handler.GetSession().GetPlayer().GetItemByGuid(ObjectGuid.Create(HighGuid.Item, guid));
if (!item)
return false;
if (index >= item.valuesCount)
return false;
item.SetUInt32Value(index, value);
return true;
}
[Command("setvalue", RBACPermissions.CommandDebugSetvalue)]
static bool HandleDebugSetValueCommand(StringArguments args, CommandHandler handler)
{
if (args.Empty())
return false;
WorldObject target = handler.GetSelectedObject();
if (!target)
{
handler.SendSysMessage(CypherStrings.SelectCharOrCreature);
return false;
}
ObjectGuid guid = target.GetGUID();
uint field = args.NextUInt32();
if (field >= target.valuesCount)
{
handler.SendSysMessage(CypherStrings.TooBigIndex, field, guid.ToString(), target.valuesCount);
return false;
}
string valueStr = args.NextString();
if (!bool.TryParse(args.NextString(), out bool isInt32))
isInt32 = true;
if (isInt32)
{
if (!uint.TryParse(valueStr, out uint value))
return false;
target.SetUInt32Value(field, value);
handler.SendSysMessage(CypherStrings.SetUintField, guid.ToString(), field, value);
}
else
{
if (!float.TryParse(valueStr, out float value))
return false;
target.SetFloatValue(field, value);
handler.SendSysMessage(CypherStrings.SetFloatField, guid.ToString(), field, value);
}
return true;
}
[Command("setvid", RBACPermissions.CommandDebugSetvid)] [Command("setvid", RBACPermissions.CommandDebugSetvid)]
static bool HandleDebugSetVehicleIdCommand(StringArguments args, CommandHandler handler) static bool HandleDebugSetVehicleIdCommand(StringArguments args, CommandHandler handler)
{ {
@@ -992,49 +798,6 @@ namespace Game.Chat
return true; return true;
} }
[Command("update", RBACPermissions.CommandDebugUpdate)]
static bool HandleDebugUpdateCommand(StringArguments args, CommandHandler handler)
{
if (args.Empty())
return false;
Unit unit = handler.getSelectedUnit();
if (!unit)
{
handler.SendSysMessage(CypherStrings.SelectCharOrCreature);
return false;
}
uint updateIndex = args.NextUInt32();
//check updateIndex
if (unit.IsTypeId(TypeId.Player))
{
if (updateIndex >= (int)PlayerFields.End)
return true;
}
else if (updateIndex >= (int)UnitFields.End)
return true;
uint value;
string valueStr = args.NextString();
if (string.IsNullOrEmpty(valueStr))
{
value = unit.GetUInt32Value(updateIndex);
handler.SendSysMessage(CypherStrings.Update, unit.GetGUID().ToString(), updateIndex, value);
return true;
}
if (!uint.TryParse(valueStr, out value))
return false;
handler.SendSysMessage(CypherStrings.UpdateChange, unit.GetGUID().ToString(), updateIndex, value);
unit.SetUInt32Value(updateIndex, value);
return true;
}
[Command("uws", RBACPermissions.CommandDebugUws)] [Command("uws", RBACPermissions.CommandDebugUws)]
static bool HandleDebugUpdateWorldStateCommand(StringArguments args, CommandHandler handler) static bool HandleDebugUpdateWorldStateCommand(StringArguments args, CommandHandler handler)
{ {
@@ -625,19 +625,34 @@ namespace Game.Chat
if (string.IsNullOrEmpty(state)) if (string.IsNullOrEmpty(state))
return false; return false;
if (!int.TryParse(state, out int objectState)) if (!uint.TryParse(state, out uint objectState))
return false; return false;
if (objectType < 4) switch (objectType)
obj.SetByteValue(GameObjectFields.Bytes1, (byte)objectType, (byte)objectState);
else if (objectType == 4)
obj.SendCustomAnim((uint)objectState);
else if (objectType == 5)
{ {
if (objectState < 0 || objectState > (uint)GameObjectDestructibleState.Rebuilding) case 0:
return false; obj.SetGoState((GameObjectState)objectState);
break;
case 1:
obj.SetGoType((GameObjectTypes)objectState);
break;
case 2:
obj.SetGoArtKit((byte)objectState);
break;
case 3:
obj.SetGoAnimProgress(objectState);
break;
case 4:
obj.SendCustomAnim(objectState);
break;
case 5:
if (objectState < 0 || objectState > (uint)GameObjectDestructibleState.Rebuilding)
return false;
obj.SetDestructibleState((GameObjectDestructibleState)objectState); obj.SetDestructibleState((GameObjectDestructibleState)objectState);
break;
default:
break;
} }
handler.SendSysMessage("Set gobject type {0} state {1}", objectType, objectState); handler.SendSysMessage("Set gobject type {0} state {1}", objectType, objectState);
+1 -1
View File
@@ -103,7 +103,7 @@ namespace Game.Chat
if (!handler.extractPlayerTarget(args, out target, out targetGuid)) if (!handler.extractPlayerTarget(args, out target, out targetGuid))
return false; return false;
uint guildId = target != null ? target.GetGuildId() : Player.GetGuildIdFromDB(targetGuid); ulong guildId = target != null ? target.GetGuildId() : Player.GetGuildIdFromDB(targetGuid);
if (guildId == 0) if (guildId == 0)
return false; return false;
+1 -1
View File
@@ -834,7 +834,7 @@ namespace Game.Chat
string knownStr = target && target.HasTitle(titleInfo) ? handler.GetCypherString(CypherStrings.Known) : ""; string knownStr = target && target.HasTitle(titleInfo) ? handler.GetCypherString(CypherStrings.Known) : "";
string activeStr = target && target.GetUInt32Value(PlayerFields.ChosenTitle) == titleInfo.MaskID string activeStr = target && target.m_playerData.PlayerTitle == titleInfo.MaskID
? handler.GetCypherString(CypherStrings.Active) : ""; ? handler.GetCypherString(CypherStrings.Active) : "";
string titleNameStr = string.Format(name.ConvertFormatSyntax(), targetName); string titleNameStr = string.Format(name.ConvertFormatSyntax(), targetName);
+13 -15
View File
@@ -345,7 +345,7 @@ namespace Game.Chat
return false; return false;
} }
Item item = playerTarget.StoreNewItem(dest, itemId, true, ItemEnchantment.GenerateItemRandomPropertyId(itemId), null, 0, bonusListIDs); Item item = playerTarget.StoreNewItem(dest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId), null, 0, bonusListIDs);
// remove binding (let GM give it to another player later) // remove binding (let GM give it to another player later)
if (player == playerTarget) if (player == playerTarget)
@@ -420,7 +420,7 @@ namespace Game.Chat
InventoryResult msg = playerTarget.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, template.Value.GetId(), 1); InventoryResult msg = playerTarget.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, template.Value.GetId(), 1);
if (msg == InventoryResult.Ok) if (msg == InventoryResult.Ok)
{ {
Item item = playerTarget.StoreNewItem(dest, template.Value.GetId(), true, ItemRandomEnchantmentId.Empty, null, 0, bonusListIDs); Item item = playerTarget.StoreNewItem(dest, template.Value.GetId(), true, 0, null, 0, bonusListIDs);
// remove binding (let GM give it to another player later) // remove binding (let GM give it to another player later)
if (player == playerTarget) if (player == playerTarget)
@@ -451,7 +451,7 @@ namespace Game.Chat
{ {
if (args.Empty()) if (args.Empty())
{ {
if (handler.GetSession().GetPlayer().HasFlag(PlayerFields.Flags, PlayerFlags.Developer)) if (handler.GetSession().GetPlayer().HasPlayerFlag(PlayerFlags.Developer))
handler.GetSession().SendNotification(CypherStrings.DevOn); handler.GetSession().SendNotification(CypherStrings.DevOn);
else else
handler.GetSession().SendNotification(CypherStrings.DevOff); handler.GetSession().SendNotification(CypherStrings.DevOff);
@@ -462,14 +462,14 @@ namespace Game.Chat
if (argstr == "on") if (argstr == "on")
{ {
handler.GetSession().GetPlayer().SetFlag(PlayerFields.Flags, PlayerFlags.Developer); handler.GetSession().GetPlayer().HasPlayerFlag(PlayerFlags.Developer);
handler.GetSession().SendNotification(CypherStrings.DevOn); handler.GetSession().SendNotification(CypherStrings.DevOn);
return true; return true;
} }
if (argstr == "off") if (argstr == "off")
{ {
handler.GetSession().GetPlayer().RemoveFlag(PlayerFields.Flags, PlayerFlags.Developer); handler.GetSession().GetPlayer().RemovePlayerFlag(PlayerFlags.Developer);
handler.GetSession().SendNotification(CypherStrings.DevOff); handler.GetSession().SendNotification(CypherStrings.DevOff);
return true; return true;
} }
@@ -1181,16 +1181,15 @@ namespace Game.Chat
return false; return false;
} }
int offset = area.AreaBit / 32; uint offset = (uint)area.AreaBit / 64;
if (offset >= PlayerConst.ExploredZonesSize) if (offset >= PlayerConst.ExploredZonesSize)
{ {
handler.SendSysMessage(CypherStrings.BadValue); handler.SendSysMessage(CypherStrings.BadValue);
return false; return false;
} }
uint val = (1u << (area.AreaBit % 32)); ulong val = 1ul << (area.AreaBit % 64);
uint currFields = playerTarget.GetUInt32Value(ActivePlayerFields.ExploredZones + offset); playerTarget.AddExploredZones(offset, val);
playerTarget.SetUInt32Value(ActivePlayerFields.ExploredZones + offset, (currFields | val));
handler.SendSysMessage(CypherStrings.ExploreArea); handler.SendSysMessage(CypherStrings.ExploreArea);
return true; return true;
@@ -1222,16 +1221,15 @@ namespace Game.Chat
return false; return false;
} }
int offset = area.AreaBit / 32; uint offset = (uint)area.AreaBit / 64;
if (offset >= PlayerConst.ExploredZonesSize) if (offset >= PlayerConst.ExploredZonesSize)
{ {
handler.SendSysMessage(CypherStrings.BadValue); handler.SendSysMessage(CypherStrings.BadValue);
return false; return false;
} }
uint val = (1u << (area.AreaBit % 32)); uint val = (1u << (area.AreaBit % 64));
uint currFields = playerTarget.GetUInt32Value(ActivePlayerFields.ExploredZones + offset); playerTarget.RemoveExploredZones(offset, val);
playerTarget.SetUInt32Value(ActivePlayerFields.ExploredZones + offset, (currFields ^ val));
handler.SendSysMessage(CypherStrings.UnexploreArea); handler.SendSysMessage(CypherStrings.UnexploreArea);
return true; return true;
@@ -1404,7 +1402,7 @@ namespace Game.Chat
mapId = target.GetMapId(); mapId = target.GetMapId();
areaId = target.GetAreaId(); areaId = target.GetAreaId();
alive = target.IsAlive() ? handler.GetCypherString(CypherStrings.Yes) : handler.GetCypherString(CypherStrings.No); alive = target.IsAlive() ? handler.GetCypherString(CypherStrings.Yes) : handler.GetCypherString(CypherStrings.No);
gender = (Gender)target.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender); gender = (Gender)(byte)target.m_playerData.NativeSex;
} }
// get additional information from DB // get additional information from DB
else else
@@ -1996,7 +1994,7 @@ namespace Game.Chat
} }
go.ModifyHealth(-damage, player); go.ModifyHealth(-damage, player);
handler.SendSysMessage(CypherStrings.GameobjectDamaged, go.GetName(), guidLow, -damage, go.m_goValue.Building.Health); handler.SendSysMessage(CypherStrings.GameobjectDamaged, go.GetName(), guidLow, -damage, go.GetGoValue().Building.Health);
} }
return true; return true;
+15 -59
View File
@@ -122,22 +122,22 @@ namespace Game.Chat
if (!uint.TryParse(pfactionid, out uint factionid)) if (!uint.TryParse(pfactionid, out uint factionid))
{ {
uint _factionid = target.getFaction(); uint _factionid = target.GetFaction();
uint _flag = target.GetUInt32Value(UnitFields.Flags); uint _flag = target.m_unitData.Flags;
ulong _npcflag = target.GetUInt64Value(UnitFields.NpcFlags); ulong _npcflag = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1];
uint _dyflag = target.GetUInt32Value(ObjectFields.DynamicFlags); uint _dyflag = target.m_objectData.DynamicFlags;
handler.SendSysMessage(CypherStrings.CurrentFaction, target.GetGUID().ToString(), _factionid, _flag, _npcflag, _dyflag); handler.SendSysMessage(CypherStrings.CurrentFaction, target.GetGUID().ToString(), _factionid, _flag, _npcflag, _dyflag);
return true; return true;
} }
if (!uint.TryParse(args.NextString(), out uint flag)) if (!uint.TryParse(args.NextString(), out uint flag))
flag = target.GetUInt32Value(UnitFields.Flags); flag = target.m_unitData.Flags;
if (!ulong.TryParse(args.NextString(), out ulong npcflag)) if (!ulong.TryParse(args.NextString(), out ulong npcflag))
npcflag = target.GetUInt64Value(UnitFields.NpcFlags); npcflag = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1];
if (!uint.TryParse(args.NextString(), out uint dyflag)) if (!uint.TryParse(args.NextString(), out uint dyflag))
dyflag = target.GetUInt32Value(ObjectFields.DynamicFlags); dyflag = target.m_objectData.DynamicFlags;
if (!CliDB.FactionTemplateStorage.ContainsKey(factionid)) if (!CliDB.FactionTemplateStorage.ContainsKey(factionid))
{ {
@@ -148,9 +148,10 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.YouChangeFaction, target.GetGUID().ToString(), factionid, flag, npcflag, dyflag); handler.SendSysMessage(CypherStrings.YouChangeFaction, target.GetGUID().ToString(), factionid, flag, npcflag, dyflag);
target.SetFaction(factionid); target.SetFaction(factionid);
target.SetUInt32Value(UnitFields.Flags, flag); target.SetUnitFlags((UnitFlags)flag);
target.SetUInt64Value(UnitFields.NpcFlags, npcflag); target.SetNpcFlags((NPCFlags)(npcflag & 0xFFFFFFFF));
target.SetUInt32Value(ObjectFields.DynamicFlags, dyflag); target.SetNpcFlags2((NPCFlags2)(npcflag >> 32));
target.SetDynamicFlags((UnitDynFlags)dyflag);
return true; return true;
} }
@@ -217,7 +218,7 @@ namespace Game.Chat
NotifyModification(handler, target, CypherStrings.YouChangeSize, CypherStrings.YoursSizeChanged, Scale); NotifyModification(handler, target, CypherStrings.YouChangeSize, CypherStrings.YoursSizeChanged, Scale);
Creature creatureTarget = target.ToCreature(); Creature creatureTarget = target.ToCreature();
if (creatureTarget) if (creatureTarget)
creatureTarget.SetFloatValue(UnitFields.DisplayScale, Scale); creatureTarget.SetDisplayId(creatureTarget.GetDisplayId(), Scale);
else else
target.SetObjectScale(Scale); target.SetObjectScale(Scale);
return true; return true;
@@ -322,51 +323,6 @@ namespace Game.Chat
return true; return true;
} }
[Command("bit", RBACPermissions.CommandModifyBit)]
static bool HandleModifyBitCommand(StringArguments args, CommandHandler handler)
{
if (args.Empty())
return false;
Unit target = handler.getSelectedUnit();
if (!target)
{
handler.SendSysMessage(CypherStrings.NoCharSelected);
return false;
}
// check online security
if (target.IsTypeId(TypeId.Player) && handler.HasLowerSecurity(target.ToPlayer(), ObjectGuid.Empty))
return false;
ushort field = args.NextUInt16();
int bit = args.NextInt32();
if (field < (int)ObjectFields.End || field >= target.valuesCount)
{
handler.SendSysMessage(CypherStrings.BadValue);
return false;
}
if (bit < 1 || bit > 32)
{
handler.SendSysMessage(CypherStrings.BadValue);
return false;
}
if (target.HasFlag(field, (1 << (bit - 1))))
{
target.RemoveFlag(field, (1 << (bit - 1)));
handler.SendSysMessage(CypherStrings.RemoveBit, bit, field);
}
else
{
target.SetFlag(field, (1 << (bit - 1)));
handler.SendSysMessage(CypherStrings.SetBit, bit, field);
}
return true;
}
[Command("honor", RBACPermissions.CommandModifyHonor)] [Command("honor", RBACPermissions.CommandModifyHonor)]
static bool HandleModifyHonorCommand(StringArguments args, CommandHandler handler) static bool HandleModifyHonorCommand(StringArguments args, CommandHandler handler)
{ {
@@ -591,7 +547,7 @@ namespace Game.Chat
return false; return false;
uint anim_id = args.NextUInt32(); uint anim_id = args.NextUInt32();
handler.GetSession().GetPlayer().SetUInt32Value(UnitFields.NpcEmotestate, anim_id); handler.GetSession().GetPlayer().SetEmoteState((Emote)anim_id);
return true; return true;
} }
@@ -637,8 +593,8 @@ namespace Game.Chat
} }
// Set gender // Set gender
target.SetByteValue(UnitFields.Bytes0, 3, (byte)gender); target.SetGender(gender);
target.SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)gender); target.SetNativeSex(gender);
// Change display ID // Change display ID
target.InitDisplayIds(); target.InitDisplayIds();
+17 -16
View File
@@ -44,8 +44,8 @@ namespace Game.Chat
CreatureTemplate cInfo = target.GetCreatureTemplate(); CreatureTemplate cInfo = target.GetCreatureTemplate();
uint faction = target.getFaction(); uint faction = target.GetFaction();
ulong npcflags = target.GetUInt64Value(UnitFields.NpcFlags); ulong npcflags = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1];
uint mechanicImmuneMask = cInfo.MechanicImmuneMask; uint mechanicImmuneMask = cInfo.MechanicImmuneMask;
uint displayid = target.GetDisplayId(); uint displayid = target.GetDisplayId();
uint nativeid = target.GetNativeDisplayId(); uint nativeid = target.GetNativeDisplayId();
@@ -63,22 +63,22 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.NpcinfoHealth, target.GetCreateHealth(), target.GetMaxHealth(), target.GetHealth()); handler.SendSysMessage(CypherStrings.NpcinfoHealth, target.GetCreateHealth(), target.GetMaxHealth(), target.GetHealth());
handler.SendSysMessage(CypherStrings.NpcinfoInhabitType, cInfo.InhabitType); handler.SendSysMessage(CypherStrings.NpcinfoInhabitType, cInfo.InhabitType);
handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags, target.GetUInt32Value(UnitFields.Flags)); handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags, target.m_unitData.Flags);
foreach (uint value in Enum.GetValues(typeof(UnitFlags))) foreach (UnitFlags value in Enum.GetValues(typeof(UnitFlags)))
if (target.GetUInt32Value(UnitFields.Flags).HasAnyFlag(value)) if (target.HasUnitFlag(value))
handler.SendSysMessage("{0} (0x{1:X})", (UnitFlags)value, value); handler.SendSysMessage("{0} (0x{1:X})", (UnitFlags)value, value);
handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags2, target.GetUInt32Value(UnitFields.Flags2)); handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags2, target.m_unitData.Flags2);
foreach (uint value in Enum.GetValues(typeof(UnitFlags2))) foreach (UnitFlags2 value in Enum.GetValues(typeof(UnitFlags2)))
if (target.GetUInt32Value(UnitFields.Flags2).HasAnyFlag(value)) if (target.HasUnitFlag2(value))
handler.SendSysMessage("{0} (0x{1:X})", (UnitFlags2)value, value); handler.SendSysMessage("{0} (0x{1:X})", (UnitFlags2)value, value);
handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags3, target.GetUInt32Value(UnitFields.Flags3)); handler.SendSysMessage(CypherStrings.NpcinfoUnitFieldFlags3, target.m_unitData.Flags3);
foreach (uint value in Enum.GetValues(typeof(UnitFlags3))) foreach (UnitFlags3 value in Enum.GetValues(typeof(UnitFlags3)))
if (target.GetUInt32Value(UnitFields.Flags3).HasAnyFlag(value)) if (target.HasUnitFlag3(value))
handler.SendSysMessage("{0} (0x{1:X})", (UnitFlags3)value, value); handler.SendSysMessage("{0} (0x{1:X})", (UnitFlags3)value, value);
handler.SendSysMessage(CypherStrings.NpcinfoDynamicFlags, target.GetUInt32Value(ObjectFields.DynamicFlags)); handler.SendSysMessage(CypherStrings.NpcinfoDynamicFlags, target.GetDynamicFlags());
handler.SendSysMessage(CypherStrings.CommandRawpawntimes, defRespawnDelayStr, curRespawnDelayStr); handler.SendSysMessage(CypherStrings.CommandRawpawntimes, defRespawnDelayStr, curRespawnDelayStr);
handler.SendSysMessage(CypherStrings.NpcinfoLoot, cInfo.LootId, cInfo.PickPocketId, cInfo.SkinLootId); handler.SendSysMessage(CypherStrings.NpcinfoLoot, cInfo.LootId, cInfo.PickPocketId, cInfo.SkinLootId);
handler.SendSysMessage(CypherStrings.NpcinfoDungeonId, target.GetInstanceId()); handler.SendSysMessage(CypherStrings.NpcinfoDungeonId, target.GetInstanceId());
@@ -243,7 +243,7 @@ namespace Game.Chat
return false; return false;
} }
target.SetUInt32Value(UnitFields.NpcEmotestate, emote); target.SetEmoteState((Emote)emote);
return true; return true;
} }
@@ -402,13 +402,13 @@ namespace Game.Chat
uint level = (creatureTarget.getLevel() < (player.getLevel() - 5)) ? (player.getLevel() - 5) : creatureTarget.getLevel(); uint level = (creatureTarget.getLevel() < (player.getLevel() - 5)) ? (player.getLevel() - 5) : creatureTarget.getLevel();
// prepare visual effect for levelup // prepare visual effect for levelup
pet.SetUInt32Value(UnitFields.Level, level - 1); pet.SetLevel(level - 1);
// add to world // add to world
pet.GetMap().AddToMap(pet.ToCreature()); pet.GetMap().AddToMap(pet.ToCreature());
// visual effect for levelup // visual effect for levelup
pet.SetUInt32Value(UnitFields.Level, level); pet.SetLevel(level);
// caster have pet now // caster have pet now
player.SetMinion(pet, true); player.SetMinion(pet, true);
@@ -685,7 +685,8 @@ namespace Game.Chat
return false; return false;
} }
creature.SetUInt64Value(UnitFields.NpcFlags, npcFlags); creature.SetNpcFlags((NPCFlags)(npcFlags & 0xFFFFFFFF));
creature.SetNpcFlags2((NPCFlags2)(npcFlags >> 32));
PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_CREATURE_NPCFLAG); PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_CREATURE_NPCFLAG);
stmt.AddValue(0, npcFlags); stmt.AddValue(0, npcFlags);
+4 -4
View File
@@ -63,8 +63,8 @@ namespace Game.Chat
creatureTarget.RemoveCorpse(); creatureTarget.RemoveCorpse();
creatureTarget.SetHealth(0); // just for nice GM-mode view creatureTarget.SetHealth(0); // just for nice GM-mode view
pet.SetGuidValue(UnitFields.CreatedBy, player.GetGUID()); pet.SetCreatorGUID(player.GetGUID());
pet.SetUInt32Value(UnitFields.FactionTemplate, player.getFaction()); pet.SetFaction(player.GetFaction());
if (!pet.InitStatsForLevel(creatureTarget.getLevel())) if (!pet.InitStatsForLevel(creatureTarget.getLevel()))
{ {
@@ -74,7 +74,7 @@ namespace Game.Chat
} }
// prepare visual effect for levelup // prepare visual effect for levelup
pet.SetUInt32Value(UnitFields.Level, creatureTarget.getLevel() - 1); pet.SetLevel(creatureTarget.getLevel() - 1);
pet.GetCharmInfo().SetPetNumber(Global.ObjectMgr.GeneratePetNumber(), true); pet.GetCharmInfo().SetPetNumber(Global.ObjectMgr.GeneratePetNumber(), true);
// this enables pet details window (Shift+P) // this enables pet details window (Shift+P)
@@ -84,7 +84,7 @@ namespace Game.Chat
pet.GetMap().AddToMap(pet.ToCreature()); pet.GetMap().AddToMap(pet.ToCreature());
// visual effect for levelup // visual effect for levelup
pet.SetUInt32Value(UnitFields.Level, creatureTarget.getLevel()); pet.SetLevel(creatureTarget.getLevel());
player.SetMinion(pet, true); player.SetMinion(pet, true);
pet.SavePetToDB(PetSaveMode.AsCurrent); pet.SavePetToDB(PetSaveMode.AsCurrent);
+6 -6
View File
@@ -395,12 +395,12 @@ namespace Game.Chat
return true; return true;
} }
[Command("item_enchantment_template", RBACPermissions.CommandReloadItemEnchantmentTemplate, true)] [Command("item_random_bonus_list_template", RBACPermissions.CommandReloadItemRandomBonusListTemplate, true)]
static bool HandleReloadItemEnchantementsCommand(StringArguments args, CommandHandler handler) static bool HandleReloadItemRandomBonusListTemplatesCommand(StringArguments args, CommandHandler handler)
{ {
Log.outInfo(LogFilter.Server, "Re-Loading Item Random Enchantments Table..."); Log.outInfo(LogFilter.Server, "Re-Loading Random item bonus list definitions...");
ItemEnchantment.LoadRandomEnchantmentsTable(); ItemEnchantmentManager.LoadItemRandomBonusListTemplates();
handler.SendGlobalGMSysMessage("DB table `item_enchantment_template` reloaded."); handler.SendGlobalGMSysMessage("DB table `item_random_bonus_list_template` reloaded.");
return true; return true;
} }
@@ -1015,7 +1015,7 @@ namespace Game.Chat
static bool HandleReloadAllItemCommand(StringArguments args, CommandHandler handler) static bool HandleReloadAllItemCommand(StringArguments args, CommandHandler handler)
{ {
HandleReloadPageTextsCommand(null, handler); HandleReloadPageTextsCommand(null, handler);
HandleReloadItemEnchantementsCommand(null, handler); HandleReloadItemRandomBonusListTemplatesCommand(null, handler);
return true; return true;
} }
+6 -7
View File
@@ -51,8 +51,7 @@ namespace Game.Chat
if (!handler.extractPlayerTarget(args, out target)) if (!handler.extractPlayerTarget(args, out target))
return false; return false;
target.SetUInt32Value(ActivePlayerFields.Kills, 0); target.ResetHonorStats();
target.SetUInt32Value(ActivePlayerFields.LifetimeHonorableKills, 0);
target.UpdateCriteria(CriteriaTypes.EarnHonorableKill); target.UpdateCriteria(CriteriaTypes.EarnHonorableKill);
return true; return true;
@@ -74,18 +73,18 @@ namespace Game.Chat
player.SetShapeshiftForm(ShapeShiftForm.None); player.SetShapeshiftForm(ShapeShiftForm.None);
player.setFactionForRace(player.GetRace()); player.setFactionForRace(player.GetRace());
player.SetUInt32Value(UnitFields.DisplayPower, (uint)powerType); player.SetPowerType(powerType);
// reset only if player not in some form; // reset only if player not in some form;
if (player.GetShapeshiftForm() == ShapeShiftForm.None) if (player.GetShapeshiftForm() == ShapeShiftForm.None)
player.InitDisplayIds(); player.InitDisplayIds();
player.SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, (byte)UnitBytes2Flags.PvP); player.SetPvpFlags(UnitPVPStateFlags.PvP);
player.SetUInt32Value(UnitFields.Flags, (uint)UnitFlags.PvpAttackable); player.SetUnitFlags(UnitFlags.PvpAttackable);
//-1 is default value //-1 is default value
player.SetUInt32Value(ActivePlayerFields.WatchedFactionIndex, 0xFFFFFFFF); player.SetWatchedFactionIndex(0xFFFFFFFF);
return true; return true;
} }
@@ -110,7 +109,7 @@ namespace Game.Chat
target.InitStatsForLevel(true); target.InitStatsForLevel(true);
target.InitTaxiNodesForLevel(); target.InitTaxiNodesForLevel();
target.InitTalentForLevel(); target.InitTalentForLevel();
target.SetUInt32Value(ActivePlayerFields.Xp, 0); target.SetXP(0);
target._ApplyAllLevelScaleItemMods(true); target._ApplyAllLevelScaleItemMods(true);
+6 -6
View File
@@ -62,7 +62,7 @@ namespace Game.Chat.Commands
string tNameLink = handler.GetNameLink(target); string tNameLink = handler.GetNameLink(target);
target.SetTitle(titleInfo); // to be sure that title now known target.SetTitle(titleInfo); // to be sure that title now known
target.SetUInt32Value(PlayerFields.ChosenTitle, titleInfo.MaskID); target.SetChosenTitle(titleInfo.MaskID);
handler.SendSysMessage(CypherStrings.TitleCurrentRes, id, (target.GetGender() == Gender.Male ? titleInfo.Name : titleInfo.Name1)[handler.GetSessionDbcLocale()], tNameLink); handler.SendSysMessage(CypherStrings.TitleCurrentRes, id, (target.GetGender() == Gender.Male ? titleInfo.Name : titleInfo.Name1)[handler.GetSessionDbcLocale()], tNameLink);
return true; return true;
@@ -150,9 +150,9 @@ namespace Game.Chat.Commands
handler.SendSysMessage(CypherStrings.TitleRemoveRes, id, titleNameStr, tNameLink); handler.SendSysMessage(CypherStrings.TitleRemoveRes, id, titleNameStr, tNameLink);
if (!target.HasTitle(target.GetUInt32Value(PlayerFields.ChosenTitle))) if (!target.HasTitle(target.m_playerData.PlayerTitle))
{ {
target.SetUInt32Value(PlayerFields.ChosenTitle, 0); target.SetChosenTitle(0);
handler.SendSysMessage(CypherStrings.CurrentTitleReset, tNameLink); handler.SendSysMessage(CypherStrings.CurrentTitleReset, tNameLink);
} }
@@ -189,12 +189,12 @@ namespace Game.Chat.Commands
titles &= ~titles2; // remove not existed titles titles &= ~titles2; // remove not existed titles
target.SetUInt64Value(ActivePlayerFields.KnownTitles, titles); target.SetKnownTitles(0, titles);
handler.SendSysMessage(CypherStrings.Done); handler.SendSysMessage(CypherStrings.Done);
if (!target.HasTitle(target.GetUInt32Value(PlayerFields.ChosenTitle))) if (!target.HasTitle(target.m_playerData.PlayerTitle))
{ {
target.SetUInt32Value(PlayerFields.ChosenTitle, 0); target.SetChosenTitle(0);
handler.SendSysMessage(CypherStrings.CurrentTitleReset, handler.GetNameLink(target)); handler.SendSysMessage(CypherStrings.CurrentTitleReset, handler.GetNameLink(target));
} }
+10 -10
View File
@@ -1689,7 +1689,7 @@ namespace Game
if (condition.Gender >= 0 && (int)player.GetGender() != condition.Gender) if (condition.Gender >= 0 && (int)player.GetGender() != condition.Gender)
return false; return false;
if (condition.NativeGender >= 0 && player.GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender) != condition.NativeGender) if (condition.NativeGender >= 0 && player.m_playerData.NativeSex != condition.NativeGender)
return false; return false;
if (condition.PowerType != -1 && condition.PowerTypeComp != 0) if (condition.PowerType != -1 && condition.PowerTypeComp != 0)
@@ -1701,7 +1701,7 @@ namespace Game
if (condition.ChrSpecializationIndex >= 0 || condition.ChrSpecializationRole >= 0) if (condition.ChrSpecializationIndex >= 0 || condition.ChrSpecializationRole >= 0)
{ {
ChrSpecializationRecord spec = CliDB.ChrSpecializationStorage.LookupByKey(player.GetUInt32Value(PlayerFields.CurrentSpecId)); ChrSpecializationRecord spec = CliDB.ChrSpecializationStorage.LookupByKey(player.GetPrimarySpecialization());
if (spec != null) if (spec != null)
{ {
if (condition.ChrSpecializationIndex >= 0 && spec.OrderIndex != condition.ChrSpecializationIndex) if (condition.ChrSpecializationIndex >= 0 && spec.OrderIndex != condition.ChrSpecializationIndex)
@@ -1785,10 +1785,10 @@ namespace Game
} }
} }
if (condition.PvpMedal != 0 && !Convert.ToBoolean((1 << (condition.PvpMedal - 1)) & player.GetUInt32Value(ActivePlayerFields.PvpMedals))) if (condition.PvpMedal != 0 && !Convert.ToBoolean((1 << (condition.PvpMedal - 1)) & player.m_activePlayerData.PvpMedals))
return false; return false;
if (condition.LifetimeMaxPVPRank != 0 && player.GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetLifetimeMaxPvpRank) != condition.LifetimeMaxPVPRank) if (condition.LifetimeMaxPVPRank != 0 && player.m_activePlayerData.LifetimeMaxRank != condition.LifetimeMaxPVPRank)
return false; return false;
if (condition.MovementFlags[0] != 0 && !Convert.ToBoolean((uint)player.GetUnitMovementFlags() & condition.MovementFlags[0])) if (condition.MovementFlags[0] != 0 && !Convert.ToBoolean((uint)player.GetUnitMovementFlags() & condition.MovementFlags[0]))
@@ -1841,7 +1841,7 @@ namespace Game
{ {
uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(condition.PrevQuestID[i]); uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(condition.PrevQuestID[i]);
if (questBit != 0) if (questBit != 0)
results[i] = (player.GetUInt32Value(ActivePlayerFields.QuestCompleted + (int)((questBit - 1) >> 5)) & (1 << (int)((questBit - 1) & 31))) != 0; results[i] = (player.m_activePlayerData.QuestCompleted[((int)questBit - 1) >> 6] & (1ul << (((int)questBit - 1) & 63))) != 0;
} }
if (!PlayerConditionLogic(condition.PrevQuestLogic, results)) if (!PlayerConditionLogic(condition.PrevQuestLogic, results))
@@ -1920,7 +1920,7 @@ namespace Game
{ {
AreaTableRecord area = CliDB.AreaTableStorage.LookupByKey(condition.Explored[i]); AreaTableRecord area = CliDB.AreaTableStorage.LookupByKey(condition.Explored[i]);
if (area != null) if (area != null)
if (area.AreaBit != -1 && !Convert.ToBoolean(player.GetUInt32Value(ActivePlayerFields.ExploredZones + area.AreaBit / 32) & (1 << (area.AreaBit % 32)))) if (area.AreaBit != -1 && !Convert.ToBoolean(player.m_activePlayerData.ExploredZones[area.AreaBit / 64] & (1ul << ((int)area.AreaBit % 64))))
return false; return false;
} }
} }
@@ -2014,16 +2014,16 @@ namespace Game
} }
} }
if (condition.MinAvgItemLevel != 0 && Math.Floor(player.GetFloatValue(PlayerFields.AvgItemLevel)) < condition.MinAvgItemLevel) if (condition.MinAvgItemLevel != 0 && Math.Floor(player.m_playerData.AvgItemLevel[0]) < condition.MinAvgItemLevel)
return false; return false;
if (condition.MaxAvgItemLevel != 0 && Math.Floor(player.GetFloatValue(PlayerFields.AvgItemLevel)) > condition.MaxAvgItemLevel) if (condition.MaxAvgItemLevel != 0 && Math.Floor(player.m_playerData.AvgItemLevel[0]) > condition.MaxAvgItemLevel)
return false; return false;
if (condition.MinAvgEquippedItemLevel != 0 && Math.Floor(player.GetFloatValue(PlayerFields.AvgItemLevel + 1)) < condition.MinAvgEquippedItemLevel) if (condition.MinAvgEquippedItemLevel != 0 && Math.Floor(player.m_playerData.AvgItemLevel[1]) < condition.MinAvgEquippedItemLevel)
return false; return false;
if (condition.MaxAvgEquippedItemLevel != 0 && Math.Floor(player.GetFloatValue(PlayerFields.AvgItemLevel + 1)) > condition.MaxAvgEquippedItemLevel) if (condition.MaxAvgEquippedItemLevel != 0 && Math.Floor(player.m_playerData.AvgItemLevel[1]) > condition.MaxAvgEquippedItemLevel)
return false; return false;
if (condition.ModifierTreeID != 0 && !player.ModifierTreeSatisfied(condition.ModifierTreeID)) if (condition.ModifierTreeID != 0 && !player.ModifierTreeSatisfied(condition.ModifierTreeID))
+11 -11
View File
@@ -76,6 +76,7 @@ namespace Game.DataStorage
CinematicCameraStorage = DBReader.Read<CinematicCameraRecord>("CinematicCamera.db2", HotfixStatements.SEL_CINEMATIC_CAMERA); CinematicCameraStorage = DBReader.Read<CinematicCameraRecord>("CinematicCamera.db2", HotfixStatements.SEL_CINEMATIC_CAMERA);
CinematicSequencesStorage = DBReader.Read<CinematicSequencesRecord>("CinematicSequences.db2", HotfixStatements.SEL_CINEMATIC_SEQUENCES); CinematicSequencesStorage = DBReader.Read<CinematicSequencesRecord>("CinematicSequences.db2", HotfixStatements.SEL_CINEMATIC_SEQUENCES);
ContentTuningStorage = DBReader.Read<ContentTuningRecord>("ContentTuning.db2", HotfixStatements.SEL_CONTENT_TUNING); ContentTuningStorage = DBReader.Read<ContentTuningRecord>("ContentTuning.db2", HotfixStatements.SEL_CONTENT_TUNING);
ContentTuningXExpectedStorage = DBReader.Read<ContentTuningXExpectedRecord>("ContentTuningXExpected.db2", HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED);
ConversationLineStorage = DBReader.Read<ConversationLineRecord>("ConversationLine.db2", HotfixStatements.SEL_CONVERSATION_LINE); ConversationLineStorage = DBReader.Read<ConversationLineRecord>("ConversationLine.db2", HotfixStatements.SEL_CONVERSATION_LINE);
CreatureDisplayInfoStorage = DBReader.Read<CreatureDisplayInfoRecord>("CreatureDisplayInfo.db2", HotfixStatements.SEL_CREATURE_DISPLAY_INFO); CreatureDisplayInfoStorage = DBReader.Read<CreatureDisplayInfoRecord>("CreatureDisplayInfo.db2", HotfixStatements.SEL_CREATURE_DISPLAY_INFO);
CreatureDisplayInfoExtraStorage = DBReader.Read<CreatureDisplayInfoExtraRecord>("CreatureDisplayInfoExtra.db2", HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA); CreatureDisplayInfoExtraStorage = DBReader.Read<CreatureDisplayInfoExtraRecord>("CreatureDisplayInfoExtra.db2", HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA);
@@ -153,8 +154,6 @@ namespace Game.DataStorage
ItemLimitCategoryConditionStorage = DBReader.Read<ItemLimitCategoryConditionRecord>("ItemLimitCategoryCondition.db2", HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_CONDITION); ItemLimitCategoryConditionStorage = DBReader.Read<ItemLimitCategoryConditionRecord>("ItemLimitCategoryCondition.db2", HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_CONDITION);
ItemModifiedAppearanceStorage = DBReader.Read<ItemModifiedAppearanceRecord>("ItemModifiedAppearance.db2", HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE); ItemModifiedAppearanceStorage = DBReader.Read<ItemModifiedAppearanceRecord>("ItemModifiedAppearance.db2", HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE);
ItemPriceBaseStorage = DBReader.Read<ItemPriceBaseRecord>("ItemPriceBase.db2", HotfixStatements.SEL_ITEM_PRICE_BASE); ItemPriceBaseStorage = DBReader.Read<ItemPriceBaseRecord>("ItemPriceBase.db2", HotfixStatements.SEL_ITEM_PRICE_BASE);
ItemRandomPropertiesStorage = DBReader.Read<ItemRandomPropertiesRecord>("ItemRandomProperties.db2", HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES, HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES_LOCALE);
ItemRandomSuffixStorage = DBReader.Read<ItemRandomSuffixRecord>("ItemRandomSuffix.db2", HotfixStatements.SEL_ITEM_RANDOM_SUFFIX, HotfixStatements.SEL_ITEM_RANDOM_SUFFIX_LOCALE);
ItemSearchNameStorage = DBReader.Read<ItemSearchNameRecord>("ItemSearchName.db2", HotfixStatements.SEL_ITEM_SEARCH_NAME, HotfixStatements.SEL_ITEM_SEARCH_NAME_LOCALE); ItemSearchNameStorage = DBReader.Read<ItemSearchNameRecord>("ItemSearchName.db2", HotfixStatements.SEL_ITEM_SEARCH_NAME, HotfixStatements.SEL_ITEM_SEARCH_NAME_LOCALE);
ItemSetStorage = DBReader.Read<ItemSetRecord>("ItemSet.db2", HotfixStatements.SEL_ITEM_SET, HotfixStatements.SEL_ITEM_SET_LOCALE); ItemSetStorage = DBReader.Read<ItemSetRecord>("ItemSet.db2", HotfixStatements.SEL_ITEM_SET, HotfixStatements.SEL_ITEM_SET_LOCALE);
ItemSetSpellStorage = DBReader.Read<ItemSetSpellRecord>("ItemSetSpell.db2", HotfixStatements.SEL_ITEM_SET_SPELL); ItemSetSpellStorage = DBReader.Read<ItemSetSpellRecord>("ItemSetSpell.db2", HotfixStatements.SEL_ITEM_SET_SPELL);
@@ -324,13 +323,13 @@ namespace Game.DataStorage
} }
// Check loaded DB2 files proper version // Check loaded DB2 files proper version
if (!AreaTableStorage.ContainsKey(10048) || // last area added in 8.0.1 (28153) if (!AreaTableStorage.ContainsKey(10521) || // last area added in 8.0.1 (28153)
!CharTitlesStorage.ContainsKey(633) || // last char title added in 8.0.1 (28153) !CharTitlesStorage.ContainsKey(649) || // last char title added in 8.0.1 (28153)
!GemPropertiesStorage.ContainsKey(3745) || // last gem property added in 8.0.1 (28153) !GemPropertiesStorage.ContainsKey(3746) || // last gem property added in 8.0.1 (28153)
!ItemStorage.ContainsKey(164760) || // last item added in 8.0.1 (28153) !ItemStorage.ContainsKey(168279) || // last item added in 8.0.1 (28153)
!ItemExtendedCostStorage.ContainsKey(6448) || // last item extended cost added in 8.0.1 (28153) !ItemExtendedCostStorage.ContainsKey(6545) || // last item extended cost added in 8.0.1 (28153)
!MapStorage.ContainsKey(2103) || // last map added in 8.0.1 (28153) !MapStorage.ContainsKey(2178) || // last map added in 8.0.1 (28153)
!SpellNameStorage.ContainsKey(281872)) // last spell added in 8.0.1 (28153) !SpellNameStorage.ContainsKey(296952)) // last spell added in 8.0.1 (28153)
{ {
Log.outError(LogFilter.Misc, "You have _outdated_ DB2 files. Please extract correct versions from current using client."); Log.outError(LogFilter.Misc, "You have _outdated_ DB2 files. Please extract correct versions from current using client.");
Global.WorldMgr.ShutdownServ(10, ShutdownMask.Force, ShutdownExitCode.Error); Global.WorldMgr.ShutdownServ(10, ShutdownMask.Force, ShutdownExitCode.Error);
@@ -420,6 +419,7 @@ namespace Game.DataStorage
public static DB6Storage<CinematicCameraRecord> CinematicCameraStorage; public static DB6Storage<CinematicCameraRecord> CinematicCameraStorage;
public static DB6Storage<CinematicSequencesRecord> CinematicSequencesStorage; public static DB6Storage<CinematicSequencesRecord> CinematicSequencesStorage;
public static DB6Storage<ContentTuningRecord> ContentTuningStorage; public static DB6Storage<ContentTuningRecord> ContentTuningStorage;
public static DB6Storage<ContentTuningXExpectedRecord> ContentTuningXExpectedStorage;
public static DB6Storage<ConversationLineRecord> ConversationLineStorage; public static DB6Storage<ConversationLineRecord> ConversationLineStorage;
public static DB6Storage<CreatureDisplayInfoRecord> CreatureDisplayInfoStorage; public static DB6Storage<CreatureDisplayInfoRecord> CreatureDisplayInfoStorage;
public static DB6Storage<CreatureDisplayInfoExtraRecord> CreatureDisplayInfoExtraStorage; public static DB6Storage<CreatureDisplayInfoExtraRecord> CreatureDisplayInfoExtraStorage;
@@ -497,8 +497,6 @@ namespace Game.DataStorage
public static DB6Storage<ItemLimitCategoryConditionRecord> ItemLimitCategoryConditionStorage; public static DB6Storage<ItemLimitCategoryConditionRecord> ItemLimitCategoryConditionStorage;
public static DB6Storage<ItemModifiedAppearanceRecord> ItemModifiedAppearanceStorage; public static DB6Storage<ItemModifiedAppearanceRecord> ItemModifiedAppearanceStorage;
public static DB6Storage<ItemPriceBaseRecord> ItemPriceBaseStorage; public static DB6Storage<ItemPriceBaseRecord> ItemPriceBaseStorage;
public static DB6Storage<ItemRandomPropertiesRecord> ItemRandomPropertiesStorage;
public static DB6Storage<ItemRandomSuffixRecord> ItemRandomSuffixStorage;
public static DB6Storage<ItemSearchNameRecord> ItemSearchNameStorage; public static DB6Storage<ItemSearchNameRecord> ItemSearchNameStorage;
public static DB6Storage<ItemSetRecord> ItemSetStorage; public static DB6Storage<ItemSetRecord> ItemSetStorage;
public static DB6Storage<ItemSetSpellRecord> ItemSetSpellStorage; public static DB6Storage<ItemSetSpellRecord> ItemSetSpellStorage;
@@ -725,6 +723,8 @@ namespace Game.DataStorage
return row.Health; return row.Health;
case -8: case -8:
return row.DamageReplaceStat; return row.DamageReplaceStat;
case -9:
return row.DamageSecondary;
default: default:
break; break;
} }
@@ -232,34 +232,34 @@ namespace Game.DataStorage
switch (Type.GetTypeCode(type)) switch (Type.GetTypeCode(type))
{ {
case TypeCode.Boolean: case TypeCode.Boolean:
buffer.WriteUInt8(fieldInfo.GetValue(entry)); buffer.WriteUInt8((byte)((bool)fieldInfo.GetValue(entry) ? 1 : 0));
break; break;
case TypeCode.SByte: case TypeCode.SByte:
buffer.WriteInt8(fieldInfo.GetValue(entry)); buffer.WriteInt8((sbyte)fieldInfo.GetValue(entry));
break; break;
case TypeCode.Byte: case TypeCode.Byte:
buffer.WriteUInt8(fieldInfo.GetValue(entry)); buffer.WriteUInt8((byte)fieldInfo.GetValue(entry));
break; break;
case TypeCode.Int16: case TypeCode.Int16:
buffer.WriteInt16(fieldInfo.GetValue(entry)); buffer.WriteInt16((short)fieldInfo.GetValue(entry));
break; break;
case TypeCode.UInt16: case TypeCode.UInt16:
buffer.WriteUInt16(fieldInfo.GetValue(entry)); buffer.WriteUInt16((ushort)fieldInfo.GetValue(entry));
break; break;
case TypeCode.Int32: case TypeCode.Int32:
buffer.WriteInt32(fieldInfo.GetValue(entry)); buffer.WriteInt32((int)fieldInfo.GetValue(entry));
break; break;
case TypeCode.UInt32: case TypeCode.UInt32:
buffer.WriteUInt32(fieldInfo.GetValue(entry)); buffer.WriteUInt32((uint)fieldInfo.GetValue(entry));
break; break;
case TypeCode.Int64: case TypeCode.Int64:
buffer.WriteInt64(fieldInfo.GetValue(entry)); buffer.WriteInt64((long)fieldInfo.GetValue(entry));
break; break;
case TypeCode.UInt64: case TypeCode.UInt64:
buffer.WriteUInt64(fieldInfo.GetValue(entry)); buffer.WriteUInt64((ulong)fieldInfo.GetValue(entry));
break; break;
case TypeCode.Single: case TypeCode.Single:
buffer.WriteFloat(fieldInfo.GetValue(entry)); buffer.WriteFloat((float)fieldInfo.GetValue(entry));
break; break;
case TypeCode.Object: case TypeCode.Object:
switch (type.Name) switch (type.Name)
@@ -294,34 +294,34 @@ namespace Game.DataStorage
switch (Type.GetTypeCode(type)) switch (Type.GetTypeCode(type))
{ {
case TypeCode.Boolean: case TypeCode.Boolean:
buffer.WriteUInt8(array.GetValue(i)); buffer.WriteUInt8((byte)((bool)array.GetValue(i) ? 1 : 0));
break; break;
case TypeCode.SByte: case TypeCode.SByte:
buffer.WriteInt8(array.GetValue(i)); buffer.WriteInt8((sbyte)array.GetValue(i));
break; break;
case TypeCode.Byte: case TypeCode.Byte:
buffer.WriteUInt8(array.GetValue(i)); buffer.WriteUInt8((byte)array.GetValue(i));
break; break;
case TypeCode.Int16: case TypeCode.Int16:
buffer.WriteInt16(array.GetValue(i)); buffer.WriteInt16((short)array.GetValue(i));
break; break;
case TypeCode.UInt16: case TypeCode.UInt16:
buffer.WriteUInt16(array.GetValue(i)); buffer.WriteUInt16((ushort)array.GetValue(i));
break; break;
case TypeCode.Int32: case TypeCode.Int32:
buffer.WriteInt32(array.GetValue(i)); buffer.WriteInt32((int)array.GetValue(i));
break; break;
case TypeCode.UInt32: case TypeCode.UInt32:
buffer.WriteUInt32(array.GetValue(i)); buffer.WriteUInt32((uint)array.GetValue(i));
break; break;
case TypeCode.Int64: case TypeCode.Int64:
buffer.WriteInt64(array.GetValue(i)); buffer.WriteInt64((long)array.GetValue(i));
break; break;
case TypeCode.UInt64: case TypeCode.UInt64:
buffer.WriteUInt64(array.GetValue(i)); buffer.WriteUInt64((ulong)array.GetValue(i));
break; break;
case TypeCode.Single: case TypeCode.Single:
buffer.WriteFloat(array.GetValue(i)); buffer.WriteFloat((float)array.GetValue(i));
break; break;
case TypeCode.String: case TypeCode.String:
var str = (string)array.GetValue(i); var str = (string)array.GetValue(i);
@@ -32,8 +32,8 @@ namespace Game.DataStorage
{ {
class DBReader class DBReader
{ {
private const int HeaderSize = 72 + 1 * 36; private const int HeaderSize = 72;
private const uint WDC2FmtSig = 0x32434457; // WDC2 private const uint WDC3FmtSig = 0x33434457; // WDC3
public static DB6Storage<T> Read<T>(string fileName, HotfixStatements preparedStatement, HotfixStatements preparedStatementLocale = 0) where T : new() public static DB6Storage<T> Read<T>(string fileName, HotfixStatements preparedStatement, HotfixStatements preparedStatementLocale = 0) where T : new()
{ {
@@ -71,7 +71,7 @@ namespace Game.DataStorage
{ {
Header = new WDCHeader(); Header = new WDCHeader();
Header.Signature = reader.ReadUInt32(); Header.Signature = reader.ReadUInt32();
if (Header.Signature != WDC2FmtSig) if (Header.Signature != WDC3FmtSig)
return false; return false;
Header.RecordCount = reader.ReadUInt32(); Header.RecordCount = reader.ReadUInt32();
@@ -126,28 +126,41 @@ namespace Game.DataStorage
} }
} }
long previousStringTableSize = 0;
for (int sectionIndex = 0; sectionIndex < Header.SectionsCount; sectionIndex++) for (int sectionIndex = 0; sectionIndex < Header.SectionsCount; sectionIndex++)
{ {
if (sections[sectionIndex].TactKeyLookup != 0)// && !hasTactKeyFunc(sections[sectionIndex].TactKeyLookup))
{
previousStringTableSize += sections[sectionIndex].StringTableSize;
//Console.WriteLine("Detected db2 with encrypted section! HasKey {0}", CASC.HasKey(Sections[sectionIndex].TactKeyLookup));
continue;
}
reader.BaseStream.Position = sections[sectionIndex].FileOffset; reader.BaseStream.Position = sections[sectionIndex].FileOffset;
byte[] recordsData; byte[] recordsData;
Dictionary<long, string> stringsTable = null; Dictionary<long, string> stringsTable = null;
List<Tuple<int, short>> offsetmap = null; SparseEntry[] sparseEntries = null;
if (!Header.HasOffsetTable()) if (!Header.HasOffsetTable())
{ {
// records data // records data
recordsData = reader.ReadBytes((int)(sections[sectionIndex].NumRecords * Header.RecordSize)); recordsData = reader.ReadBytes((int)(sections[sectionIndex].NumRecords * Header.RecordSize));
Array.Resize(ref recordsData, recordsData.Length + 8); // pad with extra zeros so we don't crash when reading
// string data // string data
stringsTable = new Dictionary<long, string>(); stringsTable = new Dictionary<long, string>();
long stringDataOffset = 0;
if (sectionIndex == 0)
stringDataOffset = (Header.RecordCount - sections[sectionIndex].NumRecords) * Header.RecordSize;
else
stringDataOffset = previousStringTableSize;
for (int i = 0; i < sections[sectionIndex].StringTableSize;) for (int i = 0; i < sections[sectionIndex].StringTableSize;)
{ {
long oldPos = reader.BaseStream.Position; long oldPos = reader.BaseStream.Position;
stringsTable[oldPos] = reader.ReadCString(); stringsTable[oldPos + stringDataOffset] = reader.ReadCString();
i += (int)(reader.BaseStream.Position - oldPos); i += (int)(reader.BaseStream.Position - oldPos);
} }
@@ -159,29 +172,23 @@ namespace Game.DataStorage
if (reader.BaseStream.Position != sections[sectionIndex].SparseTableOffset) if (reader.BaseStream.Position != sections[sectionIndex].SparseTableOffset)
throw new Exception("reader.BaseStream.Position != sections[sectionIndex].SparseTableOffset"); throw new Exception("reader.BaseStream.Position != sections[sectionIndex].SparseTableOffset");
offsetmap = new List<Tuple<int, short>>();
for (int i = 0; i < (Header.MaxId - Header.MinId + 1); i++)
{
int offset = reader.ReadInt32();
short length = reader.ReadInt16();
if (offset == 0 || length == 0)
continue;
offsetmap.Add(new Tuple<int, short>(offset, length));
}
} }
Array.Resize(ref recordsData, recordsData.Length + 8); // pad with extra zeros so we don't crash when reading
// index data // index data
int[] indexData = reader.ReadArray<int>((uint)(sections[sectionIndex].IndexDataSize / 4)); int[] indexData = reader.ReadArray<int>((uint)(sections[sectionIndex].IndexDataSize / 4));
bool isIndexEmpty = Header.HasIndexTable() && indexData.Count(i => i == 0) == sections[sectionIndex].NumRecords;
// duplicate rows data // duplicate rows data
Dictionary<int, int> copyData = new Dictionary<int, int>(); Dictionary<int, int> copyData = new Dictionary<int, int>();
for (int i = 0; i < sections[sectionIndex].CopyTableSize / 8; i++) for (int i = 0; i < sections[sectionIndex].NumCopyRecords; i++)
copyData[reader.ReadInt32()] = reader.ReadInt32(); copyData[reader.ReadInt32()] = reader.ReadInt32();
if (sections[sectionIndex].NumSparseRecords > 0)
sparseEntries = reader.ReadArray<SparseEntry>((uint)sections[sectionIndex].NumSparseRecords);
// reference data // reference data
ReferenceData refData = null; ReferenceData refData = null;
@@ -208,24 +215,31 @@ namespace Game.DataStorage
}; };
} }
if (sections[sectionIndex].NumSparseRecords > 0)
{
// TODO: use this shit
int[] sparseIndexData = reader.ReadArray<int>((uint)sections[sectionIndex].NumSparseRecords);
if (Header.HasIndexTable() && indexData.Length != sparseIndexData.Length)
throw new Exception("indexData.Length != sparseIndexData.Length");
//indexData = sparseIndexData;
}
BitReader bitReader = new BitReader(recordsData); BitReader bitReader = new BitReader(recordsData);
for (int i = 0; i < Header.RecordCount; ++i) for (int i = 0; i < sections[sectionIndex].NumRecords; ++i)
{ {
bitReader.Position = 0; bitReader.Position = 0;
if (offsetmap != null) if (Header.HasOffsetTable())
bitReader.Offset = offsetmap[i].Item1 - sections[sectionIndex].FileOffset; bitReader.Offset = sparseEntries[i].Offset - sections[sectionIndex].FileOffset;
else else
bitReader.Offset = i * (int)Header.RecordSize; bitReader.Offset = i * (int)Header.RecordSize;
bool hasRef = refData.Entries.TryGetValue(i, out int refId); bool hasRef = refData.Entries.TryGetValue(i, out int refId);
var rec = new WDC2Row(this, bitReader, sections[sectionIndex].FileOffset, sections[sectionIndex].IndexDataSize != 0 ? indexData[i] : -1, hasRef ? refId : -1, stringsTable); var rec = new WDC3Row(this, bitReader, sections[sectionIndex].FileOffset, Header.HasIndexTable() ? (isIndexEmpty ? i : indexData[i]) : -1, hasRef ? refId : -1, stringsTable);
_records.Add(rec.Id, rec);
if (sections[sectionIndex].IndexDataSize != 0)
_records.Add(indexData[i], rec);
else
_records.Add(rec.Id, rec);
} }
foreach (var copyRow in copyData) foreach (var copyRow in copyData)
@@ -234,6 +248,8 @@ namespace Game.DataStorage
rec.Id = copyRow.Key; rec.Id = copyRow.Key;
_records.Add(copyRow.Key, rec); _records.Add(copyRow.Key, rec);
} }
previousStringTableSize += sections[sectionIndex].StringTableSize;
} }
} }
@@ -246,10 +262,10 @@ namespace Game.DataStorage
internal Value32[][] PalletData; internal Value32[][] PalletData;
internal Dictionary<int, Value32>[] CommonData; internal Dictionary<int, Value32>[] CommonData;
Dictionary<int, WDC2Row> _records = new Dictionary<int, WDC2Row>(); Dictionary<int, WDC3Row> _records = new Dictionary<int, WDC3Row>();
} }
class WDC2Row class WDC3Row
{ {
private BitReader _data; private BitReader _data;
private int _dataOffset; private int _dataOffset;
@@ -265,7 +281,7 @@ namespace Game.DataStorage
private Dictionary<int, Value32>[] _commonData; private Dictionary<int, Value32>[] _commonData;
private Dictionary<long, string> _stringsTable; private Dictionary<long, string> _stringsTable;
public WDC2Row(DBReader reader, BitReader data, int recordsOffset, int id, int refId, Dictionary<long, string> stringsTable) public WDC3Row(DBReader reader, BitReader data, int recordsOffset, int id, int refId, Dictionary<long, string> stringsTable)
{ {
_data = data; _data = data;
_recordsOffset = recordsOffset; _recordsOffset = recordsOffset;
@@ -553,9 +569,9 @@ namespace Game.DataStorage
return obj; return obj;
} }
public WDC2Row Clone() public WDC3Row Clone()
{ {
return (WDC2Row)MemberwiseClone(); return (WDC3Row)MemberwiseClone();
} }
} }
@@ -669,14 +685,15 @@ namespace Game.DataStorage
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SectionHeader public struct SectionHeader
{ {
public long TactKeyLookup; public ulong TactKeyLookup;
public int FileOffset; public int FileOffset;
public int NumRecords; public int NumRecords;
public int StringTableSize; public int StringTableSize;
public int CopyTableSize;
public int SparseTableOffset; // CatalogDataOffset, absolute value, {uint offset, ushort size}[MaxId - MinId + 1] public int SparseTableOffset; // CatalogDataOffset, absolute value, {uint offset, ushort size}[MaxId - MinId + 1]
public int IndexDataSize; // int indexData[IndexDataSize / 4] public int IndexDataSize; // int indexData[IndexDataSize / 4]
public int ParentLookupDataSize; // uint NumRecords, uint minId, uint maxId, {uint id, uint index}[NumRecords], questionable usefulness... public int ParentLookupDataSize; // uint NumRecords, uint minId, uint maxId, {uint id, uint index}[NumRecords], questionable usefulness...
public int NumSparseRecords;
public int NumCopyRecords;
} }
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
+72 -20
View File
@@ -136,6 +136,13 @@ namespace Game.DataStorage
_defaultChrSpecializationsByClass[(uint)chrSpec.ClassID] = chrSpec; _defaultChrSpecializationsByClass[(uint)chrSpec.ClassID] = chrSpec;
} }
foreach (ContentTuningXExpectedRecord contentTuningXExpectedStat in CliDB.ContentTuningXExpectedStorage.Values)
{
ExpectedStatModRecord expectedStatMod = CliDB.ExpectedStatModStorage.LookupByKey(contentTuningXExpectedStat.ExpectedStatModID);
if (expectedStatMod != null)
_expectedStatModsByContentTuning.Add(contentTuningXExpectedStat.ContentTuningID, expectedStatMod);
}
foreach (CurvePointRecord curvePoint in CliDB.CurvePointStorage.Values) foreach (CurvePointRecord curvePoint in CliDB.CurvePointStorage.Values)
{ {
if (CliDB.CurveStorage.ContainsKey(curvePoint.CurveID)) if (CliDB.CurveStorage.ContainsKey(curvePoint.CurveID))
@@ -396,6 +403,12 @@ namespace Game.DataStorage
CliDB.RulesetItemUpgradeStorage.Clear(); CliDB.RulesetItemUpgradeStorage.Clear();
foreach (SkillLineRecord skill in CliDB.SkillLineStorage.Values)
{
if (skill.ParentSkillLineID != 0)
_skillLinesByParentSkillLine.Add(skill.ParentSkillLineID, skill);
}
foreach (SkillLineAbilityRecord skillLineAbility in CliDB.SkillLineAbilityStorage.Values) foreach (SkillLineAbilityRecord skillLineAbility in CliDB.SkillLineAbilityStorage.Values)
_skillLineAbilitiesBySkillupSkill.Add(skillLineAbility.SkillupSkillLineID != 0 ? skillLineAbility.SkillupSkillLineID : skillLineAbility.SkillLine, skillLineAbility); _skillLineAbilitiesBySkillupSkill.Add(skillLineAbility.SkillupSkillLineID != 0 ? skillLineAbility.SkillupSkillLineID : skillLineAbility.SkillLine, skillLineAbility);
@@ -969,61 +982,93 @@ namespace Game.DataStorage
if (expectedStatRecord == null) if (expectedStatRecord == null)
return 1.0f; return 1.0f;
ExpectedStatModRecord[] mods = new ExpectedStatModRecord[3]; ExpectedStatModRecord classMod = null;
ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(contentTuningId);
if (contentTuning != null)
{
mods[0] = CliDB.ExpectedStatModStorage.LookupByKey(contentTuning.ExpectedStatModID);
mods[1] = CliDB.ExpectedStatModStorage.LookupByKey(contentTuning.DifficultyESMID);
}
switch (unitClass) switch (unitClass)
{ {
case Class.Warrior: case Class.Warrior:
mods[2] = CliDB.ExpectedStatModStorage.LookupByKey(4); classMod = CliDB.ExpectedStatModStorage.LookupByKey(4);
break; break;
case Class.Paladin: case Class.Paladin:
mods[2] = CliDB.ExpectedStatModStorage.LookupByKey(2); classMod = CliDB.ExpectedStatModStorage.LookupByKey(2);
break; break;
case Class.Rogue: case Class.Rogue:
mods[2] = CliDB.ExpectedStatModStorage.LookupByKey(3); classMod = CliDB.ExpectedStatModStorage.LookupByKey(3);
break; break;
case Class.Mage: case Class.Mage:
mods[2] = CliDB.ExpectedStatModStorage.LookupByKey(1); classMod = CliDB.ExpectedStatModStorage.LookupByKey(1);
break; break;
default: default:
break; break;
} }
List<ExpectedStatModRecord> contentTuningMods = _expectedStatModsByContentTuning.LookupByKey(contentTuningId);
float value = 0.0f; float value = 0.0f;
switch (stat) switch (stat)
{ {
case ExpectedStatType.CreatureHealth: case ExpectedStatType.CreatureHealth:
value = mods.Sum(expectedStatMod => expectedStatRecord.CreatureHealth * (expectedStatMod != null ? expectedStatMod.CreatureHealthMod : 1.0f)); value = expectedStatRecord.CreatureHealth;
if (contentTuningMods != null)
value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureHealthMod : 1.0f);
if (classMod != null)
value *= classMod.CreatureHealthMod;
break; break;
case ExpectedStatType.PlayerHealth: case ExpectedStatType.PlayerHealth:
value = mods.Sum(expectedStatMod => expectedStatRecord.PlayerHealth * (expectedStatMod != null ? expectedStatMod.PlayerHealthMod : 1.0f)); value = expectedStatRecord.PlayerHealth;
if (contentTuningMods != null)
value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerHealthMod : 1.0f);
if (classMod != null)
value *= classMod.PlayerHealthMod;
break; break;
case ExpectedStatType.CreatureAutoAttackDps: case ExpectedStatType.CreatureAutoAttackDps:
value = mods.Sum(expectedStatMod => expectedStatRecord.CreatureAutoAttackDps * (expectedStatMod != null ? expectedStatMod.CreatureAutoAttackDPSMod : 1.0f)); value = expectedStatRecord.CreatureAutoAttackDps;
if (contentTuningMods != null)
value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureAutoAttackDPSMod : 1.0f);
if (classMod != null)
value *= classMod.CreatureAutoAttackDPSMod;
break; break;
case ExpectedStatType.CreatureArmor: case ExpectedStatType.CreatureArmor:
value = mods.Sum(expectedStatMod => expectedStatRecord.CreatureArmor * (expectedStatMod != null ? expectedStatMod.CreatureArmorMod : 1.0f)); value = expectedStatRecord.CreatureArmor;
if (contentTuningMods != null)
value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureArmorMod : 1.0f);
if (classMod != null)
value *= classMod.CreatureArmorMod;
break; break;
case ExpectedStatType.PlayerMana: case ExpectedStatType.PlayerMana:
value = mods.Sum(expectedStatMod => expectedStatRecord.PlayerMana * (expectedStatMod != null ? expectedStatMod.PlayerManaMod : 1.0f)); value = expectedStatRecord.PlayerMana;
if (contentTuningMods != null)
value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerManaMod : 1.0f);
if (classMod != null)
value *= classMod.PlayerManaMod;
break; break;
case ExpectedStatType.PlayerPrimaryStat: case ExpectedStatType.PlayerPrimaryStat:
value = mods.Sum(expectedStatMod => expectedStatRecord.PlayerPrimaryStat * (expectedStatMod != null ? expectedStatMod.PlayerPrimaryStatMod : 1.0f)); value = expectedStatRecord.PlayerPrimaryStat;
if (contentTuningMods != null)
value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerPrimaryStatMod : 1.0f);
if (classMod != null)
value *= classMod.PlayerPrimaryStatMod;
break; break;
case ExpectedStatType.PlayerSecondaryStat: case ExpectedStatType.PlayerSecondaryStat:
value = mods.Sum(expectedStatMod => expectedStatRecord.PlayerSecondaryStat * (expectedStatMod != null ? expectedStatMod.PlayerSecondaryStatMod : 1.0f)); value = expectedStatRecord.PlayerSecondaryStat;
if (contentTuningMods != null)
value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerSecondaryStatMod : 1.0f);
if (classMod != null)
value *= classMod.PlayerSecondaryStatMod;
break; break;
case ExpectedStatType.ArmorConstant: case ExpectedStatType.ArmorConstant:
value = mods.Sum(expectedStatMod => expectedStatRecord.ArmorConstant * (expectedStatMod != null ? expectedStatMod.ArmorConstantMod : 1.0f)); value = expectedStatRecord.ArmorConstant;
if (contentTuningMods != null)
value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.ArmorConstantMod : 1.0f);
if (classMod != null)
value *= classMod.ArmorConstantMod;
break; break;
case ExpectedStatType.None: case ExpectedStatType.None:
break; break;
case ExpectedStatType.CreatureSpellDamage: case ExpectedStatType.CreatureSpellDamage:
value = mods.Sum(expectedStatMod => expectedStatRecord.CreatureSpellDamage * (expectedStatMod != null ? expectedStatMod.CreatureSpellDamageMod : 1.0f)); value = expectedStatRecord.CreatureSpellDamage;
if (contentTuningMods != null)
value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureSpellDamageMod : 1.0f);
if (classMod != null)
value *= classMod.CreatureSpellDamageMod;
break; break;
default: default:
break; break;
@@ -1479,6 +1524,11 @@ namespace Game.DataStorage
return _rulesetItemUpgrade.LookupByKey(itemId); return _rulesetItemUpgrade.LookupByKey(itemId);
} }
public List<SkillLineRecord> GetSkillLinesForParentSkill(uint parentSkillId)
{
return _skillLinesByParentSkillLine.LookupByKey(parentSkillId);
}
public List<SkillLineAbilityRecord> GetSkillLineAbilitiesBySkill(uint skillId) public List<SkillLineAbilityRecord> GetSkillLineAbilitiesBySkill(uint skillId)
{ {
return _skillLineAbilitiesBySkillupSkill.LookupByKey(skillId); return _skillLineAbilitiesBySkillupSkill.LookupByKey(skillId);
@@ -1903,6 +1953,7 @@ namespace Game.DataStorage
MultiMap<uint, CurvePointRecord> _curvePoints = new MultiMap<uint, CurvePointRecord>(); MultiMap<uint, CurvePointRecord> _curvePoints = new MultiMap<uint, CurvePointRecord>();
Dictionary<Tuple<uint, byte, byte, byte>, EmotesTextSoundRecord> _emoteTextSounds = new Dictionary<Tuple<uint, byte, byte, byte>, EmotesTextSoundRecord>(); Dictionary<Tuple<uint, byte, byte, byte>, EmotesTextSoundRecord> _emoteTextSounds = new Dictionary<Tuple<uint, byte, byte, byte>, EmotesTextSoundRecord>();
Dictionary<Tuple<uint, int>, ExpectedStatRecord> _expectedStatsByLevel = new Dictionary<Tuple<uint, int>, ExpectedStatRecord>(); Dictionary<Tuple<uint, int>, ExpectedStatRecord> _expectedStatsByLevel = new Dictionary<Tuple<uint, int>, ExpectedStatRecord>();
MultiMap<uint, ExpectedStatModRecord> _expectedStatModsByContentTuning = new MultiMap<uint, ExpectedStatModRecord>();
MultiMap<uint, uint> _factionTeams = new MultiMap<uint, uint>(); MultiMap<uint, uint> _factionTeams = new MultiMap<uint, uint>();
Dictionary<uint, HeirloomRecord> _heirlooms = new Dictionary<uint, HeirloomRecord>(); Dictionary<uint, HeirloomRecord> _heirlooms = new Dictionary<uint, HeirloomRecord>();
MultiMap<uint, uint> _glyphBindableSpells = new MultiMap<uint, uint>(); MultiMap<uint, uint> _glyphBindableSpells = new MultiMap<uint, uint>();
@@ -1933,6 +1984,7 @@ namespace Game.DataStorage
MultiMap<uint, RewardPackXCurrencyTypeRecord> _rewardPackCurrencyTypes = new MultiMap<uint, RewardPackXCurrencyTypeRecord>(); MultiMap<uint, RewardPackXCurrencyTypeRecord> _rewardPackCurrencyTypes = new MultiMap<uint, RewardPackXCurrencyTypeRecord>();
MultiMap<uint, RewardPackXItemRecord> _rewardPackItems = new MultiMap<uint, RewardPackXItemRecord>(); MultiMap<uint, RewardPackXItemRecord> _rewardPackItems = new MultiMap<uint, RewardPackXItemRecord>();
Dictionary<uint, uint> _rulesetItemUpgrade = new Dictionary<uint, uint>(); Dictionary<uint, uint> _rulesetItemUpgrade = new Dictionary<uint, uint>();
MultiMap<uint, SkillLineRecord> _skillLinesByParentSkillLine = new MultiMap<uint, SkillLineRecord>();
MultiMap<uint, SkillLineAbilityRecord> _skillLineAbilitiesBySkillupSkill = new MultiMap<uint, SkillLineAbilityRecord>(); MultiMap<uint, SkillLineAbilityRecord> _skillLineAbilitiesBySkillupSkill = new MultiMap<uint, SkillLineAbilityRecord>();
MultiMap<uint, SkillRaceClassInfoRecord> _skillRaceClassInfoBySkill = new MultiMap<uint, SkillRaceClassInfoRecord>(); MultiMap<uint, SkillRaceClassInfoRecord> _skillRaceClassInfoBySkill = new MultiMap<uint, SkillRaceClassInfoRecord>();
MultiMap<uint, SpecializationSpellsRecord> _specializationSpellsBySpec = new MultiMap<uint, SpecializationSpellsRecord>(); MultiMap<uint, SpecializationSpellsRecord> _specializationSpellsBySpec = new MultiMap<uint, SpecializationSpellsRecord>();
+4 -2
View File
@@ -36,6 +36,7 @@ namespace Game.DataStorage
public AchievementFlags Flags; public AchievementFlags Flags;
public ushort UiOrder; public ushort UiOrder;
public uint IconFileID; public uint IconFileID;
public int RewardItemID;
public uint CriteriaTree; public uint CriteriaTree;
public ushort SharesCriteria; public ushort SharesCriteria;
} }
@@ -43,9 +44,9 @@ namespace Game.DataStorage
public sealed class AnimationDataRecord public sealed class AnimationDataRecord
{ {
public uint Id; public uint Id;
public ushort Fallback; public ushort BehaviorID;
public byte BehaviorTier; public byte BehaviorTier;
public int BehaviorID; public int Fallback;
public int[] Flags = new int[2]; public int[] Flags = new int[2];
} }
@@ -161,6 +162,7 @@ namespace Game.DataStorage
public uint UiAltItemAppearanceID; public uint UiAltItemAppearanceID;
public byte Flags; public byte Flags;
public ushort UiCameraID; public ushort UiCameraID;
public uint UsablePlayerConditionID;
} }
public sealed class ArtifactAppearanceSetRecord public sealed class ArtifactAppearanceSetRecord
+2 -2
View File
@@ -36,7 +36,7 @@ namespace Game.DataStorage
public string DisplayName; public string DisplayName;
public string Description; public string Description;
public uint Id; public uint Id;
public byte Type; // value 0 -> hair, value 2 -> facialhair public byte Type; // value 0 . hair, value 2 . facialhair
public float CostModifier; public float CostModifier;
public byte Race; public byte Race;
public byte Sex; public byte Sex;
@@ -76,7 +76,7 @@ namespace Game.DataStorage
public sealed class BattlePetSpeciesStateRecord public sealed class BattlePetSpeciesStateRecord
{ {
public uint Id; public uint Id;
public byte BattlePetStateID; public ushort BattlePetStateID;
public int Value; public int Value;
public uint BattlePetSpeciesID; public uint BattlePetSpeciesID;
} }
+12 -1
View File
@@ -102,6 +102,7 @@ namespace Game.DataStorage
public uint IconFileDataID; public uint IconFileDataID;
public uint LowResScreenFileDataID; public uint LowResScreenFileDataID;
public int StartingLevel; public int StartingLevel;
public uint SpellTextureBlobFileDataID;
public ushort Flags; public ushort Flags;
public ushort CinematicSequenceID; public ushort CinematicSequenceID;
public ushort DefaultSpec; public ushort DefaultSpec;
@@ -214,8 +215,14 @@ namespace Game.DataStorage
public int MinLevel; public int MinLevel;
public int MaxLevel; public int MaxLevel;
public int Flags; public int Flags;
public int ExpansionID;
}
public sealed class ContentTuningXExpectedRecord
{
public uint Id;
public int ExpectedStatModID; public int ExpectedStatModID;
public int DifficultyESMID; public uint ContentTuningID;
} }
public sealed class ConversationLineRecord public sealed class ConversationLineRecord
@@ -322,6 +329,9 @@ namespace Game.DataStorage
public float OverrideNameScale; public float OverrideNameScale;
public float OverrideSelectionRadius; public float OverrideSelectionRadius;
public float TamedPetBaseScale; public float TamedPetBaseScale;
public sbyte Unknown820_1; // scale related
public float Unknown820_2; // scale related
public float[] Unknown820_3 = new float[2]; // scale related
} }
public sealed class CreatureTypeRecord public sealed class CreatureTypeRecord
@@ -373,6 +383,7 @@ namespace Game.DataStorage
public uint Flags; public uint Flags;
public sbyte Quality; public sbyte Quality;
public int FactionID; public int FactionID;
public int ItemGroupSoundsID;
} }
public sealed class CurveRecord public sealed class CurveRecord
@@ -71,10 +71,12 @@ namespace Game.DataStorage
public short MapID; public short MapID;
public sbyte DifficultyID; public sbyte DifficultyID;
public int OrderIndex; public int OrderIndex;
public int CompleteWorldStateID;
public sbyte Bit; public sbyte Bit;
public int CreatureDisplayID; public int CreatureDisplayID;
public byte Flags; public byte Flags;
public int SpellIconFileID; public int SpellIconFileID;
public int Faction;
} }
public sealed class DurabilityCostsRecord public sealed class DurabilityCostsRecord
+1 -1
View File
@@ -29,7 +29,7 @@ namespace Game.DataStorage
public short ReputationIndex; public short ReputationIndex;
public ushort ParentFactionID; public ushort ParentFactionID;
public byte Expansion; public byte Expansion;
public byte FriendshipRepID; public uint FriendshipRepID;
public byte Flags; public byte Flags;
public ushort ParagonFactionID; public ushort ParagonFactionID;
public short[] ReputationClassMask = new short[4]; public short[] ReputationClassMask = new short[4];
+3 -3
View File
@@ -131,8 +131,8 @@ namespace Game.DataStorage
public int AllianceCreatureID; public int AllianceCreatureID;
public byte HordeGarrFollRaceID; public byte HordeGarrFollRaceID;
public byte AllianceGarrFollRaceID; public byte AllianceGarrFollRaceID;
public byte HordeGarrClassSpecID; public uint HordeGarrClassSpecID;
public byte AllianceGarrClassSpecID; public uint AllianceGarrClassSpecID;
public byte Quality; public byte Quality;
public byte FollowerLevel; public byte FollowerLevel;
public ushort ItemLevelWeapon; public ushort ItemLevelWeapon;
@@ -232,9 +232,9 @@ namespace Game.DataStorage
{ {
public uint Id; public uint Id;
public uint SpellID; public uint SpellID;
public ushort SpellIconID;
public byte GlyphType; public byte GlyphType;
public byte GlyphExclusiveCategoryID; public byte GlyphExclusiveCategoryID;
public uint SpellIconID;
} }
public sealed class GlyphRequiredSpecRecord public sealed class GlyphRequiredSpecRecord
@@ -166,6 +166,7 @@ namespace Game.DataStorage
public float Gem3; public float Gem3;
public float Health; public float Health;
public float DamageReplaceStat; public float DamageReplaceStat;
public float DamageSecondary;
} }
public sealed class GtXpRecord public sealed class GtXpRecord
+2 -2
View File
@@ -29,8 +29,8 @@ namespace Game.DataStorage
public sbyte SourceTypeEnum; public sbyte SourceTypeEnum;
public byte Flags; public byte Flags;
public int LegacyItemID; public int LegacyItemID;
public int[] UpgradeItemID = new int[3]; public int[] UpgradeItemID = new int[4];
public ushort[] UpgradeItemBonusListID = new ushort[3]; public ushort[] UpgradeItemBonusListID = new ushort[4];
} }
public sealed class HolidaysRecord public sealed class HolidaysRecord
+20 -19
View File
@@ -102,16 +102,33 @@ namespace Game.DataStorage
public uint Id; public uint Id;
public int[] Value = new int[3]; public int[] Value = new int[3];
public ushort ParentItemBonusListID; public ushort ParentItemBonusListID;
public ItemBonusType Type; public ItemBonusType BonusType;
public byte OrderIndex; public byte OrderIndex;
} }
public sealed class ItemBonusListGroupEntryRecord
{
public uint Id;
public int ItemBonusListID;
public int ItemLevelSelectorID;
public int OrderIndex;
public int ItemExtendedCostID;
public int ItemBonusListGroupID;
}
public sealed class ItemBonusListLevelDeltaRecord public sealed class ItemBonusListLevelDeltaRecord
{ {
public short ItemLevelDelta; public short ItemLevelDelta;
public uint Id; public uint Id;
} }
public sealed class ItemBonusSequenceSpellRecord
{
public uint Id;
public int SpellID;
public int ItemID;
}
public sealed class ItemBonusTreeNodeRecord public sealed class ItemBonusTreeNodeRecord
{ {
public uint Id; public uint Id;
@@ -125,9 +142,9 @@ namespace Game.DataStorage
public sealed class ItemChildEquipmentRecord public sealed class ItemChildEquipmentRecord
{ {
public uint Id; public uint Id;
public uint ParentItemID;
public uint ChildItemID; public uint ChildItemID;
public byte ChildItemEquipSlot; public byte ChildItemEquipSlot;
public uint ParentItemID;
} }
public sealed class ItemClassRecord public sealed class ItemClassRecord
@@ -206,6 +223,7 @@ namespace Game.DataStorage
public uint Id; public uint Id;
public ushort MinItemLevel; public ushort MinItemLevel;
public ushort ItemLevelSelectorQualitySetID; public ushort ItemLevelSelectorQualitySetID;
public ushort AzeriteUnlockMappingSet;
} }
public sealed class ItemLevelSelectorQualityRecord public sealed class ItemLevelSelectorQualityRecord
@@ -257,21 +275,6 @@ namespace Game.DataStorage
public float Weapon; public float Weapon;
} }
public sealed class ItemRandomPropertiesRecord
{
public uint Id;
public LocalizedString Name;
public ushort[] Enchantment = new ushort[ItemConst.MaxItemRandomProperties];
}
public sealed class ItemRandomSuffixRecord
{
public uint Id;
public LocalizedString Name;
public ushort[] Enchantment = new ushort[ItemConst.MaxItemRandomProperties];
public ushort[] AllocationPct = new ushort[ItemConst.MaxItemRandomProperties];
}
public sealed class ItemSearchNameRecord public sealed class ItemSearchNameRecord
{ {
public long AllowableRace; public long AllowableRace;
@@ -345,8 +348,6 @@ namespace Game.DataStorage
public ushort InstanceBound; public ushort InstanceBound;
public ushort ZoneBound; public ushort ZoneBound;
public ushort ItemSet; public ushort ItemSet;
public ushort ItemRandomSuffixGroupID;
public ushort RandomSelect;
public ushort LockID; public ushort LockID;
public ushort StartQuestID; public ushort StartQuestID;
public ushort PageID; public ushort PageID;
+10 -8
View File
@@ -50,6 +50,7 @@ namespace Game.DataStorage
public byte MaxPlayers; public byte MaxPlayers;
public short WindSettingsID; public short WindSettingsID;
public int ZmpFileDataID; public int ZmpFileDataID;
public int WdtFileDataID;
public MapFlags[] Flags = new MapFlags[2]; public MapFlags[] Flags = new MapFlags[2];
// Helpers // Helpers
@@ -95,14 +96,14 @@ namespace Game.DataStorage
{ {
public uint Id; public uint Id;
public LocalizedString Message; // m_message_lang (text showed when transfer to map failed) public LocalizedString Message; // m_message_lang (text showed when transfer to map failed)
public uint ItemContextPickerID; public uint DifficultyID;
public int ContentTuningID; public int LockID;
public byte DifficultyID;
public byte LockID;
public byte ResetInterval; public byte ResetInterval;
public byte MaxPlayers; public uint MaxPlayers;
public byte ItemContext; public int ItemContext;
public byte Flags; public uint ItemContextPickerID;
public int Flags;
public int ContentTuningID;
public uint MapID; public uint MapID;
public uint GetRaidDuration() public uint GetRaidDuration()
@@ -121,7 +122,7 @@ namespace Game.DataStorage
public uint Parent; public uint Parent;
public sbyte Operator; public sbyte Operator;
public sbyte Amount; public sbyte Amount;
public byte Type; public uint Type;
public uint Asset; public uint Asset;
public int SecondaryAsset; public int SecondaryAsset;
public sbyte TertiaryAsset; public sbyte TertiaryAsset;
@@ -154,6 +155,7 @@ namespace Game.DataStorage
public uint ReqSpellKnownID; public uint ReqSpellKnownID;
public uint ModSpellAuraID; public uint ModSpellAuraID;
public short ReqMapID; public short ReqMapID;
public int PlayerConditionID;
} }
public sealed class MountTypeXCapabilityRecord public sealed class MountTypeXCapabilityRecord
@@ -21,6 +21,7 @@ namespace Game.DataStorage
{ {
public uint Id; public uint Id;
public int DamageReplaceStat; public int DamageReplaceStat;
public int DamageSecondary;
public uint[] Epic = new uint[5]; public uint[] Epic = new uint[5];
public uint[] Superior = new uint[5]; public uint[] Superior = new uint[5];
public uint[] Good = new uint[5]; public uint[] Good = new uint[5];
+3 -2
View File
@@ -139,7 +139,7 @@ namespace Game.DataStorage
public sealed class SoundKitRecord public sealed class SoundKitRecord
{ {
public uint Id; public uint Id;
public byte SoundType; public uint SoundType;
public float VolumeFloat; public float VolumeFloat;
public ushort Flags; public ushort Flags;
public float MinDistance; public float MinDistance;
@@ -331,9 +331,9 @@ namespace Game.DataStorage
public string HordeName; public string HordeName;
public uint[] EffectArg = new uint[ItemConst.MaxItemEnchantmentEffects]; public uint[] EffectArg = new uint[ItemConst.MaxItemEnchantmentEffects];
public float[] EffectScalingPoints = new float[ItemConst.MaxItemEnchantmentEffects]; public float[] EffectScalingPoints = new float[ItemConst.MaxItemEnchantmentEffects];
public uint TransmogPlayerConditionID;
public uint TransmogCost; public uint TransmogCost;
public uint IconFileDataID; public uint IconFileDataID;
public uint TransmogPlayerConditionID;
public ushort[] EffectPointsMin = new ushort[ItemConst.MaxItemEnchantmentEffects]; public ushort[] EffectPointsMin = new ushort[ItemConst.MaxItemEnchantmentEffects];
public ushort ItemVisual; public ushort ItemVisual;
public EnchantmentSlotMask Flags; public EnchantmentSlotMask Flags;
@@ -392,6 +392,7 @@ namespace Game.DataStorage
public float MinDuration; public float MinDuration;
public uint SpellIconFileDataID; public uint SpellIconFileDataID;
public uint ActiveIconFileDataID; public uint ActiveIconFileDataID;
public uint ContentTuningID;
public int[] Attributes = new int[14]; public int[] Attributes = new int[14];
public uint SpellID; public uint SpellID;
} }
+6 -3
View File
@@ -48,10 +48,11 @@ namespace Game.DataStorage
public Vector2 FlightMapOffset; public Vector2 FlightMapOffset;
public uint Id; public uint Id;
public ushort ContinentID; public ushort ContinentID;
public ushort ConditionID; public uint ConditionID;
public ushort CharacterBitNumber; public ushort CharacterBitNumber;
public TaxiNodeFlags Flags; public TaxiNodeFlags Flags;
public int UiTextureKitID; public int UiTextureKitID;
public int MinimapAtlasMemberID;
public float Facing; public float Facing;
public uint SpecialIconConditionID; public uint SpecialIconConditionID;
public uint VisibilityConditionID; public uint VisibilityConditionID;
@@ -75,8 +76,8 @@ namespace Game.DataStorage
public ushort ContinentID; public ushort ContinentID;
public TaxiPathNodeFlags Flags; public TaxiPathNodeFlags Flags;
public uint Delay; public uint Delay;
public ushort ArrivalEventID; public uint ArrivalEventID;
public ushort DepartureEventID; public uint DepartureEventID;
} }
public sealed class TotemCategoryRecord public sealed class TotemCategoryRecord
@@ -112,7 +113,9 @@ namespace Game.DataStorage
public uint TransmogSetGroupID; public uint TransmogSetGroupID;
public int ItemNameDescriptionID; public int ItemNameDescriptionID;
public ushort ParentTransmogSetID; public ushort ParentTransmogSetID;
public byte Unknown810;
public byte ExpansionID; public byte ExpansionID;
public int PatchID;
public short UiOrder; public short UiOrder;
} }
@@ -58,6 +58,8 @@ namespace Game.DataStorage
public int ParentUiMapID; public int ParentUiMapID;
public int OrderIndex; public int OrderIndex;
public int ChildUiMapID; public int ChildUiMapID;
public int OverrideHighlightFileDataID;
public int OverrideHighlightAtlasID;
} }
public sealed class UiMapXMapArtRecord public sealed class UiMapXMapArtRecord
+1 -1
View File
@@ -44,7 +44,7 @@ namespace Game.DataStorage
public uint Id; public uint Id;
public uint QuestFeedbackEffectID; public uint QuestFeedbackEffectID;
public byte WhenToDisplay; public byte WhenToDisplay;
public byte TargetType; public int TargetType;
public int TargetAsset; public int TargetAsset;
public uint PlayerConditionID; public uint PlayerConditionID;
public ushort CombatConditionID; public ushort CombatConditionID;
+78 -21
View File
@@ -26,6 +26,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using Game; using Game;
using Framework.Dynamic; using Framework.Dynamic;
using Game.Network;
namespace Game.Entities namespace Game.Entities
{ {
@@ -42,7 +43,7 @@ namespace Game.Entities
m_updateFlag.Stationary = true; m_updateFlag.Stationary = true;
m_updateFlag.AreaTrigger = true; m_updateFlag.AreaTrigger = true;
valuesCount = (int)AreaTriggerFields.End; m_areaTriggerData = new AreaTriggerFieldData();
_spline = new Spline(); _spline = new Spline();
} }
@@ -114,19 +115,35 @@ namespace Game.Entities
SetObjectScale(1.0f); SetObjectScale(1.0f);
SetGuidValue(AreaTriggerFields.Caster, caster.GetGUID()); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Caster), caster.GetGUID());
SetGuidValue(AreaTriggerFields.CreatingEffectGuid, castId); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.CreatingEffectGUID), castId);
SetUInt32Value(AreaTriggerFields.SpellId, spell.Id); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellID), spell.Id);
SetUInt32Value(AreaTriggerFields.SpellForVisuals, spell.Id); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellForVisuals), spell.Id);
SetUInt32Value(AreaTriggerFields.SpellXSpellVisualId, spellXSpellVisualId); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellXSpellVisualID), spellXSpellVisualId);
SetUInt32Value(AreaTriggerFields.TimeToTargetScale, GetMiscTemplate().TimeToTargetScale != 0 ? GetMiscTemplate().TimeToTargetScale : GetUInt32Value(AreaTriggerFields.Duration)); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTargetScale), GetMiscTemplate().TimeToTargetScale != 0 ? GetMiscTemplate().TimeToTargetScale : m_areaTriggerData.Duration);
SetFloatValue(AreaTriggerFields.BoundsRadius2d, GetTemplate().MaxSearchRadius); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.BoundsRadius2D), GetTemplate().MaxSearchRadius);
SetUInt32Value(AreaTriggerFields.DecalPropertiesId, GetMiscTemplate().DecalPropertiesId); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.DecalPropertiesID), GetMiscTemplate().DecalPropertiesId);
ScaleCurve extraScaleCurve = m_areaTriggerData.ModifyValue(m_areaTriggerData.ExtraScaleCurve);
if (GetMiscTemplate().ExtraScale.Structured.StartTimeOffset != 0)
SetUpdateFieldValue(ref extraScaleCurve.StartTimeOffset, GetMiscTemplate().ExtraScale.Structured.StartTimeOffset);
if (GetMiscTemplate().ExtraScale.Structured.X != 0 || GetMiscTemplate().ExtraScale.Structured.Y != 0)
{
Vector2 point = new Vector2(GetMiscTemplate().ExtraScale.Structured.X, GetMiscTemplate().ExtraScale.Structured.Y);
SetUpdateFieldValue(ref extraScaleCurve.Points[0], point);
}
if (GetMiscTemplate().ExtraScale.Structured.Z != 0 || GetMiscTemplate().ExtraScale.Structured.W != 0)
{
Vector2 point = new Vector2(GetMiscTemplate().ExtraScale.Structured.Z, GetMiscTemplate().ExtraScale.Structured.W);
SetUpdateFieldValue(ref extraScaleCurve.Points[1], point);
}
if (GetMiscTemplate().ExtraScale.Raw.Data[5] != 0)
SetUpdateFieldValue(ref extraScaleCurve.ParameterCurve, GetMiscTemplate().ExtraScale.Raw.Data[5]);
if (GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0)
SetUpdateFieldValue(ref extraScaleCurve.OverrideActive, GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0 ? true : false);
for (byte scaleCurveIndex = 0; scaleCurveIndex < SharedConst.MaxAreatriggerScale; ++scaleCurveIndex)
if (GetMiscTemplate().ExtraScale.Raw.Data[scaleCurveIndex] != 0)
SetUInt32Value(AreaTriggerFields.ExtraScaleCurve + scaleCurveIndex, (uint)GetMiscTemplate().ExtraScale.Raw.Data[scaleCurveIndex]);
PhasingHandler.InheritPhaseShift(this, caster); PhasingHandler.InheritPhaseShift(this, caster);
@@ -137,7 +154,7 @@ namespace Game.Entities
UpdateShape(); UpdateShape();
uint timeToTarget = GetMiscTemplate().TimeToTarget != 0 ? GetMiscTemplate().TimeToTarget : GetUInt32Value(AreaTriggerFields.Duration); uint timeToTarget = GetMiscTemplate().TimeToTarget != 0 ? GetMiscTemplate().TimeToTarget : m_areaTriggerData.Duration;
if (GetTemplate().HasFlag(AreaTriggerFlags.HasCircularMovement)) if (GetTemplate().HasFlag(AreaTriggerFlags.HasCircularMovement))
{ {
@@ -234,7 +251,7 @@ namespace Game.Entities
_totalDuration = newDuration; _totalDuration = newDuration;
// negative duration (permanent areatrigger) sent as 0 // negative duration (permanent areatrigger) sent as 0
SetUInt32Value(AreaTriggerFields.Duration, (uint)Math.Max(newDuration, 0)); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Duration), (uint)Math.Max(newDuration, 0));
} }
void _UpdateDuration(int newDuration) void _UpdateDuration(int newDuration)
@@ -242,7 +259,8 @@ namespace Game.Entities
_duration = newDuration; _duration = newDuration;
// should be sent in object create packets only // should be sent in object create packets only
updateValues[(int)AreaTriggerFields.Duration].SignedValue = _duration; SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Duration), (uint)_duration);
m_areaTriggerData.ClearChanged(m_areaTriggerData.Duration);
} }
float GetProgress() float GetProgress()
@@ -619,7 +637,8 @@ namespace Game.Entities
_spline.initLengths(); _spline.initLengths();
// should be sent in object create packets only // should be sent in object create packets only
updateValues[(int)AreaTriggerFields.TimeToTarget].UnsignedValue = timeToTarget; SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget);
m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget);
if (IsInWorld) if (IsInWorld)
{ {
@@ -648,7 +667,8 @@ namespace Game.Entities
Cypher.Assert(cmi.Center.HasValue || cmi.PathTarget.HasValue); Cypher.Assert(cmi.Center.HasValue || cmi.PathTarget.HasValue);
// should be sent in object create packets only // should be sent in object create packets only
updateValues[(int)AreaTriggerFields.TimeToTarget].UnsignedValue = timeToTarget; SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget);
m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget);
_circularMovementInfo.Set(cmi); _circularMovementInfo.Set(cmi);
@@ -822,6 +842,41 @@ namespace Game.Entities
_ai = null; _ai = null;
} }
public override void BuildValuesCreate(WorldPacket data, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
WorldPacket buffer = new WorldPacket();
buffer.WriteUInt8((byte)flags);
m_objectData.WriteCreate(buffer, flags, this, target);
m_areaTriggerData.WriteCreate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteBytes(buffer);
}
public override void BuildValuesUpdate(WorldPacket data, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
WorldPacket buffer = new WorldPacket();
buffer.WriteUInt32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TypeId.Object))
m_objectData.WriteUpdate(buffer, flags, this, target);
if (m_values.HasChanged(TypeId.AreaTrigger))
m_areaTriggerData.WriteUpdate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteBytes(buffer);
}
public override void ClearUpdateMask(bool remove)
{
m_values.ClearChangesMask(m_areaTriggerData);
base.ClearUpdateMask(remove);
}
AreaTriggerAI GetAI() { return _ai; } AreaTriggerAI GetAI() { return _ai; }
[System.Diagnostics.Conditional("DEBUG")] [System.Diagnostics.Conditional("DEBUG")]
@@ -838,11 +893,11 @@ namespace Game.Entities
} }
public bool IsRemoved() { return _isRemoved; } public bool IsRemoved() { return _isRemoved; }
public uint GetSpellId() { return GetUInt32Value(AreaTriggerFields.SpellId); } public uint GetSpellId() { return m_areaTriggerData.SpellID; }
public AuraEffect GetAuraEffect() { return _aurEff; } public AuraEffect GetAuraEffect() { return _aurEff; }
public uint GetTimeSinceCreated() { return _timeSinceCreated; } public uint GetTimeSinceCreated() { return _timeSinceCreated; }
public uint GetTimeToTarget() { return GetUInt32Value(AreaTriggerFields.TimeToTarget); } public uint GetTimeToTarget() { return m_areaTriggerData.TimeToTarget; }
public uint GetTimeToTargetScale() { return GetUInt32Value(AreaTriggerFields.TimeToTargetScale); } public uint GetTimeToTargetScale() { return m_areaTriggerData.TimeToTargetScale; }
public int GetDuration() { return _duration; } public int GetDuration() { return _duration; }
public int GetTotalDuration() { return _totalDuration; } public int GetTotalDuration() { return _totalDuration; }
@@ -852,7 +907,7 @@ namespace Game.Entities
public AreaTriggerMiscTemplate GetMiscTemplate() { return _areaTriggerMiscTemplate; } public AreaTriggerMiscTemplate GetMiscTemplate() { return _areaTriggerMiscTemplate; }
public ObjectGuid GetCasterGuid() { return GetGuidValue(AreaTriggerFields.Caster); } public ObjectGuid GetCasterGuid() { return m_areaTriggerData.Caster; }
public Vector3 GetRollPitchYaw() { return _rollPitchYaw; } public Vector3 GetRollPitchYaw() { return _rollPitchYaw; }
public Vector3 GetTargetRollPitchYaw() { return _targetRollPitchYaw; } public Vector3 GetTargetRollPitchYaw() { return _targetRollPitchYaw; }
@@ -863,6 +918,8 @@ namespace Game.Entities
public Optional<AreaTriggerCircularMovementInfo> GetCircularMovementInfo() { return _circularMovementInfo; } public Optional<AreaTriggerCircularMovementInfo> GetCircularMovementInfo() { return _circularMovementInfo; }
AreaTriggerFieldData m_areaTriggerData;
ObjectGuid _targetGuid; ObjectGuid _targetGuid;
AuraEffect _aurEff; AuraEffect _aurEff;
@@ -104,10 +104,19 @@ namespace Game.Entities
public uint StartTimeOffset; public uint StartTimeOffset;
[FieldOffset(4)] [FieldOffset(4)]
public float[] Points; public float X;
[FieldOffset(8)]
public float Y;
[FieldOffset(12)]
public float Z;
[FieldOffset(16)]
public float W;
[FieldOffset(20)] [FieldOffset(20)]
public curveparameters CurveParameters; public uint CurveParameters;
[FieldOffset(24)] [FieldOffset(24)]
public uint OverrideActive; public uint OverrideActive;
+65 -40
View File
@@ -20,6 +20,7 @@ using Game.DataStorage;
using Game.Maps; using Game.Maps;
using Game.Spells; using Game.Spells;
using System.Collections.Generic; using System.Collections.Generic;
using Game.Network;
namespace Game.Entities namespace Game.Entities
{ {
@@ -35,8 +36,7 @@ namespace Game.Entities
m_updateFlag.Stationary = true; m_updateFlag.Stationary = true;
m_updateFlag.Conversation = true; m_updateFlag.Conversation = true;
valuesCount = (int)ConversationFields.End; m_conversationData = new ConversationData();
_dynamicValuesCount = (int)ConversationDynamicFields.End;
} }
public override void AddToWorld() public override void AddToWorld()
@@ -117,7 +117,7 @@ namespace Game.Entities
SetEntry(conversationEntry); SetEntry(conversationEntry);
SetObjectScale(1.0f); SetObjectScale(1.0f);
SetUInt32Value(ConversationFields.LastLineEndTime, conversationTemplate.LastLineEndTime); SetUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.LastLineEndTime), conversationTemplate.LastLineEndTime);
_duration = conversationTemplate.LastLineEndTime; _duration = conversationTemplate.LastLineEndTime;
_textureKitId = conversationTemplate.TextureKitId; _textureKitId = conversationTemplate.TextureKitId;
@@ -126,11 +126,12 @@ namespace Game.Entities
ConversationActorTemplate actor = conversationTemplate.Actors[actorIndex]; ConversationActorTemplate actor = conversationTemplate.Actors[actorIndex];
if (actor != null) if (actor != null)
{ {
ConversationDynamicFieldActor actorField = new ConversationDynamicFieldActor(); ConversationActor actorField = new ConversationActor();
actorField.ActorTemplate.CreatureId = actor.CreatureId; actorField.CreatureID = actor.CreatureId;
actorField.ActorTemplate.CreatureModelId = actor.CreatureModelId; actorField.CreatureDisplayInfoID = actor.CreatureModelId;
actorField.Type = ConversationDynamicFieldActor.ActorType.CreatureActor; actorField.Type = ConversationActorType.CreatureActor;
SetDynamicStructuredValue(ConversationDynamicFields.Actors, actorIndex, actorField);
AddDynamicUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.Actors), actorField);
} }
} }
@@ -150,17 +151,30 @@ namespace Game.Entities
Global.ScriptMgr.OnConversationCreate(this, creator); Global.ScriptMgr.OnConversationCreate(this, creator);
List<ushort> actorIndices = new List<ushort>(); List<ushort> actorIndices = new List<ushort>();
List<ConversationLine> lines = new List<ConversationLine>();
foreach (ConversationLineTemplate line in conversationTemplate.Lines) foreach (ConversationLineTemplate line in conversationTemplate.Lines)
{ {
actorIndices.Add(line.ActorIdx); actorIndices.Add(line.ActorIdx);
AddDynamicStructuredValue(ConversationDynamicFields.Lines, line);
ConversationLine lineField = new ConversationLine();
lineField.ConversationLineID = line.Id;
lineField.StartTime = line.StartTime;
lineField.UiCameraID = line.UiCameraID;
lineField.ActorIndex = line.ActorIdx;
lineField.Flags = line.Flags;
lines.Add(lineField);
} }
SetUpdateFieldValue(m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.Lines), lines);
Global.ScriptMgr.OnConversationCreate(this, creator);
// All actors need to be set // All actors need to be set
foreach (ushort actorIndex in actorIndices) foreach (ushort actorIndex in actorIndices)
{ {
ConversationDynamicFieldActor actor = GetDynamicStructuredValue<ConversationDynamicFieldActor>(ConversationDynamicFields.Actors, actorIndex); ConversationActor actor = actorIndex < m_conversationData.Actors.Size() ? m_conversationData.Actors[actorIndex] : null;
if (actor == null || actor.IsEmpty()) if (actor == null || (actor.CreatureID == 0 && actor.ActorGUID.IsEmpty()))
{ {
Log.outError(LogFilter.Conversation, $"Failed to create conversation (Id: {conversationEntry}) due to missing actor (Idx: {actorIndex})."); Log.outError(LogFilter.Conversation, $"Failed to create conversation (Id: {conversationEntry}) due to missing actor (Idx: {actorIndex}).");
return false; return false;
@@ -175,10 +189,9 @@ namespace Game.Entities
void AddActor(ObjectGuid actorGuid, ushort actorIdx) void AddActor(ObjectGuid actorGuid, ushort actorIdx)
{ {
ConversationDynamicFieldActor actorField = new ConversationDynamicFieldActor(); ConversationActor actorField = m_values.ModifyValue(m_conversationData).ModifyValue(m_conversationData.Actors, actorIdx);
actorField.ActorGuid = actorGuid; SetUpdateFieldValue(ref actorField.ActorGUID, actorGuid);
actorField.Type = ConversationDynamicFieldActor.ActorType.WorldObjectActor; SetUpdateFieldValue(ref actorField.Type, ConversationActorType.WorldObjectActor);
SetDynamicStructuredValue(ConversationDynamicFields.Actors, actorIdx, actorField);
} }
void AddParticipant(ObjectGuid participantGuid) void AddParticipant(ObjectGuid participantGuid)
@@ -191,6 +204,41 @@ namespace Game.Entities
return Global.ConversationDataStorage.GetConversationTemplate(GetEntry()).ScriptId; return Global.ConversationDataStorage.GetConversationTemplate(GetEntry()).ScriptId;
} }
public override void BuildValuesCreate(WorldPacket data, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
WorldPacket buffer = new WorldPacket();
m_objectData.WriteCreate(buffer, flags, this, target);
m_conversationData.WriteCreate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteUInt8((byte)flags);
data.WriteBytes(buffer);
}
public override void BuildValuesUpdate(WorldPacket data, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
WorldPacket buffer = new WorldPacket();
buffer.WriteUInt32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TypeId.Object))
m_objectData.WriteUpdate(buffer, flags, this, target);
if (m_values.HasChanged(TypeId.Conversation))
m_conversationData.WriteUpdate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteBytes(buffer);
}
public override void ClearUpdateMask(bool remove)
{
m_values.ClearChangesMask(m_conversationData);
base.ClearUpdateMask(remove);
}
uint GetDuration() { return _duration; } uint GetDuration() { return _duration; }
public uint GetTextureKitId() { return _textureKitId; } public uint GetTextureKitId() { return _textureKitId; }
@@ -202,35 +250,12 @@ namespace Game.Entities
public override float GetStationaryO() { return _stationaryPosition.GetOrientation(); } public override float GetStationaryO() { return _stationaryPosition.GetOrientation(); }
void RelocateStationaryPosition(Position pos) { _stationaryPosition.Relocate(pos); } void RelocateStationaryPosition(Position pos) { _stationaryPosition.Relocate(pos); }
ConversationData m_conversationData;
Position _stationaryPosition = new Position(); Position _stationaryPosition = new Position();
ObjectGuid _creatorGuid; ObjectGuid _creatorGuid;
uint _duration; uint _duration;
uint _textureKitId; uint _textureKitId;
List<ObjectGuid> _participants = new List<ObjectGuid>(); List<ObjectGuid> _participants = new List<ObjectGuid>();
} }
class ConversationDynamicFieldActor
{
public enum ActorType
{
WorldObjectActor = 0,
CreatureActor = 1
}
public bool IsEmpty()
{
return ActorGuid.IsEmpty(); // this one is good enough
}
public ObjectGuid ActorGuid;
public ActorTemplateStruct ActorTemplate;
public struct ActorTemplateStruct
{
public uint CreatureId;
public uint CreatureModelId;
}
public ActorType Type;
}
} }
+95 -21
View File
@@ -21,6 +21,9 @@ using Game.DataStorage;
using Game.Loots; using Game.Loots;
using Game.Maps; using Game.Maps;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text;
using Framework.Collections;
using Game.Network;
namespace Game.Entities namespace Game.Entities
{ {
@@ -34,7 +37,7 @@ namespace Game.Entities
m_updateFlag.Stationary = true; m_updateFlag.Stationary = true;
valuesCount = (int)CorpseFields.End; m_corpseData = new CorpseData();
m_time = Time.UnixTime; m_time = Time.UnixTime;
} }
@@ -79,7 +82,7 @@ namespace Game.Entities
_Create(ObjectGuid.Create(HighGuid.Corpse, owner.GetMapId(), 0, guidlow)); _Create(ObjectGuid.Create(HighGuid.Corpse, owner.GetMapId(), 0, guidlow));
SetObjectScale(1); SetObjectScale(1);
SetGuidValue(CorpseFields.Owner, owner.GetGUID()); SetOwnerGUID(owner.GetGUID());
_cellCoord = GridDefines.ComputeCellCoord(GetPositionX(), GetPositionY()); _cellCoord = GridDefines.ComputeCellCoord(GetPositionX(), GetPositionY());
@@ -94,6 +97,14 @@ namespace Game.Entities
SQLTransaction trans = new SQLTransaction(); SQLTransaction trans = new SQLTransaction();
DeleteFromDB(trans); DeleteFromDB(trans);
StringBuilder items = new StringBuilder();
for (var i = 0; i < EquipmentSlot.End; ++i)
items.Append($"{m_corpseData.Items[i]} ");
uint bytes1 = ((uint)m_corpseData.RaceID << 8) | ((uint)m_corpseData.Sex << 16) | ((uint)m_corpseData.SkinID << 24);
uint bytes2 = ((uint)m_corpseData.FaceID) | ((uint)m_corpseData.HairStyleID << 8) | ((uint)m_corpseData.HairColorID << 16) | ((uint)m_corpseData.FacialHairStyleID << 24);
byte index = 0; byte index = 0;
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CORPSE); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CORPSE);
stmt.AddValue(index++, GetOwnerGUID().GetCounter()); // guid stmt.AddValue(index++, GetOwnerGUID().GetCounter()); // guid
@@ -102,14 +113,14 @@ namespace Game.Entities
stmt.AddValue(index++, GetPositionZ()); // posZ stmt.AddValue(index++, GetPositionZ()); // posZ
stmt.AddValue(index++, GetOrientation()); // orientation stmt.AddValue(index++, GetOrientation()); // orientation
stmt.AddValue(index++, GetMapId()); // mapId stmt.AddValue(index++, GetMapId()); // mapId
stmt.AddValue(index++, GetUInt32Value(CorpseFields.DisplayId)); // displayId stmt.AddValue(index++, (uint)m_corpseData.DisplayID); // displayId
stmt.AddValue(index++, _ConcatFields(CorpseFields.Item, EquipmentSlot.End)); // itemCache stmt.AddValue(index++, items.ToString()); // itemCache
stmt.AddValue(index++, GetUInt32Value(CorpseFields.Bytes1)); // bytes1 stmt.AddValue(index++, bytes1); // bytes1
stmt.AddValue(index++, GetUInt32Value(CorpseFields.Bytes2)); // bytes2 stmt.AddValue(index++, bytes2); // bytes2
stmt.AddValue(index++, GetUInt32Value(CorpseFields.Flags)); // flags stmt.AddValue(index++, (uint)m_corpseData.Flags); // flags
stmt.AddValue(index++, GetUInt32Value(CorpseFields.DynamicFlags)); // dynFlags stmt.AddValue(index++, (uint)m_corpseData.DynamicFlags); // dynFlags
stmt.AddValue(index++, (uint)m_time); // time stmt.AddValue(index++, (uint)m_time); // time
stmt.AddValue(index++, (uint)GetCorpseType()); // corpseType stmt.AddValue(index++, (uint)GetCorpseType()); // corpseType
stmt.AddValue(index++, GetInstanceId()); // instanceId stmt.AddValue(index++, GetInstanceId()); // instanceId
trans.Append(stmt); trans.Append(stmt);
@@ -153,16 +164,24 @@ namespace Game.Entities
_Create(ObjectGuid.Create(HighGuid.Corpse, mapId, 0, guid)); _Create(ObjectGuid.Create(HighGuid.Corpse, mapId, 0, guid));
SetObjectScale(1.0f); SetObjectScale(1.0f);
SetUInt32Value(CorpseFields.DisplayId, field.Read<uint>(5)); SetDisplayId(field.Read<uint>(5));
_LoadIntoDataField(field.Read<string>(6), (int)CorpseFields.Item, EquipmentSlot.End); StringArray items = new StringArray(field.Read<string>(6), ' ');
SetUInt32Value(CorpseFields.Bytes1, field.Read<uint>(7)); for (uint index = 0; index < EquipmentSlot.End; ++index)
SetUInt32Value(CorpseFields.Bytes2, field.Read<uint>(8)); SetItem(index, uint.Parse(items[(int)index]));
SetUInt32Value(CorpseFields.Flags, field.Read<byte>(9));
SetUInt32Value(CorpseFields.DynamicFlags, field.Read<byte>(10)); uint bytes1 = field.Read<uint>(7);
SetGuidValue(CorpseFields.Owner, ObjectGuid.Create(HighGuid.Player, field.Read<ulong>(14))); uint bytes2 = field.Read<uint>(8);
CharacterInfo characterInfo = Global.WorldMgr.GetCharacterInfo(GetGuidValue(CorpseFields.Owner)); SetRace((Race)((bytes1 >> 8) & 0xFF));
if (characterInfo != null) SetSex((Gender)((bytes1 >> 16) & 0xFF));
SetUInt32Value(CorpseFields.FactionTemplate, CliDB.ChrRacesStorage.LookupByKey(characterInfo.RaceID).FactionID); SetSkin((byte)((bytes1 >> 24) & 0xFF));
SetFace((byte)(bytes2 & 0xFF));
SetHairStyle((byte)((bytes2 >> 8) & 0xFF));
SetHairColor((byte)((bytes2 >> 16) & 0xFF));
SetFacialHairStyle((byte)((bytes2 >> 24) & 0xFF));
SetFlags((CorpseFlags)field.Read<byte>(9));
SetCorpseDynamicFlags((CorpseDynFlags)field.Read<byte>(10));
SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read<ulong>(14)));
SetFactionTemplate(CliDB.ChrRacesStorage.LookupByKey(m_corpseData.RaceID).FactionID);
m_time = field.Read<uint>(11); m_time = field.Read<uint>(11);
@@ -196,7 +215,60 @@ namespace Game.Entities
return m_time < t - 3 * Time.Day; return m_time < t - 3 * Time.Day;
} }
public ObjectGuid GetOwnerGUID() { return GetGuidValue(CorpseFields.Owner); } public override void BuildValuesCreate(WorldPacket data, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
WorldPacket buffer = new WorldPacket();
m_objectData.WriteCreate(buffer, flags, this, target);
m_corpseData.WriteCreate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteUInt8((byte)flags);
data.WriteBytes(buffer);
}
public override void BuildValuesUpdate(WorldPacket data, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
WorldPacket buffer = new WorldPacket();
buffer.WriteUInt32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TypeId.Object))
m_objectData.WriteUpdate(buffer, flags, this, target);
if (m_values.HasChanged(TypeId.Corpse))
m_corpseData.WriteUpdate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteBytes(buffer);
}
public override void ClearUpdateMask(bool remove)
{
m_values.ClearChangesMask(m_corpseData);
base.ClearUpdateMask(remove);
}
public void AddCorpseDynamicFlag(CorpseDynFlags dynamicFlags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DynamicFlags), (uint)dynamicFlags); }
public void RemoveCorpseDynamicFlag(CorpseDynFlags dynamicFlags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DynamicFlags), (uint)dynamicFlags); }
public void SetCorpseDynamicFlags(CorpseDynFlags dynamicFlags) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DynamicFlags), (uint)dynamicFlags); }
public ObjectGuid GetOwnerGUID() { return m_corpseData.Owner; }
public void SetOwnerGUID(ObjectGuid owner) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Owner), owner); }
public void SetPartyGUID(ObjectGuid partyGuid) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.PartyGUID), partyGuid); }
public void SetGuildGUID(ObjectGuid guildGuid) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.GuildGUID), guildGuid); }
public void SetDisplayId(uint displayId) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DisplayID), displayId); }
public void SetRace(Race race) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.RaceID), (byte)race); }
public void SetSex(Gender sex) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Sex), (byte)sex); }
public void SetSkin(byte skin) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.SkinID), skin); }
public void SetFace(byte face) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FaceID), face); }
public void SetHairStyle(byte hairStyle) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.HairStyleID), hairStyle); }
public void SetHairColor(byte hairColor) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.HairColorID), hairColor); }
public void SetFacialHairStyle(byte facialHairStyle) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FacialHairStyleID), facialHairStyle); }
public void SetFlags(CorpseFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Flags), (uint)flags); }
public void SetFactionTemplate(int factionTemplate) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FactionTemplate), factionTemplate); }
public void SetItem(uint slot, uint item) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Items, (int)slot), item); }
public void SetCustomDisplayOption(uint slot, byte customDisplayOption) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.CustomDisplayOption, (int)slot), customDisplayOption); }
public long GetGhostTime() { return m_time; } public long GetGhostTime() { return m_time; }
public void ResetGhostTime() { m_time = Time.UnixTime; } public void ResetGhostTime() { m_time = Time.UnixTime; }
@@ -205,6 +277,8 @@ namespace Game.Entities
public CellCoord GetCellCoord() { return _cellCoord; } public CellCoord GetCellCoord() { return _cellCoord; }
public void SetCellCoord(CellCoord cellCoord) { _cellCoord = cellCoord; } public void SetCellCoord(CellCoord cellCoord) { _cellCoord = cellCoord; }
public CorpseData m_corpseData;
public Loot loot = new Loot(); public Loot loot = new Loot();
public Player lootRecipient; public Player lootRecipient;
public bool lootForBody; public bool lootForBody;
+84 -88
View File
@@ -46,8 +46,6 @@ namespace Game.Entities
m_meleeDamageSchoolMask = SpellSchoolMask.Normal; m_meleeDamageSchoolMask = SpellSchoolMask.Normal;
m_regenTimer = SharedConst.CreatureRegenInterval; m_regenTimer = SharedConst.CreatureRegenInterval;
valuesCount = (int)UnitFields.End;
_dynamicValuesCount = (int)UnitDynamicFields.End;
m_SightDistance = SharedConst.SightRangeUnit; m_SightDistance = SharedConst.SightRangeUnit;
@@ -192,9 +190,8 @@ namespace Game.Entities
m_creatureInfo = cinfo; // map mode related always m_creatureInfo = cinfo; // map mode related always
// equal to player Race field, but creature does not have race // equal to player Race field, but creature does not have race
SetByteValue(UnitFields.Bytes0, 0, 0); SetRace(0);
SetClass((Class)cinfo.UnitClass);
SetByteValue(UnitFields.Bytes0, 1, (byte)cinfo.UnitClass);
// Cancel load if no model defined // Cancel load if no model defined
if (cinfo.GetFirstValidModel() == null) if (cinfo.GetFirstValidModel() == null)
@@ -213,7 +210,7 @@ namespace Game.Entities
SetDisplayId(model.CreatureDisplayID, model.DisplayScale); SetDisplayId(model.CreatureDisplayID, model.DisplayScale);
SetNativeDisplayId(model.CreatureDisplayID, model.DisplayScale); SetNativeDisplayId(model.CreatureDisplayID, model.DisplayScale);
SetByteValue(UnitFields.Bytes0, 3, (byte)minfo.gender); SetGender((Gender)minfo.gender);
// Load creature equipment // Load creature equipment
if (data == null || data.equipmentId == 0) if (data == null || data.equipmentId == 0)
@@ -226,12 +223,12 @@ namespace Game.Entities
SetName(normalInfo.Name); // at normal entry always SetName(normalInfo.Name); // at normal entry always
SetFloatValue(UnitFields.ModCastSpeed, 1.0f); SetModCastingSpeed(1.0f);
SetFloatValue(UnitFields.ModCastHaste, 1.0f); SetModSpellHaste(1.0f);
SetFloatValue(UnitFields.ModHaste, 1.0f); SetModHaste(1.0f);
SetFloatValue(UnitFields.ModRangedHaste, 1.0f); SetModRangedHaste(1.0f);
SetFloatValue(UnitFields.ModHasteRegen, 1.0f); SetModHasteRegen(1.0f);
SetFloatValue(UnitFields.ModTimeRate, 1.0f); SetModTimeRate(1.0f);
SetSpeedRate(UnitMoveType.Walk, cinfo.SpeedWalk); SetSpeedRate(UnitMoveType.Walk, cinfo.SpeedWalk);
SetSpeedRate(UnitMoveType.Run, cinfo.SpeedRun); SetSpeedRate(UnitMoveType.Run, cinfo.SpeedRun);
@@ -240,7 +237,7 @@ namespace Game.Entities
SetObjectScale(cinfo.Scale); SetObjectScale(cinfo.Scale);
SetFloatValue(UnitFields.HoverHeight, cinfo.HoverHeight); SetHoverHeight(cinfo.HoverHeight);
// checked at loading // checked at loading
m_defaultMovementType = (MovementGeneratorType)cinfo.MovementType; m_defaultMovementType = (MovementGeneratorType)cinfo.MovementType;
@@ -273,19 +270,20 @@ namespace Game.Entities
ObjectManager.ChooseCreatureFlags(cInfo, out npcFlags, out unitFlags, out unitFlags2, out unitFlags3, out dynamicFlags, data); ObjectManager.ChooseCreatureFlags(cInfo, out npcFlags, out unitFlags, out unitFlags2, out unitFlags3, out dynamicFlags, data);
if (cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Worldevent)) if (cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Worldevent))
SetUInt64Value(UnitFields.NpcFlags, npcFlags | Global.GameEventMgr.GetNPCFlag(this)); npcFlags |= Global.GameEventMgr.GetNPCFlag(this);
else
SetUInt64Value(UnitFields.NpcFlags, npcFlags);
SetUInt32Value(UnitFields.Flags, unitFlags); SetNpcFlags((NPCFlags)(npcFlags & 0xFFFFFFFF));
SetUInt32Value(UnitFields.Flags2, unitFlags2); SetNpcFlags2((NPCFlags2)(npcFlags >> 32));
SetUInt32Value(UnitFields.Flags3, unitFlags3);
SetUInt32Value(ObjectFields.DynamicFlags, dynamicFlags); SetUnitFlags((UnitFlags)unitFlags);
SetUnitFlags2((UnitFlags2)unitFlags2);
SetUnitFlags3((UnitFlags3)unitFlags3);
SetUInt32Value(UnitFields.StateAnimId, (uint)CliDB.AnimationDataStorage.Count); SetDynamicFlags((UnitDynFlags)dynamicFlags);
RemoveFlag(UnitFields.Flags, UnitFlags.InCombat); SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.StateAnimID), (uint)CliDB.AnimationDataStorage.Count);
RemoveUnitFlag(UnitFlags.InCombat);
SetBaseAttackTime(WeaponAttackType.BaseAttack, cInfo.BaseAttackTime); SetBaseAttackTime(WeaponAttackType.BaseAttack, cInfo.BaseAttackTime);
SetBaseAttackTime(WeaponAttackType.OffAttack, cInfo.BaseAttackTime); SetBaseAttackTime(WeaponAttackType.OffAttack, cInfo.BaseAttackTime);
@@ -323,14 +321,14 @@ namespace Game.Entities
Player owner = GetCharmerOrOwnerPlayerOrPlayerItself(); Player owner = GetCharmerOrOwnerPlayerOrPlayerItself();
if (owner != null) // this check comes in case we don't have a player if (owner != null) // this check comes in case we don't have a player
{ {
SetFaction(owner.getFaction()); // vehicles should have same as owner faction SetFaction(owner.GetFaction()); // vehicles should have same as owner faction
owner.VehicleSpellInitialize(); owner.VehicleSpellInitialize();
} }
} }
// trigger creature is always not selectable and can not be attacked // trigger creature is always not selectable and can not be attacked
if (IsTrigger()) if (IsTrigger())
SetFlag(UnitFields.Flags, UnitFlags.NotSelectable); AddUnitFlag(UnitFlags.NotSelectable);
InitializeReactState(); InitializeReactState();
@@ -411,7 +409,7 @@ namespace Game.Entities
else if (m_corpseRemoveTime <= Time.UnixTime) else if (m_corpseRemoveTime <= Time.UnixTime)
{ {
RemoveCorpse(false); RemoveCorpse(false);
Log.outDebug(LogFilter.Unit, "Removing corpse... {0} ", GetUInt32Value(ObjectFields.Entry)); Log.outDebug(LogFilter.Unit, "Removing corpse... {0} ", GetEntry());
} }
break; break;
case DeathState.Alive: case DeathState.Alive:
@@ -519,7 +517,7 @@ namespace Game.Entities
if (!IsInEvadeMode() && (!bInCombat || IsPolymorphed() || CanNotReachTarget())) // regenerate health if not in combat or if polymorphed if (!IsInEvadeMode() && (!bInCombat || IsPolymorphed() || CanNotReachTarget())) // regenerate health if not in combat or if polymorphed
RegenerateHealth(); RegenerateHealth();
if (HasFlag(UnitFields.Flags2, UnitFlags2.RegeneratePower)) if (HasUnitFlag2(UnitFlags2.RegeneratePower))
{ {
if (GetPowerType() == PowerType.Energy) if (GetPowerType() == PowerType.Energy)
Regenerate(PowerType.Energy); Regenerate(PowerType.Energy);
@@ -798,7 +796,7 @@ namespace Game.Entities
//! Need to be called after LoadCreaturesAddon - MOVEMENTFLAG_HOVER is set there //! Need to be called after LoadCreaturesAddon - MOVEMENTFLAG_HOVER is set there
if (HasUnitMovementFlag(MovementFlag.Hover)) if (HasUnitMovementFlag(MovementFlag.Hover))
{ {
z += GetFloatValue(UnitFields.HoverHeight); z += m_unitData.HoverHeight;
//! Relocate again with updated Z coord //! Relocate again with updated Z coord
Relocate(x, y, z, ang); Relocate(x, y, z, ang);
@@ -810,7 +808,7 @@ namespace Game.Entities
{ {
SetDisplayId(display.CreatureDisplayID, display.DisplayScale); SetDisplayId(display.CreatureDisplayID, display.DisplayScale);
SetNativeDisplayId(display.CreatureDisplayID, display.DisplayScale); SetNativeDisplayId(display.CreatureDisplayID, display.DisplayScale);
SetByteValue(UnitFields.Bytes0, 3, (byte)minfo.gender); SetGender((Gender)minfo.gender);
} }
LastUsedScriptID = GetScriptId(); LastUsedScriptID = GetScriptId();
@@ -956,7 +954,7 @@ namespace Game.Entities
{ {
m_lootRecipient.Clear(); m_lootRecipient.Clear();
m_lootRecipientGroup.Clear(); m_lootRecipientGroup.Clear();
RemoveFlag(ObjectFields.DynamicFlags, UnitDynFlags.Lootable | UnitDynFlags.Tapped); RemoveDynamicFlag(UnitDynFlags.Lootable | UnitDynFlags.Tapped);
return; return;
} }
@@ -972,7 +970,7 @@ namespace Game.Entities
if (group) if (group)
m_lootRecipientGroup = group.GetGUID(); m_lootRecipientGroup = group.GetGUID();
SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.Tapped); AddDynamicFlag(UnitDynFlags.Tapped);
} }
public bool isTappedBy(Player player) public bool isTappedBy(Player player)
@@ -1011,11 +1009,11 @@ namespace Game.Entities
CreatureData data = Global.ObjectMgr.NewOrExistCreatureData(m_spawnId); CreatureData data = Global.ObjectMgr.NewOrExistCreatureData(m_spawnId);
uint displayId = GetNativeDisplayId(); uint displayId = GetNativeDisplayId();
ulong npcflag = GetUInt64Value(UnitFields.NpcFlags); ulong npcflag = ((ulong)m_unitData.NpcFlags[1] << 32) | m_unitData.NpcFlags[0];
uint unitFlags = GetUInt32Value(UnitFields.Flags); uint unitFlags = m_unitData.Flags;
uint unitFlags2 = GetUInt32Value(UnitFields.Flags2); uint unitFlags2 = m_unitData.Flags2;
uint unitFlags3 = GetUInt32Value(UnitFields.Flags3); uint unitFlags3 = m_unitData.Flags3;
uint dynamicflags = GetUInt32Value(ObjectFields.DynamicFlags); UnitDynFlags dynamicflags = (UnitDynFlags)(uint)m_objectData.DynamicFlags;
// check if it's a custom model and if not, use 0 for displayId // check if it's a custom model and if not, use 0 for displayId
CreatureTemplate cinfo = GetCreatureTemplate(); CreatureTemplate cinfo = GetCreatureTemplate();
@@ -1037,7 +1035,7 @@ namespace Game.Entities
if (unitFlags3 == cinfo.UnitFlags3) if (unitFlags3 == cinfo.UnitFlags3)
unitFlags3 = 0; unitFlags3 = 0;
if (dynamicflags == cinfo.DynamicFlags) if (dynamicflags == (UnitDynFlags)cinfo.DynamicFlags)
dynamicflags = 0; dynamicflags = 0;
} }
@@ -1064,7 +1062,7 @@ namespace Game.Entities
data.unit_flags = unitFlags; data.unit_flags = unitFlags;
data.unit_flags2 = unitFlags2; data.unit_flags2 = unitFlags2;
data.unit_flags3 = unitFlags3; data.unit_flags3 = unitFlags3;
data.dynamicflags = dynamicflags; data.dynamicflags = (uint)dynamicflags;
data.phaseId = GetDBPhase() > 0 ? (uint)GetDBPhase() : data.phaseId; data.phaseId = GetDBPhase() > 0 ? (uint)GetDBPhase() : data.phaseId;
data.phaseGroup = GetDBPhase() < 0 ? (uint)-GetDBPhase() : data.phaseGroup; data.phaseGroup = GetDBPhase() < 0 ? (uint)-GetDBPhase() : data.phaseGroup;
@@ -1119,14 +1117,14 @@ namespace Game.Entities
if (HasScalableLevels()) if (HasScalableLevels())
{ {
SetUInt32Value(UnitFields.ScalingLevelMin, cInfo.levelScaling.Value.MinLevel); SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelMin), cInfo.levelScaling.Value.MinLevel);
SetUInt32Value(UnitFields.ScalingLevelMax, cInfo.levelScaling.Value.MaxLevel); SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelMax), cInfo.levelScaling.Value.MaxLevel);
int mindelta = Math.Min(cInfo.levelScaling.Value.DeltaLevelMax, cInfo.levelScaling.Value.DeltaLevelMin); int mindelta = Math.Min(cInfo.levelScaling.Value.DeltaLevelMax, cInfo.levelScaling.Value.DeltaLevelMin);
int maxdelta = Math.Max(cInfo.levelScaling.Value.DeltaLevelMax, cInfo.levelScaling.Value.DeltaLevelMin); int maxdelta = Math.Max(cInfo.levelScaling.Value.DeltaLevelMax, cInfo.levelScaling.Value.DeltaLevelMin);
int delta = mindelta == maxdelta ? mindelta : RandomHelper.IRand(mindelta, maxdelta); int delta = mindelta == maxdelta ? mindelta : RandomHelper.IRand(mindelta, maxdelta);
SetInt32Value(UnitFields.ScalingLevelDelta, delta); SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ScalingLevelDelta), delta);
} }
UpdateLevelDependantStats(); UpdateLevelDependantStats();
@@ -1434,9 +1432,9 @@ namespace Game.Entities
return false; return false;
// This set of checks is should be done only for creatures // This set of checks is should be done only for creatures
if ((HasFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc) && !who.IsTypeId(TypeId.Player)) // flag is valid only for non player characters if ((HasUnitFlag(UnitFlags.ImmuneToNpc) && !who.IsTypeId(TypeId.Player)) // flag is valid only for non player characters
|| (HasFlag(UnitFields.Flags, UnitFlags.ImmuneToPc) && who.IsTypeId(TypeId.Player)) // immune to PC and target is a player, return false || (HasUnitFlag(UnitFlags.ImmuneToPc) && who.IsTypeId(TypeId.Player)) // immune to PC and target is a player, return false
|| (who.GetOwner() && who.GetOwner().IsTypeId(TypeId.Player) && HasFlag(UnitFields.Flags, UnitFlags.ImmuneToPc))) // player pets are immune to pc as well || (who.GetOwner() && who.GetOwner().IsTypeId(TypeId.Player) && HasUnitFlag(UnitFlags.ImmuneToPc))) // player pets are immune to pc as well
return false; return false;
// Do not attack non-combat pets // Do not attack non-combat pets
@@ -1530,9 +1528,10 @@ namespace Game.Entities
DoNotReacquireTarget(); // cancel delayed re-target DoNotReacquireTarget(); // cancel delayed re-target
SetTarget(ObjectGuid.Empty); // drop target - dead mobs shouldn't ever target things SetTarget(ObjectGuid.Empty); // drop target - dead mobs shouldn't ever target things
SetUInt64Value(UnitFields.NpcFlags, (ulong)NPCFlags.None); SetNpcFlags(NPCFlags.None);
SetNpcFlags2(NPCFlags2.None);
SetUInt32Value(UnitFields.MountDisplayId, 0); // if creature is mounted on a virtual mount, remove it at death SetMountDisplayId(0); // if creature is mounted on a virtual mount, remove it at death
setActive(false); setActive(false);
@@ -1576,16 +1575,17 @@ namespace Game.Entities
ObjectManager.ChooseCreatureFlags(cInfo, out npcFlags, out unitFlags, out unitFlags2, out unitFlags3, out dynamicFlags, creatureData); ObjectManager.ChooseCreatureFlags(cInfo, out npcFlags, out unitFlags, out unitFlags2, out unitFlags3, out dynamicFlags, creatureData);
if (cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Worldevent)) if (cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Worldevent))
SetUInt64Value(UnitFields.NpcFlags, npcFlags | Global.GameEventMgr.GetNPCFlag(this)); npcFlags |= Global.GameEventMgr.GetNPCFlag(this);
else
SetUInt64Value(UnitFields.NpcFlags, npcFlags);
SetUInt32Value(UnitFields.Flags, unitFlags); SetNpcFlags((NPCFlags)(npcFlags & 0xFFFFFFFF));
SetUInt32Value(UnitFields.Flags2, unitFlags2); SetNpcFlags2((NPCFlags2)(npcFlags >> 32));
SetUInt32Value(UnitFields.Flags3, unitFlags3);
SetUInt32Value(ObjectFields.DynamicFlags, dynamicFlags);
RemoveFlag(UnitFields.Flags, UnitFlags.InCombat); SetUnitFlags((UnitFlags)unitFlags);
SetUnitFlags2((UnitFlags2)unitFlags2);
SetUnitFlags3((UnitFlags3)unitFlags3);
SetDynamicFlags((UnitDynFlags)dynamicFlags);
RemoveUnitFlag(UnitFlags.InCombat);
SetMeleeDamageSchool((SpellSchools)cInfo.DmgSchool); SetMeleeDamageSchool((SpellSchools)cInfo.DmgSchool);
} }
@@ -1633,7 +1633,7 @@ namespace Game.Entities
{ {
SetDisplayId(display.CreatureDisplayID, display.DisplayScale); SetDisplayId(display.CreatureDisplayID, display.DisplayScale);
SetNativeDisplayId(display.CreatureDisplayID, display.DisplayScale); SetNativeDisplayId(display.CreatureDisplayID, display.DisplayScale);
SetByteValue(UnitFields.Bytes0, 3, (byte)minfo.gender); SetGender((Gender)minfo.gender);
} }
GetMotionMaster().InitDefault(); GetMotionMaster().InitDefault();
@@ -1805,9 +1805,9 @@ namespace Game.Entities
float dist = GetDistance(victim); float dist = GetDistance(victim);
if (dist > range || dist < minrange) if (dist > range || dist < minrange)
continue; continue;
if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Silence) && HasFlag(UnitFields.Flags, UnitFlags.Silenced)) if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Silence) && HasUnitFlag(UnitFlags.Silenced))
continue; continue;
if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Pacify) && HasFlag(UnitFields.Flags, UnitFlags.Pacified)) if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Pacify) && HasUnitFlag(UnitFlags.Pacified))
continue; continue;
return spellInfo; return spellInfo;
} }
@@ -1854,9 +1854,9 @@ namespace Game.Entities
if (dist > range || dist < minrange) if (dist > range || dist < minrange)
continue; continue;
if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Silence) && HasFlag(UnitFields.Flags, UnitFlags.Silenced)) if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Silence) && HasUnitFlag(UnitFlags.Silenced))
continue; continue;
if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Pacify) && HasFlag(UnitFields.Flags, UnitFlags.Pacified)) if (spellInfo.PreventionType.HasAnyFlag(SpellPreventionType.Pacify) && HasUnitFlag(UnitFlags.Pacified))
continue; continue;
return spellInfo; return spellInfo;
} }
@@ -1969,7 +1969,7 @@ namespace Game.Entities
if (IsCivilian()) if (IsCivilian())
return false; return false;
if (HasFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.ImmuneToPc)) if (HasUnitFlag(UnitFlags.NonAttackable | UnitFlags.NotSelectable | UnitFlags.ImmuneToPc))
return false; return false;
// skip fighting creature // skip fighting creature
@@ -1983,7 +1983,7 @@ namespace Game.Entities
// only from same creature faction // only from same creature faction
if (checkfaction) if (checkfaction)
{ {
if (getFaction() != u.getFaction()) if (GetFaction() != u.GetFaction())
return false; return false;
} }
else else
@@ -2009,7 +2009,7 @@ namespace Game.Entities
if (target.HasUnitState(UnitState.Died)) if (target.HasUnitState(UnitState.Died))
{ {
// guards can detect fake death // guards can detect fake death
if (IsGuard() && target.HasFlag(UnitFields.Flags2, UnitFlags2.FeignDeath)) if (IsGuard() && target.HasUnitFlag2(UnitFlags2.FeignDeath))
return true; return true;
else else
return false; return false;
@@ -2099,18 +2099,16 @@ namespace Game.Entities
// 2 StandFlags // 2 StandFlags
// 3 StandMiscFlags // 3 StandMiscFlags
SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.StandState, (byte)(cainfo.bytes1 & 0xFF)); SetStandState((UnitStandStateType)(cainfo.bytes1 & 0xFF));
//SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.PetTalent, (byte)((cainfo.bytes1 >> 8) & 0xFF)); SetVisFlags((UnitVisFlags)((cainfo.bytes1 >> 16) & 0xFF));
SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.PetTalents, 0); SetAnimTier((UnitBytes1Flags)((cainfo.bytes1 >> 24) & 0xFF), false);
SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.VisFlag, (byte)((cainfo.bytes1 >> 16) & 0xFF));
SetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.AnimTier, (byte)((cainfo.bytes1 >> 24) & 0xFF));
//! Suspected correlation between UNIT_FIELD_BYTES_1, offset 3, value 0x2: //! Suspected correlation between UNIT_FIELD_BYTES_1, offset 3, value 0x2:
//! If no inhabittype_fly (if no MovementFlag_DisableGravity or MovementFlag_CanFly flag found in sniffs) //! If no inhabittype_fly (if no MovementFlag_DisableGravity or MovementFlag_CanFly flag found in sniffs)
//! Check using InhabitType as movement flags are assigned dynamically //! Check using InhabitType as movement flags are assigned dynamically
//! basing on whether the creature is in air or not //! basing on whether the creature is in air or not
//! Set MovementFlag_Hover. Otherwise do nothing. //! Set MovementFlag_Hover. Otherwise do nothing.
if (Convert.ToBoolean(GetByteValue(UnitFields.Bytes1, UnitBytes1Offsets.AnimTier) & (byte)UnitBytes1Flags.Hover) && !Convert.ToBoolean(GetCreatureTemplate().InhabitType & InhabitType.Air)) if (Convert.ToBoolean(m_unitData.AnimTier & (byte)UnitBytes1Flags.Hover) && !Convert.ToBoolean(GetCreatureTemplate().InhabitType & InhabitType.Air))
AddUnitMovementFlag(MovementFlag.Hover); AddUnitMovementFlag(MovementFlag.Hover);
} }
@@ -2121,16 +2119,14 @@ namespace Game.Entities
// 2 PetFlags Pet only, so always 0 for default creature // 2 PetFlags Pet only, so always 0 for default creature
// 3 ShapeshiftForm Must be determined/set by shapeshift spell/aura // 3 ShapeshiftForm Must be determined/set by shapeshift spell/aura
SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.SheathState, (byte)(cainfo.bytes2 & 0xFF)); SetSheath((SheathState)(cainfo.bytes2 & 0xFF));
//SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, uint8((cainfo->bytes2 >> 8) & 0xFF)); SetPvpFlags(UnitPVPStateFlags.None);
//SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, uint8((cainfo->bytes2 >> 16) & 0xFF)); SetPetFlags(UnitPetFlags.None);
SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, 0); SetShapeshiftForm(ShapeShiftForm.None);
//SetByteValue(UnitFields.Bytes2, UNIT_BYTES_2_OFFSET_SHAPESHIFT_FORM, uint8((cainfo->bytes2 >> 24) & 0xFF));
SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.ShapeshiftForm, 0);
} }
if (cainfo.emote != 0) if (cainfo.emote != 0)
SetUInt32Value(UnitFields.NpcEmotestate, cainfo.emote); SetEmoteState((Emote)cainfo.emote);
SetAIAnimKitId(cainfo.aiAnimKit); SetAIAnimKitId(cainfo.aiAnimKit);
SetMovementAnimKitId(cainfo.movementAnimKit); SetMovementAnimKitId(cainfo.movementAnimKit);
@@ -2289,7 +2285,7 @@ namespace Game.Entities
{ {
if (loot.loot_type != LootType.Skinning && !IsPet() && GetCreatureTemplate().SkinLootId != 0 && hasLootRecipient()) if (loot.loot_type != LootType.Skinning && !IsPet() && GetCreatureTemplate().SkinLootId != 0 && hasLootRecipient())
if (LootStorage.Skinning.HaveLootFor(GetCreatureTemplate().SkinLootId)) if (LootStorage.Skinning.HaveLootFor(GetCreatureTemplate().SkinLootId))
SetFlag(UnitFields.Flags, UnitFlags.Skinnable); AddUnitFlag(UnitFlags.Skinnable);
long now = Time.UnixTime; long now = Time.UnixTime;
// Do not reset corpse remove time if corpse is already removed // Do not reset corpse remove time if corpse is already removed
@@ -2380,12 +2376,12 @@ namespace Game.Entities
// between UNIT_FIELD_SCALING_LEVEL_MIN and UNIT_FIELD_SCALING_LEVEL_MAX // between UNIT_FIELD_SCALING_LEVEL_MIN and UNIT_FIELD_SCALING_LEVEL_MAX
if (HasScalableLevels()) if (HasScalableLevels())
{ {
int targetLevelWithDelta = ((int)unitTarget.getLevel() + GetInt32Value(UnitFields.ScalingLevelDelta)); int targetLevelWithDelta = (int)unitTarget.getLevel() + m_unitData.ScalingLevelDelta;
if (target.IsPlayer()) if (target.IsPlayer())
targetLevelWithDelta += target.GetInt32Value(ActivePlayerFields.ScalingPlayerLevelDelta); targetLevelWithDelta += target.ToPlayer().m_activePlayerData.ScalingPlayerLevelDelta;
return (uint)MathFunctions.RoundToInterval(ref targetLevelWithDelta, GetInt32Value(UnitFields.ScalingLevelMin), GetInt32Value(UnitFields.ScalingLevelMax)); return (uint)MathFunctions.RoundToInterval(ref targetLevelWithDelta, m_unitData.ScalingLevelMin, m_unitData.ScalingLevelMax);
} }
} }
@@ -2409,7 +2405,7 @@ namespace Game.Entities
if (creatureData != null) if (creatureData != null)
return creatureData.ScriptId; return creatureData.ScriptId;
return Global.ObjectMgr.GetCreatureTemplate(GetEntry()).ScriptID; return Global.ObjectMgr.GetCreatureTemplate(GetEntry()) != null ? Global.ObjectMgr.GetCreatureTemplate(GetEntry()).ScriptID : 0;
} }
public VendorItemData GetVendorItems() public VendorItemData GetVendorItems()
@@ -2668,8 +2664,8 @@ namespace Game.Entities
CreatureModelInfo minfo = Global.ObjectMgr.GetCreatureModelInfo(GetDisplayId()); CreatureModelInfo minfo = Global.ObjectMgr.GetCreatureModelInfo(GetDisplayId());
if (minfo != null) if (minfo != null)
{ {
SetFloatValue(UnitFields.BoundingRadius, (IsPet() ? 1.0f : minfo.BoundingRadius) * scale); SetBoundingRadius((IsPet() ? 1.0f : minfo.BoundingRadius) * scale);
SetFloatValue(UnitFields.CombatReach, (IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * scale); SetCombatReach((IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * scale);
} }
} }
@@ -2680,8 +2676,8 @@ namespace Game.Entities
CreatureModelInfo minfo = Global.ObjectMgr.GetCreatureModelInfo(modelId); CreatureModelInfo minfo = Global.ObjectMgr.GetCreatureModelInfo(modelId);
if (minfo != null) if (minfo != null)
{ {
SetFloatValue(UnitFields.BoundingRadius, (IsPet() ? 1.0f : minfo.BoundingRadius) * GetObjectScale()); SetBoundingRadius((IsPet() ? 1.0f : minfo.BoundingRadius) * GetObjectScale());
SetFloatValue(UnitFields.CombatReach, (IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * GetObjectScale()); SetCombatReach((IsPet() ? SharedConst.DefaultCombatReach : minfo.CombatReach) * GetObjectScale());
} }
} }
@@ -2697,7 +2693,7 @@ namespace Game.Entities
if (IsFocusing(null, true)) if (IsFocusing(null, true))
m_suppressedTarget = guid; m_suppressedTarget = guid;
else else
SetGuidValue(UnitFields.Target, guid); SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Target), guid);
} }
public void FocusTarget(Spell focusSpell, WorldObject target) public void FocusTarget(Spell focusSpell, WorldObject target)
@@ -2716,7 +2712,7 @@ namespace Game.Entities
// store pre-cast values for target and orientation (used to later restore) // store pre-cast values for target and orientation (used to later restore)
if (!IsFocusing(null, true)) if (!IsFocusing(null, true))
{ // only overwrite these fields if we aren't transitioning from one spell focus to another { // only overwrite these fields if we aren't transitioning from one spell focus to another
m_suppressedTarget = GetGuidValue(UnitFields.Target); m_suppressedTarget = GetTarget();
m_suppressedOrientation = GetOrientation(); m_suppressedOrientation = GetOrientation();
} }
@@ -2724,9 +2720,9 @@ namespace Game.Entities
// set target, then force send update packet to players if it changed to provide appropriate facing // set target, then force send update packet to players if it changed to provide appropriate facing
ObjectGuid newTarget = target ? target.GetGUID() : ObjectGuid.Empty; ObjectGuid newTarget = target ? target.GetGUID() : ObjectGuid.Empty;
if (GetGuidValue(UnitFields.Target) != newTarget) if (GetTarget() != newTarget)
{ {
SetGuidValue(UnitFields.Target, newTarget); SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Target), newTarget);
// here we determine if the (relatively expensive) forced update is worth it, or whether we can afford to wait until the scheduled update tick // here we determine if the (relatively expensive) forced update is worth it, or whether we can afford to wait until the scheduled update tick
// only require instant update for spells that actually have a visual // only require instant update for spells that actually have a visual
@@ -2794,7 +2790,7 @@ namespace Game.Entities
if (IsPet())// player pets do not use delay system if (IsPet())// player pets do not use delay system
{ {
SetGuidValue(UnitFields.Target, m_suppressedTarget); SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Target), m_suppressedTarget);
if (!m_suppressedTarget.IsEmpty()) if (!m_suppressedTarget.IsEmpty())
{ {
WorldObject objTarget = Global.ObjAccessor.GetWorldObject(this, m_suppressedTarget); WorldObject objTarget = Global.ObjAccessor.GetWorldObject(this, m_suppressedTarget);
@@ -42,7 +42,7 @@ namespace Game.Entities
public uint RequiredExpansion; public uint RequiredExpansion;
public uint VignetteID; // @todo Read Vignette.db2 public uint VignetteID; // @todo Read Vignette.db2
public uint Faction; public uint Faction;
public NPCFlags Npcflag; public ulong Npcflag;
public float SpeedWalk; public float SpeedWalk;
public float SpeedRun; public float SpeedRun;
public float Scale; public float Scale;
+48 -13
View File
@@ -17,6 +17,7 @@
using Framework.Constants; using Framework.Constants;
using Game.Spells; using Game.Spells;
using Game.Network;
namespace Game.Entities namespace Game.Entities
{ {
@@ -29,7 +30,7 @@ namespace Game.Entities
m_updateFlag.Stationary = true; m_updateFlag.Stationary = true;
valuesCount = (int)DynamicObjectFields.End; m_dynamicObjectData = new DynamicObjectData();
} }
public override void Dispose() public override void Dispose()
@@ -77,7 +78,6 @@ namespace Game.Entities
public bool CreateDynamicObject(ulong guidlow, Unit caster, SpellInfo spell, Position pos, float radius, DynamicObjectType type, uint spellXSpellVisualId) public bool CreateDynamicObject(ulong guidlow, Unit caster, SpellInfo spell, Position pos, float radius, DynamicObjectType type, uint spellXSpellVisualId)
{ {
_spellXSpellVisualId = spellXSpellVisualId;
SetMap(caster.GetMap()); SetMap(caster.GetMap());
Relocate(pos); Relocate(pos);
if (!IsPositionValid()) if (!IsPositionValid())
@@ -91,13 +91,13 @@ namespace Game.Entities
SetEntry(spell.Id); SetEntry(spell.Id);
SetObjectScale(1f); SetObjectScale(1f);
SetGuidValue(DynamicObjectFields.Caster, caster.GetGUID());
SetUInt32Value(DynamicObjectFields.Type, (uint)type); SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Caster), caster.GetGUID());
SetUInt32Value(DynamicObjectFields.SpellXSpellVisualId, spellXSpellVisualId); SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Type), (byte)type);
SetUInt32Value(DynamicObjectFields.SpellId, spell.Id); SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellXSpellVisualID), spellXSpellVisualId);
SetFloatValue(DynamicObjectFields.Radius, radius); SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellID), spell.Id);
SetUInt32Value(DynamicObjectFields.CastTime, Time.GetMSTime()); SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Radius), radius);
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.CastTime), Time.GetMSTime());
if (IsWorldObject()) if (IsWorldObject())
setActive(true); //must before add to map to be put in world container setActive(true); //must before add to map to be put in world container
@@ -242,16 +242,51 @@ namespace Game.Entities
return Global.SpellMgr.GetSpellInfo(GetSpellId()); return Global.SpellMgr.GetSpellInfo(GetSpellId());
} }
public Unit GetCaster() { return _caster; } public override void BuildValuesCreate(WorldPacket data, Player target)
public uint GetSpellId() { return GetUInt32Value(DynamicObjectFields.SpellId); } {
public ObjectGuid GetCasterGUID() { return GetGuidValue(DynamicObjectFields.Caster); } UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
public float GetRadius() { return GetFloatValue(DynamicObjectFields.Radius); } WorldPacket buffer = new WorldPacket();
buffer.WriteUInt8((byte)flags);
m_objectData.WriteCreate(buffer, flags, this, target);
m_dynamicObjectData.WriteCreate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteBytes(buffer);
}
public override void BuildValuesUpdate(WorldPacket data, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
WorldPacket buffer = new WorldPacket();
buffer.WriteUInt32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TypeId.Object))
m_objectData.WriteUpdate(buffer, flags, this, target);
if (m_values.HasChanged(TypeId.DynamicObject))
m_dynamicObjectData.WriteUpdate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteBytes(buffer);
}
public override void ClearUpdateMask(bool remove)
{
m_values.ClearChangesMask(m_dynamicObjectData);
base.ClearUpdateMask(remove);
}
public Unit GetCaster() { return _caster; }
public uint GetSpellId() { return m_dynamicObjectData.SpellID; }
public ObjectGuid GetCasterGUID() { return m_dynamicObjectData.Caster; }
public float GetRadius() { return m_dynamicObjectData.Radius; }
DynamicObjectData m_dynamicObjectData;
Aura _aura; Aura _aura;
Aura _removedAura; Aura _removedAura;
Unit _caster; Unit _caster;
int _duration; // for non-aura dynobjects int _duration; // for non-aura dynobjects
uint _spellXSpellVisualId;
bool _isViewpoint; bool _isViewpoint;
} }
+106 -156
View File
@@ -31,6 +31,7 @@ using Game.Spells;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Game.Network;
namespace Game.Entities namespace Game.Entities
{ {
@@ -44,13 +45,14 @@ namespace Game.Entities
m_updateFlag.Stationary = true; m_updateFlag.Stationary = true;
m_updateFlag.Rotation = true; m_updateFlag.Rotation = true;
valuesCount = (int)GameObjectFields.End;
m_respawnDelayTime = 300; m_respawnDelayTime = 300;
m_lootState = LootState.NotReady; m_lootState = LootState.NotReady;
m_spawnedByDefault = true; m_spawnedByDefault = true;
ResetLootMode(); // restore default loot mode ResetLootMode(); // restore default loot mode
m_stationaryPosition = new Position(); m_stationaryPosition = new Position();
m_gameObjectData = new GameObjectFieldData();
} }
public override void Dispose() public override void Dispose()
@@ -248,8 +250,8 @@ namespace Game.Entities
if (m_goTemplateAddon != null) if (m_goTemplateAddon != null)
{ {
SetUInt32Value(GameObjectFields.Faction, m_goTemplateAddon.faction); SetFaction(m_goTemplateAddon.faction);
SetUInt32Value(GameObjectFields.Flags, m_goTemplateAddon.flags); SetFlags((GameObjectFlags)m_goTemplateAddon.flags);
if (m_goTemplateAddon.WorldEffectID != 0) if (m_goTemplateAddon.WorldEffectID != 0)
{ {
@@ -267,7 +269,7 @@ namespace Game.Entities
m_model = CreateModel(); m_model = CreateModel();
if (m_model != null && m_model.isMapObject()) if (m_model != null && m_model.isMapObject())
SetFlag(GameObjectFields.Flags, GameObjectFlags.MapObject); AddFlag(GameObjectFlags.MapObject);
// GAMEOBJECT_BYTES_1, index at 0, 1, 2 and 3 // GAMEOBJECT_BYTES_1, index at 0, 1, 2 and 3
SetGoType(goInfo.type); SetGoType(goInfo.type);
@@ -275,7 +277,7 @@ namespace Game.Entities
SetGoState(goState); SetGoState(goState);
SetGoArtKit((byte)artKit); SetGoArtKit((byte)artKit);
SetUInt32Value(GameObjectFields.StateAnimId, (uint)CliDB.AnimationDataStorage.Count); SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.SpawnTrackingStateAnimID), (uint)CliDB.AnimationDataStorage.Count);
switch (goInfo.type) switch (goInfo.type)
{ {
@@ -287,7 +289,8 @@ namespace Game.Entities
m_goValue.Building.Health = 20000;//goinfo.DestructibleBuilding.intactNumHits + goinfo.DestructibleBuilding.damagedNumHits; m_goValue.Building.Health = 20000;//goinfo.DestructibleBuilding.intactNumHits + goinfo.DestructibleBuilding.damagedNumHits;
m_goValue.Building.MaxHealth = m_goValue.Building.Health; m_goValue.Building.MaxHealth = m_goValue.Building.Health;
SetGoAnimProgress(255); SetGoAnimProgress(255);
SetUInt32Value(GameObjectFields.ParentRotation, goInfo.DestructibleBuilding.DestructibleModelRec); // yes, even after the updatefield rewrite this garbage hack is still in client
SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.ParentRotation), new Quaternion(goInfo.DestructibleBuilding.DestructibleModelRec, 0f, 0f, 0f));
break; break;
case GameObjectTypes.Transport: case GameObjectTypes.Transport:
m_goValue.Transport.AnimationInfo = Global.TransportMgr.GetTransportAnimInfo(goInfo.entry); m_goValue.Transport.AnimationInfo = Global.TransportMgr.GetTransportAnimInfo(goInfo.entry);
@@ -324,7 +327,7 @@ namespace Game.Entities
SetGoAnimProgress(animProgress); SetGoAnimProgress(animProgress);
break; break;
case GameObjectTypes.FishingNode: case GameObjectTypes.FishingNode:
SetUInt32Value(GameObjectFields.Level, 1); SetLevel(1);
SetGoAnimProgress(255); SetGoAnimProgress(255);
break; break;
case GameObjectTypes.Trap: case GameObjectTypes.Trap:
@@ -341,10 +344,11 @@ namespace Game.Entities
} }
break; break;
case GameObjectTypes.PhaseableMo: case GameObjectTypes.PhaseableMo:
SetByteValue(GameObjectFields.Flags, 1, (byte)(m_goInfo.PhaseableMO.AreaNameSet & 0xF)); RemoveFlag((GameObjectFlags)0xF00);
AddFlag((GameObjectFlags)((m_goInfo.PhaseableMO.AreaNameSet & 0xF) << 8));
break; break;
case GameObjectTypes.CapturePoint: case GameObjectTypes.CapturePoint:
SetUInt32Value(GameObjectFields.SpellVisualId, m_goInfo.CapturePoint.SpellVisual1); SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.SpellVisualID), m_goInfo.CapturePoint.SpellVisual1);
break; break;
default: default:
SetGoAnimProgress(animProgress); SetGoAnimProgress(animProgress);
@@ -438,15 +442,15 @@ namespace Game.Entities
m_goValue.Transport.PathProgress += diff; m_goValue.Transport.PathProgress += diff;
/* TODO: Fix movement in unloaded grid - currently GO will just disappear /* TODO: Fix movement in unloaded grid - currently GO will just disappear
public uint timer = m_goValue.Transport.PathProgress % GetTransportPeriod(); public uint timer = m_goValue.Transport.PathProgress % GetTransportPeriod();
TransportAnimationEntry const* node = m_goValue.Transport.AnimationInfo->GetAnimNode(timer); TransportAnimationEntry const* node = m_goValue.Transport.AnimationInfo.GetAnimNode(timer);
if (node && m_goValue.Transport.CurrentSeg != node->TimeSeg) if (node && m_goValue.Transport.CurrentSeg != node.TimeSeg)
{ {
m_goValue.Transport.CurrentSeg = node->TimeSeg; m_goValue.Transport.CurrentSeg = node.TimeSeg;
G3D.Quat rotation = m_goValue.Transport.AnimationInfo->GetAnimRotation(timer); G3D.Quat rotation = m_goValue.Transport.AnimationInfo.GetAnimRotation(timer);
G3D.Vector3 pos = rotation.toRotationMatrix() G3D.Vector3 pos = rotation.toRotationMatrix()
G3D.Matrix3.fromEulerAnglesZYX(GetOrientation(), 0.0f, 0.0f) G3D.Matrix3.fromEulerAnglesZYX(GetOrientation(), 0.0f, 0.0f)
G3D.Vector3(node->X, node->Y, node->Z); G3D.Vector3(node.X, node.Y, node.Z);
pos += G3D.Vector3(GetStationaryX(), GetStationaryY(), GetStationaryZ()); pos += G3D.Vector3(GetStationaryX(), GetStationaryY(), GetStationaryZ());
@@ -454,7 +458,7 @@ namespace Game.Entities
TC_LOG_DEBUG("misc", "Src: {0} Dest: {1}", src.toString().c_str(), pos.toString().c_str()); TC_LOG_DEBUG("misc", "Src: {0} Dest: {1}", src.toString().c_str(), pos.toString().c_str());
GetMap()->GameObjectRelocation(this, pos.x, pos.y, pos.z, GetOrientation()); GetMap().GameObjectRelocation(this, pos.x, pos.y, pos.z, GetOrientation());
} }
*/ */
if (!m_goValue.Transport.StopFrames.Empty()) if (!m_goValue.Transport.StopFrames.Empty())
@@ -464,8 +468,9 @@ namespace Game.Entities
uint visualStateAfter = (m_goValue.Transport.StateUpdateTimer / 20000) & 1; uint visualStateAfter = (m_goValue.Transport.StateUpdateTimer / 20000) & 1;
if (visualStateBefore != visualStateAfter) if (visualStateBefore != visualStateAfter)
{ {
ForceValuesUpdateAtIndex(GameObjectFields.Level); m_gameObjectData.ModifyValue(m_gameObjectData.Level);
ForceValuesUpdateAtIndex(GameObjectFields.Bytes1); m_gameObjectData.ModifyValue(m_gameObjectData.State);
ForceUpdateFieldChange();
} }
} }
} }
@@ -480,7 +485,7 @@ namespace Game.Entities
if (caster != null && caster.IsTypeId(TypeId.Player)) if (caster != null && caster.IsTypeId(TypeId.Player))
{ {
SetGoState(GameObjectState.Active); SetGoState(GameObjectState.Active);
SetUInt32Value(GameObjectFields.Flags, (uint)GameObjectFlags.NoDespawn); SetFlags(GameObjectFlags.NoDespawn);
UpdateData udata = new UpdateData(caster.GetMapId()); UpdateData udata = new UpdateData(caster.GetMapId());
UpdateObject packet; UpdateObject packet;
@@ -650,7 +655,7 @@ namespace Game.Entities
case GameObjectTypes.Goober: case GameObjectTypes.Goober:
if (m_cooldownTime < Time.UnixTime) if (m_cooldownTime < Time.UnixTime)
{ {
RemoveFlag(GameObjectFields.Flags, GameObjectFlags.InUse); RemoveFlag(GameObjectFlags.InUse);
SetLootState(LootState.JustDeactivated); SetLootState(LootState.JustDeactivated);
m_cooldownTime = 0; m_cooldownTime = 0;
@@ -770,7 +775,7 @@ namespace Game.Entities
//reset flags //reset flags
GameObjectTemplateAddon addon = GetTemplateAddon(); GameObjectTemplateAddon addon = GetTemplateAddon();
if (addon != null) if (addon != null)
SetUInt32Value(GameObjectFields.Flags, addon.flags); SetFlags((GameObjectFlags)addon.flags);
} }
if (m_respawnDelayTime == 0) if (m_respawnDelayTime == 0)
@@ -823,7 +828,7 @@ namespace Game.Entities
SetGoState(GameObjectState.Ready); SetGoState(GameObjectState.Ready);
GameObjectTemplateAddon addon = GetTemplateAddon(); GameObjectTemplateAddon addon = GetTemplateAddon();
if (addon != null) if (addon != null)
SetUInt32Value(GameObjectFields.Flags, addon.flags); SetFlags((GameObjectFlags)addon.flags);
uint poolid = GetSpawnId() != 0 ? Global.PoolMgr.IsPartOfAPool<GameObject>(GetSpawnId()) : 0; uint poolid = GetSpawnId() != 0 ? Global.PoolMgr.IsPartOfAPool<GameObject>(GetSpawnId()) : 0;
if (poolid != 0) if (poolid != 0)
@@ -918,7 +923,7 @@ namespace Game.Entities
data.animprogress = GetGoAnimProgress(); data.animprogress = GetGoAnimProgress();
data.go_state = GetGoState(); data.go_state = GetGoState();
data.spawnDifficulties = spawnDifficulties; data.spawnDifficulties = spawnDifficulties;
data.artKit = GetGoArtKit(); data.artKit = (byte)GetGoArtKit();
Global.ObjectMgr.NewGOData(m_spawnId, data); Global.ObjectMgr.NewGOData(m_spawnId, data);
data.phaseId = GetDBPhase() > 0 ? (uint)GetDBPhase() : data.phaseId; data.phaseId = GetDBPhase() > 0 ? (uint)GetDBPhase() : data.phaseId;
@@ -980,7 +985,7 @@ namespace Game.Entities
if (!GetGoInfo().GetDespawnPossibility() && !GetGoInfo().IsDespawnAtAction()) if (!GetGoInfo().GetDespawnPossibility() && !GetGoInfo().IsDespawnAtAction())
{ {
SetFlag(GameObjectFields.Flags, GameObjectFlags.NoDespawn); AddFlag(GameObjectFlags.NoDespawn);
m_respawnDelayTime = 0; m_respawnDelayTime = 0;
m_respawnTime = 0; m_respawnTime = 0;
} }
@@ -1104,7 +1109,7 @@ namespace Game.Entities
if (GetGoType() == GameObjectTypes.SpellFocus && GetGoInfo().SpellFocus.serverOnly == 1) if (GetGoType() == GameObjectTypes.SpellFocus && GetGoInfo().SpellFocus.serverOnly == 1)
return true; return true;
if (GetUInt32Value(GameObjectFields.DisplayId) == 0) if (GetDisplayId() == 0)
return true; return true;
return false; return false;
@@ -1157,7 +1162,7 @@ namespace Game.Entities
} }
} }
bool ActivateToQuest(Player target) public bool ActivateToQuest(Player target)
{ {
if (target.HasQuestForGO((int)GetEntry())) if (target.HasQuestForGO((int)GetEntry()))
return true; return true;
@@ -1231,7 +1236,7 @@ namespace Game.Entities
if (m_lootState == LootState.Ready || m_lootState == LootState.JustDeactivated) if (m_lootState == LootState.Ready || m_lootState == LootState.JustDeactivated)
return; return;
RemoveFlag(GameObjectFields.Flags, GameObjectFlags.InUse); RemoveFlag(GameObjectFlags.InUse);
SetGoState(m_prevGoState); SetGoState(m_prevGoState);
SetLootState(LootState.JustDeactivated); SetLootState(LootState.JustDeactivated);
@@ -1254,7 +1259,7 @@ namespace Game.Entities
public void SetGoArtKit(byte kit) public void SetGoArtKit(byte kit)
{ {
SetByteValue(GameObjectFields.Bytes1, 2, kit); SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.ArtKit), kit);
GameObjectData data = Global.ObjectMgr.GetGOData(m_spawnId); GameObjectData data = Global.ObjectMgr.GetGOData(m_spawnId);
if (data != null) if (data != null)
data.artKit = kit; data.artKit = kit;
@@ -1278,9 +1283,9 @@ namespace Game.Entities
void SwitchDoorOrButton(bool activate, bool alternative = false) void SwitchDoorOrButton(bool activate, bool alternative = false)
{ {
if (activate) if (activate)
SetFlag(GameObjectFields.Flags, GameObjectFlags.InUse); AddFlag(GameObjectFlags.InUse);
else else
RemoveFlag(GameObjectFields.Flags, GameObjectFlags.InUse); RemoveFlag(GameObjectFlags.InUse);
if (GetGoState() == GameObjectState.Ready) //if closed . open if (GetGoState() == GameObjectState.Ready) //if closed . open
SetGoState(alternative ? GameObjectState.ActiveAlternative : GameObjectState.Active); SetGoState(alternative ? GameObjectState.ActiveAlternative : GameObjectState.Active);
@@ -1423,7 +1428,7 @@ namespace Game.Entities
{ {
guid = player.GetGUID(); //this slot in now used by player guid = player.GetGUID(); //this slot in now used by player
player.TeleportTo(GetMapId(), x_lowest, y_lowest, GetPositionZ(), GetOrientation(), (TeleportToOptions.NotLeaveTransport | TeleportToOptions.NotLeaveCombat | TeleportToOptions.NotUnSummonPet)); player.TeleportTo(GetMapId(), x_lowest, y_lowest, GetPositionZ(), GetOrientation(), (TeleportToOptions.NotLeaveTransport | TeleportToOptions.NotLeaveCombat | TeleportToOptions.NotUnSummonPet));
player.SetStandState(UnitStandStateType.SitLowChair + (int)info.Chair.chairheight); player.SetStandState(UnitStandStateType.SitLowChair + (byte)info.Chair.chairheight);
return; return;
} }
} }
@@ -1487,7 +1492,7 @@ namespace Game.Entities
if (trapEntry != 0) if (trapEntry != 0)
TriggeringLinkedGameObject(trapEntry, user); TriggeringLinkedGameObject(trapEntry, user);
SetFlag(GameObjectFields.Flags, GameObjectFlags.InUse); AddFlag(GameObjectFlags.InUse);
SetLootState(LootState.Activated, user); SetLootState(LootState.Activated, user);
// this appear to be ok, however others exist in addition to this that should have custom (ex: 190510, 188692, 187389) // this appear to be ok, however others exist in addition to this that should have custom (ex: 190510, 188692, 187389)
@@ -1864,7 +1869,7 @@ namespace Game.Entities
// fallback, will always work // fallback, will always work
player.TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(), (TeleportToOptions.NotLeaveTransport | TeleportToOptions.NotLeaveCombat | TeleportToOptions.NotUnSummonPet)); player.TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(), (TeleportToOptions.NotLeaveTransport | TeleportToOptions.NotLeaveCombat | TeleportToOptions.NotUnSummonPet));
player.SetStandState((UnitStandStateType)(UnitStandStateType.SitLowChair + (int)info.BarberChair.chairheight), info.BarberChair.SitAnimKit); player.SetStandState((UnitStandStateType.SitLowChair + (byte)info.BarberChair.chairheight), info.BarberChair.SitAnimKit);
return; return;
} }
case GameObjectTypes.ArtifactForge: case GameObjectTypes.ArtifactForge:
@@ -1972,16 +1977,16 @@ namespace Game.Entities
return; return;
// remove immunity flags, to allow spell to target anything // remove immunity flags, to allow spell to target anything
trigger.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToNpc | UnitFlags.ImmuneToPc); trigger.RemoveUnitFlag(UnitFlags.ImmuneToNpc | UnitFlags.ImmuneToPc);
Unit owner = GetOwner(); Unit owner = GetOwner();
if (owner) if (owner)
{ {
trigger.SetFaction(owner.getFaction()); trigger.SetFaction(owner.GetFaction());
if (owner.HasFlag(UnitFields.Flags, UnitFlags.PvpAttackable)) if (owner.HasUnitFlag(UnitFlags.PvpAttackable))
trigger.SetFlag(UnitFields.Flags, UnitFlags.PvpAttackable); trigger.AddUnitFlag(UnitFlags.PvpAttackable);
// copy pvp state flags from owner // copy pvp state flags from owner
trigger.SetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, owner.GetByteValue(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag)); trigger.SetPvpFlags(owner.GetPvpFlags());
// needed for GO casts for proper target validation checks // needed for GO casts for proper target validation checks
trigger.SetOwnerGUID(owner.GetGUID()); trigger.SetOwnerGUID(owner.GetGUID());
trigger.CastSpell(target != null ? target : trigger, spellInfo, triggered, null, null, owner.GetGUID()); trigger.CastSpell(target != null ? target : trigger, spellInfo, triggered, null, null, owner.GetGUID());
@@ -2097,10 +2102,7 @@ namespace Game.Entities
public void SetParentRotation(Quaternion rotation) public void SetParentRotation(Quaternion rotation)
{ {
SetFloatValue(GameObjectFields.ParentRotation + 0, rotation.X); SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.ParentRotation), rotation);
SetFloatValue(GameObjectFields.ParentRotation + 1, rotation.Y);
SetFloatValue(GameObjectFields.ParentRotation + 2, rotation.Z);
SetFloatValue(GameObjectFields.ParentRotation + 3, rotation.W);
} }
public void SetWorldRotationAngles(float z_rot, float y_rot, float x_rot) public void SetWorldRotationAngles(float z_rot, float y_rot, float x_rot)
@@ -2165,7 +2167,7 @@ namespace Game.Entities
switch (state) switch (state)
{ {
case GameObjectDestructibleState.Intact: case GameObjectDestructibleState.Intact:
RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Damaged | GameObjectFlags.Destroyed); RemoveFlag(GameObjectFlags.Damaged | GameObjectFlags.Destroyed);
SetDisplayId(m_goInfo.displayId); SetDisplayId(m_goInfo.displayId);
if (setHealth) if (setHealth)
{ {
@@ -2179,8 +2181,8 @@ namespace Game.Entities
EventInform(m_goInfo.DestructibleBuilding.DamagedEvent, eventInvoker); EventInform(m_goInfo.DestructibleBuilding.DamagedEvent, eventInvoker);
Global.ScriptMgr.OnGameObjectDamaged(this, eventInvoker); Global.ScriptMgr.OnGameObjectDamaged(this, eventInvoker);
RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Destroyed); RemoveFlag(GameObjectFlags.Destroyed);
SetFlag(GameObjectFields.Flags, GameObjectFlags.Damaged); AddFlag(GameObjectFlags.Damaged);
uint modelId = m_goInfo.displayId; uint modelId = m_goInfo.displayId;
DestructibleModelDataRecord modelData = CliDB.DestructibleModelDataStorage.LookupByKey(m_goInfo.DestructibleBuilding.DestructibleModelRec); DestructibleModelDataRecord modelData = CliDB.DestructibleModelDataStorage.LookupByKey(m_goInfo.DestructibleBuilding.DestructibleModelRec);
@@ -2211,8 +2213,8 @@ namespace Game.Entities
bg.DestroyGate(eventInvoker, this); bg.DestroyGate(eventInvoker, this);
} }
RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Damaged); RemoveFlag(GameObjectFlags.Damaged);
SetFlag(GameObjectFields.Flags, GameObjectFlags.Destroyed); AddFlag(GameObjectFlags.Destroyed);
uint modelId = m_goInfo.displayId; uint modelId = m_goInfo.displayId;
DestructibleModelDataRecord modelData = CliDB.DestructibleModelDataStorage.LookupByKey(m_goInfo.DestructibleBuilding.DestructibleModelRec); DestructibleModelDataRecord modelData = CliDB.DestructibleModelDataStorage.LookupByKey(m_goInfo.DestructibleBuilding.DestructibleModelRec);
@@ -2232,7 +2234,7 @@ namespace Game.Entities
case GameObjectDestructibleState.Rebuilding: case GameObjectDestructibleState.Rebuilding:
{ {
EventInform(m_goInfo.DestructibleBuilding.RebuildingEvent, eventInvoker); EventInform(m_goInfo.DestructibleBuilding.RebuildingEvent, eventInvoker);
RemoveFlag(GameObjectFields.Flags, GameObjectFlags.Damaged | GameObjectFlags.Destroyed); RemoveFlag(GameObjectFlags.Damaged | GameObjectFlags.Destroyed);
uint modelId = m_goInfo.displayId; uint modelId = m_goInfo.displayId;
DestructibleModelDataRecord modelData = CliDB.DestructibleModelDataStorage.LookupByKey(m_goInfo.DestructibleBuilding.DestructibleModelRec); DestructibleModelDataRecord modelData = CliDB.DestructibleModelDataStorage.LookupByKey(m_goInfo.DestructibleBuilding.DestructibleModelRec);
@@ -2277,7 +2279,7 @@ namespace Game.Entities
public void SetGoState(GameObjectState state) public void SetGoState(GameObjectState state)
{ {
SetByteValue(GameObjectFields.Bytes1, 0, (byte)state); SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.State), (sbyte)state);
Global.ScriptMgr.OnGameObjectStateChanged(this, state); Global.ScriptMgr.OnGameObjectStateChanged(this, state);
if (m_model != null && !IsTransport()) if (m_model != null && !IsTransport())
{ {
@@ -2327,7 +2329,7 @@ namespace Game.Entities
public void SetDisplayId(uint displayid) public void SetDisplayId(uint displayid)
{ {
SetUInt32Value(GameObjectFields.DisplayId, displayid); SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.DisplayID), displayid);
UpdateModel(); UpdateModel();
} }
@@ -2357,7 +2359,8 @@ namespace Game.Entities
case GameObjectTypes.GarrisonBuilding: case GameObjectTypes.GarrisonBuilding:
case GameObjectTypes.GarrisonPlot: case GameObjectTypes.GarrisonPlot:
case GameObjectTypes.PhaseableMo: case GameObjectTypes.PhaseableMo:
return (byte)(GetByteValue(GameObjectFields.Flags, 1) & 0xF); var flags = (GameObjectFlags)(uint)m_gameObjectData.Flags;
return (byte)(((int)flags >> 8) & 0xF);
default: default:
break; break;
} }
@@ -2386,7 +2389,10 @@ namespace Game.Entities
if (m_model != null) if (m_model != null)
GetMap().InsertGameObjectModel(m_model); GetMap().InsertGameObjectModel(m_model);
ApplyModFlag(GameObjectFields.Flags, GameObjectFlags.MapObject, m_model != null && m_model.isMapObject()); if (m_model != null && m_model.isMapObject())
AddFlag(GameObjectFlags.MapObject);
else
RemoveFlag(GameObjectFlags.MapObject);
} }
Player GetLootRecipient() Player GetLootRecipient()
@@ -2434,7 +2440,7 @@ namespace Game.Entities
m_lootRecipientGroup = unitGroup.GetGUID(); m_lootRecipientGroup = unitGroup.GetGUID();
} }
bool IsLootAllowedFor(Player player) public bool IsLootAllowedFor(Player player)
{ {
if (m_lootRecipient.IsEmpty() && m_lootRecipientGroup.IsEmpty()) if (m_lootRecipient.IsEmpty() && m_lootRecipientGroup.IsEmpty())
return true; return true;
@@ -2455,103 +2461,39 @@ namespace Game.Entities
return ObjectAccessor.GetGameObject(this, m_linkedTrap); return ObjectAccessor.GetGameObject(this, m_linkedTrap);
} }
public override void BuildValuesUpdate(UpdateType updateType, ByteBuffer data, Player target) public override void BuildValuesCreate(WorldPacket data, Player target)
{ {
if (!target) UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
return; WorldPacket buffer = new WorldPacket();
bool isStoppableTransport = GetGoType() == GameObjectTypes.Transport && !m_goValue.Transport.StopFrames.Empty(); buffer.WriteUInt8((byte)flags);
bool forcedFlags = GetGoType() == GameObjectTypes.Chest && GetGoInfo().Chest.usegrouplootrules != 0 && HasLootRecipient(); m_objectData.WriteCreate(buffer, flags, this, target);
bool targetIsGM = target.IsGameMaster(); m_gameObjectData.WriteCreate(buffer, flags, this, target);
ByteBuffer fieldBuffer = new ByteBuffer(); data.WriteUInt32(buffer.GetSize());
UpdateMask updateMask = new UpdateMask(valuesCount); data.WriteBytes(buffer);
}
uint[] flags = UpdateFieldFlags.GameObjectUpdateFieldFlags; public override void BuildValuesUpdate(WorldPacket data, Player target)
uint visibleFlag = UpdateFieldFlags.Public; {
if (GetOwnerGUID() == target.GetGUID()) UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
visibleFlag |= UpdateFieldFlags.Owner; WorldPacket buffer = new WorldPacket();
for (int index = 0; index < valuesCount; ++index) buffer.WriteUInt32(m_values.GetChangedObjectTypeMask());
{ if (m_values.HasChanged(TypeId.Object))
if (_fieldNotifyFlags.HasAnyFlag(flags[index]) || m_objectData.WriteUpdate(buffer, flags, this, target);
((updateType == UpdateType.Values ? _changesMask.Get(index) : updateValues[index].UnsignedValue != 0) && flags[index].HasAnyFlag(visibleFlag)) ||
(index == (int)GameObjectFields.Flags && forcedFlags))
{
updateMask.SetBit(index);
if (index == (int)ObjectFields.DynamicFlags) if (m_values.HasChanged(TypeId.GameObject))
{ m_gameObjectData.WriteUpdate(buffer, flags, this, target);
GameObjectDynamicLowFlags dynFlags = 0;
short pathProgress = -1;
switch (GetGoType())
{
case GameObjectTypes.QuestGiver:
if (ActivateToQuest(target))
dynFlags |= GameObjectDynamicLowFlags.Activate;
break;
case GameObjectTypes.Chest:
case GameObjectTypes.Goober:
if (ActivateToQuest(target) || targetIsGM)
dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle;
break;
case GameObjectTypes.Generic:
if (ActivateToQuest(target))
dynFlags |= GameObjectDynamicLowFlags.Sparkle;
break;
case GameObjectTypes.Transport:
case GameObjectTypes.MapObjTransport:
uint transportPeriod = GetTransportPeriod();
if (transportPeriod != 0)
{
float timer = (float)m_goValue.Transport.PathProgress % transportPeriod;
pathProgress = (short)(timer / transportPeriod * 65535.0f);
}
break;
default:
break;
}
fieldBuffer.WriteUInt16(dynFlags); data.WriteUInt32(buffer.GetSize());
fieldBuffer.WriteInt16(pathProgress); data.WriteBytes(buffer);
} }
else if (index == (int)GameObjectFields.Flags)
{
GameObjectFlags _flags = (GameObjectFlags)GetUInt32Value(GameObjectFields.Flags);
if (GetGoType() == GameObjectTypes.Chest)
if (GetGoInfo().Chest.usegrouplootrules != 0 && !IsLootAllowedFor(target))
_flags |= GameObjectFlags.Locked | GameObjectFlags.NotSelectable;
fieldBuffer.WriteUInt32(_flags); public override void ClearUpdateMask(bool remove)
} {
else if (index == (int)GameObjectFields.Level) m_values.ClearChangesMask(m_gameObjectData);
{ base.ClearUpdateMask(remove);
if (isStoppableTransport)
fieldBuffer.WriteUInt32(m_goValue.Transport.PathProgress);
else
fieldBuffer.WriteUInt32(updateValues[index].UnsignedValue);
}
else if (index == (int)GameObjectFields.Bytes1)
{
uint bytes1 = GetUInt32Value(index);
if (isStoppableTransport && GetGoState() == GameObjectState.TransportActive)
{
if (Convert.ToBoolean((m_goValue.Transport.StateUpdateTimer / 20000) & 1))
{
bytes1 &= 0xFFFFFF00;
bytes1 |= (int)GameObjectState.TransportStopped;
}
}
fieldBuffer.WriteUInt32(bytes1);
}
else
fieldBuffer.WriteUInt32(updateValues[index].UnsignedValue);
}
}
updateMask.AppendToPacket(data);
data.WriteBytes(fieldBuffer);
} }
public void GetRespawnPosition(out float x, out float y, out float z, out float ori) public void GetRespawnPosition(out float x, out float y, out float z, out float ori)
@@ -2632,7 +2574,8 @@ namespace Game.Entities
public GameObjectTemplate GetGoInfo() { return m_goInfo; } public GameObjectTemplate GetGoInfo() { return m_goInfo; }
public GameObjectTemplateAddon GetTemplateAddon() { return m_goTemplateAddon; } public GameObjectTemplateAddon GetTemplateAddon() { return m_goTemplateAddon; }
GameObjectData GetGoData() { return m_goData; } public GameObjectData GetGoData() { return m_goData; }
public GameObjectValue GetGoValue() { return m_goValue; }
public ulong GetSpawnId() { return m_spawnId; } public ulong GetSpawnId() { return m_spawnId; }
@@ -2651,9 +2594,9 @@ namespace Game.Entities
Cypher.Assert(false); Cypher.Assert(false);
} }
m_spawnedByDefault = false; // all object with owner is despawned after delay m_spawnedByDefault = false; // all object with owner is despawned after delay
SetGuidValue(GameObjectFields.CreatedBy, owner); SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.CreatedBy), owner);
} }
public ObjectGuid GetOwnerGUID() { return GetGuidValue(GameObjectFields.CreatedBy); } public ObjectGuid GetOwnerGUID() { return m_gameObjectData.CreatedBy; }
public void SetSpellId(uint id) public void SetSpellId(uint id)
{ {
@@ -2688,12 +2631,18 @@ namespace Game.Entities
public void SetSpawnedByDefault(bool b) { m_spawnedByDefault = b; } public void SetSpawnedByDefault(bool b) { m_spawnedByDefault = b; }
public uint GetRespawnDelay() { return m_respawnDelayTime; } public uint GetRespawnDelay() { return m_respawnDelayTime; }
public GameObjectTypes GetGoType() { return (GameObjectTypes)GetByteValue(GameObjectFields.Bytes1, 1); } public bool HasFlag(GameObjectFlags flags) { return (m_gameObjectData.Flags & (uint)flags) != 0; }
public void SetGoType(GameObjectTypes type) { SetByteValue(GameObjectFields.Bytes1, 1, (byte)type); } public void AddFlag(GameObjectFlags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.Flags), (uint)flags); }
public GameObjectState GetGoState() { return (GameObjectState)GetByteValue(GameObjectFields.Bytes1, 0); } public void RemoveFlag(GameObjectFlags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.Flags), (uint)flags); }
byte GetGoArtKit() { return GetByteValue(GameObjectFields.Bytes1, 2); } public void SetFlags(GameObjectFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.Flags), (uint)flags); }
byte GetGoAnimProgress() { return GetByteValue(GameObjectFields.Bytes1, 3); } public void SetLevel(uint level) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.Level), level); }
public void SetGoAnimProgress(uint animprogress) { SetByteValue(GameObjectFields.Bytes1, 3, (byte)animprogress); }
public GameObjectTypes GetGoType() { return (GameObjectTypes)(sbyte)m_gameObjectData.TypeID; }
public void SetGoType(GameObjectTypes type) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.TypeID), (sbyte)type); }
public GameObjectState GetGoState() { return (GameObjectState)(sbyte)m_gameObjectData.State; }
uint GetGoArtKit() { return m_gameObjectData.ArtKit; }
byte GetGoAnimProgress() { return m_gameObjectData.PercentHealth; }
public void SetGoAnimProgress(uint animprogress) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.PercentHealth), (byte)animprogress); }
public LootState getLootState() { return m_lootState; } public LootState getLootState() { return m_lootState; }
public LootModes GetLootMode() { return m_LootMode; } public LootModes GetLootMode() { return m_LootMode; }
@@ -2732,19 +2681,19 @@ namespace Game.Entities
GameObjectDestructibleState GetDestructibleState() GameObjectDestructibleState GetDestructibleState()
{ {
if (HasFlag(GameObjectFields.Flags, GameObjectFlags.Destroyed)) if ((m_gameObjectData.Flags & (uint)GameObjectFlags.Destroyed) != 0)
return GameObjectDestructibleState.Destroyed; return GameObjectDestructibleState.Destroyed;
if (HasFlag(GameObjectFields.Flags, GameObjectFlags.Damaged)) if ((m_gameObjectData.Flags & (uint)GameObjectFlags.Damaged) != 0)
return GameObjectDestructibleState.Damaged; return GameObjectDestructibleState.Damaged;
return GameObjectDestructibleState.Intact; return GameObjectDestructibleState.Intact;
} }
public GameObjectAI GetAI() { return m_AI; } public GameObjectAI GetAI() { return m_AI; }
public uint GetDisplayId() { return GetUInt32Value(GameObjectFields.DisplayId); } public uint GetDisplayId() { return m_gameObjectData.DisplayID; }
uint GetFaction() { return GetUInt32Value(GameObjectFields.Faction); } public uint GetFaction() { return m_gameObjectData.FactionTemplate; }
public void SetFaction(uint faction) { SetUInt32Value(GameObjectFields.Faction, faction); } public void SetFaction(uint faction) { SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.FactionTemplate), faction); }
public override float GetStationaryX() { return m_stationaryPosition.GetPositionX(); } public override float GetStationaryX() { return m_stationaryPosition.GetPositionX(); }
public override float GetStationaryY() { return m_stationaryPosition.GetPositionY(); } public override float GetStationaryY() { return m_stationaryPosition.GetPositionY(); }
@@ -2766,7 +2715,8 @@ namespace Game.Entities
} }
#region Fields #region Fields
public GameObjectValue m_goValue; protected GameObjectFieldData m_gameObjectData;
protected GameObjectValue m_goValue;
protected GameObjectTemplate m_goInfo; protected GameObjectTemplate m_goInfo;
protected GameObjectTemplateAddon m_goTemplateAddon; protected GameObjectTemplateAddon m_goTemplateAddon;
GameObjectData m_goData; GameObjectData m_goData;
+59 -16
View File
@@ -17,6 +17,7 @@
using Framework.Constants; using Framework.Constants;
using Framework.Database; using Framework.Database;
using Game.Network;
namespace Game.Entities namespace Game.Entities
{ {
@@ -27,8 +28,7 @@ namespace Game.Entities
objectTypeMask |= TypeMask.Container; objectTypeMask |= TypeMask.Container;
objectTypeId = TypeId.Container; objectTypeId = TypeId.Container;
valuesCount = (int)ContainerFields.End; m_containerData = new ContainerData();
_dynamicValuesCount = (int)ItemDynamicFields.End;
} }
public override void Dispose() public override void Dispose()
@@ -86,20 +86,20 @@ namespace Game.Entities
if (owner) if (owner)
{ {
SetGuidValue(ItemFields.Owner, owner.GetGUID()); SetOwnerGUID(owner.GetGUID());
SetGuidValue(ItemFields.Contained, owner.GetGUID()); SetContainedIn(owner.GetGUID());
} }
SetUInt32Value(ItemFields.MaxDurability, itemProto.MaxDurability); SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.MaxDurability), itemProto.MaxDurability);
SetUInt32Value(ItemFields.Durability, itemProto.MaxDurability); SetDurability(itemProto.MaxDurability);
SetUInt32Value(ItemFields.StackCount, 1); SetCount(1);
// Setting the number of Slots the Container has // Setting the number of Slots the Container has
SetUInt32Value(ContainerFields.NumSlots, itemProto.GetContainerSlots()); SetBagSize(itemProto.GetContainerSlots());
// Cleaning 20 slots // Cleaning 20 slots
for (byte i = 0; i < ItemConst.MaxBagSize; ++i) for (byte i = 0; i < ItemConst.MaxBagSize; ++i)
SetGuidValue(ContainerFields.Slot1 + (i * 4), ObjectGuid.Empty); SetSlot(i, ObjectGuid.Empty);
m_bagslot = new Item[ItemConst.MaxBagSize]; m_bagslot = new Item[ItemConst.MaxBagSize];
return true; return true;
@@ -111,11 +111,11 @@ namespace Game.Entities
return false; return false;
ItemTemplate itemProto = GetTemplate(); // checked in Item.LoadFromDB ItemTemplate itemProto = GetTemplate(); // checked in Item.LoadFromDB
SetUInt32Value(ContainerFields.NumSlots, itemProto.GetContainerSlots()); SetBagSize(itemProto.GetContainerSlots());
// cleanup bag content related item value fields (its will be filled correctly from `character_inventory`) // cleanup bag content related item value fields (its will be filled correctly from `character_inventory`)
for (byte i = 0; i < ItemConst.MaxBagSize; ++i) for (byte i = 0; i < ItemConst.MaxBagSize; ++i)
{ {
SetGuidValue(ContainerFields.Slot1 + (i * 4), ObjectGuid.Empty); SetSlot(i, ObjectGuid.Empty);
m_bagslot[i] = null; m_bagslot[i] = null;
} }
return true; return true;
@@ -146,7 +146,7 @@ namespace Game.Entities
m_bagslot[slot].SetContainer(null); m_bagslot[slot].SetContainer(null);
m_bagslot[slot] = null; m_bagslot[slot] = null;
SetGuidValue(ContainerFields.Slot1 + (slot * 4), ObjectGuid.Empty); SetSlot(slot, ObjectGuid.Empty);
} }
public void StoreItem(byte slot, Item pItem, bool update) public void StoreItem(byte slot, Item pItem, bool update)
@@ -154,9 +154,9 @@ namespace Game.Entities
if (pItem != null && pItem.GetGUID() != GetGUID()) if (pItem != null && pItem.GetGUID() != GetGUID())
{ {
m_bagslot[slot] = pItem; m_bagslot[slot] = pItem;
SetGuidValue(ContainerFields.Slot1 + (slot * 4), pItem.GetGUID()); SetSlot(slot, pItem.GetGUID());
pItem.SetGuidValue(ItemFields.Contained, GetGUID()); pItem.SetContainedIn(GetGUID());
pItem.SetGuidValue(ItemFields.Owner, GetOwnerGUID()); pItem.SetOwnerGUID(GetOwnerGUID());
pItem.SetContainer(this); pItem.SetContainer(this);
pItem.SetSlot(slot); pItem.SetSlot(slot);
} }
@@ -171,6 +171,45 @@ namespace Game.Entities
m_bagslot[i].BuildCreateUpdateBlockForPlayer(data, target); m_bagslot[i].BuildCreateUpdateBlockForPlayer(data, target);
} }
public override void BuildValuesCreate(WorldPacket data, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
WorldPacket buffer = new WorldPacket();
buffer.WriteUInt8((byte)flags);
m_objectData.WriteCreate(buffer, flags, this, target);
m_itemData.WriteCreate(buffer, flags, this, target);
m_containerData.WriteCreate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteBytes(buffer);
}
public override void BuildValuesUpdate(WorldPacket data, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
WorldPacket buffer = new WorldPacket();
buffer.WriteUInt32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TypeId.Object))
m_objectData.WriteUpdate(buffer, flags, this, target);
if (m_values.HasChanged(TypeId.Item))
m_itemData.WriteUpdate(buffer, flags, this, target);
if (m_values.HasChanged(TypeId.Container))
m_containerData.WriteUpdate(buffer, flags, this, target);
data.WriteUInt32(buffer.GetSize());
data.WriteBytes(buffer);
}
public override void ClearUpdateMask(bool remove)
{
m_values.ClearChangesMask(m_containerData);
base.ClearUpdateMask(remove);
}
public bool IsEmpty() public bool IsEmpty()
{ {
for (var i = 0; i < GetBagSize(); ++i) for (var i = 0; i < GetBagSize(); ++i)
@@ -243,13 +282,17 @@ namespace Game.Entities
return null; return null;
} }
public uint GetBagSize() { return GetUInt32Value(ContainerFields.NumSlots); } public uint GetBagSize() { return m_containerData.NumSlots; }
void SetBagSize(uint numSlots) { SetUpdateFieldValue(m_values.ModifyValue(m_containerData).ModifyValue(m_containerData.NumSlots), numSlots); }
void SetSlot(int slot, ObjectGuid guid) { SetUpdateFieldValue(ref m_values.ModifyValue(m_containerData).ModifyValue(m_containerData.Slots, slot), guid); }
public static Item NewItemOrBag(ItemTemplate proto) public static Item NewItemOrBag(ItemTemplate proto)
{ {
return (proto.GetInventoryType() == InventoryType.Bag) ? new Bag() : new Item(); return (proto.GetInventoryType() == InventoryType.Bag) ? new Bag() : new Item();
} }
ContainerData m_containerData;
Item[] m_bagslot = new Item[36]; Item[] m_bagslot = new Item[36];
} }
} }
File diff suppressed because it is too large Load Diff
+38 -160
View File
@@ -22,148 +22,79 @@ using System.Collections.Generic;
namespace Game.Entities namespace Game.Entities
{ {
public class ItemEnchantment public class ItemEnchantmentManager
{ {
static ItemEnchantment() public static void LoadItemRandomBonusListTemplates()
{ {
RandomItemEnch = new EnchantmentStore(); uint oldMSTime = Time.GetMSTime();
}
public static void LoadRandomEnchantmentsTable() _storage.Clear();
{
// for reload case
RandomItemEnch[ItemRandomEnchantmentType.Property].Clear();
RandomItemEnch[ItemRandomEnchantmentType.Suffix].Clear();
// 0 1 2 3 // 0 1 2
SQLResult result = DB.World.Query("SELECT entry, type, ench, chance FROM item_enchantment_template"); SQLResult result = DB.World.Query("SELECT Id, BonusListID, Chance FROM item_random_bonus_list_template");
if (result.IsEmpty()) if (result.IsEmpty())
{ {
Log.outError(LogFilter.Player, "Loaded 0 Item Enchantment definitions. DB table `item_enchantment_template` is empty."); Log.outError(LogFilter.Player, "Loaded 0 Item Enchantment definitions. DB table `item_enchantment_template` is empty.");
return;
} }
uint count = 0; uint count = 0;
do do
{ {
uint entry = result.Read<uint>(0); uint id = result.Read<uint>(0);
ItemRandomEnchantmentType type = (ItemRandomEnchantmentType)result.Read<byte>(1); uint bonusListId = result.Read<uint>(1);
uint ench = result.Read<uint>(2); float chance = result.Read<float>(2);
float chance = result.Read<float>(3);
switch (type) if (Global.DB2Mgr.GetItemBonusList(bonusListId) == null)
{ {
case ItemRandomEnchantmentType.Property: Log.outError(LogFilter.Sql, $"Bonus list {bonusListId} used in `item_random_bonus_list_template` by id {id} doesn't have exist in ItemBonus.db2");
if (!CliDB.ItemRandomPropertiesStorage.ContainsKey(ench)) continue;
{
Log.outError(LogFilter.Sql, "Property {0} used in `item_enchantment_template` by entry {1} doesn't have exist in ItemRandomProperties.db2", ench, entry);
continue;
}
break;
case ItemRandomEnchantmentType.Suffix:
if (!CliDB.ItemRandomSuffixStorage.ContainsKey(ench))
{
Log.outError(LogFilter.Sql, "Suffix {0} used in `item_enchantment_template` by entry {1} doesn't have exist in ItemRandomSuffix.db2", ench, entry);
continue;
}
break;
case ItemRandomEnchantmentType.BonusList:
if (Global.DB2Mgr.GetItemBonusList(ench) == null)
{
Log.outError(LogFilter.Sql, "Bonus list {0} used in `item_enchantment_template` by entry {1} doesn't have exist in ItemBonus.db2", ench, entry);
continue;
}
break;
default:
Log.outError(LogFilter.Sql, "Invalid random enchantment type specified in `item_enchantment_template` table for `entry` {0} `ench` {1}", entry, ench);
break;
} }
if (chance < 0.000001f || chance > 100.0f) if (chance < 0.000001f || chance > 100.0f)
{ {
Log.outError(LogFilter.Sql, "Random item enchantment for entry {0} type {1} ench {2} has invalid chance {3}", entry, type, ench, chance); Log.outError(LogFilter.Sql, $"Bonus list {bonusListId} used in `item_random_bonus_list_template` by id {id} has invalid chance {chance}");
continue; continue;
} }
switch (type) if (!_storage.ContainsKey(id))
{ _storage[id] = new RandomBonusListIds();
case ItemRandomEnchantmentType.Property:
RandomItemEnch[ItemRandomEnchantmentType.Property].Add(entry, new EnchStoreItem(type, ench, chance)); RandomBonusListIds ids = _storage[id];
break; ids.BonusListIDs.Add(bonusListId);
case ItemRandomEnchantmentType.Suffix: ids.Chances.Add(chance);
case ItemRandomEnchantmentType.BonusList: // random bonus lists use RandomSuffix field in Item-sparse.db2
RandomItemEnch[ItemRandomEnchantmentType.Suffix].Add(entry, new EnchStoreItem(type, ench, chance));
break;
default:
break;
}
++count; ++count;
} while (result.NextRow()); } while (result.NextRow());
Log.outInfo(LogFilter.Player, "Loaded {0} Item Enchantment definitions", count); Log.outInfo(LogFilter.Player, $"Loaded {count} Random item bonus list definitions in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
} }
public static ItemRandomEnchantmentId GetItemEnchantMod(int entry, ItemRandomEnchantmentType type) public static uint GenerateItemRandomBonusListId(uint item_id)
{
if (entry == 0)
return ItemRandomEnchantmentId.Empty;
if (entry == -1)
return ItemRandomEnchantmentId.Empty;
var tab = RandomItemEnch[type].LookupByKey(entry);
if (tab == null)
{
Log.outError(LogFilter.Player, "Item RandomProperty / RandomSuffix id #{0} used in `item_template` but it does not have records in `item_enchantment_template` table.", entry);
return ItemRandomEnchantmentId.Empty;
}
var selectedItem = tab.SelectRandomElementByWeight(enchant => enchant.chance);
return new ItemRandomEnchantmentId(selectedItem.type, selectedItem.ench);
}
public static ItemRandomEnchantmentId GenerateItemRandomPropertyId(uint item_id)
{ {
ItemTemplate itemProto = Global.ObjectMgr.GetItemTemplate(item_id); ItemTemplate itemProto = Global.ObjectMgr.GetItemTemplate(item_id);
if (itemProto == null) if (itemProto == null)
return ItemRandomEnchantmentId.Empty; return 0;
// item must have one from this field values not null if it can have random enchantments // item must have one from this field values not null if it can have random enchantments
if (itemProto.GetRandomProperty() == 0 && itemProto.GetRandomSuffix() == 0) if (itemProto.RandomBonusListTemplateId == 0)
return ItemRandomEnchantmentId.Empty; return 0;
// item can have not null only one from field values var tab = _storage.LookupByKey(itemProto.RandomBonusListTemplateId);
if (itemProto.GetRandomProperty() != 0 && itemProto.GetRandomSuffix() != 0) if (tab == null)
{ {
Log.outError(LogFilter.Sql, "Item template {0} have RandomProperty == {1} and RandomSuffix == {2}, but must have one from field =0", itemProto.GetId(), itemProto.GetRandomProperty(), itemProto.GetRandomSuffix()); Log.outError(LogFilter.Sql, $"Item RandomBonusListTemplateId id {itemProto.RandomBonusListTemplateId} used in `item_template_addon` but it does not have records in `item_random_bonus_list_template` table.");
return ItemRandomEnchantmentId.Empty; return 0;
} }
//todo fix me this is ulgy
// RandomProperty case return tab.BonusListIDs.SelectRandomElementByWeight(x => (float)tab.Chances[tab.BonusListIDs.IndexOf(x)]);
if (itemProto.GetRandomProperty() != 0)
return GetItemEnchantMod((int)itemProto.GetRandomProperty(), ItemRandomEnchantmentType.Property);
// RandomSuffix case
else
return GetItemEnchantMod((int)itemProto.GetRandomSuffix(), ItemRandomEnchantmentType.Suffix);
}
public static uint GenerateEnchSuffixFactor(uint item_id)
{
ItemTemplate itemProto = Global.ObjectMgr.GetItemTemplate(item_id);
if (itemProto == null)
return 0;
if (itemProto.GetRandomSuffix() == 0)
return 0;
return GetRandomPropertyPoints(itemProto.GetBaseItemLevel(), itemProto.GetQuality(), itemProto.GetInventoryType(), itemProto.GetSubClass());
} }
public static uint GetRandomPropertyPoints(uint itemLevel, ItemQuality quality, InventoryType inventoryType, uint subClass) public static uint GetRandomPropertyPoints(uint itemLevel, ItemQuality quality, InventoryType inventoryType, uint subClass)
{ {
uint propIndex; uint propIndex;
switch (inventoryType) switch (inventoryType)
{ {
case InventoryType.Head: case InventoryType.Head:
@@ -208,11 +139,11 @@ namespace Game.Entities
default: default:
return 0; return 0;
} }
RandPropPointsRecord randPropPointsEntry = CliDB.RandPropPointsStorage.LookupByKey(itemLevel); RandPropPointsRecord randPropPointsEntry = CliDB.RandPropPointsStorage.LookupByKey(itemLevel);
if (randPropPointsEntry == null) if (randPropPointsEntry == null)
return 0; return 0;
// Select rare/epic modifier
switch (quality) switch (quality)
{ {
case ItemQuality.Uncommon: case ItemQuality.Uncommon:
@@ -225,69 +156,16 @@ namespace Game.Entities
case ItemQuality.Artifact: case ItemQuality.Artifact:
return randPropPointsEntry.Epic[propIndex]; return randPropPointsEntry.Epic[propIndex];
} }
return 0; return 0;
} }
static EnchantmentStore RandomItemEnch; static Dictionary<uint, RandomBonusListIds> _storage = new Dictionary<uint, RandomBonusListIds>();
public class EnchStoreItem
{
public EnchStoreItem()
{
ench = 0;
chance = 0;
}
public EnchStoreItem(ItemRandomEnchantmentType _type, uint _ench, float _chance)
{
type = _type;
ench = _ench;
chance = _chance;
}
public ItemRandomEnchantmentType type;
public uint ench;
public float chance;
}
class EnchantmentStore
{
public EnchantmentStore()
{
_data[(byte)ItemRandomEnchantmentType.Property] = new MultiMap<uint, EnchStoreItem>();
_data[(byte)ItemRandomEnchantmentType.Suffix] = new MultiMap<uint, EnchStoreItem>();
}
public MultiMap<uint, EnchStoreItem> this[ItemRandomEnchantmentType type]
{
get
{
//(type != ItemRandomEnchantmentType.BonusList, "Random bonus lists do not have their own storage, use Suffix for them");
return _data[(byte)type];
}
}
MultiMap<uint, EnchStoreItem>[] _data = new MultiMap<uint, EnchStoreItem>[2];
}
} }
public struct ItemRandomEnchantmentId public class RandomBonusListIds
{ {
public static ItemRandomEnchantmentId Empty = default(ItemRandomEnchantmentId); public List<uint> BonusListIDs = new List<uint>();
public List<double> Chances = new List<double>();
public ItemRandomEnchantmentId(ItemRandomEnchantmentType type, uint id)
{
Type = type;
Id = id;
}
public ItemRandomEnchantmentType Type;
public uint Id;
}
public enum ItemRandomEnchantmentType
{
Property = 0,
Suffix = 1,
BonusList = 2
} }
} }
+3 -4
View File
@@ -223,9 +223,9 @@ namespace Game.Entities
if (GetFlags().HasAnyFlag(ItemFlags.IsBoundToAccount) && alwaysAllowBoundToAccount) if (GetFlags().HasAnyFlag(ItemFlags.IsBoundToAccount) && alwaysAllowBoundToAccount)
return true; return true;
uint spec = player.GetUInt32Value(ActivePlayerFields.LootSpecId); uint spec = player.GetLootSpecId();
if (spec == 0) if (spec == 0)
spec = player.GetUInt32Value(PlayerFields.CurrentSpecId); spec = player.GetPrimarySpecialization();
if (spec == 0) if (spec == 0)
spec = player.GetDefaultSpecId(); spec = player.GetDefaultSpecId();
@@ -295,8 +295,6 @@ namespace Game.Entities
public uint GetPageText() { return ExtendedData.PageID; } public uint GetPageText() { return ExtendedData.PageID; }
public uint GetStartQuest() { return ExtendedData.StartQuestID; } public uint GetStartQuest() { return ExtendedData.StartQuestID; }
public uint GetLockID() { return ExtendedData.LockID; } public uint GetLockID() { return ExtendedData.LockID; }
public uint GetRandomProperty() { return ExtendedData.RandomSelect; }
public uint GetRandomSuffix() { return ExtendedData.ItemRandomSuffixGroupID; }
public uint GetItemSet() { return ExtendedData.ItemSet; } public uint GetItemSet() { return ExtendedData.ItemSet; }
public uint GetArea() { return ExtendedData.ZoneBound; } public uint GetArea() { return ExtendedData.ZoneBound; }
public uint GetMap() { return ExtendedData.InstanceBound; } public uint GetMap() { return ExtendedData.InstanceBound; }
@@ -345,6 +343,7 @@ namespace Game.Entities
public uint MaxMoneyLoot; public uint MaxMoneyLoot;
public ItemFlagsCustom FlagsCu; public ItemFlagsCustom FlagsCu;
public float SpellPPMRate; public float SpellPPMRate;
public uint RandomBonusListTemplateId;
public BitArray[] Specializations = new BitArray[3]; public BitArray[] Specializations = new BitArray[3];
public uint ItemSpecClassMask; public uint ItemSpecClassMask;
@@ -56,13 +56,13 @@ namespace Game.Entities
if (buffer.WriteBit(!outOfRangeGUIDs.Empty())) if (buffer.WriteBit(!outOfRangeGUIDs.Empty()))
{ {
buffer.WriteUInt16(0); // object limit to instantly destroy - objects before this index on m_outOfRangeGUIDs list get "smoothly phased out" buffer.WriteUInt16(0); // object limit to instantly destroy - objects before this index on m_outOfRangeGUIDs list get "smoothly phased out"
buffer.WriteUInt32(outOfRangeGUIDs.Count); buffer.WriteInt32(outOfRangeGUIDs.Count);
foreach (var guid in outOfRangeGUIDs) foreach (var guid in outOfRangeGUIDs)
buffer.WritePackedGuid(guid); buffer.WritePackedGuid(guid);
} }
var bytes = data.GetData(); var bytes = data.GetData();
buffer.WriteUInt32(bytes.Length); buffer.WriteInt32(bytes.Length);
buffer.WriteBytes(bytes); buffer.WriteBytes(bytes);
packet.Data = buffer.GetData(); packet.Data = buffer.GetData();
@@ -0,0 +1,453 @@
/*
* Copyright (C) 2012-2019 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Game.Network;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace Game.Entities
{
public class UpdateFieldHolder
{
public UpdateFieldHolder(WorldObject owner) { _owner = owner; }
public BaseUpdateData<T> ModifyValue<T>(BaseUpdateData<T> updateData)
{
_changesMask.Set(updateData.Bit);
return updateData;
}
public void ClearChangesMask<T>(BaseUpdateData<T> updateData)
{
_changesMask.Reset(updateData.Bit);
}
public void ClearChangesMask<T, U>(BaseUpdateData<T> updateData, ref UpdateField<U> updateField) where T : new() where U : new()
{
_changesMask.Reset(updateData.Bit);
IHasChangesMask hasChangesMask = (IHasChangesMask)updateField._value;
if (hasChangesMask != null)
hasChangesMask.ClearChangesMask();
}
public uint GetChangedObjectTypeMask()
{
return _changesMask.GetBlock(0);
}
public bool HasChanged(TypeId index)
{
return _changesMask[(int)index];
}
UpdateMask _changesMask = new UpdateMask((int)TypeId.Max);
WorldObject _owner;
}
public interface IUpdateField<T>
{
void SetValue(T value);
T GetValue();
}
public class UpdateField<T> : IUpdateField<T> where T : new()
{
public T _value;
public int BlockBit;
public int Bit;
public UpdateField(int blockBit, int bit)
{
BlockBit = blockBit;
Bit = bit;
_value = new T();
}
public static implicit operator T(UpdateField<T> updateField)
{
return updateField._value;
}
public void SetValue(T value) { _value = value; }
public T GetValue() { return _value; }
}
public class UpdateFieldArray<T> where T : new()
{
public T[] _values;
public int FirstElementBit;
public int Bit;
public UpdateFieldArray(uint size, int bit, int firstElementBit)
{
_values = new T[size];
for (var i = 0; i < size; ++i)
_values[i] = new T();
Bit = bit;
FirstElementBit = firstElementBit;
}
public T this[int index]
{
get
{
return _values[index];
}
set
{
_values[index] = value;
}
}
public int GetSize() { return _values.Length; }
public IEnumerator<T> GetEnumerator()
{
foreach (var obj in _values)
yield return obj;
}
}
public class DynamicUpdateField<T> where T : new()
{
public List<T> _values;
public List<uint> _updateMask;
public int BlockBit;
public int Bit;
public DynamicUpdateField()
{
_values = new List<T>();
_updateMask = new List<uint>();
BlockBit = -1;
Bit = -1;
}
public DynamicUpdateField(int blockBit, int bit)
{
_values = new List<T>();
_updateMask = new List<uint>();
BlockBit = blockBit;
Bit = bit;
}
public int FindIndex(T value)
{
return _values.IndexOf(value);
}
public bool HasChanged(int index)
{
return (_updateMask[index / 32] & (1 << (index % 32))) != 0;
}
public void WriteUpdateMask(WorldPacket data)
{
data.WriteBits(_values.Count, 32);
if (_values.Count > 32)
{
if (data.HasUnfinishedBitPack())
for (int block = 0; block < _values.Count / 32; ++block)
data.WriteBits(_updateMask[block], 32);
else
for (int block = 0; block < _values.Count / 32; ++block)
data.WriteUInt32(_updateMask[block]);
}
if ((_values.Count % 32) != 0)
data.WriteBits(_updateMask.Last(), _values.Count % 32);
}
public void ClearChangesMask()
{
for (var i = 0; i < _updateMask.Count; ++i)
_updateMask[i] = 0;
}
public void AddValue(T value)
{
MarkChanged(_values.Count);
if (value is IHasChangesMask)
{
IHasChangesMask hasChanges = (IHasChangesMask)value;
if (hasChanges != null)
hasChanges.GetUpdateMask().SetAll();
}
_values.Add(value);
}
public void InsertValue(int index, T value)
{
_values.Insert(index, value);
for (int i = index; i < _values.Count; ++i)
{
MarkChanged(i);
// also mark all fields of value as changed
IHasChangesMask hasChangesMask = (IHasChangesMask)_values[i];
if (hasChangesMask != null)
hasChangesMask.GetUpdateMask().SetAll();
}
}
public void RemoveValue(int index)
{
// remove by shifting entire container - client might rely on values being sorted for certain fields
_values.RemoveAt(index);
for (int i = index; i < _values.Count; ++i)
{
MarkChanged(i);
// also mark all fields of value as changed
IHasChangesMask hasChanges = (IHasChangesMask)_values[i];
if (hasChanges != null)
hasChanges.GetUpdateMask().SetAll();
}
if ((_values.Count % 32) != 0)
_updateMask[UpdateMask.GetBlockIndex(_values.Count)] &= (uint)~UpdateMask.GetBlockFlag(_values.Count);
else
_updateMask.RemoveAt(_updateMask.Count - 1);
}
public void Clear()
{
_values.Clear();
_updateMask.Clear();
}
public void MarkChanged(int index)
{
int block = UpdateMask.GetBlockIndex(index);
if (block >= _updateMask.Count)
_updateMask.Add(0);
_updateMask[block] |= (uint)UpdateMask.GetBlockFlag(index);
}
public void ClearChanged(int index)
{
int block = UpdateMask.GetBlockIndex(index);
if (block >= _updateMask.Count)
_updateMask.Add(0);
_updateMask[block] &= ~(uint)UpdateMask.GetBlockFlag(index);
}
public int Size()
{
return _values.Count;
}
public T this[int index]
{
get
{
if (_values.Count <= index)
_values.Add(new T());
return _values[index];
}
set
{
_values[index] = value;
}
}
public static implicit operator List<T>(DynamicUpdateField<T> updateField)
{
return updateField._values;
}
public IEnumerator<T> GetEnumerator()
{
foreach (var obj in _values)
yield return obj;
}
}
public interface IHasChangesMask
{
void ClearChangesMask();
UpdateMask GetUpdateMask();
}
public abstract class BaseUpdateData<T> : IHasChangesMask
{
public UpdateMask _changesMask;
public int _blockBit;
public int Bit;
public BaseUpdateData(int blockBit, TypeId bit, int changeMask)
{
_blockBit = blockBit;
Bit = (int)bit;
_changesMask = new UpdateMask(changeMask);
}
public BaseUpdateData(int changeMask)
{
_changesMask = new UpdateMask(changeMask);
}
public abstract void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver);
public abstract void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver);
public abstract void ClearChangesMask();
public UpdateMask GetUpdateMask()
{
return _changesMask;
}
public void ClearChanged<U>(UpdateField<U> updateField) where U : new()
{
_changesMask.Reset(updateField.Bit);
}
public void ClearChanged<U>(UpdateFieldArray<U> updateField, int index) where U : new()
{
_changesMask.Reset(updateField.Bit);
_changesMask.Reset(updateField.FirstElementBit + index);
}
public void ClearChanged<U>(DynamicUpdateField<U> updateField, int index) where U : new()
{
_changesMask.Reset(Bit);
updateField.ClearChanged(index);
}
public void ClearChangesMask<U>(UpdateField<U> updateField) where U : new()
{
if (typeof(U).BaseType == typeof(IHasChangesMask))
((IHasChangesMask)updateField._value).ClearChangesMask();
}
public void ClearChangesMask<U>(UpdateFieldArray<U> updateField) where U : new()
{
if (typeof(U).BaseType == typeof(IHasChangesMask))
{
for (int i = 0; i < updateField.GetSize(); ++i)
((IHasChangesMask)updateField[i]).ClearChangesMask();
}
}
public void ClearChangesMask<U>(DynamicUpdateField<U> updateField) where U : new()
{
if (typeof(U).BaseType == typeof(IHasChangesMask))
{
for (int i = 0; i < updateField.Size(); ++i)
((IHasChangesMask)updateField[i]).ClearChangesMask();
updateField.ClearChangesMask();
}
}
public UpdateField<UU> ModifyValue<U, UU>(Expression<Func<U, UpdateField<UU>>> expression) where UU : new()
{
var fieldInfo = ((MemberExpression)expression.Body).Member as FieldInfo;
if (fieldInfo == null)
throw new ArgumentException("The lambda expression 'property' should point to a valid Property");
var updateField = (UpdateField<UU>)fieldInfo.GetValue(this);
_changesMask.Set(updateField.BlockBit);
_changesMask.Set(updateField.Bit);
return updateField;
}
public ref UU ModifyValue<U, UU>(Expression<Func<U, UpdateFieldArray<UU>>> expression, int index) where UU : new()
{
var fieldInfo = ((MemberExpression)expression.Body).Member as FieldInfo;
if (fieldInfo == null)
throw new ArgumentException("The lambda expression 'property' should point to a valid Property");
var updateFieldArray = (UpdateFieldArray<UU>)fieldInfo.GetValue(this);
_changesMask.Set(updateFieldArray.Bit);
_changesMask.Set(updateFieldArray.FirstElementBit + index);
return ref updateFieldArray._values[index];
}
public UpdateField<U> ModifyValue<U>(UpdateField<U> updateField) where U : new()
{
_changesMask.Set(updateField.BlockBit);
_changesMask.Set(updateField.Bit);
return updateField;
}
public ref U ModifyValue<U>(UpdateFieldArray<U> updateField, int index) where U : new()
{
_changesMask.Set(updateField.Bit);
_changesMask.Set(updateField.FirstElementBit + index);
return ref updateField._values[index];
}
public DynamicUpdateField<U> ModifyValue<U>(DynamicUpdateField<U> updateField) where U : new()
{
_changesMask.Set(updateField.BlockBit);
_changesMask.Set(updateField.Bit);
return updateField;
}
public DynamicUpdateFieldSetter<U> ModifyValue<U>(DynamicUpdateField<U> updateField, int index) where U : new()
{
if (index >= updateField._values.Count)
{
// fill with zeros until reaching desired slot
updateField._values.Resize((uint)index + 1);
updateField._updateMask.Resize((uint)(updateField._values.Count + 31) / 32);
}
_changesMask.Set(updateField.BlockBit);
_changesMask.Set(updateField.Bit);
updateField.MarkChanged(index);
return new DynamicUpdateFieldSetter<U>(updateField, index);
}
}
public class DynamicUpdateFieldSetter<T> : IUpdateField<T> where T : new()
{
public DynamicUpdateFieldSetter(DynamicUpdateField<T> dynamicUpdateField, int index)
{
_dynamicUpdateField = dynamicUpdateField;
_index = index;
}
public void SetValue(T value)
{
_dynamicUpdateField[_index] = value;
}
public T GetValue() { return _dynamicUpdateField[_index]; }
public static implicit operator T(DynamicUpdateFieldSetter<T> dynamicUpdateFieldSetter)
{
return dynamicUpdateFieldSetter.GetValue();
}
DynamicUpdateField<T> _dynamicUpdateField;
int _index;
}
}
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More