AGS.Plugin.Lua.LuaForAGSEditorComponent.IEditorComponent C# (CSharp) Метод

IEditorComponent() публичный Метод

public IEditorComponent ( ) : void
Результат void
        void IEditorComponent.BeforeSaveGame()
        {
            if (!IsPluginEnabled)
            {
                if (!File.Exists(Path.Combine(compiledir, "agslua.dll")))
                {
                    TryDeleteFile("lua5.1.dll", compiledir);
                }
                if (!File.Exists(Path.Combine(debugdir, "agslua.dll")))
                {
                    TryDeleteFile("lua5.1.dll", debugdir);
                }
                TryDeleteFile("lscripts.dat", compiledir);
                return;
            }
            foreach (LuaScriptEditPane pane in editPanes.Values)
            {
                pane.Save();
            }
            if (!Directory.Exists(compiledir))
            {
                Directory.CreateDirectory(compiledir);
            }
            TryCopySiblingFileTo("lua5.1.dll", compiledir);
            if (!Directory.Exists(debugdir))
            {
                Directory.CreateDirectory(debugdir);
            }
            TryCopySiblingFileTo("lua5.1.dll", debugdir);
            string lscripts_dat_path = Path.Combine(compiledir, "lscripts.dat");
            using (FileStream lscripts_dat = File.Open(lscripts_dat_path, FileMode.Create))
            {
                lscripts_dat.WriteByte(27);
                lscripts_dat.Write(Encoding.ASCII.GetBytes("lscripts:"), 0, "lscripts:".Length);
                Queue<string> codeQ = new Queue<string>();
                codeQ.Enqueue("return {");
                /*
                codeQ.Enqueue("rooms = {");
                foreach (UnloadedRoom room in _editor.CurrentGame.Rooms)
                {
                    codeQ.Enqueue("[" + room.Number + "]={");
                    codeQ.Enqueue("objects = {");
                    _editor.RoomController.
                    foreach (RoomObject obj in )
                    {
                        codeQ.Enqueue("[" + obj.ID + "]=" + InvokeLua.util_quotestring(obj.Name) + ";");
                    }
                    codeQ.Enqueue("};"); // rooms[i].objects
                    codeQ.Enqueue("hotspots = {");
                    foreach (RoomHotspot hotspot in room.Hotspots)
                    {
                        codeQ.Enqueue("[" + hotspot.ID + "]=" + InvokeLua.util_quotestring(hotspot.Name) + ";");
                    }
                    codeQ.Enqueue("};"); // rooms[i].hotspots
                    codeQ.Enqueue("};"); // rooms[i]
                }
                codeQ.Enqueue("};"); // rooms
                 */
                codeQ.Enqueue("dialog={");
                foreach (Dialog dialog in editor.CurrentGame.Dialogs)
                {
                    codeQ.Enqueue("[" + dialog.ID + "]=" + InvokeLua.util_quotestring(dialog.Name) + ";");
                }
                codeQ.Enqueue("};"); // dialog
                codeQ.Enqueue("audioclips={");
                foreach (string clipname in HacksAndKludges.YieldAudioClipScriptNames(editor.CurrentGame))
                {
                    codeQ.Enqueue(InvokeLua.util_quotestring(clipname) + ";");
                }
                codeQ.Enqueue("};");
                codeQ.Enqueue("fonts={");
                foreach (AGSFont font in editor.CurrentGame.Fonts)
                {
                    codeQ.Enqueue("[" + font.ID + "]=" + InvokeLua.util_quotestring(font.ScriptID) + ";");
                }
                codeQ.Enqueue("};"); // fonts
                codeQ.Enqueue("views={");
                ProcessViewFolder readViews = null;
                readViews =
                    delegate(IViewFolder folder)
                    {
                        foreach (AGSView view in folder.Views)
                        {
                            codeQ.Enqueue("[" + view.ID + "] = " + InvokeLua.util_quotestring(view.Name) + ";");
                        }
                        foreach (IViewFolder subfolder in folder.SubFolders)
                        {
                            readViews(subfolder);
                        }
                    };
                readViews(editor.CurrentGame.Views);
                codeQ.Enqueue("};"); // views
                codeQ.Enqueue("cursors = {");
                foreach (MouseCursor cursor in editor.CurrentGame.Cursors)
                {
                    codeQ.Enqueue("[" + cursor.ID + "]=" + InvokeLua.util_quotestring(cursor.ScriptID) + ";");
                }
                codeQ.Enqueue("};"); // cursor
                codeQ.Enqueue("gui = {");
                foreach (GUI gui in editor.CurrentGame.GUIs)
                {
                    codeQ.Enqueue("[" + gui.ID + "]={name=" + InvokeLua.util_quotestring(gui.Name) + ";");
                    foreach (GUIControl cnt in gui.Controls)
                    {
                        codeQ.Enqueue("[" + cnt.ID + "]={" +
                            "name=" + InvokeLua.util_quotestring(cnt.Name) + ";" +
                            "type=" + InvokeLua.util_quotestring(cnt.ControlType) + ";" +
                            "};");
                    }
                    codeQ.Enqueue("};"); // gui[i]
                }
                codeQ.Enqueue("};"); // gui
                codeQ.Enqueue("inventory = {");
                foreach (InventoryItem item in editor.CurrentGame.InventoryItems)
                {
                    codeQ.Enqueue("[" + item.ID + "]=" + InvokeLua.util_quotestring(item.Name) + ";");
                }
                codeQ.Enqueue("};"); // inventory
                codeQ.Enqueue("guid='");
                Guid signature = Guid.NewGuid();
                foreach (byte b in signature.ToByteArray())
                {
                    codeQ.Enqueue(String.Format("\\{0}", b));
                }
                codeQ.Enqueue("';"); // end of guid
                codeQ.Enqueue("files={");
                foreach (ScriptEntry scriptEntry in scripts)
                {
                    string path = scriptEntry.Value.file.FullName;
                    string key = scriptEntry.Key.Substring(SCRIPTS_ROOT.Length);
                    byte[] buf = File.ReadAllBytes(path);
                    if (InvokeLua.LUA_OK != InvokeLua.luaL_loadbuffer(main_L, buf, (size_t)buf.Length, scriptEntry.Value.ScriptPath))
                    {
                        string errorMessage = InvokeLua.lua_tostring(main_L, -1);
                        InvokeLua.lua_pop(main_L, 1);
                        InvokeLua.luaL_loadstring(main_L, "error(" + InvokeLua.util_quotestring(errorMessage) + ",2)");
                    }
                    byte[] compressedCompiled;
                    using (MemoryStream memStream = new MemoryStream())
                    using (ZOutputStream z_out = new ZOutputStream(memStream, 9))
                    {
                        InvokeLua.lua_Writer ZOutWriter =
                            delegate(lua_State _L, byte[] data, size_t _sz, lua_State _ud)
                            {
                                z_out.Write(data, 0, data.Length);
                                return 0;
                            };
                        InvokeLua.lua_dump(main_L, ZOutWriter, lua_State.Zero);
                        z_out.finish();
                        compressedCompiled = memStream.ToArray();
                    }
                    codeQ.Enqueue(String.Format("[{0}]=", InvokeLua.util_quotestring(key)));
                    codeQ.Enqueue("{");
                    codeQ.Enqueue(String.Format("offset={0};length={1};", lscripts_dat.Position, compressedCompiled.Length));
                    codeQ.Enqueue("};");
                    lscripts_dat.Write(compressedCompiled, 0, compressedCompiled.Length);
                    InvokeLua.lua_pop(main_L, 1);
                }
                codeQ.Enqueue("};"); // end of files
                codeQ.Enqueue("modules={");
                foreach (ScriptEntry scriptEntry in scripts)
                {
                    string key = scriptEntry.Key.Substring(SCRIPTS_ROOT.Length);

                    codeQ.Enqueue("[" + InvokeLua.util_quotestring(scriptEntry.Value.ModuleName.ToLower()) + "]="
                        + InvokeLua.util_quotestring(key) + ";");
                }
                codeQ.Enqueue("};"); // end of modules
                if (compileTimeScripts.Count != 0)
                {
                    lua_State temp_L = InvokeLua.luaL_newstate();
                    InvokeLua.lua_atpanic(temp_L, InvokeLua.ExceptionPanicHandler);
                    try
                    {
                        InvokeRunTimePlugin.PrepareForCompileTimeScripts(temp_L);
                        /*
                        InvokeLua.lua_getfield(temp_L, InvokeLua.LUA_REGISTRYINDEX, "lscripts");
                        int IDX_LSCRIPTS = InvokeLua.lua_gettop(temp_L);
                        InvokeLua.lua_getfield(temp_L, InvokeLua.LUA_REGISTRYINDEX, "lmodules");
                        int IDX_LMODULES = InvokeLua.lua_gettop(temp_L);
                        foreach (ScriptEntry scriptEntry in scripts)
                        {
                            InvokeLua.lua_pushstring(temp_L, scriptEntry.Value.ScriptPath.ToLower());
                            InvokeLua.lua_pushstring(temp_L, scriptEntry.Value.file.FullName);
                            InvokeLua.lua_rawset(temp_L, IDX_LSCRIPTS);

                            string moduleName = scriptEntry.Value.ModuleName;
                            if (moduleName != null)
                            {
                                InvokeLua.lua_pushstring(temp_L, moduleName);
                                InvokeLua.lua_pushstring(temp_L, scriptEntry.Value.file.FullName);
                                InvokeLua.lua_rawset(temp_L, IDX_LMODULES);
                            }
                        }
                        InvokeLua.lua_pop(temp_L, 2); // remove lscripts, lmodules
                         */
                        foreach (LuaScriptFileInfo script in compileTimeScripts)
                        {
                            if (InvokeLua.LUA_OK != InvokeLua.luaL_loadfile(temp_L, script.file.FullName))
                            {
                                MessageBox.Show(script.ScriptPath + " Compile Error:\n\n" + InvokeLua.lua_tostring(temp_L, -1));
                                InvokeLua.lua_pop(temp_L, -1);
                            }
                            else
                            {
                                if (InvokeLua.LUA_OK != InvokeLua.lua_pcall(temp_L, 0, 0, 0))
                                {
                                    MessageBox.Show(script.ScriptPath + " Run Error:\n\n" + InvokeLua.lua_tostring(temp_L, -1));
                                    InvokeLua.lua_pop(temp_L, 1);
                                }
                            }
                        }

                        codeQ.Enqueue("initstate=\"");

                        InvokeLua.lua_Writer initStateWrite =
                            delegate(lua_State _L, byte[] data, size_t _sz, lua_State _ud)
                            {
                                foreach (byte b in data)
                                {
                                    codeQ.Enqueue(String.Format("\\{0}", b));
                                }
                                return 0;
                            };
                        InvokeRunTimePlugin.WriteInitState(temp_L, initStateWrite);

                        codeQ.Enqueue("\";");
                    }
                    finally
                    {
                        InvokeLua.lua_close(temp_L);
                    }
                }
                codeQ.Enqueue("};"); // end of data

                InvokeLua.lua_Reader_RetString CodeQReader =
                    delegate(lua_State _L, IntPtr _data, ref size_t sz)
                    {
                        if (codeQ.Count == 0)
                        {
                            sz = size_t.Zero;
                            return "";
                        }
                        else
                        {
                            string fragment = codeQ.Dequeue();
                            sz = (size_t)fragment.Length;
                            return fragment;
                        }
                    };

                if (InvokeLua.LUA_OK == InvokeLua.lua_load(main_L, CodeQReader, lua_State.Zero, "lscripts.dat"))
                {
                    byte[] compressedCompiled;
                    using (MemoryStream memStream = new MemoryStream())
                    using (ZOutputStream z_out = new ZOutputStream(memStream, 9))
                    {
                        InvokeLua.lua_Writer Z_OutWriter =
                            delegate(lua_State _L, byte[] data, size_t _sz, lua_State _ud)
                            {
                                z_out.Write(data, 0, data.Length);
                                return 0;
                            };
                        InvokeLua.lua_dump(main_L, Z_OutWriter, lua_State.Zero);
                        z_out.finish();
                        compressedCompiled = memStream.ToArray();
                    }
                    byte[] offset_buf = BitConverter.GetBytes((long)lscripts_dat.Position);
                    byte[] length_buf = BitConverter.GetBytes((long)compressedCompiled.Length);
                    lscripts_dat.Write(compressedCompiled, 0, compressedCompiled.Length);
                    lscripts_dat.Write(offset_buf, 0, offset_buf.Length);
                    lscripts_dat.Write(length_buf, 0, length_buf.Length);
                }
                else
                {
                    MessageBox.Show("Error compiling lscripts.dat");
                }
            }
        }

Same methods

LuaForAGSEditorComponent::IEditorComponent ( string controlID ) : IList
LuaForAGSEditorComponent::IEditorComponent ( XmlNode node ) : void
LuaForAGSEditorComponent::IEditorComponent ( XmlTextWriter writer ) : void
LuaForAGSEditorComponent::IEditorComponent ( string controlID ) : void
LuaForAGSEditorComponent::IEditorComponent ( string propertyName, object oldValue ) : void