diff --git a/Dalamud/Game/ClientState/ZoneInit.cs b/Dalamud/Game/ClientState/ZoneInit.cs
index 7eb4576aa..07f5e5cbf 100644
--- a/Dalamud/Game/ClientState/ZoneInit.cs
+++ b/Dalamud/Game/ClientState/ZoneInit.cs
@@ -2,14 +2,16 @@ using System.Linq;
using System.Text;
using Dalamud.Data;
-
+using Dalamud.Utility;
using Lumina.Excel.Sheets;
+using Serilog;
namespace Dalamud.Game.ClientState;
///
/// Provides event data for when the game should initialize a zone.
///
+[Api15ToDo("Replace all direct references with Lumina RowRef instead.")]
public class ZoneInitEventArgs : EventArgs
{
///
@@ -54,10 +56,31 @@ public class ZoneInitEventArgs : EventArgs
var flags = *(byte*)(packet + 0x12);
- eventArgs.TerritoryType = dataManager.GetExcelSheet().GetRow(*(ushort*)(packet + 0x02));
+ var territoryKey = *(ushort*)(packet + 0x02);
+ if (!dataManager.GetExcelSheet().TryGetRow(territoryKey, out var territoryRow))
+ {
+ Log.Error($"Failed to get TerritoryType row with ID {territoryKey}. Corrupted packet?");
+ return new ZoneInitEventArgs();
+ }
+ eventArgs.TerritoryType = territoryRow;
+
+ var contentFinderKey = *(ushort*)(packet + 0x06);
+ if (!dataManager.GetExcelSheet().TryGetRow(contentFinderKey, out var contentFinderRow))
+ {
+ Log.Error($"Failed to get ContentFinderCondition row with ID {contentFinderKey}. Corrupted packet?");
+ return new ZoneInitEventArgs();
+ }
+ eventArgs.ContentFinderCondition = contentFinderRow;
+
+ var weatherKey = *(byte*)(packet + 0x10);
+ if (!dataManager.GetExcelSheet().TryGetRow(weatherKey, out var weatherRow))
+ {
+ Log.Error($"Failed to get Weather row with ID {weatherKey}. Corrupted packet?");
+ return new ZoneInitEventArgs();
+ }
+ eventArgs.Weather = weatherRow;
+
eventArgs.Instance = flags >= 0 ? (ushort)0 : *(ushort*)(packet + 0x04);
- eventArgs.ContentFinderCondition = dataManager.GetExcelSheet().GetRow(*(ushort*)(packet + 0x06));
- eventArgs.Weather = dataManager.GetExcelSheet().GetRow(*(byte*)(packet + 0x10));
const int NumFestivals = 8;
eventArgs.ActiveFestivals = new Festival[NumFestivals];
@@ -67,7 +90,13 @@ public class ZoneInitEventArgs : EventArgs
// but it's unclear why they exist as separate entries and why they would be different.
for (var i = 0; i < NumFestivals; i++)
{
- eventArgs.ActiveFestivals[i] = dataManager.GetExcelSheet().GetRow(*(ushort*)(packet + 0x26 + (i * 2)));
+ var festivalKey = *(ushort*)(packet + 0x26 + (i * 2));
+ if (!dataManager.GetExcelSheet().TryGetRow(festivalKey, out var festivalRow))
+ {
+ Log.Error($"Failed to get Festival row with ID {festivalKey}. Corrupted packet?");
+ return new ZoneInitEventArgs();
+ }
+ eventArgs.ActiveFestivals[i] = festivalRow;
eventArgs.ActiveFestivalPhases[i] = *(ushort*)(packet + 0x36 + (i * 2));
}