From 64fd11b072cf0416de8f60425a1864409f9f204b Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Sat, 23 Aug 2025 22:45:32 +0800 Subject: [PATCH] fix --- src/EcsWorld.cs | 6 +++++- src/EcsWorld.static.cs | 8 +++++++- src/Pools/EcsPool.cs | 8 ++++---- src/Pools/EcsPoolBase.cs | 7 ++++++- src/Pools/EcsTagPool.cs | 2 +- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 96c420a..441dab5 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -182,7 +182,11 @@ namespace DCFApixels.DragonECS if (worldID < 0 || (worldID == NULL_WORLD_ID && nullWorld == false)) { - worldID = (short)_worldIdDispenser.UseFree(); + int newID = _worldIdDispenser.UseFree(); +#if DEBUG && DRAGONECS_DEEP_DEBUG + if (newID > short.MaxValue) { Throw.DeepDebugException(); } +#endif + worldID = (short)newID; } else { diff --git a/src/EcsWorld.static.cs b/src/EcsWorld.static.cs index 2d63671..40138a3 100644 --- a/src/EcsWorld.static.cs +++ b/src/EcsWorld.static.cs @@ -234,6 +234,12 @@ namespace DCFApixels.DragonECS Array.Resize(ref _mapping, _worlds.Length); } ref short itemIndex = ref _mapping[worldID]; +#if DEBUG && DRAGONECS_DEEP_DEBUG + if (itemIndex >= _worlds.Length) + { + Throw.UndefinedException(); + } +#endif if (itemIndex != 0) { _interface.OnDestroy(ref _items[itemIndex], _worlds[worldID]); @@ -241,8 +247,8 @@ namespace DCFApixels.DragonECS { Array.Resize(ref _recycledItems, _recycledItems.Length << 1); } - _items[itemIndex] = default; _recycledItems[_recycledItemsCount++] = itemIndex; + _items[itemIndex] = default; itemIndex = 0; } } diff --git a/src/Pools/EcsPool.cs b/src/Pools/EcsPool.cs index 8e11780..3afa805 100644 --- a/src/Pools/EcsPool.cs +++ b/src/Pools/EcsPool.cs @@ -128,8 +128,8 @@ namespace DCFApixels.DragonECS { ref int itemIndex = ref _mapping[entityID]; #if DEBUG - if (entityID == EcsConsts.NULL_ENTITY_ID) { Throw.Ent_ThrowIsNotAlive(_source, entityID); } - if (_source.IsUsed(entityID) == false) { Throw.Ent_ThrowIsNotAlive(_source, entityID); } + if (entityID == EcsConsts.NULL_ENTITY_ID) { EcsPoolThrowHelper.ThrowEntityIsNotAlive(_source, entityID); } + if (_source.IsUsed(entityID) == false) { EcsPoolThrowHelper.ThrowEntityIsNotAlive(_source, entityID); } if (itemIndex > 0) { EcsPoolThrowHelper.ThrowAlreadyHasComponent(entityID); } if (_isLocked) { EcsPoolThrowHelper.ThrowPoolLocked(); } #elif DRAGONECS_STABILITY_MODE @@ -179,7 +179,7 @@ namespace DCFApixels.DragonECS public ref T TryAddOrGet(int entityID) { #if DEBUG - if (entityID == EcsConsts.NULL_ENTITY_ID) { Throw.Ent_ThrowIsNotAlive(_source, entityID); } + if (entityID == EcsConsts.NULL_ENTITY_ID) { EcsPoolThrowHelper.ThrowEntityIsNotAlive(_source, entityID); } #endif ref int itemIndex = ref _mapping[entityID]; if (itemIndex <= 0) @@ -222,7 +222,7 @@ namespace DCFApixels.DragonECS { ref int itemIndex = ref _mapping[entityID]; #if DEBUG - if (entityID == EcsConsts.NULL_ENTITY_ID) { Throw.Ent_ThrowIsNotAlive(_source, entityID); } + if (entityID == EcsConsts.NULL_ENTITY_ID) { EcsPoolThrowHelper.ThrowEntityIsNotAlive(_source, entityID); } if (itemIndex <= 0) { EcsPoolThrowHelper.ThrowNotHaveComponent(entityID); } if (_isLocked) { EcsPoolThrowHelper.ThrowPoolLocked(); } #elif DRAGONECS_STABILITY_MODE diff --git a/src/Pools/EcsPoolBase.cs b/src/Pools/EcsPoolBase.cs index 8d4d93a..dc84ca8 100644 --- a/src/Pools/EcsPoolBase.cs +++ b/src/Pools/EcsPoolBase.cs @@ -45,6 +45,11 @@ namespace DCFApixels.DragonECS.PoolsCore throw new ArgumentException($"Entity({entityID}) has no component {EcsDebugUtility.GetGenericTypeName()}."); } [MethodImpl(MethodImplOptions.NoInlining)] + internal static void ThrowEntityIsNotAlive(EcsWorld world, int entityID) + { + Throw.Ent_ThrowIsNotAlive((world, entityID)); + } + [MethodImpl(MethodImplOptions.NoInlining)] public static void ThrowAlreadyHasComponent(Type type, int entityID) { throw new ArgumentException($"Entity({entityID}) already has component {EcsDebugUtility.GetGenericTypeName(type)}."); @@ -316,7 +321,7 @@ namespace DCFApixels.DragonECS self.InvokeOnGet(entityID, self.Count); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void InvokeOnGet(this List self, int entityID, int cachedCount) + public static void InvokeOnGet(this List self, int entityID, int cachedCount) { for (int i = 1; i < cachedCount; i++) { self[i].OnGet(entityID); } } diff --git a/src/Pools/EcsTagPool.cs b/src/Pools/EcsTagPool.cs index 885184c..536fe9c 100644 --- a/src/Pools/EcsTagPool.cs +++ b/src/Pools/EcsTagPool.cs @@ -116,7 +116,7 @@ namespace DCFApixels.DragonECS public void Add(int entityID) { #if DEBUG - if (_source.IsUsed(entityID) == false) { Throw.Ent_ThrowIsNotAlive(_source, entityID); } + if (_source.IsUsed(entityID) == false) { EcsPoolThrowHelper.ThrowEntityIsNotAlive(_source, entityID); } if (Has(entityID)) { EcsPoolThrowHelper.ThrowAlreadyHasComponent(entityID); } if (_isLocked) { EcsPoolThrowHelper.ThrowPoolLocked(); } #elif DRAGONECS_STABILITY_MODE