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); }
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); }
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 }); }