diff --git a/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp b/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp index 2fd35877..bf1b4900 100644 --- a/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp +++ b/Nuake/src/Scripting/NetModules/SceneNetAPI.cpp @@ -39,7 +39,7 @@ namespace Nuake { return scene->GetEntity(entityName).GetHandle(); } - Coral::ManagedObject GetEntityScript(Coral::String entityName) + Coral::ManagedObject GetEntityScriptFromName(Coral::String entityName) { auto scene = Engine::GetCurrentScene(); if (!scene->EntityExists(entityName)) @@ -57,6 +57,24 @@ namespace Nuake { } } + Coral::ManagedObject GetEntityScriptFromHandle(int entityHandle) + { + auto scene = Engine::GetCurrentScene(); + + Entity entity = { (entt::entity)(entityHandle), scene.get()}; + if (!entity.IsValid()) + { + return Coral::ManagedObject(); // Error code: entity not found. + } + + auto& scriptingEngine = ScriptingEngineNet::Get(); + if (scriptingEngine.HasEntityScriptInstance(entity)) + { + auto instance = scriptingEngine.GetEntityScript(entity); + return instance; + } + } + static enum ComponentTypes { Unknown = -1, @@ -121,6 +139,17 @@ namespace Nuake { } } + bool EntityHasManagedInstance(int handle) + { + Entity entity = { (entt::entity)(handle), Engine::GetCurrentScene().get() }; + if (!entity.IsValid()) + { + return false; + } + + return ScriptingEngineNet::Get().HasEntityScriptInstance(entity); + } + void TransformSetPosition(int entityId, float x, float y, float z) { Entity entity = { (entt::entity)(entityId), Engine::GetCurrentScene().get() }; @@ -247,8 +276,10 @@ namespace Nuake { void Nuake::SceneNetAPI::RegisterMethods() { RegisterMethod("Entity.EntityHasComponentIcall", &EntityHasComponent); + RegisterMethod("Entity.EntityHasManagedInstanceIcall", &EntityHasManagedInstance); RegisterMethod("Scene.GetEntityIcall", &GetEntity); - RegisterMethod("Scene.GetEntityScriptIcall", &GetEntityScript); + RegisterMethod("Scene.GetEntityScriptFromNameIcall", &GetEntityScriptFromName); + RegisterMethod("Scene.GetEntityScriptFromHandleIcall", &GetEntityScriptFromHandle); // Components RegisterMethod("TransformComponent.SetPositionIcall", &TransformSetPosition); diff --git a/NuakeNet/src/Entity.cs b/NuakeNet/src/Entity.cs index 4118778e..c10ce899 100644 --- a/NuakeNet/src/Entity.cs +++ b/NuakeNet/src/Entity.cs @@ -1,4 +1,5 @@ -using System; +using Coral.Managed.Interop; +using System; using System.Collections.Generic; using System.Linq; using System.Numerics; @@ -18,6 +19,7 @@ namespace Nuake.Net public class Entity { internal static unsafe delegate* EntityHasComponentIcall; + internal static unsafe delegate* EntityHasManagedInstanceIcall; public enum ComponentTypes { @@ -59,7 +61,22 @@ namespace Nuake.Net // Physics public void OnCollisionInternal(int entity1, int entity2) { - OnCollision(new Entity { ECSHandle = entity1 }, new Entity { ECSHandle = entity2 }); + Entity entityInstance; + unsafe + { + bool hasInstance = EntityHasManagedInstanceIcall(entity2); + + if (hasInstance) + { + entityInstance = Scene.GetEntity(entity2); + } + else + { + entityInstance = new Entity { ECSHandle = entity2 }; + } + } + + OnCollision(new Entity { ECSHandle = entity1 }, entityInstance); } protected static Dictionary MappingTypeEnum = new Dictionary() diff --git a/NuakeNet/src/Scene.cs b/NuakeNet/src/Scene.cs index b8306b32..ef0e077e 100644 --- a/NuakeNet/src/Scene.cs +++ b/NuakeNet/src/Scene.cs @@ -6,12 +6,26 @@ namespace Nuake.Net public class Scene { internal static unsafe delegate* GetEntityIcall; - internal static unsafe delegate*> GetEntityScriptIcall; + internal static unsafe delegate*> GetEntityScriptFromNameIcall; + internal static unsafe delegate*> GetEntityScriptFromHandleIcall; public static T? GetEntity(string entityName) where T : class { NativeInstance handle; - unsafe { handle = GetEntityScriptIcall(entityName); } + unsafe { handle = GetEntityScriptFromNameIcall(entityName); } + + Entity? entity = handle.Get(); + if (entity != null && entity is T) + { + return entity as T; + } + + return null; + } + public static T? GetEntity(int entityHandle) where T : class + { + NativeInstance handle; + unsafe { handle = GetEntityScriptFromHandleIcall(entityHandle); } Entity? entity = handle.Get(); if (entity != null && entity is T)