예제 #1
0
 /// <summary>
 /// Protocol 0001
 /// </summary>
 /// <param name="session"></param>
 /// <param name="packet"></param>
 /// <returns></returns>
 public void VersionCheck(EcoSession session, BasePacket packet)
 {
     try
     {
         //Logger.Debug($"Send Packet:{loginServerAck.ToHexString()}");
         session.Send(firstAck);
         //byte[] front_word = new byte[4];
         //byte[] back_word = new byte[4];
         //rng.GetBytes(front_word);
         //rng.GetBytes(back_word);
         //front_word[0] = 0;
         //back_word[0] = 0;
         //session.FrontWord = front_word.ToUInt32();
         //session.BackWord = back_word.ToUInt32();
         //var pass_hash = new BasePacket(0x001e, front_word.Concat(back_word).ToArray()).ToBytes();
         session.FrontWord = 1111;
         session.BackWord  = 1111;
         var pass_hash = new BasePacket(0x001e, session.FrontWord.ToBytes().Concat(session.BackWord.ToBytes()).ToArray()).ToBytes();
         session.Send(pass_hash);
         session.Send(new BasePacket(0x0002, packet.Data));
     }
     catch (Exception e)
     {
         Logger.Error(e);
     }
 }
예제 #2
0
 private void UpdateCharaBuffAndDebuff(EcoSession session, uint chara_id)
 {
     byte[] data = new byte[52];
     data.Fill(chara_id.ToBytes(), 0);
     //todo: record buffs and debuffs
     session.Send(new BasePacket(0x157c, data));
 }
        /// <summary>
        /// Protocol 00A0
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public async void RequestMapID(EcoSession session, BasePacket packet)
        {
            Logger.Debug($"Received MapID Request :{packet.Data.ToHexString()}");
            byte slot   = packet.Data[0];
            uint map_id = await DatabaseManager.SelectAsync($@"SELECT Map FROM Chara WHERE account_id = {session.AccountID} AND Slot = {slot}");

            session.Send(new BasePacket(0xA8, map_id.ToBytes()));
        }
        /// <summary>
        /// Protocol 0032
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public void RequestMapServer(EcoSession session, BasePacket packet)
        {
            Logger.Debug($"Received MapServer Request :{packet.Data.ToHexString()}");
            uint map_id = packet.Data.ToUInt32();

            //todo: fetch database
            session.Send(new MapServerResult(1, "127.0.0.1", 17833).ToPacket());
        }
예제 #5
0
 /// <summary>
 /// 通常
 /// ** ** ** **
 /// 00 00 00 02
 /// 00 00 00 00
 /// 闘技場モード
 /// ********
 /// 00 00 00 42
 /// 00 00 00 01
 /// ドミニオン界モード
 /// ********
 /// 00 00 01 02
 /// 00 00 00 04
 /// </summary>
 /// <param name="session"></param>
 /// <param name="chara_id"></param>
 /// <param name="mode1"></param>
 /// <param name="mode2"></param>
 private void CharaModeChange(EcoSession session, uint chara_id, uint mode1, uint mode2)
 {
     byte[] data = new byte[12];
     data.Fill(chara_id.ToBytes(), 0);
     data.Fill(mode1.ToBytes(), 0);
     data.Fill(mode2.ToBytes(), 0);
     session.Send(new BasePacket(0x0fa7, data));
 }
예제 #6
0
        /// <summary>
        /// Protocol 0031
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public async void RequestServerList(EcoSession session, BasePacket packet)
        {
            session.Send(new BasePacket(0x0032));

            List <ServerInfo> serverList = await DatabaseManager.SelectMultiAsync <ServerInfo>("SELECT Id, Name, Address, Port, Status FROM LoginServer");

            foreach (var server in serverList)
            {
                session.Send(server.ToPacket());
            }

            session.Send(new BasePacket(0x0034));

            session.Send(new DisconnectionInfo(1).ToPacket());

            session.Close();
        }
예제 #7
0
 /// <summary>
 /// Protocol 000A
 /// </summary>
 /// <param name="session"></param>
 /// <param name="packet"></param>
 /// <returns></returns>
 public void ConnectionInit(EcoSession session, BasePacket packet)
 {
     session.Send(firstAck);
     session.Send(new BasePacket(0x000b, packet.Data));
     #region send password hash
     byte[] front_word = new byte[4];
     byte[] back_word  = new byte[4];
     rng.GetBytes(front_word);
     rng.GetBytes(back_word);
     front_word[0]     = 0;
     back_word[0]      = 0;
     session.FrontWord = front_word.ToUInt32();
     session.BackWord  = back_word.ToUInt32();
     var pass_hash = new BasePacket(0x000f, front_word.Concat(back_word).ToArray()).ToBytes();
     session.Send(pass_hash);
     #endregion
 }
        /// <summary>
        /// Protocol 002A
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public void GetMailAndFriendList(EcoSession session, BasePacket packet)
        {
            Logger.Debug($"Received CheckCharaID Request :{packet.Data.ToHexString()}");
            uint chara_id = packet.Data.ToUInt32();

            session.Send(new BasePacket(0x002b));

            //todo: send mail and friend list
        }
