private bool RelinkScriptPropertiesFromStore(BoundScript bs)
        {
            //serialization
            if (serializedScriptsDatabase.ContainsKey(bs.register_id))
            {
                bool error_on_register = false;
                //we have serialization data waiting for this object!
                foreach (SerializeScriptPropertyData prop_data in serializedScriptsDatabase[bs.register_id].property_store)
                {
                    if (bs.scriptObject == null)
                    {
                        //malformed script - we will lose this serialization data
                        error_on_register = true;
                        continue;
                    }
                    PropertyInfo pi = bs.scriptObject.GetType().GetProperty(prop_data.property_name);
                    if (pi == null)
                    {
                        Logger.Log("Warning: Property " + prop_data.property_name + " no longer exists on: " + bs.scriptObject.GetType().Name);
                        continue;
                    }
                    pi.SetValue(bs.scriptObject, prop_data.property_value);
                }

                if (error_on_register)
                {
                    //errors occurred during script load
                    System.Windows.Forms.MessageBox.Show("Scripts have errors, check console for more information.\nYOU WILL LOSE SERIALIZED DEFAULTS!\nCheck Console, fix errors in external program, then restart.");
                }
                return(true);
            }
            return(false);
        }
Beispiel #2
0
    public static void Paste(object dest)
    {
        if (dest == null || stored_type == null)
        {
            return;
        }

        if ((dest as MochaInterface.Component).myType == "CScript")
        {
            MochaInterface.CScript        cscript = MochaEditor.CastingHelper.CastTo <MochaInterface.CScript>((MochaInterface.Component)dest);
            MochaScriptSystem.BoundScript bs      = MochaScriptSystem.ScriptSubsystemManaged.getInstance().GetBoundScriptFromCScript(cscript);
            if (bs.scriptObject.GetType() != stored_type)
            {
                MochaEditor.Controls.ModernModalWindow mmw = new MochaEditor.Controls.ModernModalWindow("Copy/Paste types do not match.");
                return;
            }

            foreach (var pi in bs.scriptObject.GetType().GetProperties())
            {
                if (pi.Name == "gameObject")
                {
                    continue;                           //do not copy the gameObject this is bound to
                }
                foreach (CopyPasteData data in clipboard)
                {
                    if (pi.Name == data.name && pi.PropertyType == data.value.GetType())
                    {
                        pi.SetValue(bs.scriptObject, data.value);
                    }
                }
            }
            return;
        }

        if (dest.GetType() != stored_type)
        {
            MochaEditor.Controls.ModernModalWindow mmw = new MochaEditor.Controls.ModernModalWindow("Copy/Paste types do not match.");
            return;
        }

        MochaEditor.PropertyValueConverter pvc = new MochaEditor.PropertyValueConverter();
        var pilist = (ObservableCollection <MochaEditor.PropertyValueConverter.PropertyInfo>)pvc.Convert(dest, null, "Component", null);

        foreach (CopyPasteData data in clipboard)
        {
            foreach (MochaEditor.PropertyValueConverter.PropertyInfo pi in pilist)
            {
                if (pi.PropertyName == data.name && pi.PropertyType == data.value.GetType())
                {
                    pi.PropertyValue = data.value;
                }
            }
        }
    }
        private void RegisterCScript(IntPtr from)
        {
            //setup
            MochaInterface.CScript cs = new MochaInterface.CScript(from, false);
            BoundScript            bs = new BoundScript();

            bs.scriptComponent = cs;
            string sc = cs.scriptAsset.GetName();       //assumed valid at this point

            sc            = sc.Remove(sc.Length - 3);
            bs.scriptName = sc;

            //post-compilation
            bs.scriptObject = ScriptManager.getInstance().MakeObject(bs.scriptName);
            if (bs.scriptObject != null)
            {
                bs.scriptObject.GetType().GetProperty("gameObject").SetValue(bs.scriptObject, cs.gameObject, null);
                try {
                    bs.Func_OnUpdate = bs.scriptObject.GetType().GetMethod("OnUpdate");
                    if (bs.Func_OnUpdate == null)
                    {
                        throw new Exception("No public OnUpdate specified for class: " + bs.scriptName);
                    }
                }
                catch (Exception e)
                {
                    Logger.Log("ERROR compiling scripts: " + e.Message);
                }
            }
            bs.register_id = cs.register_id;

            RelinkScriptPropertiesFromStore(bs);

            bs.scriptEvents.Enqueue(new ScriptEvent()
            {
                methodname = "OnStart"
            });

            //indexing
            registeredScripts.Add(bs);
            cscriptToBoundScriptLookup.Add(cs, bs);
            if (!gameObjectToBoundScriptsLookup.ContainsKey(cs.gameObject))
            {
                gameObjectToBoundScriptsLookup.Add(cs.gameObject, new List <BoundScript>());
            }
            gameObjectToBoundScriptsLookup[cs.gameObject].Add(bs);
        }
