private void Compile(IEnumerable<string> scriptFiles, string assemblyName, bool zipped) { Assembly assembly = null; var c = new MyModContext(); c.Init(assemblyName, assemblyName); if (zipped) { var tmp = Path.GetTempPath(); foreach (var file in scriptFiles) { try { var newPath = string.Format("{0}{1}", tmp, Path.GetFileName(file)); var stream = MyFileSystem.OpenRead(file); using (var sr = new StreamReader(stream)) { stream = MyFileSystem.OpenWrite(newPath);// (newPath); using (var sw = new StreamWriter(stream)) { sw.Write(sr.ReadToEnd()); //create file in tmp for debugging } } m_cachedFiles.Add(newPath); } catch (Exception e) { MySandboxGame.Log.WriteLine(e); MyDefinitionErrors.Add(c, string.Format("Cannot load {0}",Path.GetFileName(file)) , ErrorSeverity.Error); MyDefinitionErrors.Add(c, e.Message, ErrorSeverity.Error); } } IlCompiler.CompileFileModAPI(assemblyName, m_cachedFiles.ToArray(), out assembly, m_errors); } else { IlCompiler.CompileFileModAPI(assemblyName, scriptFiles.ToArray(), out assembly, m_errors); } if(assembly != null) AddAssembly(MyStringId.GetOrCompute(assemblyName), assembly); else { MyDefinitionErrors.Add(c, string.Format("Compilation of {0} failed:", assemblyName), ErrorSeverity.Error); MySandboxGame.Log.IncreaseIndent(); foreach (var error in m_errors) { MyDefinitionErrors.Add(c, error.ToString(), ErrorSeverity.Error); Debug.Assert(false, error.ToString()); } MySandboxGame.Log.DecreaseIndent(); m_errors.Clear(); } m_cachedFiles.Clear(); }
private void TryAddEntityScripts(Assembly assembly) { var gameLogicType = typeof(MyGameLogicComponent); var builderType = typeof(MyObjectBuilder_Base); foreach (var type in assembly.GetTypes()) { var descriptorArray = type.GetCustomAttributes(typeof(MyEntityComponentDescriptor), false); if (descriptorArray != null && descriptorArray.Length > 0) { var descriptor = (MyEntityComponentDescriptor)descriptorArray[0]; try { var component = (MyGameLogicComponent)Activator.CreateInstance(type); if (descriptor.EntityBuilderSubTypeNames != null && descriptor.EntityBuilderSubTypeNames.Length > 0) { foreach (string subTypeName in descriptor.EntityBuilderSubTypeNames) { if (gameLogicType.IsAssignableFrom(type) && builderType.IsAssignableFrom(descriptor.EntityBuilderType)) { if (!SubEntityScripts.ContainsKey(new Tuple<Type, string>(descriptor.EntityBuilderType, subTypeName))) { SubEntityScripts.Add(new Tuple<Type, string>(descriptor.EntityBuilderType, subTypeName), new HashSet<Type>()); } else { var c = new MyModContext(); c.Init(assembly.FullName, assembly.FullName); MyDefinitionErrors.Add(c, "Possible entity type script logic collision", ErrorSeverity.Warning); } SubEntityScripts[new Tuple<Type, string>(descriptor.EntityBuilderType, subTypeName)].Add(type); } } } else { if (gameLogicType.IsAssignableFrom(type) && builderType.IsAssignableFrom(descriptor.EntityBuilderType)) { if (!EntityScripts.ContainsKey(descriptor.EntityBuilderType)) { EntityScripts.Add(descriptor.EntityBuilderType, new HashSet<Type>()); } else { var c = new MyModContext(); c.Init(assembly.FullName, assembly.FullName); MyDefinitionErrors.Add(c, "Possible entity type script logic collision", ErrorSeverity.Warning); } EntityScripts[descriptor.EntityBuilderType].Add(type); } } } catch (Exception) { MySandboxGame.Log.WriteLine("Exception during loading of type : " + type.Name); } } } }
private void TryAddEntityScripts(Assembly assembly) { var gameLogicType = typeof(MyGameLogicComponent); var builderType = typeof(MyObjectBuilder_Base); foreach (var type in assembly.GetTypes()) { var descriptorArray = type.GetCustomAttributes(typeof(MyEntityComponentDescriptor), false); if (descriptorArray != null && descriptorArray.Length > 0) { var descriptor = (MyEntityComponentDescriptor)descriptorArray[0]; var component = (MyGameLogicComponent)Activator.CreateInstance(type); if (gameLogicType.IsAssignableFrom(type) && builderType.IsAssignableFrom(descriptor.EntityBuilderType)) { if (EntityScripts.Remove(descriptor.EntityBuilderType)) { var msg = string.Format("Entity script overwritten: {0}", descriptor.EntityBuilderType.Name); Debug.Fail(msg); var c = new MyModContext(); c.Init(assembly.FullName, assembly.FullName); MyDefinitionErrors.Add(c, msg, ErrorSeverity.Notice); } EntityScripts.Add(descriptor.EntityBuilderType, type); } } } }