Core: Updated to 11.1.7
Port From (https://github.com/TrinityCore/TrinityCore/commit/ceb8d561b44579118b109a9ff71ba415df53bbdc)
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace Game.DataStorage
|
||||
public sealed class QuestV2Record
|
||||
{
|
||||
public uint Id;
|
||||
public ushort UniqueBitFlag;
|
||||
public int UniqueBitFlag;
|
||||
public int UiQuestDetailsTheme;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user