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:
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 (?, ?)");
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -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,
|
||||||
|
|||||||
@@ -220,8 +220,8 @@ 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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -207,7 +207,7 @@ namespace Game.Entities
|
|||||||
if (caster != null)
|
if (caster != null)
|
||||||
{
|
{
|
||||||
caster.SetViewpoint(this, true);
|
caster.SetViewpoint(this, true);
|
||||||
_isViewpoint = true;
|
_isViewpoint = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -144,9 +144,9 @@ namespace Game.Entities
|
|||||||
{
|
{
|
||||||
if (m_bagslot[slot] != null)
|
if (m_bagslot[slot] != null)
|
||||||
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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+381
-356
File diff suppressed because it is too large
Load Diff
@@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user