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