fix(nameplates): handle exceptions
This commit is contained in:
parent
bc5657f990
commit
0b9aab4acf
@ -80,10 +80,24 @@ namespace XivCommon.Functions.NamePlates {
|
|||||||
private const int LevelIndex = 150;
|
private const int LevelIndex = 150;
|
||||||
|
|
||||||
private unsafe IntPtr NamePlateUpdateDetour(AddonNamePlate* addon, NumberArrayData** numberData, StringArrayData** stringData) {
|
private unsafe IntPtr NamePlateUpdateDetour(AddonNamePlate* addon, NumberArrayData** numberData, StringArrayData** stringData) {
|
||||||
|
try {
|
||||||
|
this.NamePlateUpdateDetourInner(numberData, stringData);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.LogError(ex, "Exception in NamePlateUpdateDetour");
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._namePlateUpdateHook!.Original(addon, numberData, stringData);
|
||||||
|
}
|
||||||
|
|
||||||
|
private unsafe void NamePlateUpdateDetourInner(NumberArrayData** numberData, StringArrayData** stringData) {
|
||||||
// don't skip to original if no subscribers because of ForceRedraw
|
// don't skip to original if no subscribers because of ForceRedraw
|
||||||
|
|
||||||
var numbers = numberData[5];
|
var numbers = numberData[5];
|
||||||
var strings = stringData[4];
|
var strings = stringData[4];
|
||||||
|
if (numbers == null || strings == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var atkModule = (RaptureAtkModule*) this.Functions.GetAtkModule();
|
var atkModule = (RaptureAtkModule*) this.Functions.GetAtkModule();
|
||||||
|
|
||||||
var active = numbers->IntArray[0];
|
var active = numbers->IntArray[0];
|
||||||
@ -139,14 +153,25 @@ namespace XivCommon.Functions.NamePlates {
|
|||||||
Flags = flags,
|
Flags = flags,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
this.OnUpdate?.Invoke(args);
|
this.OnUpdate?.Invoke(args);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.LogError(ex, "Exception in name plate update event");
|
||||||
|
}
|
||||||
|
|
||||||
void Replace(byte[] bytes, int i) {
|
void Replace(byte[] bytes, int i) {
|
||||||
|
// allocate new memory with the game for the new string
|
||||||
var mem = this.Functions.UiAlloc.Alloc((ulong) bytes.Length + 1);
|
var mem = this.Functions.UiAlloc.Alloc((ulong) bytes.Length + 1);
|
||||||
|
// copy the new string over to the game's memory
|
||||||
Marshal.Copy(bytes, 0, mem, bytes.Length);
|
Marshal.Copy(bytes, 0, mem, bytes.Length);
|
||||||
|
// terminate the new string
|
||||||
*(byte*) (mem + bytes.Length) = 0;
|
*(byte*) (mem + bytes.Length) = 0;
|
||||||
this.Functions.UiAlloc.Free((IntPtr) strings->StringArray[i]);
|
|
||||||
|
// replace the pointer with our new one
|
||||||
|
var old = strings->StringArray[i];
|
||||||
strings->StringArray[i] = (byte*) mem;
|
strings->StringArray[i] = (byte*) mem;
|
||||||
|
// free the old pointer
|
||||||
|
this.Functions.UiAlloc.Free((IntPtr) old);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name != args.Name) {
|
if (name != args.Name) {
|
||||||
@ -183,8 +208,6 @@ namespace XivCommon.Functions.NamePlates {
|
|||||||
numbers->SetValue(numbersIndex + FlagsIndex, args.Flags);
|
numbers->SetValue(numbersIndex + FlagsIndex, args.Flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._namePlateUpdateHook!.Original(addon, numberData, stringData);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user