예제 #9
0
        /// <summary>
        /// Protocol 001F
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public async void UserLogin(EcoSession session, BasePacket packet)
        {
            var login_data = new LoginData(packet.Data);

            Logger.Debug($"Received Login Request, Username: {login_data.Username}, Password:{login_data.Password}, MacAddress:{login_data.MacAddress.ToHexString()}, SingleSignOn:{login_data.SingleSignOn.ToString()}");
            LoginAuthResult loginAuthResult;
            //select user info from db
            Account userAccount = await DatabaseManager.SelectAsync <Account>("username", $@"'{login_data.Username}'");

            if (userAccount.is_online)
            {
                loginAuthResult = new LoginAuthResult(LoginResultEnum.GAME_SMSG_LOGIN_ERR_ALREADY, 1);
                session.Send(loginAuthResult.ToPacket());
                Logger.Debug($"USER: {login_data.Username} has already logged in.");
                return;
            }

            if (userAccount.is_banned)
            {
                loginAuthResult = new LoginAuthResult(LoginResultEnum.GAME_SMSG_LOGIN_ERR_BFALOCK, 1);
                session.Send(loginAuthResult.ToPacket());
                Logger.Debug($"USER: {login_data.Username} is banned.");
                return;
            }

            string pass_hash = Utilities.PasswordHash(userAccount.password, session.FrontWord.ToString(), session.BackWord.ToString()).ToHexString();


            if (login_data.Password == pass_hash)
            {
                loginAuthResult          = new LoginAuthResult(LoginResultEnum.GAME_SMSG_LOGIN_SUCCESS, 1);
                session.UserLoginSuccess = true;
                session.AccountID        = userAccount.id;
                Logger.Debug($"USER: {login_data.Username} login success.");
            }
            else
            {
                loginAuthResult = new LoginAuthResult(LoginResultEnum.GAME_SMSG_LOGIN_ERR_BADPASS, 0);
                Logger.Debug($"USER: {login_data.Username} login disallowed (wrong password).");
            }


            session.Send(loginAuthResult.ToPacket());
        }
예제 #10
0
        /// <summary>
        /// Protocol 002F
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public void LoginStatusCheck(EcoSession session, BasePacket packet)
        {
            int allowLogin = -1;

            if (session.UserLoginSuccess)
            {
                allowLogin = 0;
            }
            session.Send(new BasePacket(0x0030, allowLogin.ToBytes()));
        }
예제 #11
0
 private void UpdateCharaHpMpSpEp(EcoSession session, CharaInfo info)
 {
     byte[] data = new byte[33];
     data.Fill(info.CharaID.ToBytes(), 0);
     data[4] = 3;
     data.Fill(((ulong)info.Hp).ToBytes(), 5);
     data.Fill(((ulong)info.Mp).ToBytes(), 13);
     data.Fill(((ulong)info.Sp).ToBytes(), 21);
     data.Fill(info.MaxEp.ToBytes(), 29);
     session.Send(new BasePacket(0x021c, data));
 }
예제 #12
0
        /// <summary>
        /// 取得済みEXモーション2
        /// </summary>
        /// <param name="session"></param>
        private void GetExMotion2(EcoSession session)
        {
            //todo: get motion from db
            uint[] motion2 = new uint[3];

            byte[] data = new byte[13];

            data[0] = (byte)motion2.Length;

            for (byte i = 0; i < data[0]; i++)
            {
                data.Fill(motion2[i].ToBytes(), 1 + 4 * i);
            }

            session.Send(new BasePacket(0x1d06, data));
        }
