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,