/// <summary> /// Removes an actor by channelId /// </summary> /// <param name="channelId"></param> public static void Remove(int channelId) { var actorInfo = NativeActorMethods.GetActorInfoByChannelId((ushort)channelId); if (actorInfo.Id != 0) { NativeActorMethods.RemoveActor(actorInfo.Id); } }
void RemoteInvocation(EntityBase target, MethodInfo method, NetworkTarget netTarget, int channelId = -1, params object[] args) { #if !(RELEASE && RELEASE_DISABLE_CHECKS) if (!method.ContainsAttribute <RemoteInvocationAttribute>()) { throw new AttributeUsageException("Method did not contain RemoteInvocation attribute"); } if (target == null) { throw new RemoteInvocationException("Non-static method owner does not derive from EntityBase."); } #endif NativeActorMethods.RemoteInvocation(Id, target.Id, method.Name, args, netTarget, channelId); }
internal static EntityBase CreateNativeEntity(EntityId id, IntPtr entityPointer) { // check if actor var actorInfo = NativeActorMethods.GetActorInfoById((uint)id._value); if (actorInfo.Id != 0) { return(Actor.CreateNativeActor(actorInfo)); } var nativeEntity = new NativeEntity(id, entityPointer); ScriptManager.Instance.AddScriptInstance(nativeEntity, ScriptType.Entity); return(nativeEntity); }
internal static T CreateCommon <T>(string className, int channelId, string name = "Dude", Vec3?pos = null, Quat?rot = null, Vec3?scale = null) where T : ActorBase { var actor = Get <T>(channelId); if (actor != null) { return(actor); } var info = NativeActorMethods.CreateActor(channelId, name, className, pos ?? new Vec3(0, 0, 0), rot ?? Quat.Identity, scale ?? new Vec3(1, 1, 1)); if (info.Id == 0) { throw new Exception("Actor creation failed, make sure your IActor implementation is registered with the same name as your managed actor class."); } return(Get <T>(channelId)); }
/// <summary> /// Gets the actor with the specified channel id if it exists. /// </summary> /// <param name="channelId">channelId of the actor you want to obtain</param> /// <returns>Actor if found, null otherwise</returns> public static ActorBase Get(int channelId) { var actor = Get <ActorBase>(channelId); if (actor != null) { return(actor); } var entityInfo = NativeActorMethods.GetActorInfoByChannelId((ushort)channelId); if (entityInfo.Id != 0) { return(CreateNativeActor(entityInfo)); } return(null); }
/// <summary> /// Gets the actor with the specified entity id if it exists. /// </summary> /// <param name="actorId">entityId of the actor you want to obtain</param> /// <returns>Actor if found, null otherwise</returns> public static ActorBase Get(EntityId actorId) { var actor = Get <ActorBase>(actorId); if (actor != null) { return(actor); } // Couldn't find a CryMono entity, check if a non-managed one exists. var actorInfo = NativeActorMethods.GetActorInfoById(actorId); if (actorInfo.Id != 0) { return(CreateNativeActor(actorInfo)); } return(null); }
void ProcessWaitingScripts(bool initialLoad) { bool hasDefaultGameRules = false; foreach (var pluginPair in PluginTypes) { ICryMonoPlugin plugin = pluginPair.Key; foreach (Type type in pluginPair.Value) { var script = FindScript(ScriptType.Any, x => x.Type == type); if (script == null) { if (!CryScript.TryCreate(type, out script)) { continue; } } script.RegistrationParams = plugin.GetRegistrationParams(script.ScriptType, type); if (!script.Registered) { if (script == null || script.RegistrationParams == null) { continue; } // Contain types that can only be registered at startup here. if (initialLoad) { if (script.RegistrationParams is ActorRegistrationParams) { var registrationParams = (ActorRegistrationParams)script.RegistrationParams; NativeActorMethods.RegisterActorClass(script.ScriptName, script.Type.Implements(typeof(NativeActor)), registrationParams.isAI); } else if (script.RegistrationParams is EntityRegistrationParams) { var registrationParams = (EntityRegistrationParams)script.RegistrationParams; if (registrationParams.name == null) { registrationParams.name = script.ScriptName; } if (registrationParams.category == null) { registrationParams.category = "Default"; } NativeEntityMethods.RegisterEntityClass(registrationParams); script.RegistrationParams = registrationParams; } } if (script.RegistrationParams is GameRulesRegistrationParams) { var registrationParams = (GameRulesRegistrationParams)script.RegistrationParams; if (registrationParams.name == null) { registrationParams.name = script.ScriptName; } NativeGameRulesMethods.RegisterGameMode(registrationParams.name); if (registrationParams.defaultGamemode || !hasDefaultGameRules) { NativeGameRulesMethods.SetDefaultGameMode(registrationParams.name); hasDefaultGameRules = true; } script.RegistrationParams = registrationParams; } else if (script.RegistrationParams is FlowNodeRegistrationParams) { var registrationParams = (FlowNodeRegistrationParams)script.RegistrationParams; if (registrationParams.name == null) { registrationParams.name = script.ScriptName; } if (registrationParams.category == null) { registrationParams.category = script.Type.Namespace; } if (registrationParams.filter == 0) { registrationParams.filter = FlowNodeFilter.Approved; } script.RegistrationParams = registrationParams; script.ScriptName = registrationParams.category + ":" + registrationParams.name; } else if (script.RegistrationParams is EntityFlowNodeRegistrationParams) { var registrationParams = (EntityFlowNodeRegistrationParams)script.RegistrationParams; script.ScriptName = "entity" + ":" + registrationParams.entityName; } script.Registered = true; Scripts.Add(script); } } } }
/// <summary> /// Removes an actor by entity id. /// </summary> /// <param name="id"></param> public static void Remove(EntityId id) { NativeActorMethods.RemoveActor(id); }
void LoadPlugins(bool initialLoad) { var pluginsDirectory = PathUtils.PluginsFolder; if (!Directory.Exists(pluginsDirectory)) { return; } bool hasDefaultGameRules = false; foreach (var directory in Directory.GetDirectories(pluginsDirectory)) { var compilerDll = Path.Combine(directory, "Compiler.dll"); if (File.Exists(compilerDll)) { var assembly = LoadAssembly(compilerDll); var compilerType = assembly.GetTypes().First(x => x.Implements <ScriptCompiler>()); Debug.LogAlways(" Initializing {0}...", compilerType.Name); var compiler = Activator.CreateInstance(compilerType) as ScriptCompiler; var assemblyPaths = Directory.GetFiles(directory, "*.dll", SearchOption.AllDirectories); var assemblies = new List <Assembly>(); foreach (var assemblyPath in assemblyPaths) { if (assemblyPath != compilerDll) { assemblies.Add(LoadAssembly(assemblyPath)); } } var scripts = compiler.Process(assemblies); foreach (var unprocessedScript in scripts) { var script = unprocessedScript; if (initialLoad) { if (script.RegistrationParams == null) { continue; } else if (script.RegistrationParams is ActorRegistrationParams) { var registrationParams = (ActorRegistrationParams)script.RegistrationParams; NativeActorMethods.RegisterActorClass(script.ScriptName, script.Type.Implements(typeof(NativeActor))); } else if (script.RegistrationParams is EntityRegistrationParams) { var registrationParams = (EntityRegistrationParams)script.RegistrationParams; if (registrationParams.name == null) { registrationParams.name = script.ScriptName; } if (registrationParams.category == null) { registrationParams.category = "Default"; } NativeEntityMethods.RegisterEntityClass(registrationParams); script.RegistrationParams = registrationParams; } else if (script.RegistrationParams is GameRulesRegistrationParams) { var registrationParams = (GameRulesRegistrationParams)script.RegistrationParams; if (registrationParams.name == null) { registrationParams.name = script.ScriptName; } NativeGameRulesMethods.RegisterGameMode(registrationParams.name); if (registrationParams.defaultGamemode || !hasDefaultGameRules) { NativeGameRulesMethods.SetDefaultGameMode(registrationParams.name); hasDefaultGameRules = true; } script.RegistrationParams = registrationParams; } else if (script.RegistrationParams is FlowNodeRegistrationParams) { var registrationParams = (FlowNodeRegistrationParams)script.RegistrationParams; if (registrationParams.name == null) { registrationParams.name = script.ScriptName; } if (registrationParams.category == null) { registrationParams.category = script.Type.Namespace; } if (registrationParams.filter == 0) { registrationParams.filter = FlowNodeFilter.Approved; } script.RegistrationParams = registrationParams; script.ScriptName = registrationParams.category + ":" + registrationParams.name; } else if (script.RegistrationParams is EntityFlowNodeRegistrationParams) { var registrationParams = (EntityFlowNodeRegistrationParams)script.RegistrationParams; script.ScriptName = "entity" + ":" + registrationParams.entityName; } } Scripts.Add(script); } } } }