예제 #13
0
        /// <summary>
        /// Protocol 01FD
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public async void SelectMap(EcoSession session, BasePacket packet)
        {
            Logger.Debug($"Received SelectChara Request :{packet.Data.ToHexString()}");
            SelectMapRequestInfo scri = new SelectMapRequestInfo(packet.Data);

            if (scri.MapMove == 0) //login
            {
                //session.CharaID = await DatabaseManager.SelectAsync($@"SELECT id FROM Chara WHERE account_id = {session.AccountID} AND Slot = {scri.SelectedSlot}");
                CharaInfo info = await DatabaseManager.SelectAsync <CharaInfo>(
                    $@"SELECT Chara.Id AS CharaID, Name, Race, Form, Race, Form, Sex, HairStyle, HairColor, Wig, IsEmptySlot, Face, RebirthLv, Ex, Wing, WingColor, Map, X, Y, Dir, Hp, Mp, Sp,Ep, MaxHp, MaxMp, MaxSp, MaxEp, Gold FROM Chara LEFT JOIN CharaData ON Chara.id = CharaData.id WHERE Chara.account_id = {session.AccountID} AND Slot = {scri.SelectedSlot}"
                    );

                CharaEquipment equip = await DatabaseManager.SelectAsync <CharaEquipment>(info.CharaID, "Equip");

                info.Equipments = equip.ToArray();

                session.CharaID = info.CharaID;
                ShowTinyIcon(session, info.ShowTinyIcon == 1);
                EverydayDungeonNotification(session, info.DailyDungeonCleared == 1);
                MoveSpeedChange(session, session.CharaID, 0x0A);               //lock chara move
                CharaModeChange(session, session.CharaID, 2, 0);
                RightClickSettings(session, RightClickSettingsEnum.ALLOW_ALL); //todo: save user settings

                // todo:
                SendCharaInventory(session);
                session.Send(info.ToPacket());
                UpdateCharaMaxHpMpSpEp(session, info);
                UpdateCharaHpMpSpEp(session, info);
                UpdateCharaBuffAndDebuff(session, session.CharaID);
                UpdateDetailedStatus(session, info);
                UpdateElements(session);
                UpdateCharaCapaAndPayl(session);
                //=====
            }
            else //move between map servers
            {
            }
            //session.Send(new BasePacket(0x0033));
        }
예제 #14
0
        /// <summary>
        /// Protocol 001F
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public async void UserLogin(EcoSession session, BasePacket packet)
        {
            try
            {
                var login_data = new LoginData(packet.Data);
                Logger.Debug($"Received Login Request, Username: {login_data.Username}, Password:{login_data.Password}, MacAddress:{login_data.MacAddress.ToHexString()}, SingleSignOn:{login_data.SingleSignOn.ToString()}");
                LoginAuthResult loginAuthResult;
                //select user info from db
                Account userAccount = await DatabaseManager.SelectAsync <Account>("username", $@"'{login_data.Username}'");

                if (userAccount.is_online)
                {
                    loginAuthResult = new LoginAuthResult(LoginResultEnum.GAME_SMSG_LOGIN_ERR_ALREADY, 1);
                    session.Send(loginAuthResult.ToPacket());
                    return;
                }

                if (userAccount.is_banned)
                {
                    loginAuthResult = new LoginAuthResult(LoginResultEnum.GAME_SMSG_LOGIN_ERR_BFALOCK, 1);
                    session.Send(loginAuthResult.ToPacket());
                    return;
                }

                string pass_hash = Utilities.PasswordHash(userAccount.password, session.FrontWord.ToString(), session.BackWord.ToString()).ToHexString();

                if (login_data.Password == pass_hash)
                {
                    loginAuthResult          = new LoginAuthResult(LoginResultEnum.GAME_SMSG_LOGIN_SUCCESS, 1);
                    session.UserLoginSuccess = true;
                    session.AccountID        = userAccount.id;
                }
                else
                {
                    loginAuthResult = new LoginAuthResult(LoginResultEnum.GAME_SMSG_LOGIN_ERR_BADPASS, 0);
                }

                session.Send(loginAuthResult.ToPacket());

                if (session.UserLoginSuccess)
                {
                    CharaSelectionInfo     sci = new CharaSelectionInfo();
                    EquipmentSelectionInfo sei = new EquipmentSelectionInfo();
                    //select chara data from db
                    List <SingleCharaSelectionInfoExt> lscsiws = await DatabaseManager.SelectMultiAsync <SingleCharaSelectionInfoExt>("account_id", session.AccountID.ToString(), "Chara");

                    foreach (var scsiws in lscsiws)
                    {
                        sci.AddChara(scsiws, scsiws.Slot);
                        SingleCharaEquipmentSelectionInfoExt scesi = await DatabaseManager.SelectAsync <SingleCharaEquipmentSelectionInfoExt>(scsiws.id, "Equip");

                        sei.AddEquipmentInfo(scesi, scsiws.Slot);
                    }

                    //test use
                    //sci.AddChara(new SingleCharaSelectionInfo {
                    //    Name = "TEST",
                    //    RebirthLv = 10, Sex = 1, HairStyle = 7, HairColor = 50, Wig = 0xffff, IsEmptySlot = 0xff, Face = 0, Map = 0x0098f058, Job = 91, LvBase = 15, LvJob1 = 15, LvJob2t = 50, LvJob2x = 1, LvJob3 = 1, Quest = 5 });

                    session.Send(sci.ToPacket());

                    //for test use
                    //sei.AddEquipmentInfo(new SingleCharaEquipmentSelectionInfo { Chestacce = 0x02fc6a3c, Tops = 0x0395d924, Backpack = 0x02fc3328, Shoes = 0x02fe8678 });

                    session.Send(sei.ToPacket());
                }
            }
            catch (Exception e)
            {
                Logger.Error(e);
            }
        }
