Skip to content

Instantly share code, notes, and snippets.

@Subv
Created June 1, 2014 03:46
Show Gist options
  • Save Subv/e54cedfdbf936ee06281 to your computer and use it in GitHub Desktop.
Save Subv/e54cedfdbf936ee06281 to your computer and use it in GitHub Desktop.
WPP Modifications for phaseid prediction of spawns
diff --git a/WowPacketParser/Parsing/Parsers/MovementHandler.cs b/WowPacketParser/Parsing/Parsers/MovementHandler.cs
index fea17cd..dac557b 100644
--- a/WowPacketParser/Parsing/Parsers/MovementHandler.cs
+++ b/WowPacketParser/Parsing/Parsers/MovementHandler.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.IO;
using WowPacketParser.Enums;
using WowPacketParser.Enums.Version;
@@ -15,6 +16,12 @@ namespace WowPacketParser.Parsing.Parsers
public static int CurrentPhaseMask = 1;
+ [ThreadStatic]
+ public static HashSet<ushort> PhaseIds = new HashSet<ushort>();
+
+ [ThreadStatic]
+ public static Dictionary<ushort, uint> phaseCounts = new Dictionary<ushort, uint>();
+
public static MovementInfo ReadMovementInfo(ref Packet packet, Guid guid, int index = -1)
{
if (ClientVersion.Build == ClientVersionBuild.V4_2_0_14333)
diff --git a/WowPacketParser/SQL/Builders/Spawns.cs b/WowPacketParser/SQL/Builders/Spawns.cs
index 3b5b46f..0d847fb 100644
--- a/WowPacketParser/SQL/Builders/Spawns.cs
+++ b/WowPacketParser/SQL/Builders/Spawns.cs
@@ -7,6 +7,7 @@ using WowPacketParser.Enums.Version;
using WowPacketParser.Misc;
using WowPacketParser.Store.Objects;
using Guid = WowPacketParser.Misc.Guid;
+using System.Linq;
namespace WowPacketParser.SQL.Builders
{
@@ -53,7 +54,7 @@ namespace WowPacketParser.SQL.Builders
row.AddValue("id", entry);
row.AddValue("map", !creature.IsOnTransport() ? creature.Map : 0); // TODO: query transport template for map
row.AddValue("spawnMask", creature.GetDefaultSpawnMask());
- row.AddValue("phaseMask", creature.PhaseMask);
+ row.AddValue("phaseMask", string.Join(" - ", creature.PossiblePhases.ToArray()));
if (!creature.IsOnTransport())
{
row.AddValue("position_x", creature.Movement.Position.X);
diff --git a/WowPacketParser/Store/Objects/WoWObject.cs b/WowPacketParser/Store/Objects/WoWObject.cs
index 24c2b9f..805f989 100644
--- a/WowPacketParser/Store/Objects/WoWObject.cs
+++ b/WowPacketParser/Store/Objects/WoWObject.cs
@@ -20,6 +20,8 @@ namespace WowPacketParser.Store.Objects
public uint PhaseMask;
+ public HashSet<ushort> PossiblePhases;
+
public bool ForceTemporarySpawn;
public virtual bool IsTemporarySpawn()
diff --git a/WowPacketParserModule.V4_3_4_15595/Parsers/MovementHandler.cs b/WowPacketParserModule.V4_3_4_15595/Parsers/MovementHandler.cs
index 603ea45..f48880f 100644
--- a/WowPacketParserModule.V4_3_4_15595/Parsers/MovementHandler.cs
+++ b/WowPacketParserModule.V4_3_4_15595/Parsers/MovementHandler.cs
@@ -2738,8 +2738,14 @@ namespace WowPacketParserModule.V4_3_4_15595.Parsers
count = packet.ReadUInt32() / 2;
packet.WriteLine("Phases count: {0}", count);
+ CoreParsers.MovementHandler.PhaseIds.Clear();
for (var i = 0; i < count; ++i)
- packet.ReadUInt16("Phase id", i); // Phase.dbc
+ {
+ ushort ph = packet.ReadUInt16("Phase id", i);
+ CoreParsers.MovementHandler.PhaseIds.Add(ph); // Phase.dbc
+ if (!CoreParsers.MovementHandler.phaseCounts.ContainsKey(ph))
+ CoreParsers.MovementHandler.phaseCounts.Add(ph, 0);
+ }
packet.ReadXORByte(guid, 3);
packet.ReadXORByte(guid, 0);
diff --git a/WowPacketParserModule.V4_3_4_15595/Parsers/UpdateHandler.cs b/WowPacketParserModule.V4_3_4_15595/Parsers/UpdateHandler.cs
index e27c27f..007117a 100644
--- a/WowPacketParserModule.V4_3_4_15595/Parsers/UpdateHandler.cs
+++ b/WowPacketParserModule.V4_3_4_15595/Parsers/UpdateHandler.cs
@@ -92,6 +92,7 @@ namespace WowPacketParserModule.V4_3_4_15595.Parsers
obj.Map = map;
obj.Area = CoreParsers.WorldStateHandler.CurrentAreaId;
obj.PhaseMask = (uint)CoreParsers.MovementHandler.CurrentPhaseMask;
+ obj.PossiblePhases = new HashSet<ushort>(CoreParsers.MovementHandler.PhaseIds);
// If this is the second time we see the same object (same guid,
// same position) update its phasemask
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment