Пример #1
0
        public static void WriteViewIds(ServerDbs dbSource, AbstractDb <int> db)
        {
            if (ProjectConfiguration.SynchronizeWithClientDatabases && dbSource == ServerDbs.Items &&
                ProjectConfiguration.HandleViewIds)
            {
                //return;
                int debugInfo = 0;
                _debugStatus = "OK";

                var dataAccId   = db.ProjectDatabase.MetaGrf.GetData(ProjectConfiguration.SyncAccId);
                var dataAccName = db.ProjectDatabase.MetaGrf.GetData(ProjectConfiguration.SyncAccName);

                if (dataAccId != null && dataAccName != null)
                {
                    var itemDb1 = db.Get <int>(ServerDbs.Items);
                    var itemDb2 = db.Get <int>(ServerDbs.Items2);
                    var citemDb = db.Get <int>(ServerDbs.CItems);
                    debugInfo++;

                    try {
                        itemDb1.Commands.Begin();
                        itemDb2.Commands.Begin();
                        citemDb.Commands.Begin();
                        debugInfo++;

                        AccessoryTable table = new AccessoryTable(db, dataAccId, dataAccName);
                        table.SetLuaTables();
                        table.SetTables();
                        table.SetDbs();

                        _debugStatus = "BackupManager";
                        BackupEngine.Instance.BackupClient(ProjectConfiguration.SyncAccId, db.ProjectDatabase.MetaGrf.GetData(ProjectConfiguration.SyncAccId));
                        BackupEngine.Instance.BackupClient(ProjectConfiguration.SyncAccName, db.ProjectDatabase.MetaGrf.GetData(ProjectConfiguration.SyncAccName));
                        debugInfo++;

                        _debugStatus = "WriteLuaFiles";
                        _writeLuaFiles(table.LuaAccIdParser, table.LuaAccNameParser, db);
                        debugInfo++;
                    }
                    catch (Exception err) {
                        ErrorHandler.HandleException("Couldn't save the accessory item files. Error code = " + debugInfo + ", state = " + _debugStatus, err, ErrorLevel.Low);
                        DbIOErrorHandler.Handle(err, "Generic exception while trying to save the client accessory items, debug code = " + debugInfo, ErrorLevel.NotSpecified);
                        DbIOErrorHandler.Focus();
                    }
                    finally {
                        itemDb1.Commands.End();
                        itemDb2.Commands.End();
                        citemDb.Commands.End();
                    }
                }
            }
        }
Пример #2
0
        public static void WriteMobLuaFiles(AbstractDb <int> db)
        {
            // Ensures this is only written once
            if (ProjectConfiguration.SynchronizeWithClientDatabases && db.DbSource == ServerDbs.Mobs &&
                ProjectConfiguration.SyncMobTables)
            {
                var metaTable = db.ProjectDatabase.GetMetaTable <int>(ServerDbs.Mobs);
                //var table = Attached["jobtbl_T"] as Dictionary<string, string>;

                // Load the tables
                DbDebugItem <int> debug = new DbDebugItem <int>(db);
                DbAttachLuaLoaderUpper(debug, "jobtbl", ProjectConfiguration.SyncMobId);
                var table = db.Attached["jobtbl_T"] as Dictionary <string, string>;

                if (table != null)
                {
                    Dictionary <int, Npc> npcs = new Dictionary <int, Npc>();

                    var dataJobName = debug.AbsractDb.ProjectDatabase.MetaGrf.GetData(ProjectConfiguration.SyncMobName);

                    if (dataJobName == null)
                    {
                        return;
                    }

                    LuaParser parser   = new LuaParser(dataJobName, true, p => new Lub(p).Decompile(), EncodingService.DetectEncoding(dataJobName), EncodingService.DisplayEncoding);
                    var       jobNames = parser.Tables["JobNameTable"];

                    // Load the npcs from the lua files first
                    foreach (var keyPair in table)
                    {
                        npcs[Int32.Parse(keyPair.Value)] = new Npc {
                            NpcName = keyPair.Key
                        };
                    }

                    foreach (var keyPair in jobNames)
                    {
                        var key          = keyPair.Key.Trim('[', ']');
                        var ingameSprite = keyPair.Value.Trim('\"');

                        int ival;
                        if (!Int32.TryParse(key, out ival))
                        {
                            key = key.Substring(7);

                            var npcKeyPair = npcs.FirstOrDefault(p => p.Value.NpcName == key);

                            if (npcKeyPair.Equals(default(KeyValuePair <int, Npc>)))
                            {
                                // Key not found
                                // We ignore it
                            }
                            else
                            {
                                npcs[npcKeyPair.Key] = new Npc(npcKeyPair.Value)
                                {
                                    IngameSprite = ingameSprite
                                };
                                //npcKeyPair.Value = new ingameSprite;
                            }

                            continue;
                        }

                        npcs[ival] = new Npc {
                            IngameSprite = ingameSprite
                        };
                    }

                    foreach (var tuple in metaTable.FastItems.OrderBy(p => p.Key))
                    {
                        var ssprite = "JT_" + (tuple.GetValue <string>(ServerMobAttributes.SpriteName) ?? "");
                        var csprite = tuple.GetValue <string>(ServerMobAttributes.ClientSprite);

                        if (ssprite != "JT_")
                        {
                            // not empty
                            if (npcs.ContainsKey(tuple.Key))
                            {
                                npcs[tuple.Key] = new Npc(npcs[tuple.Key])
                                {
                                    IngameSprite = csprite, NpcName = ssprite
                                };
                            }
                            else
                            {
                                Npc npc = new Npc {
                                    IngameSprite = csprite, NpcName = ssprite
                                };
                                npcs[tuple.Key] = npc;
                            }
                        }
                    }

                    // Validation
                    HashSet <string> duplicates = new HashSet <string>();
                    foreach (var npc in npcs)
                    {
                        if (!duplicates.Add(npc.Value.NpcName))
                        {
                            DbIOErrorHandler.Handle(StackTraceException.GetStrackTraceException(), "Duplicate mob name (" + npc.Value.NpcName + ") for mobid " + npc.Key + " while saving npcidentity and jobname. The files have not been resaved.");
                            DbIOErrorHandler.Focus();
                            return;
                        }

                        if (LatinOnly(npc.Value.NpcName) != npc.Value.NpcName)
                        {
                            DbIOErrorHandler.Handle(StackTraceException.GetStrackTraceException(), "The mob name (" + npc.Value.NpcName + ") is invalid, only ASCII characters are allowed. Consider using '" + LatinOnly(npc.Value.NpcName) + "' as the name instead. The files have not been resaved.");
                            DbIOErrorHandler.Focus();
                            return;
                        }
                    }

                    // Converts back to a lua format
                    {
                        BackupEngine.Instance.BackupClient(ProjectConfiguration.SyncMobId, db.ProjectDatabase.MetaGrf);
                        string file = TemporaryFilesManager.GetTemporaryFilePath("tmp2_{0:0000}.lua");

                        parser.Tables.Clear();
                        var dico = new Dictionary <string, string>();
                        parser.Tables["jobtbl"] = dico;
                        foreach (var npc in npcs.OrderBy(p => p.Key))
                        {
                            dico[npc.Value.NpcName] = npc.Key.ToString(CultureInfo.InvariantCulture);
                        }
                        parser.Write(file, EncodingService.DisplayEncoding);

                        db.ProjectDatabase.MetaGrf.SetData(ProjectConfiguration.SyncMobId, File.ReadAllBytes(file));
                    }

                    {
                        BackupEngine.Instance.BackupClient(ProjectConfiguration.SyncMobName, db.ProjectDatabase.MetaGrf);
                        string file = TemporaryFilesManager.GetTemporaryFilePath("tmp2_{0:0000}.lua");

                        parser.Tables.Clear();
                        var dico = new Dictionary <string, string>();
                        parser.Tables["JobNameTable"] = dico;
                        foreach (var npc in npcs.OrderBy(p => p.Key))
                        {
                            var ingameSprite = LatinUpper((npc.Value.IngameSprite ?? ""));

                            if (!String.IsNullOrEmpty(ingameSprite.GetExtension()))
                            {
                                ingameSprite = ingameSprite.ReplaceExtension(ingameSprite.GetExtension().ToLower());
                            }

                            if (string.IsNullOrEmpty(ingameSprite))
                            {
                                continue;
                            }
                            dico["[jobtbl." + npc.Value.NpcName + "]"] = "\"" + ingameSprite + "\"";
                        }
                        parser.Write(file, EncodingService.DisplayEncoding);

                        db.ProjectDatabase.MetaGrf.SetData(ProjectConfiguration.SyncMobName, File.ReadAllBytes(file));
                    }
                }
            }
        }