예제 #15
0
 /// <summary>
 /// Set Right Click Menu functions
 /// </summary>
 /// <param name="session"></param>
 /// <param name="options"></param>
 private void RightClickSettings(EcoSession session, RightClickSettingsEnum options)
 {
     session.Send(new BasePacket(0x1a5f, ((uint)options).ToBytes()));
 }
예제 #16
0
 private void UpdateDetailedStatus(EcoSession session, CharaInfo info)
 {
     session.Send(new CharaDetailedStatus1().ToPacket());
     session.Send(new CharaDetailedStatus2().ToPacket());
 }
예제 #17
0
 /// <summary>
 /// change chara's move speed
 /// </summary>
 /// <param name="session"></param>
 /// <param name="chara_id"></param>
 /// <param name="speed"></param>
 private void MoveSpeedChange(EcoSession session, uint chara_id, ushort speed)
 {
     session.Send(new BasePacket(0x1239, chara_id.ToBytes().Concat(speed.ToBytes()).ToArray()));
 }
예제 #18
0
        /// <summary>
        /// DWORD unknown;
        /// DWORD flag?; //毎日ダンジョンクリア時に0x00000001を受信(!を非表示にする)
        /// </summary>
        /// <param name="session"></param>
        /// <param name="cleared"></param>
        private void EverydayDungeonNotification(EcoSession session, bool cleared)
        {
            UInt64 data = (UInt64)(cleared ? 0x01 : 0x00);

            session.Send(new BasePacket(0x026a, data.ToBytes()));
        }
예제 #19
0
        ///// <summary>
        ///// send chara data
        ///// </summary>
        ///// <param name="session"></param>
        ///// <param name="chara_id"></param>
        //private void SendCharaInfo(EcoSession session, CharaInfo info)
        //{
        //    session.Send(info.ToPacket());
        //}

        /// <summary>
        /// タイニーアイコン
        /// </summary>
        /// <param name="session"></param>
        /// <param name="show"></param>
        private void ShowTinyIcon(EcoSession session, bool show)
        {
            session.Send(new BasePacket(0x1f72, new byte[] { (byte)(show ? 0x01 :0x00) }));
        }
예제 #20
0
        private void UpdateElements(EcoSession session)
        {
            CharaElements elements = new CharaElements();

            session.Send(elements.ToPacket());
        }
예제 #21
0
 /// <summary>
 /// Protocol 000A
 /// </summary>
 /// <param name="session"></param>
 /// <param name="packet"></param>
 /// <returns></returns>
 public void ConnectionCheck(EcoSession session, BasePacket packet)
 {
     session.Send(new BasePacket(0x000b, packet.Data));
 }
예제 #22
0
        private void UpdateCharaCapaAndPayl(EcoSession session)
        {
            CharaCapaAndPayl capaAndPayl = new CharaCapaAndPayl();

            session.Send(capaAndPayl.ToPacket());
        }
예제 #23
0
 /// <summary>
 /// send inventory data
 /// </summary>
 /// <param name="session"></param>
 /// <param name="chara_id"></param>
 private void SendCharaInventory(EcoSession session)
 {
     //todo
     session.Send(new ItemInfoExt(2).ToPacket());
 }
