All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
https://github.com/nwn-dotnet/Anvil/compare/v8193.36.1...HEAD
- N/A
- N/A
- N/A
- N/A
- N/A
- N/A
https://github.com/nwn-dotnet/Anvil/compare/v8193.35.3...v8193.36.1
- EffectType: Added new 8193.36 constants
- GuiEventType: Added new 8193.36 constants
- PlayerDeviceProperty: Added new 8193.36 constants
- ResRefType: Added new 8193.36 constants and missing constants for 8193.35
- Effect: Added
EnemyAttackBonus
method. - SQLQuery: Added
Columns
property. - SQLResult: Added overloads with column name parameters.
- OnPlayerGuiEvent: Added missing documentation for
EventObject
event types. - NwArea: Added
SetAreaTileBorderDisabled
method. - NwArea: Added
SetAreaGrassOverride
method. - NwArea: Added
RemoveAreaGrassOverride
method. - NwArea: Added
SetAreaDefaultGrassDisabled
method. - NwGameObject: Added
CasterLevel
property. This replacesLastSpellCasterLevel
from NwCreature. - NwCreature: Added
SpellAbilities
property for managing creature spell-like abilities. - NwPlayer: Added
StartAudioStream
method. - NwPlayer: Added
StopAudioStream
method. - NwPlayer: Added
SetAudioStreamPaused
method. - NwPlayer: Added
SetAudioStreamVolume
method. - NwPlayer: Added
SeekAudioStream
method. - CRulesKeyHash: New structure to support working with the new hash-based ruleset key labels.
- RulesetKeys: New constants class with hashed keys for all known ruleset definitions.
- NwGameTables: Added
SurfaceMaterialTable
.
- NWNX: 51162c5 -> 9865013
- NWN.Core: 8193.35.21 -> 8193.36.1
- NWN.Native: 8193.35.9 -> 8193.36.2
- NLog: 5.2.5 -> 5.2.8
- Effect:
DamageReduction
now supports an optionalrangedOnly
parameter. - Effect:
DamageResistance
now supports an optionalrangedOnly
parameter. - Effect:
EffectType
will return the new types introduced in 8193.36. - NwDoor:
Clone
now uses the sharedCloneInternal
behaviour. - NwEncounter:
Clone
is now supported. - NwGameObject:
ActionCastSpellAt
now supports optionalspellClass
andspontaneousCast
parameters. - NwPlayer:
FloatingTextString
now supports an optionalchatWindow
parameter. - NwPlayer:
FloatingTextStrRef
now supports an optionalchatWindow
parameter. - CampaignVariableObject: Tightened generic constraint to only allow
NwGameObject
instead ofNwObject
to match base game behaviour.
- ItemProperty:
LimitUseByClass(IPClass)
- Use theLimitUseByClass(NwClass)
overload instead.
- Fixed
Possessor
not correctly returning bags/containers.
https://github.com/nwn-dotnet/Anvil/compare/v8193.35.2...v8193.35.3
- Removed custom crash handler due to preventing dotnet from collecting a crash dump.
https://github.com/nwn-dotnet/Anvil/compare/v8193.35.1...v8193.35.2
- Effect: Added
AreaOfEffect
overload withPersistentVfxTableEntry
support. - Effect: Added
Polymorph
overload withPolymorphTableEntry
support. - Location: Added
TileInfo
property. - Events: Added
OnDispelMagicApply
event. - NuiDrawList: Added
NuiDrawListItemType.Line
support. - NuiDrawList: Added support for item order and render options.
- NuiDrawList: Added
ImageRegion
property. - NuiImage: Added
ImageRegion
property. - NuiImage: Added
WordWrap
property. - Nui: Added
NuiToggles
widget. - NuiElement: Added
DisabledTooltip
,Encouraged
properties. - NuiWindow: Added
AcceptsInput
property. - CreatureLevelInfo: Added
AbilityGained
property. - NwArea: Added
TileInfo
property. - NwCreature: Added
RemainingSkillPoints
property. - NwCreature: Added
BroadcastSkillRoll
method. - NwCreature: Added
CalculateAbilityModifierFromScore
method. - NwCreature: Added
GetArmorClassVersus
method. - NwCreature: Added parameter to
RemoveFeat
to optionally remove the feat from the level stat list (for ELC). - NwItem: Extended
AddItemProperty
to support additional behaviours for managing existing item properties. - NwItem: Added
CompareItem
method. - NwItem: Added
HasItemProperty
method. - NwItem: Added
RemoveItemProperties
method. - NwModule: Added
RefreshClientObjects
method. - NwPlayer: Added
RefreshClientObject
method. - NwPlayer: Added
RefreshPlayerClientObject
method. - NwServer: Added
DebugMode
,DebugCombat
,DebugSaveThrows
,DebugHitDie
,DebugMoveSpeed
properties. - NwGameTables: Added
PlaceableTypeTable
- NwGameTables: Added
PolymorphTable
- NwGameTables: Added
PortraitTable
- NwGameTables: Added
PersistentEffectTable
- PluginManager: Added support for specifying additional plugin directories with a new environment variable,
ADD_PLUGIN_PATHS
- UnobservedTaskExceptionLogger: Added new service for logging and handling uncaught
async Task
exceptions.
- NWNX: b419e42 -> 51162c5
- NWN.Core: 8193.35.6 -> 8193.35.21
- NWN.Native: 8193.34.6 -> 8193.35.9
- NLog: 5.1.4 -> 5.2.5
- Effect:
Tag
property is now correctly marked as nullable. - ItemProperty:
Tag
property is now correctly marked as nullable. - OnClientConnect:
PlayerName
,CDKey
properties are no longer nullable. - CreatureLevelInfo:
Feats
property is now a mutable list. - EncounterListEntry:
CreatureResRef
is now correctly marked as nullable. - NwCreature:
DialogResRef
is now correctly marked as nullable. - NwCreature:
TalentBest
,TalentRandom
now returns the correct talent class type. - NwDoor:
DialogResRef
is now correctly marked as nullable. - NwGameObject:
PortraitId
now uses the 2da PortraitTableEntry type. - NwPlaceable:
DialogResRef
is now correctly marked as nullable. - NwBaseItem:
DefaultIcon
is now correctly marked as nullable. - NwBaseItem:
DefaultModel
is now correctly marked as nullable. - NwClass:
IconResRef
,SpellTableColumn
properties are now correctly marked as nullable. - NwClass:
PreReqTable
is now a nullable reference to a TwoDimArray wrapper of the associated class prereq table. - NwDomain:
Icon
is now correctly marked as nullable. - NwFeat:
IconResRef
is now correctly marked as nullable. - NwRace:
DefaultCharacterDescription
,Description
,Name
,PluralName
properties are now correctly marked as nullable. - NwSkill:
IconResRef
is now correctly marked as nullable. - NwSpell:
CastGroundVisual
,CastHandVisual
,CastHeadVisual
,CastSound
,ConjureGroundVisual
,ConjureHandVisual
,ConjureHeadVisual
,ConjureSound
,IconResRef
,ImpactScript
,ProjectileModel
,ProjectileSound
properties are now correctly marked as nullable. - NativeObjectExtensions: Moved to
Anvil.Native
to prevent missing method errors when using other extension overloads, and made public again. - ArrayWrapper: Added additional error checking.
- EnforceLegalCharacterService: Added 8 multiclass support.
- ServerLogRedirectorService: Don't log empty or null messages.
- ScriptDispatchService: Remove redundant try/catch, optimization.
- AnvilCore: Merged
VirtualMachineFunctionHandler
into AnvilCore. - AnvilCore: Use better performant unmanaged function pointers for handling low level events from NWNX.
- AnvilCore: Implement custom crash handler with managed stacktrace.
IPRacialType
- useNwRace
instead.HitEffect.SlayRace
- useNwRace
overload instead.ItemProperty.ACBonusVsRace
- useNwRace
overload instead.ItemProperty.AttackBonusVsRace
- useNwRace
overload instead.ItemProperty.DamageBonusVsRace
- useNwRace
overload instead.ItemProperty.EnhancementBonusVsRace
- useNwRace
overload instead.ItemProperty.LimitUseByRace
- useNwRace
overload instead.DamageData
properties - use GetDamageByType, SetDamageByType instead.
- EventService: Built-in game events subscribed in anvil will now preserve the event script identifier when calling the original script.
- ItemAppearance: Now correctly supports the extended appearance types added in 8193.35.
- NwArea:
GetTileInfo
now correctly returns the correct tile when specifying a tile coordinate. - NwCreature: Fixed
ActionUseFeat
subFeat parameter not working. - EnforceLegalCharacterService: Fixed an erroneous calculation when calculating ability scores with a level stat bonus.
- WeaponService: Fixed a rare server crash when calculating levels for a specific class.
https://github.com/nwn-dotnet/Anvil/compare/v8193.35.0...v8193.35.1
- (Docker) Fixed an issue with libssl dependency.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.28...v8193.35.0
- DamageType: Added
CustomXX
damage type constants - EffectSubType: Added
Unyielding
subtype. - EffectType: Added
Pacify
,BonusFeat
,TimeStopImmunity
,ForceWalk
effects. - GuiEventType: Added
RadialOpen
- GuiPanel: Added
Tile
,Trigger
,Creature
,Item
,Placeable
,Door
,Quickbar
panels. - PlayerDeviceProperty: Added various graphics properties.
- Effect: Added
BonusFeat
,ForceWalk
,Pacified
,TimeStopImmunity
effect methods. - Effect: Added
LinkId
,IgnoreImmunity
properties. - Location: Added
TileId
,TileRotation
,TileHeight
properties. - Location: Added
SetTile
,SetTileAnimationLoops
methods. - SQLQuery: Added
Reset
method. - ModuleEvents.OnPlayerEquipItem: Added
Slot
property. - ModuleEvents.OnPlayerGuiEvent: Added
Vector
property. - ModuleEvents.OnPlayerUnequipItem: Added
Slot
property. - SpellEvents.OnSpellCast: Added
IsSpontaneousCast
,SpellLevel
properties. - NwArea: Added
ReloadAreaGrass
,ReloadAreaBorder
,SetTiles
,GetAreaLightColor
,SetAreaLightColor
,GetAreaLightDirection
,SetAreaLightDirection
,SetFogColor
methods. - NwCreature: Added
ControllingPlayer
setter. - NwCreature: Added
ActionUseFeat
,GetSpellUsesLeft
,SetEffectIconFlashing
methods - NwGameObject: Added
Usable
,VisibleDistance
,VisualTransform
,UiDiscoveryFlags
properties. - NwGameObject: Added
GetVisualTransform
method with scope option. - NwGameObject: Added
ReplaceObjectAnimation
,ClearObjectAnimationOverride
,SetTextBubbleOverride
methods. - NwPlayer: Added
CameraFlags
,ClientVersionCommitSha1
properties. - NwPlayer: Added
AttachCamera
,SetCameraLimits
,SetShaderUniform
,SetSpellTargetingData
methods. - VisualTransform: Added
Clear
method. - VisualTransformLerpSettings: Added
BehaviorFlags
,Repeats
properties. - DevastatingCriticalData: Added
Attacker
property.
- NWNX: 2692ecb -> d44d373
- NWN.Core: 8193.34.15 -> 8193.35.6
- NWN.Native: 8193.34.5 -> 8193.35.6
- LightInject: 6.6.3 -> 6.6.4
- NLog: 5.1.3 -> 5.1.4
- !! Anvil now targets .NET 7. You may need to update your plugin's target framework to successfully compile against Anvil.
- !! HookService: NWNX and NWN.Native no-longer exposes a list of function addresses, and the address parameter has been removed from
RequestHook
. The RequestHook now expects a delegate with theNativeFunction
attribute. See here for an example. - ItemAppearance: Update return values to support the extended part ranges introduced in 8193.35.
- NwPlayer:
ClientVersion
now includes the revision value of the client version. - NwPlayer:
EnterTargetMode
now specifies a setting object that contains all new options added in 8193.35.
- ItemAppearanceArmorModel: Removed deprecated class.
- DoorEvents.OnDialogue: Removed deprecated class.
- PlaceableEvents.OnDialogue: Removed deprecated class.
- ItemAppearanceArmorModel: Removed deprecated class.
- Effect: Removed deprecated
EffectIcon
overload. - ItemProperty: Removed deprecated
PropertyType
property. - CreatureEvents.OnConversation: Removed deprecated
CurrentSpeaker
property. - ModuleEvents.OnNuiEvent: Removed deprecated
WindowToken
property. - CreatureClassInfo: Removed deprecated
AddKnownSpell
,GetKnownSpellCountByLevel
,GetKnownSpells
,RemoveKnownSpell
methods. - ItemAppearance: Removed deprecated
ClearArmorPieceColor
,GetArmorModel
,GetArmorPieceColor
,SetArmorModel
,SetArmorPieceColor
overloads. - NativeObjectInfoAttribute: Removed unused class.
- NwArea: Removed deprecated
GetFogAmount
,GetFogColor
methods. - NwGameObject: Removed deprecated
CreatureAppearanceType
property. - NwGameObject: Remove
Destroy
,PlaySoundByStrRef
overloads. - NwPlayer: Remove
ClearTlkOverride
,CreateNuiWindow
,NuiDestroy
,NuiGetUserData
,NuiGetWindowId
,NuiSetUserData
,SetTlkOverride
methods. - Color: Removed
ToInt
method.
- (NWNX) Fixed an issue where nested VM scopes would cause an invalid stack and assertion error.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.27...v8193.34.28
- 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.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.26...v8193.34.27
- NwCreature: Added
BodyBag
,BodyBagTemplate
properties. - NwPlaceable: Added
IsBodyBag
property.
- OnPlayerGuiEvent:
EffectIcon
property is now nullable. - OnDebugPlayVisualEffect:
Effect
property is now nullable. - APIs that accept a
TableEntry
parameter now have implicit casts (e.g.EffectIconTableEntry
&EffectIcon
).
- NwCreature: Fixed an infinite loop caused by the
Associates
property when having dominated creature associates. - Added some index/range checks for some usages of game table data.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.25...v8193.34.26
- NwGameTables: Added
EffectIconTable
. - CreatureClassInfo: Added
School
,KnownSpells
properties. - CreatureLevelInfo: Added
AddedKnownSpells
,RemovedKnownSpells
properties.
- NWNX: 2692ecb -> d44d373
- NWN.Core: 8193.34.12 -> 8193.34.15
- NWN.Native: 8193.34.5 -> 8193.34.7
- Newtonsoft.Json: 13.0.2 -> 13.0.3
- NLog: 5.1.2 -> 5.1.3
- Paket.Core: 7.2.0 -> 7.2.1
- CollectionExtensions:
InsertOrdered
now returns the index in which the item was inserted. - Anvil will now log a managed stack trace during an assertion failure. We're hoping this will help track down issues where the nwscript VM reports an invalid stack state.
CreatureClassInfo.AddKnownSpell
- useCreatureClassInfo.KnownSpells[].Add
instead.CreatureClassInfo.RemoveKnownSpell
- useCreatureClassInfo.KnownSpells[].Remove
instead.CreatureClassInfo.GetKnownSpellCountByLevel
- useCreatureClassInfo.KnownSpells[].Count
instead.CreatureClassInfo.GetKnownSpells
- useCreatureClassInfo.KnownSpells
instead.
- Fixed null/empty script names not clearing object event scripts.
- Fixed an issue where an invalid script name could be assigned to an object event.
- Fixed a NRE in the
ModuleEvents.OnAcquireItem
event caused by characters failing ELC. - Fixed a cast exception in the
PlaceableEvents.OnDisturbed
event when the last inventory event was not caused by a creature. - NwStore: Fixed
WillNotBuyItems
,WillOnlyBuyItems
lists not removing items, and LINQ functions (ToList/ToArray) not working. - CreatureLevelInfo:
ClassInfo
now returns the correct creature class. - ItemPropertyItemMapTable: Fixed some item property values returning valid when they shouldn't be.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.24...v8193.34.25
- Exposed
HomeStorage
class for accessing paths in anvil home. - Added support for creating
Cassowary
solvers throughnew Cassowary()
- NwGameObject: Added
ActionJumpToLocation
method. - Events: Added
OnPlayerQuickChat
event. - NwPlayer: Added object name override support (SetObjectNameOverride)
- NwPlayer: Added player-specific looping vfx support (AddLoopingVisualEffect)
- NwCreature: Added
LevelUp
method that bypasses validation.
- NLog: 5.1.1 -> 5.1.2
- Microsoft.CodeAnalysis.CSharp: 4.4.0 -> 4.5.0
- Optional anvil services will now log a message when they are used.
- !! Fixed a memory leak when not using
Dispose()
on engine structures. (Effect, Location, ItemProperty, Json, SQLQuery, Talent)
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.23...v8193.34.24
- Implemented AI message and listen system.
- NwGameObject: Added
IsListening
property. - NwGameObject: Added
SetListenPattern
method. - NwCreature: Added
SetAssociateListenPatterns
method. - OnConversation events: Added
ListenPattern
,AssociateCommand
properties.
- NwGameObject: Added
- OnTrapTriggered: Added
TriggeredBy
property to door/placeable traps. - CreatureClassInfo: Added
Domains
array for reading/modifying creature domains.
- NWN.Core: 8193.34.10 -> 8193.34.12
DoorEvents.OnDialogue
- useDoorEvents.OnConversation
instead.PlaceableEvents.OnDialogue
- usePlaceableEvents.OnConversation
instead.
- Fixed an issue with events that caused script handlers not to be called after reloading anvil.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.22...v8193.34.23
- Added
ANVIL_ENCODING
environment variable for specifying a custom encoding when converting native strings from nwserver. - Added
EncodingService
for changing the server encoding at runtime. - NUI: Added StrRef support with
NuiBindStrRef
andNuiValueStrRef
types. - Events: Added
OnDoorSetOpenState
event. - Events: Added
OnObjectUse
event. - Extensions: Added
TryParseObject
extension for parsing object ID strings. - NwCreature: Added
GetInitiativeModifier
,SetInitiativeModifier
,ClearInitiativeModifier
methods. - NwCreature: Added
IsDMAvatar
property. - NwCreature: Added
IsFlanking
method. - NwDoor: Added
DoorOpenState
property. - NwRuleset: Added NwDomain ruleset table and replaced constant usages with table references.
- NwServer: Added
IsActivePaused
property. - NwServer: Added
IsTimestopPaused
property.
- Microsoft.CodeAnalysis.CSharp: 4.3.1 -> 4.4.0
- NWN.Core: 8193.34.7 -> 8193.34.10
- NWN.Native: 8193.34.4 -> 8193.34.5
- LightInject: 6.6.1 -> 6.6.3
- Newtonsoft.Json: 13.0.1 -> 13.0.2
- NLog: 5.0.5 -> 5.1.1
- Paket.Core: 7.1.5 -> 7.2.0
- NWNX: fe195ec -> 2692ecb
- Events:
OnSpellAction
Domain and Feat is now nullable. - Events:
OnSpellInterrupt
Domain and Feat is now nullable. - Events:
OnSpellSlotMemorize
Domain is now nullable. System.Random
usages now use theSystem.Random.Shared
instance, instead of individual instances.
- Fixed an issue where a GameObject or Player could become stuck in a hash-based collection when it became invalid.
- NwPlayer:
IsDM
now correctly returns true when a DM is possessing a creature. UseControlledCreature.IsDM
for the prior behaviour.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.21...v8193.34.22
- NLog: 5.0.4 -> 5.0.5
- OnSpellCast: Item, Spell and TargetObject can be null.
- NwItem:
Clone()
now preserves the item'sDroppable
flag. An optional parameter is provided to keep the old behaviour.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.20...v8193.34.21
- NwAreaOfEffect: Added
Radius
property.
- NWNX: 8faa9d4 -> fe195ec
- OnSpellCast:
Caster
andTargetObject
now correctly useNwObject
as the event data type.
- Fixed a server crash when a module or area attempted to cast a spell.
- Fixed an edge case where a deleted player's TURD would not be deleted.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.19...v8193.34.20
- CollectionExtensions: Added IList
AddRange
extension. - NwCreature: Added
IsBartering
property. - NwObject: Added
TryGetUUID
method. - NwObject: Added
SerializeToJson
method. - NwStore: Added
BuyStolenGoods
,MarkDown
,MarkDownStolen
,MarkUp
,WillNotBuyItems
,WillOnlyBuyItems
properties.
- LightInject: 6.5.1 -> 6.6.1
- Exposed Json engine structure.
- VirtualMachine: Fixed an issue where ObjectSelf would not be correctly assigned.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.18...v8193.34.19
- Events: Added
OnLoadCharacterFinish
event.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.17...v8193.34.18
- Fix an InvalidOperationException being thrown when checking player for equality.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.16...v8193.34.17
- NwCreature: Added
SittingObject
property. - NwArea: Added
LoadScreen
property. - ResourceManager: Added
CreateResourceDirectory
.
- NwBaseItem: Fixed
ItemClass
returning a type name instead of the item class name. - Fixed a rare compile issue when using
ToNwObject
caused by exposed native types.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.15...v8193.34.16
- Events: Added
OnDebugPlayVisualEffect
,OnDebugRunScript
,OnDebugRunScriptChunk
events. - NwGameObject: Added
AnimationState
. - Effect: Added
Effect.VisualEffect(VisualEffectTableEntry, bool, float, Vector3, Vector3)
overload.
- NWN.Core 8193.34.6 -> 8193.34.7
- LightInject 6.4.1 -> 6.5.1
- NLog 5.0.1 -> 5.0.4
- NWNX 5ade7de -> 8faa9d4
- SchedulerService: Use
PriorityQueue
to improve main server loop performance.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.14...v8193.34.15
- ItemProperty: Added
SubTypeTable
.
- Fixed
CalculateValidItemsForProperty
returning false for base items using column 0.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.13...v8193.34.14
- NuiText: Added
Border
andScrollbars
properties. - ItemProperty: Added properties for referencing 2da data.
- ItemProperty: Added Create() factory method overload using the new table class types.
- NwGameTables: Added
ItemPropertyTable
,ItemPropertyItemMapTable
,ItemPropertyCostTables
,ItemPropertyParamTables
- BREAKING CHANGE: TwoDimArrays must now be initialized via
NwGameTables.GetTable
.
- Fixed a server crash when using TwoDimArray after the native array structure was evicted from the 2da cache.
- Fixed updating the weight of a equipped item with
NwItem.Weight
not correctly updating creature weight and encumbrance. - Fixed
NwBaseItem.ArmorCheckPenalty
returning an unsigned integer.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.12...v8193.34.13
- NLog 5.0.0 -> 5.0.1
- NWN.Core 8193.34.5 -> 8193.34.6
- NWNX 95e700a -> 5ade7de
- NUI: DrawList is now supported on all NUI elements, instead of just layout elements.
- NUI: NuiGroup now supports a non-layout element.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.11...v8193.34.12
- NwGameTables: Exposed armor (armor.2da) and parts (parts_*.2da) tables.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.10...v8193.34.11
- NwCreature: Added
GetSlotFromItem
- NwCreature: Added
RunEquip(item, EquipmentSlots)
- ItemAppearance: Added
ChangeAppearance
- NuiWindowToken: Added
Get/SetUserData()
- Effect: Added
SkillIncreaseAll
,SkillDecreaseAll
- NWNX 4842f60 -> 95e700a
- NWN.Native 8193.34.3 -> 8193.34.4
- NWN.Core 8193.34.4 -> 8193.34.5
- NLog 4.7.15 -> 5.0.0
ItemAppearanceArmorModel
enum. UseCreaturePart
instead.NwPlayer.NuiDestroy
. UseNuiWindowToken.Close
instead.NwPlayer.NuiGetUserData
. UseNuiWindowToken.NuiGetUserData
instead.NwPlayer.NuiSetUserData
. UseNuiWindowToken.NuiSetUserData
instead.NwPlayer.NuiGetWindowId
. UseNuiWindowToken.NuiGetWindowId
instead.
- Fixed
NwGameObject.Location
setter not working for newly deserialized game objects. - Fixed a crash when an equipped item was sent to limbo with
NwModule.MoveObjectToLimbo
. - Fixed
NuiWindowToken.WindowId
returning an empty string from events. - Speculative fix for a rare native crash when fetching 2da strings.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.9...v8193.34.10
- Added ClientVersion/ClientPlatform properties to OnClientConnect event.
- NWNX 3227d60 -> 4842f60
- NWN.Core 8193.34.3 -> 8193.34.4
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.8...v8193.34.9
- NwCreature - Added setters for base armor & shield arcane spell failure
NuiWindowToken
- small structure with helper methods for controlling NuiWindow instances. Can be created fromNwPlayer.TryCreateNuiWindow
- NwCreature - Added getter for BaseAttackCount
- NwCreature - Added setter for ChallengeRating.
- Paket 7.1.4 -> 7.1.5
NwCreature.Position
will no-longer block the action queue from being modified.- This fixes inconsistencies with actions queued after setting the position, but the new position can sometimes not apply for players using drive mode.
- For players, it is recommended to immobilize them before setting their position.
NwPlayer.TryCreateNuiWindow
- use theNuiWindowToken
overload instead.NwPlayer.CreateNuiWindow
- useTryCreateNuiWindow
instead.ModuleEvents.OnNuiEvent.WindowToken
- useModuleEvents.OnNuiEvent.Token
instead.
- Fixed
NwGameObject.Location
setter re-triggering Area Enter events. - Fixed
NwPlayer.PartyMembers
throwing a NRE when a party contained associate creatures. - Fixed a typo in PlayOptions.OnePartyOnly.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.7...v8193.34.8
NwObject.Destroy(float delay)
- Use the non-delay overload instead, with theSchedulerService
.
- Fixed
NwEncounter.Destroy()
not destroying the encounter object. - Fixed
PlaceableEvents.OnPhysicalAttacked
event always returning no data.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.6...v8193.34.7
- NWNX 6a552d9 -> 3227d60
- Fixed an edge case issue that caused some servers to enter an infinite crash loop when shutting down.
- Fixed
NWNX_CORE_SHUTDOWN_SCRIPT
throwing a NRE during shutdown.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.5...v8193.34.6
- Added
Color
equality membersEquals
and operators==
!=
NwGameTables
: AddedExpTable
NwGameTables
: AddedSkillItemCostTable
- Paket.Core 7.0.2 -> 7.1.4
- NWNX d15bc22 -> 6a552d9
- Fixed an issue that prevented .NET 6 plugins from being loaded with Paket.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.4...v8193.34.5
NwCreature.Encounter
: Gets the encounter that spawned the creature.NwAreaOfEffect.Spell
: Gets the spell that created the area of effect.NwAreaOfEffect.RemainingDuration
: Gets the remaining duration on the area of effect.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.3...v8193.34.4
- Fixed an issue where API services would not be constructed in the expected order.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.2...v8193.34.3
StrRef.ToParsedString()
: Gets the string associated with a StrRef and parses any tokens (e.g. <CUSTOM0>)StrTokenCustom
: New structure for resolving/setting custom token values.NwGameTables
: Added new 2da tablesBodyBagTable
LightColorTable
PlaceableSoundTable
PlaceableTable
ProgrammedEffectTable
VisualEffectTable
NwArea
: AddedGetTileInfo()
- Added
InjectionService
&ServiceBinding
tests. NwPlaceable.Appearance
: Gets or sets the appearance for the placeable.ModuleLoadTracker
: Added core service for tracking module load progress as debug log messages.- If a module fails to load due to an error with an area, the area is logged as an error instead.
NwPlayer
: Added player name override methods.PlayerNameOverrideService
contains configuration options.
NwCreature
: AddedGetFeatRemainingUses
GetFeatTotalUses
SetFeatRemainingUses
- Added
OnMapPinAddPin
,OnMapPinChangePin
,OnMapPinDestroyPin
events. NwCreature
: Added damage level override functions (ClearDamageLevelOverride
,GetDamageLevelOverride
,SetDamageLevelOverride
)NwCreature
: AddedDamageLevel
property.NwGameTables
: AddedDamageLevelTable
- NWNX c51d233 -> d15bc22
- NWN.Core 8193.34.2 -> 8193.34.3
- LightInject 6.4.0 -> 6.4.1
- NLog 4.7.13 -> 4.7.15
- Paket.Core 6.2.1 -> 7.0.2
- Rewrote core services and initialisation logic for easier extensibility, and reduced coupling with AnvilCore.
- All core services now implement
ICoreService
, an interface containing specific event functions that are called at specific times in the server lifecycle. - Core services are executed in the order defined by
ServiceBindingOptions
. - The CoreService composition root is defined in
AnvilServiceManager
. - AnvilCore is now "dumber", and simply passes signals to
AnvilServiceManager
andVirtualMachineFunctionHandler
. AnvilServiceManager
merges service initialization inAnvilCore
, with the container/composition root setup fromIContainerFactory
- All core services now implement
OnPlayerDeath.Killer
now tries toGetLastDamager
whenGetLastHostileActor
is invalid.
NwGameObject.CreatureAppearanceType
. UseNwCreature.Appearance
instead.- APIs using int-based StrRef parameters have been deprecated. Please use the StrRef overloads:
NwGameObject.PlaySoundByStrRef()
NwPlayer.ClearTlkOverride()
NwPlayer.SetTlkOverride()
NwBaseItem.BaseItemStatsText
NwBaseItem.Description
NwBaseItem.Name
NwClass.Description
NwClass.Name
NwClass.NameLower
NwClass.NamePlural
NwFeat.Description
NwFeat.Name
NwSkill.Description
NwSkill.Name
NwSpell.AltMessage
NwSpell.Description
NwSpell.Name
OnELCValidationFailure.StrRef
- Fixed a stack overflow when injecting the
InjectionService
as a property dependency. - Unload is now triggered on all plugins before waiting for the assemblies to be unloaded. This fixes some edge cases where assemblies would not unload.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.1...v8193.34.2
- Added net6.0 target framework. Since multiple frameworks are now being targeted, there is a small change to the binary output paths.
- When building locally, binaries are now located in
NWN.Anvil/bin/Release/<framework>
. Release binaries on github will now have a folder for each framework.
- When building locally, binaries are now located in
NwColor
: AddedFromRGBA
,ToRGBA
ToUnsignedRGBA
methods.ToString
is now more explicit.- Added various tests for
Color
conversion. - Added
ResourceManager
tests. NwArea
: Added various properties for environment visual options and metadata.NwArea
: AddedCreateEnvironmentPreset
,ApplyEnvironmentPreset
for saving and loading preset visual options.NwWaypoint.Create
: Added overload without template parameter for creating a general waypoint.PlayOptions
: Added PlayerPartyControl option.StrRef
: Added value structure for string references (StrRefs). The associated talk table string can be resolved by invokingToString
.NwGameTables
: Contains static members for commonly used 2das (internally cached byCTwoDimArrays
).- Implemented
AppearanceTable
&EnvironmentPresetTable
- Implemented
- Implemented new
TwoDimArray
,TwoDimArrayEntry
andITwoDimArrayEntry
APIs.- Supports general usage through
TwoDimArray
, and a genericTwoDimArray<T>
type for specifying a custom row format. See the docs for more info.
- Supports general usage through
ResourceManager
: AddedDeleteTempResource
andGetResourceText
.ResourceManager
: Added string overload forWriteTempResource
.LocalVariableStruct
: Added local variable type for serializing any C# type to JSON.PersistentVariableStruct
: Added persistent variable type for serializing any C# type to JSON.- Added
OnTriggerEnter
event.
- NWNX: 790a54b -> c51d233
- NWN.Core: 8193.34.1 -> 8193.34.2
- NWN.Native: 8193.34.2 -> 8193.34.3
- Change test assertion pattern to use NUnit constraints: https://docs.nunit.org/artcles/nunit/writing-tests/assertions/assertion-models/constraint.html
- Code samples are now built as a separate plugin project, and included in CI analysis.
- Improved path validation for
Delete/WriteTempResource
. It should no-longer be possible to navigate outside of the resource folder.
NwServer.ReloadRules()
. UseNwRuleset.ReloadRules()
instead.NwColor.ToInt()
. UseNwColor.ToRGBA()
instead.ITwoDimArray
/TwoDimArrayFactory
: The 2da APIs have been superseded by a simpler API. See theITwoDimArrayEntry
example for more info.NwArea.GetFogAmount
: UseSunFogAmount
andMoonFogAmount
instead.NwArea.GetFogColor
: UseSunFogColor
andMoonFogColor
instead.
- NuiColor was removed and functionality replaced with the standard
Color
class. The intention is to remove confusion and conversion issues when interacting with both types.
- Fixed a NRE when using visibility properties.
- Fixed a NRE when using
PersistentVariableEnum
.
https://github.com/nwn-dotnet/Anvil/compare/v8193.34.0...v8193.34.1
- NwPlayer:
IsConnected
boolean added. Should be checked when enumeratingNwModule.Players
- NwPlayer: Added
DMPossessCreature
andUnpossessCreature
for controlling player creature. - NwPlayer:
ForceExamine
now supports creatures, placeables, items and doors. - Implemented
NWN.Anvil.TestRunner
for running automated tests. - NwPlayer: Added
Get/SetPersonalVisibilityOverride
methods for customizing object visibility per player. - NwGameObject: Added
VisibilityOverride
property for customizing object visibility globally. - Creature Events: Added
OnCreatureCheckProficiencies
event. - Added
Local/Campaign/PersistentVariableEnum<T>
object variable type for user enum types. The underlying type must be an integer. - NwGameObject: Added
Clone
method for cloning non-creature and item objects. - NwDoor: Added
Create
method for creating doors from ResRefs. - NwEncounter: Added
Create
method for creating encounters from ResRefs. - NwSound: Added
Create
method for creating sound objects from ResRefs. - NwTrigger: Added
Create
method for creating triggers from ResRefs. - NWN.Anvil.TestRunner: Added generator for generating ResRef constants from the standard creator palette.
- NWN.Core: 8193.34.0 -> 8193.34.1
NwCreature.WalkRateCap
andNwCreature.AlwaysWalk
properties are no-longer persistent. Additionally, the services and functions are not hooked until the associated property is used for the first time.NwObject.ObjectId
is now public.
AnvilCore.Reload()
now uses the scheduler service to schedule the reload. This should fix some edge cases where async methods would hold a reference preventing unload.- Fixed an issue where the
SchedulerService
would throw an exception if the server was shutdown/reloaded during a schedule callback. - Fixed a rare crash when subscribed to effect events.
https://github.com/nwn-dotnet/Anvil/compare/v8193.33.5...v8193.34.0
NwBaseItem
: Added various properties.NwSpell
: Added various properties.NwClass
: Added various properties.- Added support for
NuiList
&NuiListTemplateCell
. Effect.DurationType
: Added setter.- Added assembly attribute
PluginInfo
for defining optional dependencies. PluginManager
: Added check for missing types from optional plugins.
- (Docker) NWNX: 16b2c88 -> 790a54b
- NWN.Core: 8193.33.4 -> 8193.34.0
- NWN.Native: 8193.33.4 -> 8193.34.2
- Services implementing
IInitializable
are now executed in deterministic order based on the service binding order defined inServiceBindingOptions
. - Updated APIs to use ruleset classes
Effect.SkillDecrease(NwSkill,int)
Effect.SkillIncrease(NwSkill,int)
Effect.Spell
ItemProperty.DecreaseSkill(NwSkill,int)
ItemProperty.SkillBonus(NwSkill,int)
Talent.Feat
Talent.Skill
Talent.Spell
NwSkill.ToTalent(this NwSkill)
NwSkill.ToTalent(this NwSpell)
NwSkill.ToTalent(this NwFeat)
CreatureEvents.OnSpellCastAt.Spell
CreatureEvents.OnSpellCastAt.Signal(NwObject,NwCreature,NwSpell,bool)
DoorEvents.OnSpellCastAt.Spell
DoorEvents.OnSpellCastAt.Signal(NwObject,NwDoor,NwSpell,bool)
ModuleEvents.OnPlayerGuiEvent.FeatSelection
ModuleEvents.OnPlayerGuiEvent.SkillSelection
PlaceableEvents.OnSpellCastAt.Spell
PlaceableEvents.OnSpellCastAt.Signal(NwObject,NwPlaceable,NwSpell,bool)
OnDisarmWeapon.Feat
OnUseFeat.Feat
OnUseSkill.Skill
OnSpellAction.Feat
OnSpellAction.Spell
OnSpellBroadcast.Feat
OnSpellBroadcast.Spell
OnSpellCast.Spell
OnSpellInterrupt.Feat
OnSpellInterrupt.Spell
OnSpellSlotMemorize.Spell
SpellEvents.OnSpellCast.Spell
SpellEvents.OnSpellCast.SpellCastClass
CreatureClassInfo.Class
CreatureClassInfo.AddKnownSpell(NwSpell,byte)
CreatureClassInfo.ClearMemorizedKnownSpells(NwSpell)
CreatureClassInfo.GetKnownSpells(byte)
CreatureClassInfo.RemoveKnownSpell(byte,NwSpell)
CreatureLevelInfo.Class
CreatureLevelInfo.Feats
CreatureLevelInfo.GetSkillRank(NwSkill)
CreatureLevelInfo.SetSkillRank(NwSkill,sbyte)
CreatureTypeFilter.Class(NwClass)
CreatureTypeFilter.DoesNotHaveSpellEffect(NwSpell)
CreatureTypeFilter.HasSpellEffect(NwSpell)
MemorizedSpellSlot.Spell
NwCreature.Classes
NwCreature.Feats
NwCreature.ActionCastFakeSpellAt(NwSpell,Location,ProjectilePathType)
NwCreature.ActionCastFakeSpellAt(NwSpell,NwGameObject,ProjectilePathType)
NwCreature.ActionUseFeat(NwFeat,NwGameObject)
NwCreature.ActionUseSkill(NwSkill,NwGameObject,SubSkill,NwItem)
NwCreature.AddFeat(NwFeat)
NwCreature.AddFeat(NwFeat,int)
NwCreature.DecrementRemainingFeatUses(NwFeat,int)
NwCreature.DoSkillCheck(NwSkill,int)
NwCreature.GetClassDomains(NwClass)
NwCreature.GetClassInfo(NwClass)
NwCreature.GetFeatGainLevel(NwFeat)
NwCreature.GetSkillRank(NwSkill,bool)
NwCreature.GetSpecialization(NwClass)
NwCreature.HasFeatEffect(NwFeat)
NwCreature.HasFeatPrepared(NwFeat)
NwCreature.HasSkill(NwSkill)
NwCreature.HasSpellEffect(NwSpell)
NwCreature.HasSpellUse(NwSpell)
NwCreature.IncrementRemainingFeatUses(NwFeat,int)
NwCreature.KnowsFeat(NwFeat)
NwCreature.LevelUpHenchman(NwClass,PackageType,bool)
NwCreature.MeetsFeatRequirements(NwFeat)
NwCreature.RemoveFeat(NwFeat)
NwCreature.SetSkillRank(NwSkill)
NwGameObject.ActionCastSpellAt(NwSpell,NwGameObject,MetaMagic,bool,int,ProjectilePathType,bool)
NwGameObject.ActionCastSpellAt(NwSpell,Location,MetaMagic,bool,int,ProjectilePathType,bool)
SpecialAbility(NwSpell,byte,bool)
SpecialAbility.Spell
OnELCSkillValidationFailure.Skill
OnELCSkillValidationFailure.Feat
OnELCSkillValidationFailure.Spell
WeaponService.Add***Feat(NwBaseItem,NwFeat)
CursorTargetService.EnterTargetMode
- Use NwPlayer.EnterTargetMode/NwPlayer.TryEnterTargetMode instead.
Effect.AreaOfEffect(int,string,string,string)
AttributeExtensions
StandardFactionExtensions
CreatureTypeFilter.RacialType
Inventory.CheckFit(BaseItemType)
NwCreature.RacialType
NwCreature.ChangeToStandardFaction
NwItem.BaseItemType
NwItem.CanStack
NwItem.IsStackable
NwPlayer.NuiSetGroupLayout(int,string,NuiGroup)
NwPlayer.NuiSetGroupLayout(int,string,NuiWindow)
NwFaction(int)
Anvil.Services.NwDateTime
LoopTimeService
ServiceBindingOptions.MissingPluginDependencies
ServiceBindingOptions.Order
https://github.com/nwn-dotnet/Anvil/compare/v8193.33.4...v8193.33.5
- NwModule: Added
LimboGameObjects
property to list all GameObjects currently stored in limbo. - NwModule: Added
MoveObjectToLimbo
method to remove a GameObject from an area and store it in limbo. - NwCreature: Added
AlwaysWalk
andWalkRateCap
for restricting creature & player movement. - Added
OnCheckEffectImmunity
event for bypassing effect immunity checks. - Added
OnEffectApply
andOnEffectRemove
events. - Added ruleset APIs:
NwRuleset
,NwBaseItem
,NwClass
,NwFeat
,NwRace
NwSkill
andNwSpell
- Migrated LoopTimeService properties to static class
Anvil.API.Time
. - Exposed
ScheduledTask
to Scheduler Service. - Services implementing
IUpdateable
are now executed in deterministic order based on the service binding order defined inServiceBindingOptions
.
LoopTimeService
- useAnvil.API.Time
instead.- Moved
NwDateTime
andNwTimeSpan
toAnvil.API
namespace. - Duplicated APIs
NwItem.CanStack
/NwItem.IsStackable
. UseNwBaseItem.IsStackable
instead.
https://github.com/nwn-dotnet/Anvil/compare/v8193.33.3...v8193.33.4
- (Docker) Update NWNX to 16b2c88.
- Startup log now includes the git revision of the current running server binary.
- Server revision is now printed to stdout if startup fails.
https://github.com/nwn-dotnet/Anvil/compare/v8193.33.2...v8193.33.3
- Implemented
PaketPluginSource
for installing and running NuGet-based plugins. - Implemented support for custom plugin sources with the
IPluginSource
interface. - Implemented
PluginStorageService
- a unified API for storing plugin data and configurations. - Added
ANVIL_HOME
environment variable. This variable defines the root path where Anvil config files, plugins and plugin data are read from. - Added additional properties to
NwEncounter
. - Added IsStackable to 'NwItem'
- NWN.Core -> 8193.33.4
- NWN.Native -> 8193.33.4
- BREAKING CHANGE - Removed
ANVIL_NLOG_CONFIG
environment variable. The config path is now fixed to{ANVIL_HOME}/nlog.config
- BREAKING CHANGE - Removed
ANVIL_PLUGIN_PATH
environment variable. The plugin load path is now fixed to{ANVIL_HOME}/Plugins
- Fixed a server crash when preventing player connections in the
OnClientConnect
event. - Fixed
OnClientConnect.CDKey
returning a type name instead of the client's public CD key.
https://github.com/nwn-dotnet/Anvil/compare/v8193.33.1...v8193.33.2
- ResourceManager: Implemented GffResource API.
- [Inject]: Property-based dependencies can now be flagged as "Optional". Optional dependencies do not throw exceptions if the service could not be loaded from a missing plugin assembly.
[ServiceBindingOptions]
- TheBindingPriority
property defines the initialization order of a service. (Higher priority = initialized first).- When injecting a dependency of an interface/base class and multiple candidates are available, the service with the highest
BindingPriority
will be injected. NwCreature.Age
can now be set.
[ServiceBindingOptions]
-Order
has been deprecated and replaced with theBindingPriority
property.[ServiceBindingOptions]
-MissingPluginDependencies
has been deprecated as functionality is covered by theBindingPriority
dependency resolve behaviour.AttributeExtensions
- moved toReflectionExtensions
.NwPlayer.NuiSetGroupLayout
- moved toNuiGroup.SetLayout
.
- Properties injected into service classes with plugin dependency requirements will no-longer throw an exception when the assembly is missing.
- Fixed NuiGroup.SetLayout creating nested layout elements instead of updating the existing element (
NwPlayer.NuiSetGroupLayout
still has the old behaviour.)
https://github.com/nwn-dotnet/Anvil/compare/v8193.33.0...v8193.33.1
- Update to NWN.Core 8193.33.1
- Fixed an issue when retrieving bind values for certain class/structures (NuiRect, NuiVector, etc.) would return the default value.
- Fixed an incorrect API/object mapping for NuiDrawList.
https://github.com/nwn-dotnet/Anvil/compare/v8193.26.3...v8193.33.0
- NUI: Implement API with classes, added methods to NwPlayer.
- Effect: Added
Effect.Icon()
factory method for creating Icon effects. - Effect: Added
Effect.RunAction()
factory methods for creating effects that invoke C# actions. - ScriptHandleFactory: New service for dynamically creating function callbacks at runtime that are bound to script names. The returned handle is currently used for script parameters in effects.
- ModuleEvents: Added
OnPlayerGuiEvent
,OnNuiEvent
andOnPlayerTarget
events. - GUIPanel: Added new constants published with NWN 8193.31
- NwPlayer: Added
SetGuiPanelDisabled
for disabling built-in GUI elements. - NwPlayer: Added
RestDurationOverride
property. - VirtualMachine: Added
RecursionLevel
property. - LocalVariableCassowary: Added to support cassowary local variables.
- ILateDisposable: Added a new service event interface that is invoked after the server is destroyed.
- ServiceBindingOptions: Added
PluginDependencies
andMissingPluginDependencies
properties for setting up services with optional plugin dependencies. - Added
PRELINK_ENABLED
setting for disabling native prelink checks.
- Refactored various internal usages of NWN.Native to use collection/list accessors for native types.
- VirtualMachine:
IsInScriptContext
now checks the current executing thread, and now only returns true while on the main thread and inside of a VM script context. - HookService: Hooks are now returned/disposed after the server has been destroyed.
- IScriptDispatcher: Custom Script Dispatchers must now define an execution order. This order is used when a script call is triggered from the VM, and determines which service/s implementing this interface get executed first.
- ObjectStorageService (Breaking): Persistent data written in Anvil can no-longer be accessed by NWNX. Anvil can still import NWNX persistent data.
- ObjectStorageSerive: Anvil no-longer writes a duplicate
NWNX_POS
serialized field and instead writes its ownANVIL_POS
field for persistent object data.
- Effect: Deprecated
Effect.AreaOfEffect
that uses strings for the script handlers. Use the overload that usesScriptCallbackHandle
parameters instead.
- HookService: Removed the optional
shutdownDispose
parameter (superseded byILateDisposable
). - AnvilCore: Removed custom
ITypeLoader
support, and hardcoded references to the updatedPluginManager
.
- Fixed an issue where the
ObjectStorageService
would cause errors when performing hot reloads withAnvilCore.Reload()
- Fixed an issue where the PluginLoader would attempt to unload plugins too early during server shutdown/hot reload.
- Fixed an issue where the
EnforceLegalCharacterService
would call theELCValidationBefore
event outside of a script context. - Fixed
OnChatMessageSend.Target
always being null. - Fixed Plugin Unloadability & Hot Reload.
- Fixed a native crash caused by a conflict with Anvil's
ObjectStorageService
and NWNX's Object Storage (POS).
https://github.com/nwn-dotnet/Anvil/compare/v8193.26.2...v8193.26.3
- OnCreatureDamage: Fixed damage hook function returning void instead of an int. Resolves an issue where damage effects would persist on a character, and be applied again after login.
https://github.com/nwn-dotnet/Anvil/compare/v8193.26.1...v8193.26.2
- IEvent: Exposed "Context" property, allowing plugins to implement custom events.
https://github.com/nwn-dotnet/Anvil/compare/v8193.26.0...v8193.26.1
- OnCreatureDamage: Fixed a server crash when a creature received damage from non-object sources. (EffectDamage from a module/area event, etc.)
https://github.com/nwn-dotnet/Anvil/compare/ffd9cd6dd0d6626ebc325265a8a8b370dd74d66b...v8193.26.0