Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        //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);
        }
Exemplo n.º 3
0
        // 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);
        }
Exemplo n.º 4
0
        /// <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();
        }