예제 #24
0
        /// <summary>
        /// Protocol 00A0
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public async void CreateChara(EcoSession session, BasePacket packet)
        {
            CharaCreationInfo cci = new CharaCreationInfo(packet.Data);

            Logger.Debug($"Received Chara Creation Request at slot:{cci.chara_slot}, chara name:{cci.chara_name}, race:{cci.race},sex:{cci.sex}, hair:{cci.hair}, hair color:{cci.hair_color}, face:{cci.face}");

            #region validation check

            if (session.AccountID == 0)
            {
                //error
                Logger.Error($"Create chara failed, AccountID is 0");
                return;
            }

            if (cci.chara_name.Length < 3)
            {
                session.Send(new CharaCreationResult(CharaCreationResultEnum.GAME_SMSG_CHRCREATE_E_NAME_TOO_SHORT).ToPacket());
                return;
            }

            if (cci.chara_name.Length > 8)
            {
                session.Send(new CharaCreationResult(CharaCreationResultEnum.GAME_SMSG_CHRCREATE_E_NAME_TOO_LONG).ToPacket());
                return;
            }

            Regex r = new Regex(@"[.,\/#!$%\^&\*;:{}=\-_~()\s]");
            if (r.IsMatch(cci.chara_name))
            {
                session.Send(new CharaCreationResult(CharaCreationResultEnum.GAME_SMSG_CHRCREATE_E_NAME_BADCHAR).ToPacket());
                return;
            }

            uint repeat_slot_count = await DatabaseManager.SelectCountAsync($@"SELECT COUNT(id) AS COUNT FROM Chara WHERE 'account_id' = {session.AccountID} AND 'Slot' = {cci.chara_slot}");

            if (repeat_slot_count > 0)
            {
                session.Send(new CharaCreationResult(CharaCreationResultEnum.GAME_SMSG_CHRCREATE_E_ALREADY_SLOT).ToPacket());
                return;
            }

            uint repeat_name_count = await DatabaseManager.SelectCountAsync("Name", $@"'{cci.chara_name}'", "Chara", "id");

            if (repeat_name_count > 0)
            {
                session.Send(new CharaCreationResult(CharaCreationResultEnum.GAME_SMSG_CHRCREATE_E_NAME_CONFLICT).ToPacket());
                return;
            }
            #endregion

            #region insert chara info
            Dictionary <string, object> charaInsertDict = new Dictionary <string, object>();
            charaInsertDict.Add("account_id", session.AccountID);
            charaInsertDict.Add("Slot", cci.chara_slot);
            charaInsertDict.Add("Name", cci.chara_name);
            charaInsertDict.Add("Race", cci.race);
            charaInsertDict.Add("Sex", cci.sex);
            charaInsertDict.Add("HairStyle", cci.hair);
            charaInsertDict.Add("HairColor", cci.hair_color);
            charaInsertDict.Add("Face", cci.face);
            charaInsertDict.Add("Map", 10999000); //start map

            if (await DatabaseManager.InsertAsync("Chara", charaInsertDict) <= 0)
            {
                session.Send(new CharaCreationResult(CharaCreationResultEnum.GAME_SMSG_CHRCREATE_E_ERROR).ToPacket());
                return;
            }

            #region  insert default equipments for the chara

            uint chara_id = await DatabaseManager.SelectAsync($@"SELECT id FROM Chara WHERE account_id = {session.AccountID} AND Slot = {cci.chara_slot}");

            if (chara_id == 0)
            {
                Logger.Error("Get chara id error.");
            }

            SingleCharaEquipmentSelectionInfoExt scesi           = new SingleCharaEquipmentSelectionInfoExt(chara_id);
            Dictionary <string, object>          equipInsertDict = new Dictionary <string, object>();

            equipInsertDict.Add("id", chara_id);
            // Head
            equipInsertDict.Add("Head", scesi.Head);
            // Headacce
            equipInsertDict.Add("Headacce", scesi.Headacce);
            // Face
            equipInsertDict.Add("Face", scesi.Face);
            //Faceacce
            equipInsertDict.Add("Faceacce", scesi.Faceacce);
            //Chestacce
            equipInsertDict.Add("Chestacce", scesi.Chestacce);
            //Tops
            equipInsertDict.Add("Top", scesi.Top);
            //Bottoms
            equipInsertDict.Add("Bottom", scesi.Bottom);
            //Backpack
            equipInsertDict.Add("Backpack", scesi.Backpack);
            //Right
            equipInsertDict.Add("Right", scesi.Right);
            //Left
            equipInsertDict.Add("Left", scesi.Left);
            //Shoes
            equipInsertDict.Add("Shoes", scesi.Shoes);
            //Socks
            equipInsertDict.Add("Socks", scesi.Socks);
            //Pet
            equipInsertDict.Add("Pet", scesi.Pet);
            //Effect
            equipInsertDict.Add("Effect", scesi.Effect);

            if (await DatabaseManager.InsertAsync("Equip", equipInsertDict) <= 0)
            {
                Logger.Error("Insert Equip failed.");
            }

            #endregion
            #endregion

            //send success message
            session.Send(new CharaCreationResult(CharaCreationResultEnum.GAME_SMSG_CHRCREATE_SUCCESS).ToPacket());
        }