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,
|
CommandPetLevel = 838,
|
||||||
CommandServerShutdownForce = 839,
|
CommandServerShutdownForce = 839,
|
||||||
CommandServerRestartForce = 840,
|
CommandServerRestartForce = 840,
|
||||||
CommandNearGraveyard = 841,
|
// 841 previously used, do not reuse
|
||||||
CommandReloadCharacterTemplate = 842,
|
CommandReloadCharacterTemplate = 842,
|
||||||
CommandReloadQuestGreeting = 843,
|
CommandReloadQuestGreeting = 843,
|
||||||
CommandScene = 844,
|
CommandScene = 844,
|
||||||
|
|||||||
@@ -1106,6 +1106,12 @@ namespace Framework.Constants
|
|||||||
ForceMaxQuantityOnConversion = 0x100, // NYI
|
ForceMaxQuantityOnConversion = 0x100, // NYI
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum BattlemasterType
|
||||||
|
{
|
||||||
|
Battleground = 0,
|
||||||
|
Arena = 1,
|
||||||
|
}
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
public enum BattlemasterListFlags : int
|
public enum BattlemasterListFlags : int
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ namespace Framework.Constants
|
|||||||
Catmullrom = 0x00000800, // Used Catmullrom interpolation mode
|
Catmullrom = 0x00000800, // Used Catmullrom interpolation mode
|
||||||
Cyclic = 0x00001000, // Movement by cycled spline
|
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
|
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,
|
TransportEnter = 0x00008000,
|
||||||
TransportExit = 0x00010000,
|
TransportExit = 0x00010000,
|
||||||
Unknown_0x20000 = 0x00020000, // NOT VERIFIED
|
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
|
// flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably
|
||||||
MaskNoMonsterMove = Done,
|
MaskNoMonsterMove = Done,
|
||||||
// Unused, not suported flags
|
// 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
|
| 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,
|
Inventory = 0x02,
|
||||||
Bank = 0x04,
|
Bank = 0x04,
|
||||||
ReagentBank = 0x08,
|
ReagentBank = 0x08,
|
||||||
|
AccountBank = 0x10, // NYI
|
||||||
|
|
||||||
Default = Equipment | Inventory,
|
Default = Equipment | Inventory,
|
||||||
Everywhere = Equipment | Inventory | Bank | ReagentBank
|
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) = ?");
|
" WHERE (`VerifiedBuild` > 0) = ?");
|
||||||
|
|
||||||
// BattlemasterList.db2
|
// 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" +
|
"RatedPlayers, MinPlayers, MaxPlayers, GroupsAllowed, MaxGroupSize, HolidayWorldState, Flags, IconFileDataID, RequiredPlayerConditionID" +
|
||||||
" FROM battlemaster_list WHERE (`VerifiedBuild` > 0) = ?");
|
" FROM battlemaster_list WHERE (`VerifiedBuild` > 0) = ?");
|
||||||
PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE, "SELECT ID, Name_lang, GameType_lang, ShortDescription_lang, LongDescription_lang" +
|
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) = ?");
|
" FROM conditional_content_tuning WHERE (`VerifiedBuild` > 0) = ?");
|
||||||
|
|
||||||
// ContentTuning.db2
|
// ContentTuning.db2
|
||||||
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, HealthItemLevelCurveID, DamageItemLevelCurveID, MinLevel, MaxLevel, " +
|
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, HealthItemLevelCurveID, DamageItemLevelCurveID, " +
|
||||||
"MinLevelType, MaxLevelType, TargetLevelDelta, TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel, QuestXpMultiplier" +
|
"HealthPrimaryStatCurveID, DamagePrimaryStatCurveID, MinLevel, MaxLevel, MinLevelType, MaxLevelType, TargetLevelDelta, TargetLevelMaxDelta, " +
|
||||||
" FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?");
|
"TargetLevelMin, TargetLevelMax, MinItemLevel, QuestXpMultiplier FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?");
|
||||||
|
|
||||||
// ContentTuningXExpected.db2
|
// ContentTuningXExpected.db2
|
||||||
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MinMythicPlusSeasonID, MaxMythicPlusSeasonID, " +
|
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MinMythicPlusSeasonID, MaxMythicPlusSeasonID, " +
|
||||||
|
|||||||
@@ -461,13 +461,13 @@ namespace Game.BattleGrounds
|
|||||||
switch ((BattlegroundQueueIdType)bgQueueTypeId.BgType)
|
switch ((BattlegroundQueueIdType)bgQueueTypeId.BgType)
|
||||||
{
|
{
|
||||||
case BattlegroundQueueIdType.Battleground:
|
case BattlegroundQueueIdType.Battleground:
|
||||||
if (battlemasterList.InstanceType != (int)MapTypes.Battleground)
|
if (battlemasterList.GetPvpType() != BattlemasterType.Battleground)
|
||||||
return false;
|
return false;
|
||||||
if (bgQueueTypeId.TeamSize != 0)
|
if (bgQueueTypeId.TeamSize != 0)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case BattlegroundQueueIdType.Arena:
|
case BattlegroundQueueIdType.Arena:
|
||||||
if (battlemasterList.InstanceType != (int)MapTypes.Arena)
|
if (battlemasterList.GetPvpType() != BattlemasterType.Arena)
|
||||||
return false;
|
return false;
|
||||||
if (!bgQueueTypeId.Rated)
|
if (!bgQueueTypeId.Rated)
|
||||||
return false;
|
return false;
|
||||||
@@ -479,7 +479,7 @@ namespace Game.BattleGrounds
|
|||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case BattlegroundQueueIdType.ArenaSkirmish:
|
case BattlegroundQueueIdType.ArenaSkirmish:
|
||||||
if (battlemasterList.InstanceType != (int)MapTypes.Arena)
|
if (battlemasterList.GetPvpType() != BattlemasterType.Arena)
|
||||||
return false;
|
return false;
|
||||||
if (!bgQueueTypeId.Rated)
|
if (!bgQueueTypeId.Rated)
|
||||||
return false;
|
return false;
|
||||||
@@ -785,7 +785,7 @@ namespace Game.BattleGrounds
|
|||||||
public BattlemasterListRecord BattlemasterEntry;
|
public BattlemasterListRecord BattlemasterEntry;
|
||||||
public List<int> MapIDs = new();
|
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()
|
public ushort GetMinPlayersPerTeam()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2145,7 +2145,29 @@ namespace Game
|
|||||||
for (var i = 0; i < condition.ItemID.Length; ++i)
|
for (var i = 0; i < condition.ItemID.Length; ++i)
|
||||||
{
|
{
|
||||||
if (condition.ItemID[i] != 0)
|
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))
|
if (!PlayerConditionLogic(condition.ItemLogic, results))
|
||||||
|
|||||||
@@ -1944,7 +1944,7 @@ namespace Game.DataStorage
|
|||||||
if (v2 == null)
|
if (v2 == null)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return v2.UniqueBitFlag;
|
return (uint)v2.UniqueBitFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<uint> GetPhasesForGroup(uint group)
|
public List<uint> GetPhasesForGroup(uint group)
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ namespace Game.DataStorage
|
|||||||
public string GameType;
|
public string GameType;
|
||||||
public string ShortDescription;
|
public string ShortDescription;
|
||||||
public string LongDescription;
|
public string LongDescription;
|
||||||
public sbyte InstanceType;
|
public int PvpType;
|
||||||
public byte MinLevel;
|
public byte MinLevel;
|
||||||
public byte MaxLevel;
|
public byte MaxLevel;
|
||||||
public sbyte RatedPlayers;
|
public sbyte RatedPlayers;
|
||||||
@@ -93,6 +93,7 @@ namespace Game.DataStorage
|
|||||||
public int IconFileDataID;
|
public int IconFileDataID;
|
||||||
public int RequiredPlayerConditionID;
|
public int RequiredPlayerConditionID;
|
||||||
|
|
||||||
|
public BattlemasterType GetPvpType() { return (BattlemasterType)PvpType; }
|
||||||
public bool HasFlag(BattlemasterListFlags battlemasterListFlags) { return (Flags & (int)battlemasterListFlags) != 0; }
|
public bool HasFlag(BattlemasterListFlags battlemasterListFlags) { return (Flags & (int)battlemasterListFlags) != 0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -387,6 +387,8 @@ namespace Game.DataStorage
|
|||||||
public int ExpansionID;
|
public int ExpansionID;
|
||||||
public int HealthItemLevelCurveID;
|
public int HealthItemLevelCurveID;
|
||||||
public int DamageItemLevelCurveID;
|
public int DamageItemLevelCurveID;
|
||||||
|
public int HealthPrimaryStatCurveID;
|
||||||
|
public int DamagePrimaryStatCurveID;
|
||||||
public int MinLevel;
|
public int MinLevel;
|
||||||
public int MaxLevel;
|
public int MaxLevel;
|
||||||
public int MinLevelType;
|
public int MinLevelType;
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ namespace Game.DataStorage
|
|||||||
public uint CurrentCompletedQuestLogic;
|
public uint CurrentCompletedQuestLogic;
|
||||||
public uint SpellLogic;
|
public uint SpellLogic;
|
||||||
public uint ItemLogic;
|
public uint ItemLogic;
|
||||||
public byte ItemFlags;
|
public int ItemFlags;
|
||||||
public uint AuraSpellLogic;
|
public uint AuraSpellLogic;
|
||||||
public ushort WorldStateExpressionID;
|
public ushort WorldStateExpressionID;
|
||||||
public int WeatherID;
|
public int WeatherID;
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ namespace Game.DataStorage
|
|||||||
public sealed class QuestV2Record
|
public sealed class QuestV2Record
|
||||||
{
|
{
|
||||||
public uint Id;
|
public uint Id;
|
||||||
public ushort UniqueBitFlag;
|
public int UniqueBitFlag;
|
||||||
public int UiQuestDetailsTheme;
|
public int UiQuestDetailsTheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ namespace Game.DataStorage
|
|||||||
public uint Id;
|
public uint Id;
|
||||||
public string Description;
|
public string Description;
|
||||||
public byte TierID;
|
public byte TierID;
|
||||||
public byte Flags;
|
public int Flags;
|
||||||
public byte ColumnIndex;
|
public byte ColumnIndex;
|
||||||
public ushort TabID;
|
public ushort TabID;
|
||||||
public sbyte ClassID;
|
public sbyte ClassID;
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ namespace Game.DataStorage
|
|||||||
public ushort IntroSound;
|
public ushort IntroSound;
|
||||||
public ushort UwIntroSound;
|
public ushort UwIntroSound;
|
||||||
public ushort AreaTableID;
|
public ushort AreaTableID;
|
||||||
public byte Flags;
|
public int Flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class WorldEffectRecord
|
public sealed class WorldEffectRecord
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -393,10 +393,11 @@ namespace Game.Entities
|
|||||||
|
|
||||||
if (HasDriveStatus)
|
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.speed);
|
||||||
data.WriteFloat(unit.m_movementInfo.driveStatus.Value.movementAngle);
|
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));
|
data.WriteFloat(unit.GetSpeed(UnitMoveType.Walk));
|
||||||
|
|||||||
@@ -546,7 +546,7 @@ namespace Game.Entities
|
|||||||
{
|
{
|
||||||
RaidDifficultySet raidDifficultySet = new();
|
RaidDifficultySet raidDifficultySet = new();
|
||||||
raidDifficultySet.DifficultyID = forcedDifficulty == -1 ? (int)(legacy ? GetLegacyRaidDifficultyID() : GetRaidDifficultyID()) : forcedDifficulty;
|
raidDifficultySet.DifficultyID = forcedDifficulty == -1 ? (int)(legacy ? GetLegacyRaidDifficultyID() : GetRaidDifficultyID()) : forcedDifficulty;
|
||||||
raidDifficultySet.Legacy = legacy;
|
raidDifficultySet.Legacy = legacy ? 1 : 0;
|
||||||
SendPacket(raidDifficultySet);
|
SendPacket(raidDifficultySet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,9 +48,17 @@ namespace Game
|
|||||||
if (packet.DataType >= AccountDataTypes.Max)
|
if (packet.DataType >= AccountDataTypes.Max)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
UpdateAccountDataComplete updateAccountDataComplete = new();
|
||||||
|
|
||||||
if (packet.Size == 0)
|
if (packet.Size == 0)
|
||||||
{
|
{
|
||||||
SetAccountData(packet.DataType, 0, "");
|
SetAccountData(packet.DataType, 0, "");
|
||||||
|
|
||||||
|
updateAccountDataComplete.Player = packet.PlayerGuid;
|
||||||
|
updateAccountDataComplete.DataType = (int)packet.DataType;
|
||||||
|
updateAccountDataComplete.Result = 0;
|
||||||
|
SendPacket(updateAccountDataComplete);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,6 +70,11 @@ namespace Game
|
|||||||
|
|
||||||
byte[] data = ZLib.Decompress(packet.CompressedData.GetData(), packet.Size);
|
byte[] data = ZLib.Decompress(packet.CompressedData.GetData(), packet.Size);
|
||||||
SetAccountData(packet.DataType, packet.Time, Encoding.Default.GetString(data));
|
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)]
|
[WorldPacketHandler(ClientOpcodes.SetSelection)]
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using Framework.Constants;
|
using Framework.Constants;
|
||||||
using Framework.Dynamic;
|
using Framework.Dynamic;
|
||||||
|
using Game.Entities;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
@@ -37,6 +38,7 @@ namespace Game.Movement
|
|||||||
vertical_acceleration = 0.0f;
|
vertical_acceleration = 0.0f;
|
||||||
effect_start_time = 0;
|
effect_start_time = 0;
|
||||||
spell_effect_extra = args.spellEffectExtra;
|
spell_effect_extra = args.spellEffectExtra;
|
||||||
|
turn = args.turnData;
|
||||||
anim_tier = args.animTier;
|
anim_tier = args.animTier;
|
||||||
splineIsFacingOnly = args.path.Count == 2 && args.facing.type != MonsterMoveType.Normal && ((args.path[1] - args.path[0]).Length() < 0.1f);
|
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?");
|
Log.outError(LogFilter.Unit, "MoveSpline.init_spline: zero length spline, wrong input data?");
|
||||||
spline.Set_length(spline.Last(), spline.IsCyclic() ? 1000 : 1);
|
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();
|
point_Idx = spline.First();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,18 +136,20 @@ namespace Game.Movement
|
|||||||
public int CurrentSplineIdx() { return point_Idx; }
|
public int CurrentSplineIdx() { return point_Idx; }
|
||||||
public uint GetId() { return m_Id; }
|
public uint GetId() { return m_Id; }
|
||||||
public bool Finalized() { return splineflags.HasFlag(MoveSplineFlagEnum.Done); }
|
public bool Finalized() { return splineflags.HasFlag(MoveSplineFlagEnum.Done); }
|
||||||
|
|
||||||
void _Finalize()
|
void _Finalize()
|
||||||
{
|
{
|
||||||
splineflags.SetUnsetFlag(MoveSplineFlagEnum.Done);
|
splineflags.SetUnsetFlag(MoveSplineFlagEnum.Done);
|
||||||
point_Idx = spline.Last() - 1;
|
point_Idx = spline.Last() - 1;
|
||||||
time_passed = Duration();
|
time_passed = Duration();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector4 ComputePosition(int time_point, int point_index)
|
public Vector4 ComputePosition(int time_point, int point_index)
|
||||||
{
|
{
|
||||||
float u = 1.0f;
|
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)
|
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;
|
Vector3 c;
|
||||||
float orientation = initialOrientation;
|
float orientation = initialOrientation;
|
||||||
@@ -157,6 +168,10 @@ namespace Game.Movement
|
|||||||
orientation = MathF.Atan2(facing.f.Y - c.Y, facing.f.X - c.X);
|
orientation = MathF.Atan2(facing.f.Y - c.Y, facing.f.X - c.X);
|
||||||
//nothing to do for MoveSplineFlag.Final_Target flag
|
//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
|
else
|
||||||
{
|
{
|
||||||
if (!splineflags.HasFlag(MoveSplineFlagEnum.OrientationFixed | MoveSplineFlagEnum.Falling | MoveSplineFlagEnum.JumpOrientationFixed))
|
if (!splineflags.HasFlag(MoveSplineFlagEnum.OrientationFixed | MoveSplineFlagEnum.Falling | MoveSplineFlagEnum.JumpOrientationFixed))
|
||||||
@@ -340,6 +355,7 @@ namespace Game.Movement
|
|||||||
int SegmentTimeElapsed() { return NextTimestamp() - time_passed; }
|
int SegmentTimeElapsed() { return NextTimestamp() - time_passed; }
|
||||||
public bool IsCyclic() { return splineflags.HasFlag(MoveSplineFlagEnum.Cyclic); }
|
public bool IsCyclic() { return splineflags.HasFlag(MoveSplineFlagEnum.Cyclic); }
|
||||||
public bool IsFalling() { return splineflags.HasFlag(MoveSplineFlagEnum.Falling); }
|
public bool IsFalling() { return splineflags.HasFlag(MoveSplineFlagEnum.Falling); }
|
||||||
|
public bool IsTurning() { return splineflags.HasFlag(MoveSplineFlagEnum.Turning); }
|
||||||
public bool Initialized() { return !spline.Empty(); }
|
public bool Initialized() { return !spline.Empty(); }
|
||||||
public Vector3 FinalDestination() { return Initialized() ? spline.GetPoint(spline.Last()) : Vector3.Zero; }
|
public Vector3 FinalDestination() { return Initialized() ? spline.GetPoint(spline.Last()) : Vector3.Zero; }
|
||||||
public Vector3 CurrentDestination() { return Initialized() ? spline.GetPoint(point_Idx + 1) : 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 int point_Idx_offset;
|
||||||
public float velocity;
|
public float velocity;
|
||||||
public SpellEffectExtraData spell_effect_extra;
|
public SpellEffectExtraData spell_effect_extra;
|
||||||
|
public TurnData turn;
|
||||||
public AnimTierTransition anim_tier;
|
public AnimTierTransition anim_tier;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@@ -176,6 +176,9 @@ namespace Game.Movement
|
|||||||
loc.W = unit.GetOrientation();
|
loc.W = unit.GetOrientation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (move_spline.IsTurning())
|
||||||
|
SetFacing(loc.W);
|
||||||
|
|
||||||
args.flags.Flags = MoveSplineFlagEnum.Done;
|
args.flags.Flags = MoveSplineFlagEnum.Done;
|
||||||
unit.m_movementInfo.RemoveMovementFlag(MovementFlag.Forward);
|
unit.m_movementInfo.RemoveMovementFlag(MovementFlag.Forward);
|
||||||
move_spline.onTransport = transport;
|
move_spline.onTransport = transport;
|
||||||
@@ -186,6 +189,9 @@ namespace Game.Movement
|
|||||||
packet.Pos = new Vector3(loc.X, loc.Y, loc.Z);
|
packet.Pos = new Vector3(loc.X, loc.Y, loc.Z);
|
||||||
packet.SplineData.StopSplineStyle = 2;
|
packet.SplineData.StopSplineStyle = 2;
|
||||||
packet.SplineData.Id = move_spline.GetId();
|
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)
|
if (transport)
|
||||||
{
|
{
|
||||||
@@ -324,6 +330,17 @@ namespace Game.Movement
|
|||||||
args.spellEffectExtra = spellEffectExtraData;
|
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 List<Vector3> Path() { return args.path; }
|
||||||
|
|
||||||
public MoveSplineInitArgs args = new();
|
public MoveSplineInitArgs args = new();
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ namespace Game.Movement
|
|||||||
public uint splineId;
|
public uint splineId;
|
||||||
public float initialOrientation;
|
public float initialOrientation;
|
||||||
public SpellEffectExtraData spellEffectExtra;
|
public SpellEffectExtraData spellEffectExtra;
|
||||||
|
public TurnData turnData;
|
||||||
public AnimTierTransition animTier;
|
public AnimTierTransition animTier;
|
||||||
public bool walk;
|
public bool walk;
|
||||||
public bool HasVelocity;
|
public bool HasVelocity;
|
||||||
@@ -116,6 +117,14 @@ namespace Game.Movement
|
|||||||
public uint ParabolicCurveId;
|
public uint ParabolicCurveId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TurnData
|
||||||
|
{
|
||||||
|
public float StartFacing;
|
||||||
|
public float TotalTurnRads;
|
||||||
|
public float RadsPerSec;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public class AnimTierTransition
|
public class AnimTierTransition
|
||||||
{
|
{
|
||||||
public uint TierTransitionId;
|
public uint TierTransitionId;
|
||||||
|
|||||||
@@ -370,8 +370,8 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
class EnterEncryptedMode : ServerPacket
|
class EnterEncryptedMode : ServerPacket
|
||||||
{
|
{
|
||||||
byte[] EncryptionKey;
|
|
||||||
int RegionGroup;
|
int RegionGroup;
|
||||||
|
byte[] EncryptionKey;
|
||||||
bool Enabled;
|
bool Enabled;
|
||||||
static byte[] expandedPrivateKey;
|
static byte[] expandedPrivateKey;
|
||||||
|
|
||||||
@@ -404,8 +404,8 @@ namespace Game.Networking.Packets
|
|||||||
toSign.Process(BitConverter.GetBytes(Enabled), 1);
|
toSign.Process(BitConverter.GetBytes(Enabled), 1);
|
||||||
toSign.Finish(EnableEncryptionSeed, 16);
|
toSign.Finish(EnableEncryptionSeed, 16);
|
||||||
|
|
||||||
_worldPacket.WriteBytes(Ed25519.Sign(toSign.Digest, expandedPrivateKey, 0, EnableEncryptionContext));
|
|
||||||
_worldPacket.WriteInt32(RegionGroup);
|
_worldPacket.WriteInt32(RegionGroup);
|
||||||
|
_worldPacket.WriteBytes(Ed25519.Sign(toSign.Digest, expandedPrivateKey, 0, EnableEncryptionContext));
|
||||||
_worldPacket.WriteBit(Enabled);
|
_worldPacket.WriteBit(Enabled);
|
||||||
_worldPacket.FlushBits();
|
_worldPacket.FlushBits();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -786,18 +786,19 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public class UndeleteCooldownStatusResponse : ServerPacket
|
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 UndeleteCooldownStatusResponse() : base(ServerOpcodes.UndeleteCooldownStatusResponse) { }
|
||||||
|
|
||||||
public override void Write()
|
public override void Write()
|
||||||
{
|
{
|
||||||
_worldPacket.WriteBit(OnCooldown);
|
|
||||||
_worldPacket.WriteUInt32(MaxCooldown);
|
_worldPacket.WriteUInt32(MaxCooldown);
|
||||||
_worldPacket.WriteUInt32(CurrentCooldown);
|
_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
|
public class PlayerLogin : ClientPacket
|
||||||
|
|||||||
@@ -103,6 +103,22 @@ namespace Game.Networking.Packets
|
|||||||
public ByteBuffer CompressedData;
|
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
|
class SetAdvancedCombatLogging : ClientPacket
|
||||||
{
|
{
|
||||||
public SetAdvancedCombatLogging(WorldPacket packet) : base(packet) { }
|
public SetAdvancedCombatLogging(WorldPacket packet) : base(packet) { }
|
||||||
|
|||||||
@@ -320,23 +320,23 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public class GarrisonBuildingInfo
|
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)
|
public void Write(WorldPacket data)
|
||||||
{
|
{
|
||||||
|
data.WriteInt64(TimeBuilt);
|
||||||
data.WriteUInt32(GarrPlotInstanceID);
|
data.WriteUInt32(GarrPlotInstanceID);
|
||||||
data.WriteUInt32(GarrBuildingID);
|
data.WriteUInt32(GarrBuildingID);
|
||||||
data.WriteInt64(TimeBuilt);
|
|
||||||
data.WriteUInt32(CurrentGarSpecID);
|
data.WriteUInt32(CurrentGarSpecID);
|
||||||
data.WriteInt64(TimeSpecCooldown);
|
data.WriteInt64(TimeSpecCooldown);
|
||||||
data.WriteBit(Active);
|
data.WriteBit(Active);
|
||||||
data.FlushBits();
|
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
|
public class GarrisonFollower
|
||||||
|
|||||||
@@ -843,12 +843,11 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public override void Write()
|
public override void Write()
|
||||||
{
|
{
|
||||||
_worldPacket.WriteBit(InGuildParty);
|
|
||||||
_worldPacket.FlushBits();
|
|
||||||
|
|
||||||
_worldPacket.WriteInt32(NumMembers);
|
_worldPacket.WriteInt32(NumMembers);
|
||||||
_worldPacket.WriteInt32(NumRequired);
|
_worldPacket.WriteInt32(NumRequired);
|
||||||
_worldPacket.WriteFloat(GuildXPEarnedMult);
|
_worldPacket.WriteFloat(GuildXPEarnedMult);
|
||||||
|
_worldPacket.WriteBit(InGuildParty);
|
||||||
|
_worldPacket.FlushBits();
|
||||||
}
|
}
|
||||||
|
|
||||||
public float GuildXPEarnedMult = 0.0f;
|
public float GuildXPEarnedMult = 0.0f;
|
||||||
|
|||||||
@@ -306,19 +306,6 @@ namespace Game.Networking.Packets
|
|||||||
//Structs
|
//Structs
|
||||||
public struct InstanceLockPkt
|
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 ulong InstanceID;
|
||||||
public uint MapID;
|
public uint MapID;
|
||||||
public uint DifficultyID;
|
public uint DifficultyID;
|
||||||
@@ -327,5 +314,18 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public bool Locked;
|
public bool Locked;
|
||||||
public bool Extended;
|
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 class SetRaidDifficulty : ClientPacket
|
||||||
{
|
{
|
||||||
|
public int DifficultyID;
|
||||||
|
public int Legacy;
|
||||||
|
|
||||||
public SetRaidDifficulty(WorldPacket packet) : base(packet) { }
|
public SetRaidDifficulty(WorldPacket packet) : base(packet) { }
|
||||||
|
|
||||||
public override void Read()
|
public override void Read()
|
||||||
{
|
{
|
||||||
|
Legacy = _worldPacket.ReadInt32();
|
||||||
DifficultyID = _worldPacket.ReadInt32();
|
DifficultyID = _worldPacket.ReadInt32();
|
||||||
Legacy = _worldPacket.ReadUInt8();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int DifficultyID;
|
|
||||||
public byte Legacy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DungeonDifficultySet : ServerPacket
|
public class DungeonDifficultySet : ServerPacket
|
||||||
@@ -440,16 +440,16 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public class RaidDifficultySet : ServerPacket
|
public class RaidDifficultySet : ServerPacket
|
||||||
{
|
{
|
||||||
|
public int DifficultyID;
|
||||||
|
public int Legacy;
|
||||||
|
|
||||||
public RaidDifficultySet() : base(ServerOpcodes.RaidDifficultySet) { }
|
public RaidDifficultySet() : base(ServerOpcodes.RaidDifficultySet) { }
|
||||||
|
|
||||||
public override void Write()
|
public override void Write()
|
||||||
{
|
{
|
||||||
|
_worldPacket.WriteInt32(Legacy);
|
||||||
_worldPacket.WriteInt32(DifficultyID);
|
_worldPacket.WriteInt32(DifficultyID);
|
||||||
_worldPacket.WriteUInt8((byte)(Legacy ? 1 : 0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int DifficultyID;
|
|
||||||
public bool Legacy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CorpseReclaimDelay : ServerPacket
|
public class CorpseReclaimDelay : ServerPacket
|
||||||
|
|||||||
@@ -140,10 +140,10 @@ namespace Game.Networking.Packets
|
|||||||
data.ResetBitPos();
|
data.ResetBitPos();
|
||||||
|
|
||||||
MovementInfo.Drive driveStatus = new();
|
MovementInfo.Drive driveStatus = new();
|
||||||
driveStatus.accelerating = data.HasBit();
|
|
||||||
driveStatus.drifting = data.HasBit();
|
|
||||||
driveStatus.speed = data.ReadFloat();
|
driveStatus.speed = data.ReadFloat();
|
||||||
driveStatus.movementAngle = data.ReadFloat();
|
driveStatus.movementAngle = data.ReadFloat();
|
||||||
|
driveStatus.accelerating = data.HasBit();
|
||||||
|
driveStatus.drifting = data.HasBit();
|
||||||
|
|
||||||
movementInfo.driveStatus = driveStatus;
|
movementInfo.driveStatus = driveStatus;
|
||||||
}
|
}
|
||||||
@@ -232,10 +232,11 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
if (hasDriveStatus)
|
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.speed);
|
||||||
data.WriteFloat(movementInfo.driveStatus.Value.movementAngle);
|
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(false); // HasSplineFilter
|
||||||
data.WriteBit(moveSpline.spell_effect_extra != null); // HasSpellEffectExtraData
|
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));
|
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(moveSpline.anim_tier != null); // HasAnimTierTransition
|
||||||
data.WriteBit(false); // HasUnknown901
|
data.WriteBit(false); // HasUnknown901
|
||||||
data.FlushBits();
|
data.FlushBits();
|
||||||
@@ -321,6 +323,13 @@ namespace Game.Networking.Packets
|
|||||||
data.WriteUInt32(0); // Duration (override)
|
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)
|
if (moveSpline.anim_tier != null)
|
||||||
{
|
{
|
||||||
data.WriteUInt32(moveSpline.anim_tier.TierTransitionId);
|
data.WriteUInt32(moveSpline.anim_tier.TierTransitionId);
|
||||||
@@ -447,6 +456,15 @@ namespace Game.Networking.Packets
|
|||||||
movementSpline.JumpExtraData = jumpExtraData;
|
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))
|
if (splineFlags.HasFlag(MoveSplineFlagEnum.FadeObject))
|
||||||
movementSpline.FadeObjectTime = (uint)moveSpline.effect_start_time;
|
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 struct MonsterSplineAnimTierTransition
|
||||||
{
|
{
|
||||||
public int TierTransitionID;
|
public int TierTransitionID;
|
||||||
@@ -1502,6 +1534,7 @@ namespace Game.Networking.Packets
|
|||||||
data.WriteBit(SplineFilter != null);
|
data.WriteBit(SplineFilter != null);
|
||||||
data.WriteBit(SpellEffectExtraData.HasValue);
|
data.WriteBit(SpellEffectExtraData.HasValue);
|
||||||
data.WriteBit(JumpExtraData.HasValue);
|
data.WriteBit(JumpExtraData.HasValue);
|
||||||
|
data.WriteBit(TurnData != null);
|
||||||
data.WriteBit(AnimTierTransition.HasValue);
|
data.WriteBit(AnimTierTransition.HasValue);
|
||||||
data.WriteBit(Unknown901 != null);
|
data.WriteBit(Unknown901 != null);
|
||||||
data.FlushBits();
|
data.FlushBits();
|
||||||
@@ -1535,6 +1568,9 @@ namespace Game.Networking.Packets
|
|||||||
if (JumpExtraData.HasValue)
|
if (JumpExtraData.HasValue)
|
||||||
JumpExtraData.Value.Write(data);
|
JumpExtraData.Value.Write(data);
|
||||||
|
|
||||||
|
if (TurnData != null)
|
||||||
|
TurnData.Write(data);
|
||||||
|
|
||||||
if (AnimTierTransition.HasValue)
|
if (AnimTierTransition.HasValue)
|
||||||
AnimTierTransition.Value.Write(data);
|
AnimTierTransition.Value.Write(data);
|
||||||
|
|
||||||
@@ -1557,6 +1593,7 @@ namespace Game.Networking.Packets
|
|||||||
public MonsterSplineFilter SplineFilter;
|
public MonsterSplineFilter SplineFilter;
|
||||||
public MonsterSplineSpellEffectExtraData? SpellEffectExtraData;
|
public MonsterSplineSpellEffectExtraData? SpellEffectExtraData;
|
||||||
public MonsterSplineJumpExtraData? JumpExtraData;
|
public MonsterSplineJumpExtraData? JumpExtraData;
|
||||||
|
public MonsterSplineTurnData TurnData;
|
||||||
public MonsterSplineAnimTierTransition? AnimTierTransition;
|
public MonsterSplineAnimTierTransition? AnimTierTransition;
|
||||||
public MonsterSplineUnknown901 Unknown901;
|
public MonsterSplineUnknown901 Unknown901;
|
||||||
public float FaceDirection;
|
public float FaceDirection;
|
||||||
@@ -1575,6 +1612,7 @@ namespace Game.Networking.Packets
|
|||||||
{
|
{
|
||||||
data.WriteUInt32(Id);
|
data.WriteUInt32(Id);
|
||||||
data.WriteBit(CrzTeleport);
|
data.WriteBit(CrzTeleport);
|
||||||
|
data.WriteBit(StopUseFaceDirection);
|
||||||
data.WriteBits(StopSplineStyle, 3);
|
data.WriteBits(StopSplineStyle, 3);
|
||||||
|
|
||||||
Move.Write(data);
|
Move.Write(data);
|
||||||
@@ -1582,6 +1620,7 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public uint Id;
|
public uint Id;
|
||||||
public bool CrzTeleport;
|
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 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;
|
public MovementSpline Move;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -609,22 +609,22 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
class SetPartyAssignment : ClientPacket
|
class SetPartyAssignment : ClientPacket
|
||||||
{
|
{
|
||||||
|
public int Assignment;
|
||||||
|
public byte? PartyIndex;
|
||||||
|
public ObjectGuid Target;
|
||||||
|
public bool Set;
|
||||||
|
|
||||||
public SetPartyAssignment(WorldPacket packet) : base(packet) { }
|
public SetPartyAssignment(WorldPacket packet) : base(packet) { }
|
||||||
|
|
||||||
public override void Read()
|
public override void Read()
|
||||||
{
|
{
|
||||||
bool hasPartyIndex = _worldPacket.HasBit();
|
bool hasPartyIndex = _worldPacket.HasBit();
|
||||||
Set = _worldPacket.HasBit();
|
Set = _worldPacket.HasBit();
|
||||||
Assignment = _worldPacket.ReadUInt8();
|
Assignment = _worldPacket.ReadInt32();
|
||||||
Target = _worldPacket.ReadPackedGuid();
|
Target = _worldPacket.ReadPackedGuid();
|
||||||
if (hasPartyIndex)
|
if (hasPartyIndex)
|
||||||
PartyIndex = _worldPacket.ReadUInt8();
|
PartyIndex = _worldPacket.ReadUInt8();
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte Assignment;
|
|
||||||
public byte? PartyIndex;
|
|
||||||
public ObjectGuid Target;
|
|
||||||
public bool Set;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class DoReadyCheck : ClientPacket
|
class DoReadyCheck : ClientPacket
|
||||||
@@ -1290,8 +1290,8 @@ namespace Game.Networking.Packets
|
|||||||
{
|
{
|
||||||
public void Write(WorldPacket data)
|
public void Write(WorldPacket data)
|
||||||
{
|
{
|
||||||
data.WriteUInt8(MyFlags);
|
|
||||||
data.WriteUInt32(Slot);
|
data.WriteUInt32(Slot);
|
||||||
|
data.WriteUInt8(MyFlags);
|
||||||
data.WriteUInt32(MyRandomSlot);
|
data.WriteUInt32(MyRandomSlot);
|
||||||
data.WriteUInt8(MyPartialClear);
|
data.WriteUInt8(MyPartialClear);
|
||||||
data.WriteFloat(MyGearDiff);
|
data.WriteFloat(MyGearDiff);
|
||||||
@@ -1303,15 +1303,15 @@ namespace Game.Networking.Packets
|
|||||||
data.FlushBits();
|
data.FlushBits();
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte MyFlags;
|
|
||||||
public uint Slot;
|
public uint Slot;
|
||||||
public byte BootCount;
|
public byte MyFlags;
|
||||||
public uint MyRandomSlot;
|
public uint MyRandomSlot;
|
||||||
public bool Aborted;
|
|
||||||
public byte MyPartialClear;
|
public byte MyPartialClear;
|
||||||
public float MyGearDiff;
|
public float MyGearDiff;
|
||||||
public byte MyStrangerCount;
|
public byte MyStrangerCount;
|
||||||
public byte MyKickVoteCount;
|
public byte MyKickVoteCount;
|
||||||
|
public byte BootCount;
|
||||||
|
public bool Aborted;
|
||||||
public bool MyFirstReward;
|
public bool MyFirstReward;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1464,7 +1464,8 @@ namespace Game.Networking.Packets
|
|||||||
var contentTuning = CliDB.ContentTuningStorage.LookupByKey(creatureDifficulty.ContentTuningID);
|
var contentTuning = CliDB.ContentTuningStorage.LookupByKey(creatureDifficulty.ContentTuningID);
|
||||||
if (contentTuning != null)
|
if (contentTuning != null)
|
||||||
{
|
{
|
||||||
ScalingHealthItemLevelCurveID = (uint)contentTuning.HealthItemLevelCurveID;
|
ScalingHealthItemLevelCurveID = contentTuning.HealthItemLevelCurveID;
|
||||||
|
ScalingHealthPrimaryStatCurveID = contentTuning.HealthPrimaryStatCurveID;
|
||||||
TargetContentTuningID = contentTuning.Id;
|
TargetContentTuningID = contentTuning.Id;
|
||||||
}
|
}
|
||||||
TargetLevel = (byte)target.GetLevel();
|
TargetLevel = (byte)target.GetLevel();
|
||||||
@@ -1484,7 +1485,8 @@ namespace Game.Networking.Packets
|
|||||||
var contentTuning = CliDB.ContentTuningStorage.LookupByKey(creatureDifficulty.ContentTuningID);
|
var contentTuning = CliDB.ContentTuningStorage.LookupByKey(creatureDifficulty.ContentTuningID);
|
||||||
if (contentTuning != null)
|
if (contentTuning != null)
|
||||||
{
|
{
|
||||||
ScalingHealthItemLevelCurveID = (uint)contentTuning.HealthItemLevelCurveID;
|
ScalingHealthItemLevelCurveID = contentTuning.HealthItemLevelCurveID;
|
||||||
|
ScalingHealthPrimaryStatCurveID = contentTuning.HealthPrimaryStatCurveID;
|
||||||
TargetContentTuningID = contentTuning.Id;
|
TargetContentTuningID = contentTuning.Id;
|
||||||
}
|
}
|
||||||
TargetLevel = (byte)target.GetLevel();
|
TargetLevel = (byte)target.GetLevel();
|
||||||
@@ -1549,14 +1551,17 @@ namespace Game.Networking.Packets
|
|||||||
data.WriteFloat(PlayerItemLevel);
|
data.WriteFloat(PlayerItemLevel);
|
||||||
data.WriteFloat(TargetItemLevel);
|
data.WriteFloat(TargetItemLevel);
|
||||||
data.WriteInt16(PlayerLevelDelta);
|
data.WriteInt16(PlayerLevelDelta);
|
||||||
data.WriteUInt32(ScalingHealthItemLevelCurveID);
|
data.WriteInt32(ScalingHealthItemLevelCurveID);
|
||||||
|
data.WriteInt32(Unused1117);
|
||||||
|
data.WriteInt32(ScalingHealthPrimaryStatCurveID);
|
||||||
data.WriteUInt8(TargetLevel);
|
data.WriteUInt8(TargetLevel);
|
||||||
data.WriteUInt8(Expansion);
|
data.WriteUInt8(Expansion);
|
||||||
data.WriteInt8(TargetScalingLevelDelta);
|
data.WriteInt8(TargetScalingLevelDelta);
|
||||||
data.WriteUInt32((uint)Flags);
|
data.WriteUInt32((uint)Flags);
|
||||||
data.WriteUInt32(PlayerContentTuningID);
|
data.WriteUInt32(PlayerContentTuningID);
|
||||||
data.WriteUInt32(TargetContentTuningID);
|
data.WriteUInt32(TargetContentTuningID);
|
||||||
data.WriteInt32(Unused927);
|
data.WriteInt32(TargetHealingContentTuningID);
|
||||||
|
data.WriteFloat(PlayerPrimaryStatToExpectedRatio);
|
||||||
data.WriteBits(TuningType, 4);
|
data.WriteBits(TuningType, 4);
|
||||||
data.FlushBits();
|
data.FlushBits();
|
||||||
}
|
}
|
||||||
@@ -1565,22 +1570,28 @@ namespace Game.Networking.Packets
|
|||||||
public short PlayerLevelDelta;
|
public short PlayerLevelDelta;
|
||||||
public float PlayerItemLevel;
|
public float PlayerItemLevel;
|
||||||
public float TargetItemLevel;
|
public float TargetItemLevel;
|
||||||
public uint ScalingHealthItemLevelCurveID;
|
public int ScalingHealthItemLevelCurveID = 0;
|
||||||
|
public int Unused1117 = 0;
|
||||||
|
public int ScalingHealthPrimaryStatCurveID = 0;
|
||||||
public byte TargetLevel;
|
public byte TargetLevel;
|
||||||
public byte Expansion;
|
public byte Expansion;
|
||||||
public sbyte TargetScalingLevelDelta;
|
public sbyte TargetScalingLevelDelta;
|
||||||
public ContentTuningFlags Flags = ContentTuningFlags.NoLevelScaling | ContentTuningFlags.NoItemLevelScaling;
|
public ContentTuningFlags Flags = ContentTuningFlags.NoLevelScaling | ContentTuningFlags.NoItemLevelScaling;
|
||||||
public uint PlayerContentTuningID;
|
public uint PlayerContentTuningID;
|
||||||
public uint TargetContentTuningID;
|
public uint TargetContentTuningID;
|
||||||
public int Unused927;
|
public int TargetHealingContentTuningID = 0; // direct heal only, not periodic
|
||||||
|
public float PlayerPrimaryStatToExpectedRatio = 1.0f;
|
||||||
|
|
||||||
public enum ContentTuningType
|
public enum ContentTuningType
|
||||||
{
|
{
|
||||||
CreatureToPlayerDamage = 1,
|
CreatureToPlayerDamage = 1,
|
||||||
PlayerToCreatureDamage = 2,
|
PlayerToCreatureDamage = 2,
|
||||||
CreatureToCreatureDamage = 4,
|
CreatureToPlayerHealing = 3,
|
||||||
PlayerToSandboxScaling = 7, // NYI
|
PlayerToCreatureHealing = 4,
|
||||||
PlayerToPlayerExpectedStat = 8
|
CreatureToCreatureDamage = 5,
|
||||||
|
CreatureToCreatureHealing = 6,
|
||||||
|
PlayerToPlayerDamage = 7, // Nyi
|
||||||
|
PlayerToPlayerHealing = 8,
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ContentTuningFlags
|
public enum ContentTuningFlags
|
||||||
|
|||||||
@@ -114,34 +114,12 @@ namespace Game.Networking.Packets
|
|||||||
_worldPacket.WriteBit(LobbyMatchmakerQueueFromMainlineEnabled);
|
_worldPacket.WriteBit(LobbyMatchmakerQueueFromMainlineEnabled);
|
||||||
_worldPacket.WriteBit(CanSendLobbyMatchmakerPartyCustomizations);
|
_worldPacket.WriteBit(CanSendLobbyMatchmakerPartyCustomizations);
|
||||||
_worldPacket.WriteBit(AddonProfilerEnabled);
|
_worldPacket.WriteBit(AddonProfilerEnabled);
|
||||||
|
_worldPacket.WriteBit(false); // unused 11.1.7
|
||||||
|
_worldPacket.WriteBit(false); // unused 11.1.7
|
||||||
|
|
||||||
_worldPacket.FlushBits();
|
_worldPacket.FlushBits();
|
||||||
|
|
||||||
{
|
QuickJoinConfig.Write(_worldPacket);
|
||||||
_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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SessionAlert.HasValue)
|
if (SessionAlert.HasValue)
|
||||||
{
|
{
|
||||||
@@ -268,6 +246,34 @@ namespace Game.Networking.Packets
|
|||||||
public float ThrottleRfIlvlScalingAbove;
|
public float ThrottleRfIlvlScalingAbove;
|
||||||
public float ThrottleDfMaxItemLevel;
|
public float ThrottleDfMaxItemLevel;
|
||||||
public float ThrottleDfBestPriority;
|
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
|
public struct SquelchInfo
|
||||||
@@ -339,6 +345,10 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
_worldPacket.WriteBit(BNSendGameDataUseV2Services);
|
_worldPacket.WriteBit(BNSendGameDataUseV2Services);
|
||||||
_worldPacket.WriteBit(CharacterSelectListModeRealmless);
|
_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();
|
_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 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 BNSendGameDataUseV2Services = true; ///< BNSendGameData will send to v2.NotificationService instead of v1.NotificationService
|
||||||
public bool CharacterSelectListModeRealmless;
|
public bool CharacterSelectListModeRealmless;
|
||||||
|
public bool WowTokenLimitedMode; // classic only
|
||||||
|
public bool PandarenLevelBoostAllowed; // classic only
|
||||||
public EuropaTicketConfig? EuropaTicketSystemStatus;
|
public EuropaTicketConfig? EuropaTicketSystemStatus;
|
||||||
public List<int> LiveRegionCharacterCopySourceRegions = new();
|
public List<int> LiveRegionCharacterCopySourceRegions = new();
|
||||||
public uint CommercePricePollTimeSeconds; // NYI
|
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
|
// END OF THE WANDERING ISLE SPELLS
|
||||||
//
|
//
|
||||||
|
|
||||||
@@ -4684,6 +4691,18 @@ namespace Game.Entities
|
|||||||
spellInfo._LoadSqrtTargetLimit(5, 0, null, 4, null, null);
|
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");
|
Log.outInfo(LogFilter.ServerLoading, $"Loaded SpellInfo target caps in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user