diff --git a/CHANGELOG.md b/CHANGELOG.md
index 04b594fa8..94f7e5ab9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
+## 8193.34.28
+https://github.com/nwn-dotnet/Anvil/compare/v8193.34.27...v8193.34.28
+
+### Fixed
+- NwCreature: Fixed an issue where GetAssociates would return an empty list for certain associate types.
+- VirtualMachine: Fix an issue where the context object would be incorrectly flagged as invalid.
+- Creature.OnDeath: Support Area/Module as the killer of the creature.
+- EventService: More reliable handling of game events.
+
## 8193.34.27
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.26...v8193.34.27
diff --git a/NWN.Anvil/src/main/API/Events/Game/CreatureEvents/CreatureEvents.OnDeath.cs b/NWN.Anvil/src/main/API/Events/Game/CreatureEvents/CreatureEvents.OnDeath.cs
index bd70642b9..4b9933560 100644
--- a/NWN.Anvil/src/main/API/Events/Game/CreatureEvents/CreatureEvents.OnDeath.cs
+++ b/NWN.Anvil/src/main/API/Events/Game/CreatureEvents/CreatureEvents.OnDeath.cs
@@ -23,7 +23,7 @@ public sealed class OnDeath : IEvent
///
/// Gets the that killed .
///
- public NwGameObject Killer { get; } = NWScript.GetLastKiller().ToNwObject()!;
+ public NwObject? Killer { get; } = NWScript.GetLastKiller().ToNwObject();
NwObject IEvent.Context => KilledCreature;
}
diff --git a/NWN.Anvil/src/main/API/Events/Game/GameEventFactory.cs b/NWN.Anvil/src/main/API/Events/Game/GameEventFactory.cs
index 705862178..af3c79c85 100644
--- a/NWN.Anvil/src/main/API/Events/Game/GameEventFactory.cs
+++ b/NWN.Anvil/src/main/API/Events/Game/GameEventFactory.cs
@@ -44,7 +44,7 @@ ScriptHandleResult IScriptDispatcher.ExecuteScript(string? scriptName, uint oidS
return ScriptHandleResult.NotHandled;
}
- EventScriptType eventScriptType = (EventScriptType)NWScript.GetCurrentlyRunningEvent();
+ EventScriptType eventScriptType = (EventScriptType)NWScript.GetCurrentlyRunningEvent(false.ToInt());
if (eventScriptType == EventScriptType.None)
{
return ScriptHandleResult.NotHandled;
diff --git a/NWN.Anvil/src/main/API/Objects/NwCreature.cs b/NWN.Anvil/src/main/API/Objects/NwCreature.cs
index 0cdf78bf2..278eccd8b 100644
--- a/NWN.Anvil/src/main/API/Objects/NwCreature.cs
+++ b/NWN.Anvil/src/main/API/Objects/NwCreature.cs
@@ -2548,7 +2548,7 @@ private List GetAssociates(AssociateType associateType)
List associates = new List();
int type = (int)associateType;
- for (int i = 0;; i++)
+ for (int i = 1;; i++)
{
NwCreature? associate = NWScript.GetAssociate(type, this, i).ToNwObject();
if (associate == null || associates.Contains(associate))
diff --git a/NWN.Anvil/src/main/API/Scripts/CallInfo.cs b/NWN.Anvil/src/main/API/Scripts/CallInfo.cs
index acefe33af..e10ca149b 100644
--- a/NWN.Anvil/src/main/API/Scripts/CallInfo.cs
+++ b/NWN.Anvil/src/main/API/Scripts/CallInfo.cs
@@ -16,7 +16,7 @@ public CallInfo(string scriptName, NwObject? objSelf)
{
ScriptName = scriptName;
ObjectSelf = objSelf;
- ScriptType = (EventScriptType)NWScript.GetCurrentlyRunningEvent();
+ ScriptType = (EventScriptType)NWScript.GetCurrentlyRunningEvent(false.ToInt());
}
///
diff --git a/NWN.Anvil/src/main/API/Utils/VirtualMachine.cs b/NWN.Anvil/src/main/API/Utils/VirtualMachine.cs
index 74d8609ee..de5b26065 100644
--- a/NWN.Anvil/src/main/API/Utils/VirtualMachine.cs
+++ b/NWN.Anvil/src/main/API/Utils/VirtualMachine.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
+using Anvil.Internal;
using Anvil.Services;
using NLog;
using NWN.Core;
@@ -89,9 +90,9 @@ public void Execute(string scriptName, params (string ParamName, string ParamVal
Execute(scriptName, null, scriptParams);
}
- public void ExecuteInScriptContext(System.Action action, uint objectId = NwObject.Invalid, int scriptEventId = 0, bool valid = false)
+ public void ExecuteInScriptContext(System.Action action, uint objectId = NwObject.Invalid, int scriptEventId = 0)
{
- int spBefore = PushScriptContext(objectId, scriptEventId, valid);
+ int spBefore = PushScriptContext(objectId, scriptEventId);
try
{
action();
@@ -106,9 +107,9 @@ public void ExecuteInScriptContext(System.Action action, uint objectId = NwObjec
}
}
- public T ExecuteInScriptContext(System.Func action, uint objectId = NwObject.Invalid, int scriptEventId = 0, bool valid = false)
+ public T ExecuteInScriptContext(System.Func action, uint objectId = NwObject.Invalid, int scriptEventId = 0)
{
- int spBefore = PushScriptContext(objectId, scriptEventId, valid);
+ int spBefore = PushScriptContext(objectId, scriptEventId);
try
{
@@ -181,9 +182,10 @@ private int PopScriptContext()
return virtualMachine.m_cRunTimeStack.GetStackPointer();
}
- private int PushScriptContext(uint oid, int scriptEventId, bool valid)
+ private int PushScriptContext(uint oid, int scriptEventId)
{
CNWVirtualMachineCommands cmd = CNWVirtualMachineCommands.FromPointer(virtualMachine.m_pCmdImplementer.Pointer);
+ bool valid = LowLevel.ServerExoApp.GetGameObject(oid) != null;
if (virtualMachine.m_nRecursionLevel++ == -1)
{
@@ -196,7 +198,10 @@ private int PushScriptContext(uint oid, int scriptEventId, bool valid)
virtualMachine.m_oidObjectRunScript[virtualMachine.m_nRecursionLevel] = oid;
virtualMachine.m_bValidObjectRunScript[virtualMachine.m_nRecursionLevel] = valid.ToInt();
- virtualMachine.m_pVirtualMachineScript[virtualMachine.m_nRecursionLevel].m_nScriptEventID = scriptEventId;
+ CVirtualMachineScript script = virtualMachine.m_pVirtualMachineScript[virtualMachine.m_nRecursionLevel];
+ script.m_nScriptEventID = scriptEventId;
+
+ virtualMachine.m_pVirtualMachineScript[virtualMachine.m_nRecursionLevel] = script;
cmd.m_oidObjectRunScript = virtualMachine.m_oidObjectRunScript[virtualMachine.m_nRecursionLevel];
cmd.m_bValidObjectRunScript = virtualMachine.m_bValidObjectRunScript[virtualMachine.m_nRecursionLevel];
diff --git a/NWN.Anvil/src/main/Services/ScriptDispatch/ScriptHandleResult.cs b/NWN.Anvil/src/main/Services/ScriptDispatch/ScriptHandleResult.cs
index cc1d11f31..5f6787fed 100644
--- a/NWN.Anvil/src/main/Services/ScriptDispatch/ScriptHandleResult.cs
+++ b/NWN.Anvil/src/main/Services/ScriptDispatch/ScriptHandleResult.cs
@@ -2,7 +2,7 @@ namespace Anvil.Services
{
public enum ScriptHandleResult
{
- NotHandled = -1,
+ NotHandled = ~0,
Handled = 0,
False = 0,
True = 1,