Beispiel #4
0
    public static void Copy(object c)
    {
        clipboard.Clear();
        if (c == null)
        {
            return;
        }

        if ((c as MochaInterface.Component).myType == "CScript")
        {
            MochaInterface.CScript        cscript = MochaEditor.CastingHelper.CastTo <MochaInterface.CScript>((MochaInterface.Component)c);
            MochaScriptSystem.BoundScript bs      = MochaScriptSystem.ScriptSubsystemManaged.getInstance().GetBoundScriptFromCScript(cscript);
            stored_type = bs.scriptObject.GetType();
            foreach (var pi in bs.scriptObject.GetType().GetProperties())
            {
                if (pi.Name == "gameObject")
                {
                    continue;                           //do not copy the gameObject this is bound to
                }
                if (pi.GetCustomAttribute <MochaDoNotShow>() != null)
                {
                    continue;
                }
                CopyPasteData pd = new CopyPasteData()
                {
                    name  = pi.Name,
                    value = pi.GetValue(bs.scriptObject)
                };
                clipboard.Add(pd);
            }
            return;
        }

        stored_type = c.GetType();

        MochaEditor.PropertyValueConverter pvc = new MochaEditor.PropertyValueConverter();

        foreach (MochaEditor.PropertyValueConverter.PropertyInfo pi in (ObservableCollection <MochaEditor.PropertyValueConverter.PropertyInfo>)pvc.Convert(c, null, "Component", null))
        {
            CopyPasteData pd = new CopyPasteData()
            {
                name  = pi.PropertyName,
                value = pi.PropertyValue
            };
            clipboard.Add(pd);
        }
    }
        private void UnRegisterCScript(IntPtr from)
        {
            MochaInterface.CScript cs = new MochaInterface.CScript(from, false);

            BoundScript bs = null;

            try
            {
                bs = cscriptToBoundScriptLookup[cs];
            }
            catch (KeyNotFoundException)
            {
                Logger.Log("ERROR: Unregister skipped (not found) for script from GameObject: " + cs.gameObject.GetName());
                return;
            }

            //call OnEnd
            if (bs.hasCalledOnStart)
            {
                MethodInfo mi = bs.scriptObject.GetType().GetMethod("OnEnd");
                if (mi != null)
                {
                    try
                    {
                        mi.Invoke(bs.scriptObject, null);
                    }
                    catch (Exception e)
                    {
                        Logger.Log("WARNING: Could not call OnEnd on script: " + bs.scriptName + " because " + e.Message);
                    }
                }
            }

            registeredScripts.Remove(bs);
            cscriptToBoundScriptLookup.Remove(cs);
            var bslist = gameObjectToBoundScriptsLookup[cs.gameObject];

            bslist.Remove(bs);
            if (bslist.Count == 0)
            {
                gameObjectToBoundScriptsLookup.Remove(cs.gameObject);
            }
        }
        void HandleScriptError(Exception e, BoundScript script)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;     //hack fix for kai's Chinese

            string err_out = "";

            err_out += "SCRIPT ERROR(" + script.scriptName + ")" + e.InnerException.Message + "\n";

            // Get stack trace for the exception with source file information
            var st = new StackTrace(e.InnerException, true);

            for (int i = 0; i < st.FrameCount; ++i)
            {
                var frame = st.GetFrame(i);
                var line  = frame.GetFileLineNumber();
                err_out += "\t(" + Path.GetFileNameWithoutExtension(frame.GetFileName()) + "," + line.ToString() + ") " + frame.GetMethod() + "\n";
            }
            Logger.Log(err_out);

            Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
        }
        void QueueAction(IntPtr cs_ptr, string _methodname, IntPtr data, string data_type)
        {
            object data_obj = null;

            if (data != null)
            {
                MochaInterface.IMeta imeta_obj = new MochaInterface.IMeta(data, false);
                if (String.IsNullOrWhiteSpace(data_type))
                {
                    Logger.Log("ERROR: Failed to convert queued event parameter because data_type is null");
                }
                else
                {
                    data_obj = CastingHelper.castTo(imeta_obj, Type.GetType("MochaInterface." + data_type));
                }
            }
            MochaInterface.CScript cs = new MochaInterface.CScript(cs_ptr, false);
            BoundScript            bs = cscriptToBoundScriptLookup[cs];

            bs.scriptEvents.Enqueue(new ScriptEvent()
            {
                methodname = _methodname, data = data_obj
            });
        }