Port to WoW client 12.0.7 (build 68453)
Adapt CypherCore from 11.2.5.63796 to 12.0.7.68453 using TrinityCore as byte-exact reference. - Fase 1: build gate 68453 (build_info + build_auth_key SQL, keys from TC) - Fase 2: Opcodes.cs remapped by name to 12.0.7 values - Fase 3: 32 DB2 structs + HotfixDatabase.cs SELECTs realigned; fixed ReputationManager/SpellInfo refs - Fase 4: UpdateFields ported (GameObject/Conversation/AreaTrigger/Player/ Unit/ActivePlayer + nested VisibleItem/QuestLog/BitVectors/CraftingOrderItem/ SkillInfo) - Critical protocol fixes: CreateObject header +3 bits (Room/Decor/MeshObject); EntityFragment enum renumbered to 12.0.7 (was 11.2.5 values, breaking every object packet) - New-entity foundation: TypeId/TypeMask/HighGuid.MeshObject, fragment tags - MeshObject entity scaffold (Midnight features are wire-format only) Builds clean (dotnet build -c Release, 0 errors). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -100,6 +100,7 @@ namespace Game.DataStorage
|
||||
public string GameType;
|
||||
public string ShortDescription;
|
||||
public string LongDescription;
|
||||
public sbyte InstanceType;
|
||||
public int PvpType;
|
||||
public byte MinLevel;
|
||||
public byte MaxLevel;
|
||||
|
||||
@@ -63,10 +63,10 @@ namespace Game.DataStorage
|
||||
public sealed class CharacterLoadoutRecord
|
||||
{
|
||||
public uint Id;
|
||||
public long RaceMask;
|
||||
public sbyte ChrClassID;
|
||||
public int Purpose;
|
||||
public byte ItemContext;
|
||||
public long RaceMask;
|
||||
|
||||
public bool IsForNewCharacter() { return Purpose == 9; }
|
||||
}
|
||||
@@ -216,7 +216,6 @@ namespace Game.DataStorage
|
||||
public sealed class ChrCustomizationReqRecord
|
||||
{
|
||||
public uint Id;
|
||||
public long RaceMask;
|
||||
public string ReqSource;
|
||||
public int Flags;
|
||||
public int ClassMask;
|
||||
@@ -225,6 +224,7 @@ namespace Game.DataStorage
|
||||
public int QuestID;
|
||||
public int OverrideArchive; // -1: allow any, otherwise must match OverrideArchive cvar
|
||||
public uint ItemModifiedAppearanceID;
|
||||
public long RaceMask;
|
||||
|
||||
public bool HasFlag(ChrCustomizationReqFlag chrCustomizationReqFlag) { return (Flags & (int)chrCustomizationReqFlag) != 0; }
|
||||
}
|
||||
@@ -382,6 +382,7 @@ namespace Game.DataStorage
|
||||
public int OrderIndex;
|
||||
public int RedirectContentTuningID;
|
||||
public int RedirectFlag;
|
||||
public int RedirectEnum;
|
||||
public uint ParentContentTuningID;
|
||||
}
|
||||
|
||||
@@ -639,6 +640,9 @@ namespace Game.DataStorage
|
||||
public uint RechargingCycleDurationMS;
|
||||
public float AccountTransferPercentage;
|
||||
public byte OrderIndex;
|
||||
public float RecraftReagentCountPercentage;
|
||||
public byte OrderSource;
|
||||
public int MCRCurrencyID;
|
||||
public int[] Flags = new int[2];
|
||||
|
||||
public bool HasFlag(CurrencyTypesFlags currencyTypesFlags) { return (Flags[0] & (int)currencyTypesFlags) != 0; }
|
||||
|
||||
@@ -6,7 +6,6 @@ namespace Game.DataStorage
|
||||
public sealed class EmotesRecord
|
||||
{
|
||||
public uint Id;
|
||||
public long RaceMask;
|
||||
public string EmoteSlashCommand;
|
||||
public short AnimID;
|
||||
public int EmoteFlags;
|
||||
@@ -15,6 +14,7 @@ namespace Game.DataStorage
|
||||
public uint EventSoundID;
|
||||
public uint SpellVisualKitId;
|
||||
public int ClassMask;
|
||||
public long RaceMask;
|
||||
}
|
||||
|
||||
public sealed class EmotesTextRecord
|
||||
|
||||
@@ -8,7 +8,6 @@ namespace Game.DataStorage
|
||||
public sealed class FactionRecord
|
||||
{
|
||||
public uint Id;
|
||||
public long[] ReputationRaceMask = new long[4];
|
||||
public LocalizedString Name;
|
||||
public string Description;
|
||||
public short ReputationIndex;
|
||||
@@ -25,8 +24,15 @@ namespace Game.DataStorage
|
||||
public int[] ReputationMax = new int[4];
|
||||
public float[] ParentFactionMod = new float[2]; // Faction outputs rep * ParentFactionModOut as spillover reputation
|
||||
public byte[] ParentFactionCap = new byte[2]; // The highest rank the faction will profit from incoming spillover
|
||||
public long ReputationRaceMask1;
|
||||
public long ReputationRaceMask2;
|
||||
public long ReputationRaceMask3;
|
||||
public long ReputationRaceMask4;
|
||||
|
||||
// helpers
|
||||
// 12.0.7: client stores ReputationRaceMask as 4 separate RaceMask<int32,2> columns; expose as array for existing code
|
||||
public long[] ReputationRaceMask => new long[] { ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4 };
|
||||
|
||||
public bool CanHaveReputation()
|
||||
{
|
||||
return ReputationIndex >= 0;
|
||||
|
||||
@@ -219,7 +219,6 @@ namespace Game.DataStorage
|
||||
public uint HordeConstructObjID;
|
||||
public uint AllianceConstructObjID;
|
||||
public byte Flags;
|
||||
public byte UiCategoryID;
|
||||
public uint[] UpgradeRequirement = new uint[2];
|
||||
}
|
||||
|
||||
@@ -332,6 +331,7 @@ namespace Game.DataStorage
|
||||
public int TraitTreeID;
|
||||
public int ProfessionID;
|
||||
public int Unknown_1002_14;
|
||||
public int NeighborhoodMapID;
|
||||
public int SkillLineID;
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,11 @@ namespace Game.DataStorage
|
||||
public uint ItemGroupSoundsID;
|
||||
public int ContentTuningID;
|
||||
public int ModifiedCraftingReagentItemID;
|
||||
public byte Unknown1200;
|
||||
public int CraftingQualityID;
|
||||
public int ItemSquishEraID;
|
||||
public float RecraftReagentCountPercentage;
|
||||
public byte OrderSource;
|
||||
}
|
||||
|
||||
public sealed class ItemAppearanceRecord
|
||||
@@ -227,13 +231,15 @@ namespace Game.DataStorage
|
||||
public ushort SpellCategoryID;
|
||||
public int SpellID;
|
||||
public ushort ChrSpecializationID;
|
||||
public int PlayerConditionID;
|
||||
}
|
||||
|
||||
public sealed class ItemExtendedCostRecord
|
||||
{
|
||||
public uint Id;
|
||||
public ulong Money;
|
||||
public ushort RequiredArenaRating;
|
||||
public byte ArenaBracket; // arena slot restrictions (min slot value)
|
||||
public byte ArenaBracket; // arena slot restrictions (min slot value)
|
||||
public int Flags;
|
||||
public byte MinFactionID;
|
||||
public int MinReputation;
|
||||
@@ -337,12 +343,12 @@ namespace Game.DataStorage
|
||||
public int ItemLevel;
|
||||
public int RequiredLevel;
|
||||
public int Unknown1125;
|
||||
public int Flags;
|
||||
}
|
||||
|
||||
public sealed class ItemSearchNameRecord
|
||||
{
|
||||
public uint Id;
|
||||
public long AllowableRace;
|
||||
public string Display;
|
||||
public byte OverallQualityID;
|
||||
public int ExpansionID;
|
||||
@@ -355,6 +361,7 @@ namespace Game.DataStorage
|
||||
public uint RequiredAbility;
|
||||
public ushort ItemLevel;
|
||||
public int[] Flags = new int[5];
|
||||
public long AllowableRace;
|
||||
}
|
||||
|
||||
public sealed class ItemSetRecord
|
||||
@@ -382,7 +389,6 @@ namespace Game.DataStorage
|
||||
public sealed class ItemSparseRecord
|
||||
{
|
||||
public uint Id;
|
||||
public long AllowableRace;
|
||||
public string Description;
|
||||
public string Display3;
|
||||
public string Display2;
|
||||
@@ -404,6 +410,7 @@ namespace Game.DataStorage
|
||||
public uint MaxCount;
|
||||
public uint MinReputation;
|
||||
public uint RequiredAbility;
|
||||
public long AllowableRace;
|
||||
public uint SellPrice;
|
||||
public uint BuyPrice;
|
||||
public uint VendorStackCount;
|
||||
@@ -416,6 +423,7 @@ namespace Game.DataStorage
|
||||
public uint PlayerLevelToItemLevelCurveID;
|
||||
public int ItemLevelOffsetCurveID;
|
||||
public int ItemLevelOffsetItemLevel;
|
||||
public int ItemSquishEraID;
|
||||
public ushort ItemNameDescriptionID;
|
||||
public ushort RequiredTransmogHoliday;
|
||||
public ushort RequiredHoliday;
|
||||
|
||||
@@ -94,8 +94,8 @@ namespace Game.DataStorage
|
||||
public byte MaterialID;
|
||||
public int MinimapStaticCol;
|
||||
public byte[] FrameCountTexture = new byte[6];
|
||||
public int[] Color = new int[2];
|
||||
public float[] Float = new float[18];
|
||||
public int[] Color = new int[3];
|
||||
public float[] Float = new float[38];
|
||||
public uint[] Int = new uint[4];
|
||||
public float[] Coefficient = new float[4];
|
||||
}
|
||||
|
||||
@@ -116,9 +116,10 @@ namespace Game.DataStorage
|
||||
public uint Id;
|
||||
public ushort MapID;
|
||||
public int Flags;
|
||||
public int MaxMedals;
|
||||
public uint ExpansionLevel;
|
||||
public int RequiredWorldStateID; // maybe?
|
||||
public short[] CriteriaCount = new short[3];
|
||||
public short[] CriteriaCount = new short[5];
|
||||
public int[] FirstRewardQuestID = new int[6];
|
||||
public int[] RewardQuestID = new int[6];
|
||||
}
|
||||
@@ -248,6 +249,7 @@ namespace Game.DataStorage
|
||||
public sealed class MovieRecord
|
||||
{
|
||||
public uint Id;
|
||||
public LocalizedString Summary;
|
||||
public byte Volume;
|
||||
public byte KeyID;
|
||||
public uint AudioFileDataID;
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace Game.DataStorage
|
||||
public byte Type;
|
||||
public byte Flags;
|
||||
public uint UiTextureKitID;
|
||||
public uint UiScenarioDisplayInfoID;
|
||||
}
|
||||
|
||||
public sealed class ScenarioStepRecord
|
||||
@@ -59,6 +60,7 @@ namespace Game.DataStorage
|
||||
{
|
||||
public uint Id;
|
||||
public string Name;
|
||||
public int Flags;
|
||||
public int Unknown915;
|
||||
}
|
||||
|
||||
@@ -98,7 +100,6 @@ namespace Game.DataStorage
|
||||
|
||||
public sealed class SkillLineAbilityRecord
|
||||
{
|
||||
public long RaceMask;
|
||||
public string AbilityVerb;
|
||||
public string AbilityAllVerb;
|
||||
public uint Id;
|
||||
@@ -115,6 +116,7 @@ namespace Game.DataStorage
|
||||
public short UniqueBit;
|
||||
public short TradeSkillCategoryID;
|
||||
public ushort SkillupSkillLineID;
|
||||
public long RaceMask;
|
||||
|
||||
public bool HasFlag(SkillLineAbilityFlags skillLineAbilityFlags) { return (Flags & (int)skillLineAbilityFlags) != 0; }
|
||||
}
|
||||
@@ -130,13 +132,13 @@ namespace Game.DataStorage
|
||||
public sealed class SkillRaceClassInfoRecord
|
||||
{
|
||||
public uint Id;
|
||||
public long RaceMask;
|
||||
public ushort SkillID;
|
||||
public int ClassMask;
|
||||
public int Flags;
|
||||
public int Availability;
|
||||
public sbyte MinLevel;
|
||||
public ushort SkillTierID;
|
||||
public long RaceMask;
|
||||
|
||||
public bool HasFlag(SkillRaceClassInfoFlags skillRaceClassInfoFlags) { return (Flags & (int)skillRaceClassInfoFlags) != 0; }
|
||||
}
|
||||
@@ -245,6 +247,7 @@ namespace Game.DataStorage
|
||||
public byte DifficultyID;
|
||||
public ushort Category;
|
||||
public int DefenseType;
|
||||
public int DiminishType;
|
||||
public sbyte DispelType;
|
||||
public sbyte Mechanic;
|
||||
public int PreventionType;
|
||||
@@ -291,6 +294,7 @@ namespace Game.DataStorage
|
||||
public uint Id;
|
||||
public int Duration;
|
||||
public int MaxDuration;
|
||||
public int DurationPerResource;
|
||||
}
|
||||
|
||||
public sealed class SpellEffectRecord
|
||||
@@ -320,6 +324,7 @@ namespace Game.DataStorage
|
||||
public float GroupSizeBasePointsCoefficient;
|
||||
public float EffectBasePoints;
|
||||
public int ScalingClass;
|
||||
public int TargetNodeGraph;
|
||||
public int[] EffectMiscValue = new int[2];
|
||||
public uint[] EffectRadiusIndex = new uint[2];
|
||||
public FlagArray128 EffectSpellClassMask;
|
||||
@@ -446,7 +451,7 @@ namespace Game.DataStorage
|
||||
public sealed class SpellMiscRecord
|
||||
{
|
||||
public uint Id;
|
||||
public int[] Attributes = new int[16];
|
||||
public int[] Attributes = new int[17];
|
||||
public byte DifficultyID;
|
||||
public ushort CastingTimeIndex;
|
||||
public ushort DurationIndex;
|
||||
@@ -551,6 +556,8 @@ namespace Game.DataStorage
|
||||
public int SpellID;
|
||||
public ushort CurrencyTypesID;
|
||||
public ushort CurrencyCount;
|
||||
public int OverrideRecraftCurrencyCount;
|
||||
public byte OrderSource;
|
||||
}
|
||||
|
||||
public sealed class SpellScalingRecord
|
||||
@@ -559,7 +566,6 @@ namespace Game.DataStorage
|
||||
public uint SpellID;
|
||||
public uint MinScalingLevel;
|
||||
public uint MaxScalingLevel;
|
||||
public ushort ScalesFromItemLevel;
|
||||
}
|
||||
|
||||
public sealed class SpellShapeshiftRecord
|
||||
@@ -614,6 +620,7 @@ namespace Game.DataStorage
|
||||
public uint Id;
|
||||
public float[] MissileCastOffset = new float[3];
|
||||
public float[] MissileImpactOffset = new float[3];
|
||||
public int StateKit;
|
||||
public uint AnimEventSoundID;
|
||||
public int Flags;
|
||||
public sbyte MissileAttachment;
|
||||
|
||||
@@ -316,6 +316,7 @@ namespace Game.DataStorage
|
||||
|
||||
public sealed class TraitTreeRecord
|
||||
{
|
||||
public LocalizedString TitleText;
|
||||
public uint Id;
|
||||
public uint TraitSystemID;
|
||||
public int Unused1000_1;
|
||||
@@ -324,6 +325,7 @@ namespace Game.DataStorage
|
||||
public int Flags;
|
||||
public float Unused1000_2;
|
||||
public float Unused1000_3;
|
||||
public int UiTextureKitID;
|
||||
|
||||
public bool HasFlag(TraitTreeFlag traitTreeFlag) { return (Flags & (int)traitTreeFlag) != 0; }
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ namespace Game.DataStorage
|
||||
public UiMapType Type;
|
||||
public int BountySetID;
|
||||
public uint BountyDisplayLocation;
|
||||
public int VisibilityPlayerConditionID2; // if not met then map is skipped when evaluating UiMapAssignment
|
||||
public int VisibilityPlayerConditionID; // if not met then client checks other maps with the same AlternateUiMapGroup, not re-evaluating UiMapAssignment for them
|
||||
public sbyte HelpTextPosition;
|
||||
public int BkgAtlasID;
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
|
||||
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
|
||||
|
||||
using Framework.Constants;
|
||||
using Game.Maps;
|
||||
using Game.Networking;
|
||||
using Game.Networking.Packets;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Game.Entities
|
||||
{
|
||||
public class MeshObject : WorldObject
|
||||
{
|
||||
MeshObjectData m_meshObjectData;
|
||||
|
||||
Position _stationaryPosition = new();
|
||||
|
||||
public MeshObject(bool isWorldObject = false) : base(isWorldObject)
|
||||
{
|
||||
ObjectTypeMask |= TypeMask.MeshObject;
|
||||
ObjectTypeId = TypeId.MeshObject;
|
||||
|
||||
m_updateFlag.Stationary = true;
|
||||
m_updateFlag.MeshObject = true;
|
||||
|
||||
m_entityFragments.Add(EntityFragment.Tag_MeshObject, false);
|
||||
|
||||
m_meshObjectData = new();
|
||||
_stationaryPosition = new();
|
||||
}
|
||||
|
||||
public override void AddToWorld()
|
||||
{
|
||||
if (!IsInWorld)
|
||||
{
|
||||
GetMap().GetObjectsStore().Add(GetGUID(), this);
|
||||
base.AddToWorld();
|
||||
}
|
||||
}
|
||||
|
||||
public override void RemoveFromWorld()
|
||||
{
|
||||
if (IsInWorld)
|
||||
{
|
||||
base.RemoveFromWorld();
|
||||
GetMap().GetObjectsStore().Remove(GetGUID());
|
||||
}
|
||||
}
|
||||
|
||||
public static MeshObject CreateMeshObject(Map map, Position pos, ObjectGuid privateObjectOwner)
|
||||
{
|
||||
if (map == null)
|
||||
return null;
|
||||
|
||||
ulong lowGuid = map.GenerateLowGuid(HighGuid.MeshObject);
|
||||
|
||||
MeshObject meshObject = new();
|
||||
if (!meshObject.Create(lowGuid, map, pos, privateObjectOwner))
|
||||
{
|
||||
meshObject.Dispose();
|
||||
return null;
|
||||
}
|
||||
|
||||
return meshObject;
|
||||
}
|
||||
|
||||
bool Create(ulong lowGuid, Map map, Position pos, ObjectGuid privateObjectOwner)
|
||||
{
|
||||
SetMap(map);
|
||||
Relocate(pos);
|
||||
RelocateStationaryPosition(pos);
|
||||
|
||||
SetPrivateObjectOwner(privateObjectOwner);
|
||||
|
||||
_Create(ObjectGuid.Create(HighGuid.MeshObject, GetMapId(), 0, lowGuid));
|
||||
|
||||
SetObjectScale(1.0f);
|
||||
|
||||
// Register the updateable mesh-object-data fragment (vendor-style updateable fragment).
|
||||
m_entityFragments.Add(EntityFragment.FMeshObjectData_C, IsInWorld);
|
||||
|
||||
if (!GetMap().AddToMap(this))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void BuildValuesCreate(WorldPacket data, UpdateFieldFlag flags, Player target)
|
||||
{
|
||||
m_objectData.WriteCreate(data, flags, this, target);
|
||||
|
||||
if (m_meshObjectData != null)
|
||||
{
|
||||
if (EntityFragmentsHolder.IsIndirectFragment(EntityFragment.FMeshObjectData_C))
|
||||
data.WriteUInt8(1); // IndirectFragmentActive: FMeshObjectData_C
|
||||
|
||||
m_meshObjectData.WriteCreate(data, flags, this, target);
|
||||
}
|
||||
}
|
||||
|
||||
public override void BuildValuesUpdate(WorldPacket data, UpdateFieldFlag flags, Player target)
|
||||
{
|
||||
if ((m_entityFragments.ContentsChangedMask & m_entityFragments.GetUpdateMaskFor(EntityFragment.CGObject)) != 0)
|
||||
{
|
||||
data.WriteUInt32(m_values.GetChangedObjectTypeMask());
|
||||
|
||||
if (m_values.HasChanged(TypeId.Object))
|
||||
m_objectData.WriteUpdate(data, flags, this, target);
|
||||
}
|
||||
|
||||
if (m_meshObjectData != null && (m_entityFragments.ContentsChangedMask & m_entityFragments.GetUpdateMaskFor(EntityFragment.FMeshObjectData_C)) != 0)
|
||||
m_meshObjectData.WriteUpdate(data, flags, this, target);
|
||||
}
|
||||
|
||||
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedMeshObjectMask, Player target)
|
||||
{
|
||||
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
|
||||
UpdateMask valuesMask = new((int)TypeId.Max);
|
||||
if (requestedObjectMask.IsAnySet())
|
||||
valuesMask.Set((int)TypeId.Object);
|
||||
|
||||
WorldPacket buffer = new();
|
||||
BuildEntityFragmentsForValuesUpdateForPlayerWithMask(buffer, flags);
|
||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||
|
||||
if (valuesMask[(int)TypeId.Object])
|
||||
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
|
||||
|
||||
// MeshObjectData is an updateable fragment (FMeshObjectData_C), written after the values block.
|
||||
if (m_meshObjectData != null && requestedMeshObjectMask.IsAnySet())
|
||||
m_meshObjectData.WriteUpdate(buffer, requestedMeshObjectMask, true, this, target);
|
||||
|
||||
WorldPacket buffer1 = new();
|
||||
buffer1.WriteUInt8((byte)UpdateType.Values);
|
||||
buffer1.WritePackedGuid(GetGUID());
|
||||
buffer1.WriteUInt32(buffer.GetSize());
|
||||
buffer1.WriteBytes(buffer.GetData());
|
||||
|
||||
data.AddUpdateBlock(buffer1);
|
||||
}
|
||||
|
||||
public override void ClearUpdateMask(bool remove)
|
||||
{
|
||||
m_values.ClearChangesMask(m_meshObjectData);
|
||||
base.ClearUpdateMask(remove);
|
||||
}
|
||||
|
||||
public override uint GetFaction() { return 0; }
|
||||
|
||||
public override Position GetStationaryPosition() { return _stationaryPosition; }
|
||||
void RelocateStationaryPosition(Position pos) { _stationaryPosition.Relocate(pos); }
|
||||
|
||||
class ValuesUpdateForPlayerWithMaskSender
|
||||
{
|
||||
MeshObject Owner;
|
||||
ObjectFieldData ObjectMask = new();
|
||||
MeshObjectData MeshObjectMask = new();
|
||||
|
||||
public ValuesUpdateForPlayerWithMaskSender(MeshObject owner)
|
||||
{
|
||||
Owner = owner;
|
||||
}
|
||||
|
||||
public void Invoke(Player player)
|
||||
{
|
||||
UpdateData udata = new(Owner.GetMapId());
|
||||
|
||||
Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), MeshObjectMask.GetUpdateMask(), player);
|
||||
|
||||
udata.BuildPacket(out UpdateObject packet);
|
||||
player.SendPacket(packet);
|
||||
}
|
||||
|
||||
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -143,6 +143,7 @@ namespace Game.Entities
|
||||
case HighGuid.Corpse:
|
||||
case HighGuid.LootObject:
|
||||
case HighGuid.SceneObject:
|
||||
case HighGuid.MeshObject:
|
||||
case HighGuid.Scenario:
|
||||
case HighGuid.AIGroup:
|
||||
case HighGuid.DynamicDoor:
|
||||
@@ -345,6 +346,8 @@ namespace Game.Entities
|
||||
return TypeId.AreaTrigger;
|
||||
case HighGuid.SceneObject:
|
||||
return TypeId.SceneObject;
|
||||
case HighGuid.MeshObject:
|
||||
return TypeId.MeshObject;
|
||||
case HighGuid.Conversation:
|
||||
return TypeId.Conversation;
|
||||
default:
|
||||
@@ -377,6 +380,7 @@ namespace Game.Entities
|
||||
case HighGuid.Corpse:
|
||||
case HighGuid.LootObject:
|
||||
case HighGuid.SceneObject:
|
||||
case HighGuid.MeshObject:
|
||||
case HighGuid.Scenario:
|
||||
case HighGuid.AIGroup:
|
||||
case HighGuid.DynamicDoor:
|
||||
@@ -605,6 +609,7 @@ namespace Game.Entities
|
||||
SET_GUID_INFO(HighGuid.Corpse, FormatWorldObject, ParseWorldObject);
|
||||
SET_GUID_INFO(HighGuid.LootObject, FormatWorldObject, ParseWorldObject);
|
||||
SET_GUID_INFO(HighGuid.SceneObject, FormatWorldObject, ParseWorldObject);
|
||||
SET_GUID_INFO(HighGuid.MeshObject, FormatWorldObject, ParseWorldObject);
|
||||
SET_GUID_INFO(HighGuid.Scenario, FormatWorldObject, ParseWorldObject);
|
||||
SET_GUID_INFO(HighGuid.AIGroup, FormatWorldObject, ParseWorldObject);
|
||||
SET_GUID_INFO(HighGuid.DynamicDoor, FormatWorldObject, ParseWorldObject);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,33 +8,52 @@ namespace Game.Entities
|
||||
{
|
||||
public enum EntityFragment
|
||||
{
|
||||
CGObject = 0, // UPDATEABLE, INDIRECT,
|
||||
Tag_Item = 1, // TAG,
|
||||
Tag_Container = 2, // TAG,
|
||||
Tag_AzeriteEmpoweredItem = 3, // TAG,
|
||||
Tag_AzeriteItem = 4, // TAG,
|
||||
Tag_Unit = 5, // TAG,
|
||||
Tag_Player = 6, // TAG,
|
||||
Tag_GameObject = 7, // TAG,
|
||||
Tag_DynamicObject = 8, // TAG,
|
||||
Tag_Corpse = 9, // TAG,
|
||||
Tag_AreaTrigger = 10, // TAG,
|
||||
Tag_SceneObject = 11, // TAG,
|
||||
Tag_Conversation = 12, // TAG,
|
||||
Tag_AIGroup = 13, // TAG,
|
||||
Tag_Scenario = 14, // TAG,
|
||||
Tag_LootObject = 15, // TAG,
|
||||
Tag_ActivePlayer = 16, // TAG,
|
||||
Tag_ActiveClient_S = 17, // TAG,
|
||||
Tag_ActiveObject_C = 18, // TAG,
|
||||
Tag_VisibleObject_C = 19, // TAG,
|
||||
Tag_UnitVehicle = 20, // TAG,
|
||||
FEntityPosition = 112,
|
||||
FEntityLocalMatrix = 113,
|
||||
FEntityWorldMatrix = 114,
|
||||
CActor = 115, // INDIRECT,
|
||||
FVendor_C = 117, // UPDATEABLE, INDIRECT,
|
||||
FMirroredObject_C = 119,
|
||||
// 12.0.7 (build 68453): fragment IDs renumbered vs 11.2.5; these are written into every object create/update packet.
|
||||
FEntityPosition = 1,
|
||||
CGObject = 2, // UPDATEABLE, INDIRECT,
|
||||
FTransportLink = 5,
|
||||
FPlayerOwnershipLink = 13,
|
||||
CActor = 15, // INDIRECT,
|
||||
FVendor_C = 17, // UPDATEABLE,
|
||||
FMirroredObject_C = 18,
|
||||
FMeshObjectData_C = 19, // UPDATEABLE,
|
||||
FHousingDecor_C = 20, // UPDATEABLE,
|
||||
FHousingRoom_C = 21, // UPDATEABLE,
|
||||
FHousingRoomComponentMesh_C = 22, // UPDATEABLE,
|
||||
FHousingPlayerHouse_C = 23, // UPDATEABLE,
|
||||
FJamHousingCornerstone_C = 27, // UPDATEABLE,
|
||||
FHousingDecorActor_C = 28,
|
||||
FNeighborhoodMirrorData_C = 30, // UPDATEABLE,
|
||||
FMirroredPositionData_C = 31, // UPDATEABLE,
|
||||
PlayerHouseInfoComponent_C = 32, // UPDATEABLE, INDIRECT,
|
||||
FHousingStorage_C = 33, // UPDATEABLE,
|
||||
FHousingFixture_C = 34, // UPDATEABLE,
|
||||
PlayerInitiativeComponent_C = 37, // UPDATEABLE, INDIRECT,
|
||||
Tag_Item = 200, // TAG,
|
||||
Tag_Container = 201, // TAG,
|
||||
Tag_AzeriteEmpoweredItem = 202, // TAG,
|
||||
Tag_AzeriteItem = 203, // TAG,
|
||||
Tag_Unit = 204, // TAG,
|
||||
Tag_Player = 205, // TAG,
|
||||
Tag_GameObject = 206, // TAG,
|
||||
Tag_DynamicObject = 207, // TAG,
|
||||
Tag_Corpse = 208, // TAG,
|
||||
Tag_AreaTrigger = 209, // TAG,
|
||||
Tag_SceneObject = 210, // TAG,
|
||||
Tag_Conversation = 211, // TAG,
|
||||
Tag_AIGroup = 212, // TAG,
|
||||
Tag_Scenario = 213, // TAG,
|
||||
Tag_LootObject = 214, // TAG,
|
||||
Tag_ActivePlayer = 215, // TAG,
|
||||
Tag_ActiveClient_S = 216, // TAG,
|
||||
Tag_ActiveObject_C = 217, // TAG,
|
||||
Tag_VisibleObject_C = 218, // TAG,
|
||||
Tag_UnitVehicle = 219, // TAG,
|
||||
Tag_HousingRoom = 220, // TAG,
|
||||
Tag_MeshObject = 221, // TAG,
|
||||
Tag_HouseExteriorPiece = 224, // TAG,
|
||||
Tag_HouseExteriorRoot = 225, // TAG,
|
||||
Tag_HousingDecorProxyGameObject = 226, // TAG,
|
||||
End = 255,
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace Game.Entities
|
||||
m_movementInfo = new MovementInfo();
|
||||
m_updateFlag.Clear();
|
||||
|
||||
m_entityFragments.Add((int)EntityFragment.CGObject, false);
|
||||
m_entityFragments.Add(EntityFragment.CGObject, false);
|
||||
|
||||
m_objectData = new ObjectFieldData();
|
||||
|
||||
@@ -313,6 +313,9 @@ namespace Game.Entities
|
||||
data.WriteBit(flags.SceneObject);
|
||||
data.WriteBit(flags.ActivePlayer);
|
||||
data.WriteBit(flags.Conversation);
|
||||
data.WriteBit(flags.Room); // 12.0.7: new create-header bit
|
||||
data.WriteBit(flags.Decor); // 12.0.7: new create-header bit
|
||||
data.WriteBit(flags.MeshObject); // 12.0.7: new create-header bit
|
||||
data.FlushBits();
|
||||
|
||||
if (flags.MovementUpdate)
|
||||
@@ -4047,6 +4050,9 @@ namespace Game.Entities
|
||||
public bool SceneObject;
|
||||
public bool ActivePlayer;
|
||||
public bool Conversation;
|
||||
public bool Room; // 12.0.7: new
|
||||
public bool Decor; // 12.0.7: new
|
||||
public bool MeshObject; // 12.0.7: new
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
@@ -4067,6 +4073,9 @@ namespace Game.Entities
|
||||
SceneObject = false;
|
||||
ActivePlayer = false;
|
||||
Conversation = false;
|
||||
Room = false;
|
||||
Decor = false;
|
||||
MeshObject = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3579,6 +3579,11 @@ namespace Game.Maps
|
||||
return _objectsStore.LookupByKey(guid) as SceneObject;
|
||||
}
|
||||
|
||||
public MeshObject GetMeshObject(ObjectGuid guid)
|
||||
{
|
||||
return _objectsStore.LookupByKey(guid) as MeshObject;
|
||||
}
|
||||
|
||||
public Conversation GetConversation(ObjectGuid guid)
|
||||
{
|
||||
return (Conversation)_objectsStore.LookupByKey(guid);
|
||||
|
||||
@@ -77,7 +77,7 @@ namespace Game.Spells
|
||||
{
|
||||
Scaling.MinScalingLevel = _scaling.MinScalingLevel;
|
||||
Scaling.MaxScalingLevel = _scaling.MaxScalingLevel;
|
||||
Scaling.ScalesFromItemLevel = _scaling.ScalesFromItemLevel;
|
||||
// 12.0.7: ScalesFromItemLevel removed from SpellScaling.db2
|
||||
}
|
||||
|
||||
// SpellAuraOptionsEntry
|
||||
|
||||
Reference in New Issue
Block a user