Core: Updated to 11.1.7

Port From (https://github.com/TrinityCore/TrinityCore/commit/ceb8d561b44579118b109a9ff71ba415df53bbdc)
This commit is contained in:
Hondacrx
2025-08-18 14:47:48 -04:00
parent 5f6329665a
commit ebd9c9e636
35 changed files with 1824 additions and 1603 deletions
+1 -1
View File
@@ -704,7 +704,7 @@ namespace Framework.Constants
CommandPetLevel = 838,
CommandServerShutdownForce = 839,
CommandServerRestartForce = 840,
CommandNearGraveyard = 841,
// 841 previously used, do not reuse
CommandReloadCharacterTemplate = 842,
CommandReloadQuestGreeting = 843,
CommandScene = 844,
+6
View File
@@ -1106,6 +1106,12 @@ namespace Framework.Constants
ForceMaxQuantityOnConversion = 0x100, // NYI
}
public enum BattlemasterType
{
Battleground = 0,
Arena = 1,
}
[Flags]
public enum BattlemasterListFlags : int
{
@@ -31,7 +31,7 @@ namespace Framework.Constants
Catmullrom = 0x00000800, // Used Catmullrom interpolation mode
Cyclic = 0x00001000, // Movement by cycled spline
EnterCycle = 0x00002000, // Everytimes appears with cyclic flag in monster move packet, erases first spline vertex after first cycle done
Frozen = 0x00004000, // Will never arrive
Turning = 0x00004000, // Turns in place
TransportEnter = 0x00008000,
TransportExit = 0x00010000,
Unknown_0x20000 = 0x00020000, // NOT VERIFIED
@@ -53,7 +53,7 @@ namespace Framework.Constants
// flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably
MaskNoMonsterMove = Done,
// Unused, not suported flags
MaskUnused = NoSpline | Frozen | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000
MaskUnused = NoSpline | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000
| Unknown_0x800000 | FadeObject | UnlimitedSpeed | Unknown_0x40000000 | Unknown_0x80000000
}
}
File diff suppressed because it is too large Load Diff
@@ -811,6 +811,7 @@ namespace Framework.Constants
Inventory = 0x02,
Bank = 0x04,
ReagentBank = 0x08,
AccountBank = 0x10, // NYI
Default = Equipment | Inventory,
Everywhere = Equipment | Inventory | Bank | ReagentBank
File diff suppressed because it is too large Load Diff
@@ -195,7 +195,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?");
// BattlemasterList.db2
PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, InstanceType, MinLevel, MaxLevel, " +
PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, PvpType, MinLevel, MaxLevel, " +
"RatedPlayers, MinPlayers, MaxPlayers, GroupsAllowed, MaxGroupSize, HolidayWorldState, Flags, IconFileDataID, RequiredPlayerConditionID" +
" FROM battlemaster_list WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE, "SELECT ID, Name_lang, GameType_lang, ShortDescription_lang, LongDescription_lang" +
@@ -357,9 +357,9 @@ namespace Framework.Database
" FROM conditional_content_tuning WHERE (`VerifiedBuild` > 0) = ?");
// ContentTuning.db2
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, HealthItemLevelCurveID, DamageItemLevelCurveID, MinLevel, MaxLevel, " +
"MinLevelType, MaxLevelType, TargetLevelDelta, TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel, QuestXpMultiplier" +
" FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, HealthItemLevelCurveID, DamageItemLevelCurveID, " +
"HealthPrimaryStatCurveID, DamagePrimaryStatCurveID, MinLevel, MaxLevel, MinLevelType, MaxLevelType, TargetLevelDelta, TargetLevelMaxDelta, " +
"TargetLevelMin, TargetLevelMax, MinItemLevel, QuestXpMultiplier FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?");
// ContentTuningXExpected.db2
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MinMythicPlusSeasonID, MaxMythicPlusSeasonID, " +
@@ -461,13 +461,13 @@ namespace Game.BattleGrounds
switch ((BattlegroundQueueIdType)bgQueueTypeId.BgType)
{
case BattlegroundQueueIdType.Battleground:
if (battlemasterList.InstanceType != (int)MapTypes.Battleground)
if (battlemasterList.GetPvpType() != BattlemasterType.Battleground)
return false;
if (bgQueueTypeId.TeamSize != 0)
return false;
break;
case BattlegroundQueueIdType.Arena:
if (battlemasterList.InstanceType != (int)MapTypes.Arena)
if (battlemasterList.GetPvpType() != BattlemasterType.Arena)
return false;
if (!bgQueueTypeId.Rated)
return false;
@@ -479,7 +479,7 @@ namespace Game.BattleGrounds
return false;
break;
case BattlegroundQueueIdType.ArenaSkirmish:
if (battlemasterList.InstanceType != (int)MapTypes.Arena)
if (battlemasterList.GetPvpType() != BattlemasterType.Arena)
return false;
if (!bgQueueTypeId.Rated)
return false;
@@ -785,7 +785,7 @@ namespace Game.BattleGrounds
public BattlemasterListRecord BattlemasterEntry;
public List<int> MapIDs = new();
public bool IsArena() { return BattlemasterEntry.InstanceType == (uint)MapTypes.Arena; }
public bool IsArena() { return BattlemasterEntry.GetPvpType() == BattlemasterType.Arena; }
public ushort GetMinPlayersPerTeam()
{
+23 -1
View File
@@ -2145,7 +2145,29 @@ namespace Game
for (var i = 0; i < condition.ItemID.Length; ++i)
{
if (condition.ItemID[i] != 0)
results[i] = player.GetItemCount(condition.ItemID[i], condition.ItemFlags != 0) >= condition.ItemCount[i];
{
ItemSearchLocation where = ItemSearchLocation.Equipment;
if ((condition.ItemFlags & 1) != 0) // include banks
where |= ItemSearchLocation.Bank | ItemSearchLocation.ReagentBank | ItemSearchLocation.AccountBank;
if ((condition.ItemFlags & 2) == 0) // ignore inventory
where |= ItemSearchLocation.Inventory;
uint foundCount = 0;
results[i] = !player.ForEachItem(where, item =>
{
if (item.GetEntry() == condition.ItemID[i])
{
foundCount += item.GetCount();
if (foundCount >= condition.ItemCount[i])
return false;
}
return true;
});
if (!results[i] && condition.ItemCount[i] == 1 && Global.DB2Mgr.IsToyItem(condition.ItemID[i]))
results[i] = player.GetSession().GetCollectionMgr().HasToy(condition.ItemID[i]);
}
}
if (!PlayerConditionLogic(condition.ItemLogic, results))
+1 -1
View File
@@ -1944,7 +1944,7 @@ namespace Game.DataStorage
if (v2 == null)
return 0;
return v2.UniqueBitFlag;
return (uint)v2.UniqueBitFlag;
}
public List<uint> GetPhasesForGroup(uint group)
+2 -1
View File
@@ -80,7 +80,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;
public sbyte RatedPlayers;
@@ -93,6 +93,7 @@ namespace Game.DataStorage
public int IconFileDataID;
public int RequiredPlayerConditionID;
public BattlemasterType GetPvpType() { return (BattlemasterType)PvpType; }
public bool HasFlag(BattlemasterListFlags battlemasterListFlags) { return (Flags & (int)battlemasterListFlags) != 0; }
}
@@ -387,6 +387,8 @@ namespace Game.DataStorage
public int ExpansionID;
public int HealthItemLevelCurveID;
public int DamageItemLevelCurveID;
public int HealthPrimaryStatCurveID;
public int DamagePrimaryStatCurveID;
public int MinLevel;
public int MaxLevel;
public int MinLevelType;
+1 -1
View File
@@ -80,7 +80,7 @@ namespace Game.DataStorage
public uint CurrentCompletedQuestLogic;
public uint SpellLogic;
public uint ItemLogic;
public byte ItemFlags;
public int ItemFlags;
public uint AuraSpellLogic;
public ushort WorldStateExpressionID;
public int WeatherID;
+1 -1
View File
@@ -56,7 +56,7 @@ namespace Game.DataStorage
public sealed class QuestV2Record
{
public uint Id;
public ushort UniqueBitFlag;
public int UniqueBitFlag;
public int UiQuestDetailsTheme;
}
+1 -1
View File
@@ -18,7 +18,7 @@ namespace Game.DataStorage
public uint Id;
public string Description;
public byte TierID;
public byte Flags;
public int Flags;
public byte ColumnIndex;
public ushort TabID;
public sbyte ClassID;
+1 -1
View File
@@ -43,7 +43,7 @@ namespace Game.DataStorage
public ushort IntroSound;
public ushort UwIntroSound;
public ushort AreaTableID;
public byte Flags;
public int Flags;
}
public sealed class WorldEffectRecord
File diff suppressed because it is too large Load Diff
+3 -2
View File
@@ -393,10 +393,11 @@ namespace Game.Entities
if (HasDriveStatus)
{
data.WriteBit(unit.m_movementInfo.driveStatus.Value.accelerating);
data.WriteBit(unit.m_movementInfo.driveStatus.Value.drifting);
data.WriteFloat(unit.m_movementInfo.driveStatus.Value.speed);
data.WriteFloat(unit.m_movementInfo.driveStatus.Value.movementAngle);
data.WriteBit(unit.m_movementInfo.driveStatus.Value.accelerating);
data.WriteBit(unit.m_movementInfo.driveStatus.Value.drifting);
data.FlushBits();
}
data.WriteFloat(unit.GetSpeed(UnitMoveType.Walk));
+1 -1
View File
@@ -546,7 +546,7 @@ namespace Game.Entities
{
RaidDifficultySet raidDifficultySet = new();
raidDifficultySet.DifficultyID = forcedDifficulty == -1 ? (int)(legacy ? GetLegacyRaidDifficultyID() : GetRaidDifficultyID()) : forcedDifficulty;
raidDifficultySet.Legacy = legacy;
raidDifficultySet.Legacy = legacy ? 1 : 0;
SendPacket(raidDifficultySet);
}
+13
View File
@@ -48,9 +48,17 @@ namespace Game
if (packet.DataType >= AccountDataTypes.Max)
return;
UpdateAccountDataComplete updateAccountDataComplete = new();
if (packet.Size == 0)
{
SetAccountData(packet.DataType, 0, "");
updateAccountDataComplete.Player = packet.PlayerGuid;
updateAccountDataComplete.DataType = (int)packet.DataType;
updateAccountDataComplete.Result = 0;
SendPacket(updateAccountDataComplete);
return;
}
@@ -62,6 +70,11 @@ namespace Game
byte[] data = ZLib.Decompress(packet.CompressedData.GetData(), packet.Size);
SetAccountData(packet.DataType, packet.Time, Encoding.Default.GetString(data));
updateAccountDataComplete.Player = packet.PlayerGuid;
updateAccountDataComplete.DataType = (int)packet.DataType;
updateAccountDataComplete.Result = 0;
SendPacket(updateAccountDataComplete);
}
[WorldPacketHandler(ClientOpcodes.SetSelection)]
+19 -2
View File
@@ -3,6 +3,7 @@
using Framework.Constants;
using Framework.Dynamic;
using Game.Entities;
using System;
using System.Collections.Generic;
using System.Numerics;
@@ -37,6 +38,7 @@ namespace Game.Movement
vertical_acceleration = 0.0f;
effect_start_time = 0;
spell_effect_extra = args.spellEffectExtra;
turn = args.turnData;
anim_tier = args.animTier;
splineIsFacingOnly = args.path.Count == 2 && args.facing.type != MonsterMoveType.Normal && ((args.path[1] - args.path[0]).Length() < 0.1f);
@@ -108,6 +110,13 @@ namespace Game.Movement
Log.outError(LogFilter.Unit, "MoveSpline.init_spline: zero length spline, wrong input data?");
spline.Set_length(spline.Last(), spline.IsCyclic() ? 1000 : 1);
}
if (turn != null)
{
float totalTurnTime = (float)(turn.TotalTurnRads / turn.RadsPerSec * (float)Time.InMilliseconds);
spline.Set_length(spline.Last(), MathF.Max(spline.Length(), totalTurnTime));
}
point_Idx = spline.First();
}
@@ -127,18 +136,20 @@ namespace Game.Movement
public int CurrentSplineIdx() { return point_Idx; }
public uint GetId() { return m_Id; }
public bool Finalized() { return splineflags.HasFlag(MoveSplineFlagEnum.Done); }
void _Finalize()
{
splineflags.SetUnsetFlag(MoveSplineFlagEnum.Done);
point_Idx = spline.Last() - 1;
time_passed = Duration();
}
public Vector4 ComputePosition(int time_point, int point_index)
{
float u = 1.0f;
int seg_time = spline.Length(point_index, point_index + 1);
float seg_time = (float)spline.Length(point_index, point_index + 1);
if (seg_time > 0)
u = (time_point - spline.Length(point_index)) / (float)seg_time;
u = MathF.Min((time_point - spline.Length(point_index)) / (float)seg_time, 1.0f);
Vector3 c;
float orientation = initialOrientation;
@@ -157,6 +168,10 @@ namespace Game.Movement
orientation = MathF.Atan2(facing.f.Y - c.Y, facing.f.X - c.X);
//nothing to do for MoveSplineFlag.Final_Target flag
}
else if (splineflags.HasFlag(MoveSplineFlagEnum.Turning))
{
orientation = Position.NormalizeOrientation(turn.StartFacing + (float)time_point / (float)Time.InMilliseconds * turn.RadsPerSec);
}
else
{
if (!splineflags.HasFlag(MoveSplineFlagEnum.OrientationFixed | MoveSplineFlagEnum.Falling | MoveSplineFlagEnum.JumpOrientationFixed))
@@ -340,6 +355,7 @@ namespace Game.Movement
int SegmentTimeElapsed() { return NextTimestamp() - time_passed; }
public bool IsCyclic() { return splineflags.HasFlag(MoveSplineFlagEnum.Cyclic); }
public bool IsFalling() { return splineflags.HasFlag(MoveSplineFlagEnum.Falling); }
public bool IsTurning() { return splineflags.HasFlag(MoveSplineFlagEnum.Turning); }
public bool Initialized() { return !spline.Empty(); }
public Vector3 FinalDestination() { return Initialized() ? spline.GetPoint(spline.Last()) : Vector3.Zero; }
public Vector3 CurrentDestination() { return Initialized() ? spline.GetPoint(point_Idx + 1) : Vector3.Zero; }
@@ -362,6 +378,7 @@ namespace Game.Movement
public int point_Idx_offset;
public float velocity;
public SpellEffectExtraData spell_effect_extra;
public TurnData turn;
public AnimTierTransition anim_tier;
#endregion
+17
View File
@@ -176,6 +176,9 @@ namespace Game.Movement
loc.W = unit.GetOrientation();
}
if (move_spline.IsTurning())
SetFacing(loc.W);
args.flags.Flags = MoveSplineFlagEnum.Done;
unit.m_movementInfo.RemoveMovementFlag(MovementFlag.Forward);
move_spline.onTransport = transport;
@@ -186,6 +189,9 @@ namespace Game.Movement
packet.Pos = new Vector3(loc.X, loc.Y, loc.Z);
packet.SplineData.StopSplineStyle = 2;
packet.SplineData.Id = move_spline.GetId();
packet.SplineData.StopUseFaceDirection = args.facing.type == MonsterMoveType.FacingAngle;
packet.SplineData.Move.Face = args.facing.type;
packet.SplineData.Move.FaceDirection = args.facing.angle;
if (transport)
{
@@ -324,6 +330,17 @@ namespace Game.Movement
args.spellEffectExtra = spellEffectExtraData;
}
public void SetTurning(float startFacing, float totalTurnRads, float radsPerSec)
{
args.flags.SetUnsetFlag(MoveSplineFlagEnum.Turning, true);
TurnData turn = new();
turn.StartFacing = startFacing;
turn.TotalTurnRads = totalTurnRads;
turn.RadsPerSec = radsPerSec;
args.turnData = turn;
}
public List<Vector3> Path() { return args.path; }
public MoveSplineInitArgs args = new();
@@ -37,6 +37,7 @@ namespace Game.Movement
public uint splineId;
public float initialOrientation;
public SpellEffectExtraData spellEffectExtra;
public TurnData turnData;
public AnimTierTransition animTier;
public bool walk;
public bool HasVelocity;
@@ -116,6 +117,14 @@ namespace Game.Movement
public uint ParabolicCurveId;
}
public class TurnData
{
public float StartFacing;
public float TotalTurnRads;
public float RadsPerSec;
}
public class AnimTierTransition
{
public uint TierTransitionId;
@@ -370,8 +370,8 @@ namespace Game.Networking.Packets
class EnterEncryptedMode : ServerPacket
{
byte[] EncryptionKey;
int RegionGroup;
byte[] EncryptionKey;
bool Enabled;
static byte[] expandedPrivateKey;
@@ -404,8 +404,8 @@ namespace Game.Networking.Packets
toSign.Process(BitConverter.GetBytes(Enabled), 1);
toSign.Finish(EnableEncryptionSeed, 16);
_worldPacket.WriteBytes(Ed25519.Sign(toSign.Digest, expandedPrivateKey, 0, EnableEncryptionContext));
_worldPacket.WriteInt32(RegionGroup);
_worldPacket.WriteBytes(Ed25519.Sign(toSign.Digest, expandedPrivateKey, 0, EnableEncryptionContext));
_worldPacket.WriteBit(Enabled);
_worldPacket.FlushBits();
}
@@ -786,18 +786,19 @@ namespace Game.Networking.Packets
public class UndeleteCooldownStatusResponse : ServerPacket
{
public uint MaxCooldown; // Max. cooldown until next free character restoration. Displayed in undelete confirm message. (in sec)
public uint CurrentCooldown; // Current cooldown until next free character restoration. (in sec)
public bool OnCooldown;
public UndeleteCooldownStatusResponse() : base(ServerOpcodes.UndeleteCooldownStatusResponse) { }
public override void Write()
{
_worldPacket.WriteBit(OnCooldown);
_worldPacket.WriteUInt32(MaxCooldown);
_worldPacket.WriteUInt32(CurrentCooldown);
_worldPacket.WriteBit(OnCooldown);
_worldPacket.FlushBits();
}
public bool OnCooldown; //
public uint MaxCooldown; // Max. cooldown until next free character restoration. Displayed in undelete confirm message. (in sec)
public uint CurrentCooldown; // Current cooldown until next free character restoration. (in sec)
}
public class PlayerLogin : ClientPacket
@@ -103,6 +103,22 @@ namespace Game.Networking.Packets
public ByteBuffer CompressedData;
}
class UpdateAccountDataComplete : ServerPacket
{
public ObjectGuid Player;
public int DataType; // @see enum AccountDataType
public int Result;
public UpdateAccountDataComplete() : base(ServerOpcodes.UpdateAccountDataComplete, ConnectionType.Realm) { }
public override void Write()
{
_worldPacket.WritePackedGuid(Player);
_worldPacket.WriteInt32(DataType);
_worldPacket.WriteInt32(Result);
}
}
class SetAdvancedCombatLogging : ClientPacket
{
public SetAdvancedCombatLogging(WorldPacket packet) : base(packet) { }
@@ -320,23 +320,23 @@ namespace Game.Networking.Packets
public class GarrisonBuildingInfo
{
public long TimeBuilt;
public uint GarrPlotInstanceID;
public uint GarrBuildingID;
public uint CurrentGarSpecID;
public long TimeSpecCooldown = 2288912640; // 06/07/1906 18:35:44 - another in the series of magic blizz dates
public bool Active;
public void Write(WorldPacket data)
{
data.WriteInt64(TimeBuilt);
data.WriteUInt32(GarrPlotInstanceID);
data.WriteUInt32(GarrBuildingID);
data.WriteInt64(TimeBuilt);
data.WriteUInt32(CurrentGarSpecID);
data.WriteInt64(TimeSpecCooldown);
data.WriteBit(Active);
data.FlushBits();
}
public uint GarrPlotInstanceID;
public uint GarrBuildingID;
public long TimeBuilt;
public uint CurrentGarSpecID;
public long TimeSpecCooldown = 2288912640; // 06/07/1906 18:35:44 - another in the series of magic blizz dates
public bool Active;
}
public class GarrisonFollower
@@ -843,12 +843,11 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteBit(InGuildParty);
_worldPacket.FlushBits();
_worldPacket.WriteInt32(NumMembers);
_worldPacket.WriteInt32(NumRequired);
_worldPacket.WriteFloat(GuildXPEarnedMult);
_worldPacket.WriteBit(InGuildParty);
_worldPacket.FlushBits();
}
public float GuildXPEarnedMult = 0.0f;
@@ -306,19 +306,6 @@ namespace Game.Networking.Packets
//Structs
public struct InstanceLockPkt
{
public void Write(WorldPacket data)
{
data.WriteUInt32(MapID);
data.WriteUInt32(DifficultyID);
data.WriteUInt64(InstanceID);
data.WriteInt32(TimeRemaining);
data.WriteUInt32(CompletedMask);
data.WriteBit(Locked);
data.WriteBit(Extended);
data.FlushBits();
}
public ulong InstanceID;
public uint MapID;
public uint DifficultyID;
@@ -327,5 +314,18 @@ namespace Game.Networking.Packets
public bool Locked;
public bool Extended;
public void Write(WorldPacket data)
{
data.WriteUInt64(InstanceID);
data.WriteUInt32(MapID);
data.WriteUInt32(DifficultyID);
data.WriteInt32(TimeRemaining);
data.WriteUInt32(CompletedMask);
data.WriteBit(Locked);
data.WriteBit(Extended);
data.FlushBits();
}
}
}
@@ -414,16 +414,16 @@ namespace Game.Networking.Packets
public class SetRaidDifficulty : ClientPacket
{
public int DifficultyID;
public int Legacy;
public SetRaidDifficulty(WorldPacket packet) : base(packet) { }
public override void Read()
{
Legacy = _worldPacket.ReadInt32();
DifficultyID = _worldPacket.ReadInt32();
Legacy = _worldPacket.ReadUInt8();
}
public int DifficultyID;
public byte Legacy;
}
public class DungeonDifficultySet : ServerPacket
@@ -440,16 +440,16 @@ namespace Game.Networking.Packets
public class RaidDifficultySet : ServerPacket
{
public int DifficultyID;
public int Legacy;
public RaidDifficultySet() : base(ServerOpcodes.RaidDifficultySet) { }
public override void Write()
{
_worldPacket.WriteInt32(Legacy);
_worldPacket.WriteInt32(DifficultyID);
_worldPacket.WriteUInt8((byte)(Legacy ? 1 : 0));
}
public int DifficultyID;
public bool Legacy;
}
public class CorpseReclaimDelay : ServerPacket
@@ -140,10 +140,10 @@ namespace Game.Networking.Packets
data.ResetBitPos();
MovementInfo.Drive driveStatus = new();
driveStatus.accelerating = data.HasBit();
driveStatus.drifting = data.HasBit();
driveStatus.speed = data.ReadFloat();
driveStatus.movementAngle = data.ReadFloat();
driveStatus.accelerating = data.HasBit();
driveStatus.drifting = data.HasBit();
movementInfo.driveStatus = driveStatus;
}
@@ -232,10 +232,11 @@ namespace Game.Networking.Packets
if (hasDriveStatus)
{
data.WriteBit(movementInfo.driveStatus.Value.accelerating);
data.WriteBit(movementInfo.driveStatus.Value.drifting);
data.WriteFloat(movementInfo.driveStatus.Value.speed);
data.WriteFloat(movementInfo.driveStatus.Value.movementAngle);
data.WriteBit(movementInfo.driveStatus.Value.accelerating);
data.WriteBit(movementInfo.driveStatus.Value.drifting);
data.FlushBits();
}
}
@@ -270,6 +271,7 @@ namespace Game.Networking.Packets
data.WriteBit(false); // HasSplineFilter
data.WriteBit(moveSpline.spell_effect_extra != null); // HasSpellEffectExtraData
bool hasJumpExtraData = data.WriteBit(moveSpline.splineflags.HasFlag(MoveSplineFlagEnum.Parabolic) && (moveSpline.spell_effect_extra == null || moveSpline.effect_start_time != 0));
data.WriteBit(moveSpline.turn != null); // HasTurnData
data.WriteBit(moveSpline.anim_tier != null); // HasAnimTierTransition
data.WriteBit(false); // HasUnknown901
data.FlushBits();
@@ -321,6 +323,13 @@ namespace Game.Networking.Packets
data.WriteUInt32(0); // Duration (override)
}
if (moveSpline.turn != null)
{
data.WriteFloat(moveSpline.turn.StartFacing);
data.WriteFloat(moveSpline.turn.TotalTurnRads);
data.WriteFloat(moveSpline.turn.RadsPerSec);
}
if (moveSpline.anim_tier != null)
{
data.WriteUInt32(moveSpline.anim_tier.TierTransitionId);
@@ -447,6 +456,15 @@ namespace Game.Networking.Packets
movementSpline.JumpExtraData = jumpExtraData;
}
if (moveSpline.turn != null)
{
MonsterSplineTurnData turn = new();
turn.StartFacing = moveSpline.turn.StartFacing;
turn.TotalTurnRads = moveSpline.turn.TotalTurnRads;
turn.RadsPerSec = moveSpline.turn.RadsPerSec;
movementSpline.TurnData = turn;
}
if (splineFlags.HasFlag(MoveSplineFlagEnum.FadeObject))
movementSpline.FadeObjectTime = (uint)moveSpline.effect_start_time;
@@ -1431,6 +1449,20 @@ namespace Game.Networking.Packets
}
}
public class MonsterSplineTurnData
{
public float StartFacing;
public float TotalTurnRads;
public float RadsPerSec;
public void Write(WorldPacket data)
{
data.WriteFloat(StartFacing);
data.WriteFloat(TotalTurnRads);
data.WriteFloat(RadsPerSec);
}
}
public struct MonsterSplineAnimTierTransition
{
public int TierTransitionID;
@@ -1502,6 +1534,7 @@ namespace Game.Networking.Packets
data.WriteBit(SplineFilter != null);
data.WriteBit(SpellEffectExtraData.HasValue);
data.WriteBit(JumpExtraData.HasValue);
data.WriteBit(TurnData != null);
data.WriteBit(AnimTierTransition.HasValue);
data.WriteBit(Unknown901 != null);
data.FlushBits();
@@ -1535,6 +1568,9 @@ namespace Game.Networking.Packets
if (JumpExtraData.HasValue)
JumpExtraData.Value.Write(data);
if (TurnData != null)
TurnData.Write(data);
if (AnimTierTransition.HasValue)
AnimTierTransition.Value.Write(data);
@@ -1557,6 +1593,7 @@ namespace Game.Networking.Packets
public MonsterSplineFilter SplineFilter;
public MonsterSplineSpellEffectExtraData? SpellEffectExtraData;
public MonsterSplineJumpExtraData? JumpExtraData;
public MonsterSplineTurnData TurnData;
public MonsterSplineAnimTierTransition? AnimTierTransition;
public MonsterSplineUnknown901 Unknown901;
public float FaceDirection;
@@ -1575,6 +1612,7 @@ namespace Game.Networking.Packets
{
data.WriteUInt32(Id);
data.WriteBit(CrzTeleport);
data.WriteBit(StopUseFaceDirection);
data.WriteBits(StopSplineStyle, 3);
Move.Write(data);
@@ -1582,6 +1620,7 @@ namespace Game.Networking.Packets
public uint Id;
public bool CrzTeleport;
public bool StopUseFaceDirection;
public byte StopSplineStyle; // Determines how far from spline destination the mover is allowed to stop in place 0, 0, 3.0, 2.76, numeric_limits<float>::max, 1.1, float(INT_MAX); default before this field existed was distance 3.0 (index 2)
public MovementSpline Move;
}
+10 -10
View File
@@ -609,22 +609,22 @@ namespace Game.Networking.Packets
class SetPartyAssignment : ClientPacket
{
public int Assignment;
public byte? PartyIndex;
public ObjectGuid Target;
public bool Set;
public SetPartyAssignment(WorldPacket packet) : base(packet) { }
public override void Read()
{
bool hasPartyIndex = _worldPacket.HasBit();
Set = _worldPacket.HasBit();
Assignment = _worldPacket.ReadUInt8();
Assignment = _worldPacket.ReadInt32();
Target = _worldPacket.ReadPackedGuid();
if (hasPartyIndex)
PartyIndex = _worldPacket.ReadUInt8();
}
public byte Assignment;
public byte? PartyIndex;
public ObjectGuid Target;
public bool Set;
}
class DoReadyCheck : ClientPacket
@@ -1290,8 +1290,8 @@ namespace Game.Networking.Packets
{
public void Write(WorldPacket data)
{
data.WriteUInt8(MyFlags);
data.WriteUInt32(Slot);
data.WriteUInt8(MyFlags);
data.WriteUInt32(MyRandomSlot);
data.WriteUInt8(MyPartialClear);
data.WriteFloat(MyGearDiff);
@@ -1303,15 +1303,15 @@ namespace Game.Networking.Packets
data.FlushBits();
}
public byte MyFlags;
public uint Slot;
public byte BootCount;
public byte MyFlags;
public uint MyRandomSlot;
public bool Aborted;
public byte MyPartialClear;
public float MyGearDiff;
public byte MyStrangerCount;
public byte MyKickVoteCount;
public byte BootCount;
public bool Aborted;
public bool MyFirstReward;
}
+20 -9
View File
@@ -1464,7 +1464,8 @@ namespace Game.Networking.Packets
var contentTuning = CliDB.ContentTuningStorage.LookupByKey(creatureDifficulty.ContentTuningID);
if (contentTuning != null)
{
ScalingHealthItemLevelCurveID = (uint)contentTuning.HealthItemLevelCurveID;
ScalingHealthItemLevelCurveID = contentTuning.HealthItemLevelCurveID;
ScalingHealthPrimaryStatCurveID = contentTuning.HealthPrimaryStatCurveID;
TargetContentTuningID = contentTuning.Id;
}
TargetLevel = (byte)target.GetLevel();
@@ -1484,7 +1485,8 @@ namespace Game.Networking.Packets
var contentTuning = CliDB.ContentTuningStorage.LookupByKey(creatureDifficulty.ContentTuningID);
if (contentTuning != null)
{
ScalingHealthItemLevelCurveID = (uint)contentTuning.HealthItemLevelCurveID;
ScalingHealthItemLevelCurveID = contentTuning.HealthItemLevelCurveID;
ScalingHealthPrimaryStatCurveID = contentTuning.HealthPrimaryStatCurveID;
TargetContentTuningID = contentTuning.Id;
}
TargetLevel = (byte)target.GetLevel();
@@ -1549,14 +1551,17 @@ namespace Game.Networking.Packets
data.WriteFloat(PlayerItemLevel);
data.WriteFloat(TargetItemLevel);
data.WriteInt16(PlayerLevelDelta);
data.WriteUInt32(ScalingHealthItemLevelCurveID);
data.WriteInt32(ScalingHealthItemLevelCurveID);
data.WriteInt32(Unused1117);
data.WriteInt32(ScalingHealthPrimaryStatCurveID);
data.WriteUInt8(TargetLevel);
data.WriteUInt8(Expansion);
data.WriteInt8(TargetScalingLevelDelta);
data.WriteUInt32((uint)Flags);
data.WriteUInt32(PlayerContentTuningID);
data.WriteUInt32(TargetContentTuningID);
data.WriteInt32(Unused927);
data.WriteInt32(TargetHealingContentTuningID);
data.WriteFloat(PlayerPrimaryStatToExpectedRatio);
data.WriteBits(TuningType, 4);
data.FlushBits();
}
@@ -1565,22 +1570,28 @@ namespace Game.Networking.Packets
public short PlayerLevelDelta;
public float PlayerItemLevel;
public float TargetItemLevel;
public uint ScalingHealthItemLevelCurveID;
public int ScalingHealthItemLevelCurveID = 0;
public int Unused1117 = 0;
public int ScalingHealthPrimaryStatCurveID = 0;
public byte TargetLevel;
public byte Expansion;
public sbyte TargetScalingLevelDelta;
public ContentTuningFlags Flags = ContentTuningFlags.NoLevelScaling | ContentTuningFlags.NoItemLevelScaling;
public uint PlayerContentTuningID;
public uint TargetContentTuningID;
public int Unused927;
public int TargetHealingContentTuningID = 0; // direct heal only, not periodic
public float PlayerPrimaryStatToExpectedRatio = 1.0f;
public enum ContentTuningType
{
CreatureToPlayerDamage = 1,
PlayerToCreatureDamage = 2,
CreatureToCreatureDamage = 4,
PlayerToSandboxScaling = 7, // NYI
PlayerToPlayerExpectedStat = 8
CreatureToPlayerHealing = 3,
PlayerToCreatureHealing = 4,
CreatureToCreatureDamage = 5,
CreatureToCreatureHealing = 6,
PlayerToPlayerDamage = 7, // Nyi
PlayerToPlayerHealing = 8,
}
public enum ContentTuningFlags
+37 -25
View File
@@ -114,34 +114,12 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(LobbyMatchmakerQueueFromMainlineEnabled);
_worldPacket.WriteBit(CanSendLobbyMatchmakerPartyCustomizations);
_worldPacket.WriteBit(AddonProfilerEnabled);
_worldPacket.WriteBit(false); // unused 11.1.7
_worldPacket.WriteBit(false); // unused 11.1.7
_worldPacket.FlushBits();
{
_worldPacket.WriteBit(QuickJoinConfig.ToastsDisabled);
_worldPacket.WriteFloat(QuickJoinConfig.ToastDuration);
_worldPacket.WriteFloat(QuickJoinConfig.DelayDuration);
_worldPacket.WriteFloat(QuickJoinConfig.QueueMultiplier);
_worldPacket.WriteFloat(QuickJoinConfig.PlayerMultiplier);
_worldPacket.WriteFloat(QuickJoinConfig.PlayerFriendValue);
_worldPacket.WriteFloat(QuickJoinConfig.PlayerGuildValue);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleInitialThreshold);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleDecayTime);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottlePrioritySpike);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleMinThreshold);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottlePvPPriorityNormal);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottlePvPPriorityLow);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottlePvPHonorThreshold);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleLfgListPriorityDefault);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleLfgListPriorityAbove);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleLfgListPriorityBelow);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleLfgListIlvlScalingAbove);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleLfgListIlvlScalingBelow);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleRfPriorityAbove);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleRfIlvlScalingAbove);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleDfMaxItemLevel);
_worldPacket.WriteFloat(QuickJoinConfig.ThrottleDfBestPriority);
}
QuickJoinConfig.Write(_worldPacket);
if (SessionAlert.HasValue)
{
@@ -268,6 +246,34 @@ namespace Game.Networking.Packets
public float ThrottleRfIlvlScalingAbove;
public float ThrottleDfMaxItemLevel;
public float ThrottleDfBestPriority;
public void Write(WorldPacket data)
{
data.WriteFloat(ToastDuration);
data.WriteFloat(DelayDuration);
data.WriteFloat(QueueMultiplier);
data.WriteFloat(PlayerMultiplier);
data.WriteFloat(PlayerFriendValue);
data.WriteFloat(PlayerGuildValue);
data.WriteFloat(ThrottleInitialThreshold);
data.WriteFloat(ThrottleDecayTime);
data.WriteFloat(ThrottlePrioritySpike);
data.WriteFloat(ThrottleMinThreshold);
data.WriteFloat(ThrottlePvPPriorityNormal);
data.WriteFloat(ThrottlePvPPriorityLow);
data.WriteFloat(ThrottlePvPHonorThreshold);
data.WriteFloat(ThrottleLfgListPriorityDefault);
data.WriteFloat(ThrottleLfgListPriorityAbove);
data.WriteFloat(ThrottleLfgListPriorityBelow);
data.WriteFloat(ThrottleLfgListIlvlScalingAbove);
data.WriteFloat(ThrottleLfgListIlvlScalingBelow);
data.WriteFloat(ThrottleRfPriorityAbove);
data.WriteFloat(ThrottleRfIlvlScalingAbove);
data.WriteFloat(ThrottleDfMaxItemLevel);
data.WriteFloat(ThrottleDfBestPriority);
data.WriteBit(ToastsDisabled);
data.FlushBits();
}
}
public struct SquelchInfo
@@ -339,6 +345,10 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(BNSendGameDataUseV2Services);
_worldPacket.WriteBit(CharacterSelectListModeRealmless);
_worldPacket.WriteBit(WowTokenLimitedMode);
_worldPacket.WriteBit(false); // unused 11.1.7
_worldPacket.WriteBit(false); // unused 11.1.7
_worldPacket.WriteBit(PandarenLevelBoostAllowed);
_worldPacket.FlushBits();
@@ -411,6 +421,8 @@ namespace Game.Networking.Packets
public bool BNSendWhisperUseV2Services = true; ///< BNSendWhisper will send to v2.WhisperService instead of v1.NotificationService
public bool BNSendGameDataUseV2Services = true; ///< BNSendGameData will send to v2.NotificationService instead of v1.NotificationService
public bool CharacterSelectListModeRealmless;
public bool WowTokenLimitedMode; // classic only
public bool PandarenLevelBoostAllowed; // classic only
public EuropaTicketConfig? EuropaTicketSystemStatus;
public List<int> LiveRegionCharacterCopySourceRegions = new();
public uint CommercePricePollTimeSeconds; // NYI
+19
View File
@@ -4384,6 +4384,13 @@ namespace Game.Entities
});
});
// Flame Spout
ApplySpellFix([ 114685 ], spellInfo =>
{
spellInfo.AttributesEx |= SpellAttr1.NoThreat;
spellInfo.AttributesEx8 |= SpellAttr8.CanAttackImmunePC;
});
// END OF THE WANDERING ISLE SPELLS
//
@@ -4684,6 +4691,18 @@ namespace Game.Entities
spellInfo._LoadSqrtTargetLimit(5, 0, null, 4, null, null);
});
// Keg Smash
ApplySpellFix([ 121253 ], spellInfo =>
{
spellInfo._LoadSqrtTargetLimit(5, 0, null, 6, null, null);
});
// Odyn's Fury
ApplySpellFix([ 385060, 385061, 385062 ], spellInfo =>
{
spellInfo._LoadSqrtTargetLimit(5, 0, 385059, 5, null, null);
});
Log.outInfo(LogFilter.ServerLoading, $"Loaded SpellInfo target caps in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
}