public static Dictionary <int, KeyValuePair <ushort, long> > LoadFromTdf(TdfReader tdfReader) { var levelTable = new Dictionary <int, KeyValuePair <ushort, long> >(); using (TextReader reader = File.OpenText("system/data/LevelServer.csv")) { string line; int i = 0; while ((line = reader.ReadLine()) != null) { var data = line.Split(','); if (data.Length < 2) { return(levelTable); } levelTable.Add(i, new KeyValuePair <ushort, long>(Convert.ToUInt16(data[0]), Convert.ToInt64(data[1]))); i++; } } /*var levelTable = new Dictionary<int, KeyValuePair<ushort, long>>(); * using (var reader = new BinaryReaderExt(new MemoryStream(tdfReader.ResTable))) * { * for (var row = 0; row < tdfReader.Header.Row; row++) * levelTable.Add(row, new KeyValuePair<ushort, long>(Convert.ToUInt16(reader.ReadUnicode()), Convert.ToInt64(reader.ReadUnicode()))); * }*/ return(levelTable); }
//std::vector<AssistGroup *,std::allocator<AssistGroup *> > AssistList; public static Dictionary <uint, XiStrItem> LoadFromTdf(TdfReader tdfReader) { var itemList = new Dictionary <uint, XiStrItem>(); using (var reader = new BinaryReaderExt(new MemoryStream(tdfReader.ResTable))) { for (var row = 0; row < tdfReader.Header.Row; row++) { var item = new XiStrItem(); reader.ReadUnicode(); // Empty item.Type = ItemTypeStringToVar(reader.ReadUnicode()); // Type item.SetType = ItemSetTypeStrToVar(reader.ReadUnicode()); // SetType item.ID = reader.ReadUnicode(); // Id Name item.GroupID = reader.ReadUnicode(); item.Name = reader.ReadUnicode(); reader.ReadUnicode(); // ???? item.Grade = ItemGradeCharToVar(reader.ReadUnicode()); item.ReqLevel = Convert.ToUInt16(reader.ReadUnicode()); reader.ReadUnicode(); // ???? item.Value = Convert.ToUInt16(reader.ReadUnicode()); item.Min = Convert.ToUInt16(reader.ReadUnicode()); item.Max = Convert.ToUInt16(reader.ReadUnicode()); item.Cost = Convert.ToInt64(reader.ReadUnicode()); item.Sell = Convert.ToUInt16(reader.ReadUnicode()); item.NextID = reader.ReadUnicode(); item.Shop = reader.ReadUnicode().ToLower() == "true"; item.Trade = reader.ReadUnicode().ToLower() == "true"; item.Auction = reader.ReadUnicode().ToLower() == "true"; var setRate = reader.ReadUnicode(); if (setRate != "n/a") { item.SetRate = Convert.ToUInt16(setRate); } else { item.SetRate = 0; } item.SetDesc = reader.ReadUnicode(); reader.ReadUnicode(); // SetAssist //__that.SetAssist = XiAssistTable::GetAssistByID(v6, v12); item.Time = Convert.ToUInt16(reader.ReadUnicode()); itemList.Add((uint)row, item); } } return(itemList); }
// TODO: move to XiQuestTable? public static Dictionary <uint, XiStrQuest> LoadFromTdf(TdfReader tdfReader) { var questList = new Dictionary <uint, XiStrQuest>(); using (var reader = new BinaryReaderExt(new MemoryStream(tdfReader.ResTable))) { for (var row = 0; row < tdfReader.Header.Row; row++) { var quest = new XiStrQuest(); quest.QuestId = reader.ReadUnicode(); /*quest.QuestIdN = Convert.ToUInt32(reader.ReadUnicode()); * quest.PrevQuestIdN = Convert.ToUInt32(reader.ReadUnicode());*/ quest.QuestIdN = Convert.ToUInt32(reader.ReadUnicode()) - 1; // -1 since the request the client sents us are 0 based quest.PrevQuestIdN = Convert.ToUInt32(reader.ReadUnicode()) - 1; // -1 since the request the client sents us are 0 based quest.Event = (uint)QuestEventStrToVar(reader.ReadUnicode()); quest.NeedLevel = Convert.ToUInt32(reader.ReadUnicode()); quest.NeedLevelPercent = Convert.ToUInt32(reader.ReadUnicode()); quest.GivePost = reader.ReadUnicode(); quest.Title = reader.ReadUnicode(); quest.EndPost = reader.ReadUnicode(); quest.Place = new string[5]; for (var i = 0; i < 5; i++) { quest.Place[i] = reader.ReadUnicode(); } quest.CrashTime = new int[5]; for (var i = 0; i < 5; i++) { quest.CrashTime[i] = Convert.ToInt32(reader.ReadUnicode()); } quest.TimeLimit = new int[5]; for (var i = 0; i < 5; i++) { quest.TimeLimit[i] = Convert.ToInt32(reader.ReadUnicode()); } quest.MinSpeed = new int[5]; for (var i = 0; i < 5; i++) { quest.MinSpeed[i] = Convert.ToInt32(reader.ReadUnicode()); } quest.MaxSpeed = new int[5]; for (var i = 0; i < 5; i++) { quest.MaxSpeed[i] = Convert.ToInt32(reader.ReadUnicode()); } quest.MinLadius = new int[5]; for (var i = 0; i < 5; i++) { quest.MinLadius[i] = Convert.ToInt32(reader.ReadUnicode()); } quest.MaxLadius = new int[5]; for (var i = 0; i < 5; i++) { quest.MaxLadius[i] = Convert.ToInt32(reader.ReadUnicode()); } quest.QuestPath_01 = Convert.ToUInt32(reader.ReadUnicode()); quest.QuestPath_02 = Convert.ToUInt32(reader.ReadUnicode()); quest.Car_01 = Convert.ToUInt32(reader.ReadUnicode()); quest.Car_02 = Convert.ToUInt32(reader.ReadUnicode()); quest.ClearQuestIdN = Convert.ToUInt32(reader.ReadUnicode()); quest.Count = Convert.ToInt32(reader.ReadUnicode()); quest.RewardExp = Convert.ToInt32(reader.ReadUnicode()); quest.RewardMoney = Convert.ToInt32(reader.ReadUnicode()); quest.Item01 = reader.ReadUnicode(); quest.Item02 = reader.ReadUnicode(); quest.Item03 = reader.ReadUnicode(); // TODO: Get Icon by Index //quest.GivePostPtr = GetIconByIndex(quest.GivePost); //quest.EndPostPtr = GetIconByIndex(quest.EndPost); /* * v4 = BS_SingletonHeap < XiIconTable,5 >::GetInstance(); * v28.GivePostPtr = XiIconTable::GetIconByIndex(v4, v28.GivePost); * v5 = BS_SingletonHeap < XiIconTable,5 >::GetInstance(); * v28.EndPostPtr = XiIconTable::GetIconByIndex(v5, v28.EndPost); */ // TODO: Get Item by Id /* * v6 = BS_SingletonHeap < XiItemTable,5 >::GetInstance(); * v28.Item01Ptr = XiItemTable::GetItemByID(v6, v28.Item01); * v7 = BS_SingletonHeap < XiItemTable,5 >::GetInstance(); * v28.Item02Ptr = XiItemTable::GetItemByID(v7, v28.Item02); * v8 = BS_SingletonHeap < XiItemTable,5 >::GetInstance(); * v28.Item03Ptr = XiItemTable::GetItemByID(v8, v28.Item03); * v9 = BS_SingletonHeap < XiVisualItemTable,5 >::GetInstance(); * v29 = XiVisualItemTable::GetVisualItemInfo(v9, v28.Item01); * if (v29) * v28.VSItemPtr = v29; * if (v28.Item01Ptr) ++v28.RewardItemNum; * if (v28.Item02Ptr) ++v28.RewardItemNum; * if (v28.Item03Ptr) ++v28.RewardItemNum; */ questList.Add(quest.QuestIdN, quest); } } return(questList); }
/// <summary> /// Loads all necessary components and starts the server. /// </summary> public void Run() { if (_running) { throw new Exception("Server is already running."); } var watch = System.Diagnostics.Stopwatch.StartNew(); int x, y, width, height; Win32.GetWindowPosition(out x, out y, out width, out height); Win32.SetWindowPosition(width + 5, 0, width, height); ConsoleUtil.WriteHeader($"Game Server ({Shared.Util.Version.GetVersion()})", ConsoleColor.DarkGreen); ConsoleUtil.LoadingTitle(); Log.Info("Server startup requested"); Log.Info($"Server Version {Shared.Util.Version.GetVersion()}"); NavigateToRoot(); // Conf LoadConf(Config = new GameConf()); // Database InitDatabase(Database = new GameDatabase(), Config); // Data /*var reader = new TdfReader(); * if (reader.Load("system/data/QuestServer.tdf")) * { * Log.Debug("Loading Quest Table"); * QuestTable = XiStrQuest.LoadFromTdf(reader); * if(QuestTable.Count == 0) throw new InvalidDataException("QuestTable corrupt!"); * Log.Debug("Quest Table Initialized with {0:D} rows.", QuestTable.Count); * } * else * { * Log.Debug("Quest Table Load failed."); * }*/ Log.Info("Loading Vehicles.."); if (File.Exists("system/data/Vehicles.xml")) { try { Vehicles = GameData.LoadVehicleData("system/data/vehicles.xml"); } catch (Exception) { #if !DEBUG throw new Exception("Vehicle Data corrupt"); #else throw; #endif } } Log.Info("Loading VShop Items.."); if (File.Exists("system/data/VShopItems.xml")) { try { VisualItems = GameData.LoadVShopItems("system/data/VShopItems.xml"); } catch (Exception) { #if !DEBUG throw new Exception("VShop Items corrupt!"); #else throw; #endif } } else { throw new FileNotFoundException("VShopItem data not found!"); } Log.Info("VShop Items loaded with {0:D} entries", VisualItems.Count); Log.Info("Loading Quest Table"); if (File.Exists("system/data/Quests.xml")) { try { Quests = GameData.LoadQuests("system/data/Quests.xml"); } catch (Exception) { #if !DEBUG throw new Exception("Quest data corrupt!"); #else throw; #endif } } else { throw new FileNotFoundException("Quest data not found!"); } Log.Info("Quest Table loaded with {0:D} entries", Quests.Count); // ################# ITEMS ################ // Log.Info("Loading Item Table"); if (File.Exists("system/data/Items.xml")) { try { Items = GameData.LoadItems("system/data/Items.xml", "system/data/UseItems.xml"); } catch (Exception) { #if !DEBUG throw new Exception("Items data corrupt!"); #else throw; #endif } } else { throw new FileNotFoundException("Items data not found!"); } Log.Info("Item Table loaded with {0:D} entries", Items.Count); /*reader = new TdfReader(); * if (reader.Load("system/data/ItemClient.tdf")) * { * Log.Debug("Loading Item Table"); * ItemTable = XiStrItem.LoadFromTdf(reader); * if(ItemTable.Count == 0) throw new InvalidDataException("ItemTable corrupt!"); * Log.Debug("Item Table Initialized with {0:D} rows.", ItemTable.Count); * }*/ // TODO: Load VehicleList.csv to VehicleInfo //VehicleInfo.Load("system/data/VehicleList.csv"); var reader = new TdfReader(); if (reader.Load("system/data/LevelServer.tdf")) { Log.Debug("Loading Exp Table"); LevelTable = XiExpTable.LoadFromTdf(reader); if (LevelTable.Count == 0) { throw new InvalidDataException("LevelTable corrupt!"); } Log.Debug("Exp Table Initialized with {0:D} rows.", LevelTable.Count); } else { Log.Debug("Exp Table Load failed."); } // Start Server = new DefaultServer(Config.Game.Port); Server.Start(); ConsoleUtil.RunningTitle(); _running = true; watch.Stop(); Log.Info("Ready after {0}ms", watch.ElapsedMilliseconds); // Commands var commands = new GameConsoleCommands(); commands.Wait(); }