Esempio n. 1
0
 public ScriptWeapon(IRefObject Ref)
 {
     this.Ref = (ServerWeapon)Ref;
 }
Esempio n. 2
0
 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;
 }