コード例 #1
0
 // 캐릭터 정보 패킷 획득 함수
 public void OnReceiveCharacterPacket(PacketId id, byte[] data)
 {
     CharacterPacket packet    = new CharacterPacket(data);
     CharacterData   character = packet.GetPacket();
     // Debug.Log(character.ToString() + " 수신완료.");
     //remotePlayers[character.playerIndex] = character;
 }
コード例 #2
0
        public override void Handle(EzClient client, EzPacket packet)
        {
            string characterName = packet.Data.ReadCString(Utils.KoreanEncoding);

            _logger.Debug("Character Name: {0}", characterName);

            Character existing = Server.Database.SelectCharacter(characterName);

            if (existing == null)
            {
                client.Session.Character = new Character(characterName);
                if (!Server.Database.UpsertCharacter(client.Session.Character, client.Account.Id))
                {
                    _logger.Error("Failed to save newly created character.");
                }

                IBuffer characterPacket = CharacterPacket.Create(client);
                Send(client, 2, characterPacket);
            }
            else
            {
                _logger.Error("Character with name ({0}) already exists", characterName);
                IBuffer error = EzServer.Buffer.Provide();
                error.WriteByte(1);
                Send(client, 2, error);
            }
        }
コード例 #3
0
 public ServerCharacter(string name, NetPeer peer, Vector2 position) : base(peer.Id, name)
 {
     Peer            = peer;
     Peer.Tag        = this;
     CharacterPacket = new CharacterPacket {
         Id = (byte)peer.Id
     };
     _variableData.Position = position;
 }
コード例 #4
0
    // 주기적으로 local character data를 송신한다.
    private IEnumerator SendLocalCharacterInfo()
    {
        // while(newtworkmanager.isconnected())
        while (true)
        {
            for (int i = 0; i < 3; i++)
            {
                CharacterPacket packet = new CharacterPacket(localPlayers[i]);
                // UDP로 전송
                networkManager.SendUnreliable <CharacterData>(packet);
                // TCP로 전송
                //networkManager.SendReliable<CharacterData>(packet);
            }
            //Debug.Log("캐릭터 데이터 송신 완료");

            // 0.2초마다 데이터 송신
            yield return(new WaitForSeconds(0.2f));
        }
    }
コード例 #5
0
        public override void Handle(EzClient client, EzPacket packet)
        {
            byte[] paramOne     = packet.Data.ReadBytes(17);
            byte[] paramTwo     = packet.Data.ReadBytes(17);
            byte[] unknown      = packet.Data.ReadBytes(4);
            byte[] paramThree   = packet.Data.ReadBytes(35);
            byte[] paramVersion = packet.Data.ReadBytes(4);
            byte[] unknown1     = packet.Data.ReadBytes(7);
            byte[] paramFour    = packet.Data.ReadBytes(4); // Last parameter, 4 numbers [0000 - 9999]
            byte[] unknown2     = packet.Data.ReadBytes(16);


            byte[] paramOneDecrypt = Utils.DecryptParameter(paramOne, Utils.KeyFirstParameter);
            byte[] paramTwoDecrypt = Utils.DecryptParameter(paramTwo, Utils.KeySecondParameter);

            string sessionKey  = Utils.ParameterToString(paramOneDecrypt);
            string accountName = Utils.ParameterToString(paramTwoDecrypt);
            string password    = Utils.ParameterToString(paramThree);
            string four        = Utils.ParameterToString(paramFour);
            string version     = Utils.ParameterToString(paramVersion);

            Session session;

            if (Server.Settings.ApiSettings.NeedRegistration)
            {
                session = Server.SessionManager.GetSession(sessionKey);
                if (session == null)
                {
                    _logger.Info("Invalid session key ({0}) provided by client ({1})",
                                 sessionKey, client.Identity);
                    client.Socket.Close();
                    return;
                }

                if (session.Account.Name != accountName)
                {
                    _logger.Info("Account ({0}) doesn't match session {{1}) for client ({2})",
                                 accountName, session.Account, client.Identity);
                    client.Socket.Close();
                    return;
                }

                if (!BCrypt.Net.BCrypt.Verify(password, session.Account.Hash))
                {
                    _logger.Info("Hash ({0}) doesn't match session {{1}) for client ({2})",
                                 password, session.Account.Hash, client.Identity);
                    client.Socket.Close();
                    return;
                }
            }
            else
            {
                Account account = Server.Database.SelectAccount(accountName);

                if (account == null)
                {
                    string bCryptHash = BCrypt.Net.BCrypt.HashPassword(password, ApiSettings.BCryptWorkFactor);
                    account = Server.Database.CreateAccount(accountName, bCryptHash);
                }
                else if (!BCrypt.Net.BCrypt.Verify(password, account.Hash))
                {
                    _logger.Info("Wrong password for account: {0}", accountName);
                    client.Socket.Close();
                    return;
                }

                session = new Session(sessionKey, account);
                Server.SessionManager.StoreSession(session);
                _logger.Info("Created session ({0}) for {0} ", session.Key, session.Account);
            }

            session.Character = Database.SelectCharacter(session.Account.Id);
            session.Setting   = Database.SelectSetting(session.Account.Id);
            session.Inventory = new Inventory(Database.SelectInventoryItems(session.Account.Id));

            if (session.Setting == null)
            {
                session.Setting = new Setting();
                if (!Server.Database.UpsertSetting(session.Setting, session.Account.Id))
                {
                    _logger.Error("Failed to save newly created setting.");
                }
            }

            client.Session = session;

            // TODO implement login protection
            client.Session.IsLoggedIn = true;

            _logger.Debug("Client {0} Login (params: sessionKey:{1} account:{2} hash:{3} Four:{4}) Version:{5}",
                          client.Identity, sessionKey, accountName, password, four, version);

            IBuffer response = EzServer.Buffer.Provide();

            response.WriteByte(1); // 0 = NonBlocking // 1 = Blocking?
            response.WriteByte(0);
            response.WriteByte(0);
            response.WriteByte(0x14);
            Send(client, 0, response);

            IBuffer characterPacket = CharacterPacket.Create(client);

            Send(client, 1, characterPacket);
        }