public ScriptWeapon(IRefObject Ref) { this.Ref = (ServerWeapon)Ref; }
public ScriptWeapon(CSocket socket, IRefObject Ref) : base(socket) { this.Ref = (ServerWeapon)Ref; }
public virtual ScriptObj InvokeConstruct(IRefObject Reference, ConstructorInfo constructor) { ScriptObj obj = (ScriptObj)constructor.Invoke(new object[] { null, Reference }); return obj; }
/// <summary> /// Run Script -> Return Object /// </summary> public ScriptObj RunScript(IRefObject Reference, Assembly Script) { Type[] types = Script.GetTypes(); foreach (Type type in types) { if (!type.IsSubclassOf(typeof(ScriptObj))) { //Console.WriteLine("Is not scriptobj"); continue; } //else //Console.WriteLine("Is scriptobj"); ConstructorInfo constructor = type.GetConstructor(new Type[] { typeof(CSocket), typeof(IRefObject) }); if (constructor != null && constructor.IsPublic) { ScriptObj obj = InvokeConstruct(Reference, constructor); //GSConn obj.RunEvents(); //Console.WriteLine("Script Constructed"); return obj; } else Console.WriteLine("error3"); } //Console.WriteLine("No object created, return null"); // No object created, return null return null; }
/// <summary> /// Compile Script -> Return Assembly /// </summary> public Assembly CompileScript(IRefObject ScriptObject, out CompilerResults Result, String script, bool ClientSide = false) { String ClassName, PrefixName, AssemblyName = ""; switch (ScriptObject.Type) { case IRefObject.ScriptType.WEAPON: ClassName = "ScriptWeapon"; PrefixName = "WeaponPrefix"; ServerWeapon tempWeap = (ServerWeapon)ScriptObject; AssemblyName = tempWeap.Name.Replace("-", "weapon").Replace("*", "weapon"); break; case IRefObject.ScriptType.CLASS: PrefixName = "NpcClass"; ServerClass tempClass = (ServerClass)ScriptObject; ClassName = tempClass.Name; AssemblyName = "NpcClass." + tempClass.Name + ".dll"; break; default: ClassName = "ScriptLevelNpc"; PrefixName = "LevelNpcPrefix"; //ScriptLevelNpc tempNpc = (ScriptLevelNpc)ScriptObject; AssemblyName = ""; break; } // Setup our options CompilerParameters options = new CompilerParameters(); options.GenerateExecutable = false; if (ClientSide || ScriptObject.Type == IRefObject.ScriptType.CLASS) options.GenerateInMemory = false; else options.GenerateInMemory = true; if (!ClientSide) options.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location); options.ReferencedAssemblies.Add("System.dll"); options.ReferencedAssemblies.Add("System.Core.dll"); options.ReferencedAssemblies.Add("OpenGraal.Core.dll"); options.ReferencedAssemblies.Add("OpenGraal.Common.dll"); options.ReferencedAssemblies.Add("Microsoft.CSharp.dll"); options.ReferencedAssemblies.Add("MonoGame.Framework.dll"); if (this.GetClasses() != null) { foreach (KeyValuePair<string, ServerClass> npcClass in this.GetClasses()) { if (npcClass.Value.Asm != null) options.ReferencedAssemblies.Add(npcClass.Value.Asm); } } //options.ReferencedAssemblies. options.CompilerOptions = "/optimize"; if (AssemblyName == "") AssemblyName = PrefixName + NextId[(int)ScriptObject.Type]; if (ClientSide) options.OutputAssembly = AssemblyName + "_ClientSide.dll"; if (ScriptObject.Type == IRefObject.ScriptType.CLASS) options.OutputAssembly = AssemblyName; // Compile our code CSharpCodeProvider csProvider = new Microsoft.CSharp.CSharpCodeProvider(); string usingNamespace = ""; usingNamespace = "using Microsoft.Xna.Framework.Input;"; string[] CompileData = new string[1]; if (ScriptObject.Type != IRefObject.ScriptType.CLASS) CompileData.SetValue("using System;" + usingNamespace + "using OpenGraal; using OpenGraal.Core; using OpenGraal.Common.Levels; using OpenGraal.Common.Players; using OpenGraal.Common.Scripting; " + (this.GetClasses() != null && this.GetClasses().Count > 0 ? "using OpenGraal.Common.Scripting.NpcClass;" : "") + " public class " + PrefixName + NextId[(int)ScriptObject.Type] + " : " + ClassName + " { public " + PrefixName + NextId[(int)ScriptObject.Type] + "(CSocket Server, IRefObject Ref) : base(Server, Ref) { } " + script + " } ", 0); else CompileData.SetValue("using System;" + usingNamespace + "using OpenGraal; using OpenGraal.Core; using OpenGraal.Common.Levels; using OpenGraal.Common.Players; using OpenGraal.Common.Scripting; namespace OpenGraal.Common.Scripting.NpcClass { public class " + ClassName + " { " + script + "\n } }", 0); Result = null; try { Result = csProvider.CompileAssemblyFromSource(options, CompileData); } catch (Exception e) { return null; } csProvider.Dispose(); NextId[(int)ScriptObject.Type]++; return (Result.Errors.HasErrors ? null : Result.CompiledAssembly); }
/// <summary> /// Add to Compile List /// </summary> public void CompileAdd(IRefObject ScriptObj) { lock (CompileList) CompileList.Enqueue(ScriptObj); }
/// <summary> /// Compile & Execute -> Script /// </summary> /// <returns></returns> public void Compile(IRefObject ScriptObj) { CompilerResults Results; String[] Script = ParseJoins(ScriptObj.Script); //Serverside script Assembly Asm = CompileScript(ScriptObj, out Results, Script[0]); if (Asm != null) { if (ScriptObj.Type != IRefObject.ScriptType.CLASS) ScriptObj.ScriptObject = this.RunScript(ScriptObj, Asm); else { ScriptObj.Asm = Results.PathToAssembly; Results = null; Asm = null; } } else HandleErrors((ScriptObj.Type == IRefObject.ScriptType.WEAPON ? "weapon" : "levelnpc_") + ScriptObj.GetErrorText(), Results); /* //Clientside script Assembly Asm2 = CompileScript(ScriptObj, out Results, Script[1], true); if (Asm2 == null) HandleErrors((ScriptObj.Type == IRefObject.ScriptType.WEAPON ? "weapon" : "levelnpc_") + ScriptObj.GetErrorText(), Results, true); Asm2 = null; */ }
public ScriptLevelNpc(CSocket socket, IRefObject Ref) : base(socket) { this.Ref = (GraalLevelNPC)Ref; this.Server = this.Ref.Server; }
public ScriptLevelNpc(IRefObject Ref) { this.Ref = (GraalLevelNPC)Ref; this.Server = this.Ref.Server; }