Exemplo n.º 1
2
        public static void RegisterHandler(PacketId packetId, PacketHandler handler)
        {
            if (packetHandlers.ContainsKey(packetId))
                throw new Exception("Duplicate packet handler");

            packetHandlers[packetId] = handler;
        }
Exemplo n.º 2
0
    public int Send <T>(int node, PacketId id, IPacket <T> packet)
    {
        int sendSize = 0;

        if (m_sessionTcp != null)
        {
            // 모듈에서 사용하는 헤더 정보 생성.
            PacketHeader     header     = new PacketHeader();
            HeaderSerializer serializer = new HeaderSerializer();

            header.packetId = id;

            byte[] headerData = null;
            if (serializer.Serialize(header) == true)
            {
                headerData = serializer.GetSerializedData();
            }
            byte[] packetData = packet.GetData();

            byte[] data = new byte[headerData.Length + packetData.Length];

            int headerSize = Marshal.SizeOf(typeof(PacketHeader));
            Buffer.BlockCopy(headerData, 0, data, 0, headerSize);
            Buffer.BlockCopy(packetData, 0, data, headerSize, packetData.Length);

            //string str = "Send Packet[" +  id  + "]";

            sendSize = m_sessionTcp.Send(node, data, data.Length);
        }

        return(sendSize);
    }
Exemplo n.º 3
0
    // ---------------------------------------------------------------- //
    // 패킷 수신 함수].

    // 동기 대기 패킷 수신.
    public void OnReceiveSyncPacket(int node, PacketId id, byte[] data)
    {
        Debug.Log("[CLIENT]OnReceiveSyncPacket");

        GameSyncPacket packet = new GameSyncPacket(data);
        GameSyncInfo   sync   = packet.GetPacket();

        GlobalParam.get().seed = sync.seed;

        // 초기 장비를 보존한다.
        for (int i = 0; i < sync.items.Length; ++i)
        {
            CharEquipment equip = sync.items[i];

            GlobalParam.get().shot_type[equip.globalId] = (SHOT_TYPE)equip.shotType;
            this.select_done_players[equip.globalId] = true;

            Debug.Log("[CLIENT] AccountID:" + equip.globalId + " ShotType:" + equip.shotType);
        }

        // 응답이 있는 쿼리를 검색.
        string            account_id = this.player.control.getAccountID();
        QuerySelectFinish query      = QueryManager.get().findQuery <QuerySelectFinish>(x => x.account_id == account_id);

        if (query != null)
        {
            Debug.Log("[CLIENT]QuerySelectDone done");
            query.set_done(true);
            query.set_success(true);
        }

        Debug.Log("[CLIENT]Recv seed:" + sync.seed);
    }
Exemplo n.º 4
0
    void OnReceiveStartSession(int node, PacketId id, byte[] data)
    {
        Debug.Log("ReceiveStartSession");

#if UNUSE_MATCHING_SERVER
        SessionData response = new SessionData();

        {
            int         memberNum = NetConfig.PLAYER_MAX;
            string      hostname  = Dns.GetHostName();
            IPAddress[] adrList   = Dns.GetHostAddresses(hostname);
            response.endPoints = new EndPointData[memberNum];

            response.result   = MatchingResult.Success;
            response.playerId = GlobalParam.get().global_account_id;
            response.members  = memberNum;

            for (int i = 0; i < memberNum; ++i)
            {
                response.endPoints[i]           = new EndPointData();
                response.endPoints[i].ipAddress = adrList[0].ToString();
                response.endPoints[i].port      = NetConfig.GAME_PORT;
            }
        }
#else
        SessionPacket packet   = new SessionPacket(data);
        SessionData   response = packet.GetPacket();
#endif
        playerId = response.playerId;

        SetSessionMembers(response.result, response.members, response.endPoints);

        matchingState = State.MatchingEnded;
    }
Exemplo n.º 5
0
    public void OnReceivePrizeResultPacket(int node, PacketId id, byte[] data)
    {
        PrizeResultPacket packet = new PrizeResultPacket(data);
        PrizeResultData   result = packet.GetPacket();

        Debug.Log("[CLIENT] ReceivePrizeResultPacket");

        for (int i = 0; i < result.cakeDataNum; ++i)
        {
            this.cake_counts[i] = result.cakeNum[i];

            Debug.Log("[CLIENT] Cake num[" + i + "]:" + result.cakeNum[i]);
        }

        chrBehaviorLocal local_player = PartyControl.get().getLocalPlayer();

        QueryCakeCount query = QueryManager.get().findQuery <QueryCakeCount>(x => x.account_id == local_player.getAcountID());

        if (query != null)
        {
            Debug.Log("[CLIENT]QueryCakeCount done");
            query.set_done(true);
            query.set_success(true);
        }
    }
Exemplo n.º 6
0
        internal unsafe void SendPayload(IMessage message, PacketId packetId, IPlugin plugin = null, Channel channel = null)
        {
            NetworkPayloadWriter temp = message.WritePacket(message, this);

            message.RawSize = temp.Length - HEADER_SIZE;
            SendPayload(temp, messageHandler.GetMessageId(message.GetType()), packetId, plugin, channel);
        }
Exemplo n.º 7
0
        /// <summary>Creates a new packet with a given ID. Used for sending.</summary>
        /// <param name="packetId">The packet ID.</param>
        protected Packet(PacketId packetId)
        {
            buffer  = new List <byte>(); // Intitialize buffer
            readPos = 0;                 // Set readPos to 0

            Write(packetId);             // Write packet id to the buffer
        }
Exemplo n.º 8
0
    public void SendReliableToAll(PacketId id, byte[] data)
    {
        if (m_tcp != null)
        {
            // 모듈에서 사용할 헤더 정보를 생성합니다.
            PacketHeader     header     = new PacketHeader();
            HeaderSerializer serializer = new HeaderSerializer();

            header.packetId = id;

            byte[] headerData = null;
            if (serializer.Serialize(header) == true)
            {
                headerData = serializer.GetSerializedData();
            }

            byte[] pdata = new byte[headerData.Length + data.Length];

            int headerSize = Marshal.SizeOf(typeof(PacketHeader));
            Buffer.BlockCopy(headerData, 0, pdata, 0, headerSize);
            Buffer.BlockCopy(data, 0, pdata, headerSize, data.Length);

            string str = "Send reliable packet[" + header.packetId + "]";

            int sendSize = m_tcp.Send(pdata, pdata.Length);
            if (sendSize < 0)
            {
                // 송신 오류.
            }
        }
    }
Exemplo n.º 9
0
    public int Send(PacketId id, byte[] data)
    {
        int sendSize = 0;

        if (m_tcp != null)
        {
            // 모듈에서 사용할 헤더 정보를 생성합니다.
            PacketHeader     header     = new PacketHeader();
            HeaderSerializer serializer = new HeaderSerializer();

            header.packetId = id;

            byte[] headerData = null;
            if (serializer.Serialize(header) == true)
            {
                headerData = serializer.GetSerializedData();
            }

            byte[] packetData = new byte[headerData.Length + data.Length];

            int headerSize = Marshal.SizeOf(typeof(PacketHeader));
            Buffer.BlockCopy(headerData, 0, packetData, 0, headerSize);
            Buffer.BlockCopy(data, 0, packetData, headerSize, data.Length);

            sendSize = m_tcp.Send(data, data.Length);
        }

        return(sendSize);
    }
Exemplo n.º 10
0
 protected static void WriteInternal(BinaryWriter writer, PacketId id, byte[] bodyData)
 {
     writer.Write((short)id);
     writer.Write((byte)0);
     writer.Write(bodyData.Length);
     writer.Write(bodyData);
 }
Exemplo n.º 11
0
    public void OnReceiveQuickAttackPacket(int node, PacketId id, byte[] data)
    {
        if (m_isHost)
        {
            // 호스트의 몬스터는 실행 완료.
            return;
        }

        // 패킷에서 파라미터를 추출해서 ↓의 코드 스니펫을 호출한다.
        GameObject go = GameObject.FindGameObjectWithTag("Boss");

        if (go != null)
        {
            chrControllerEnemyBoss bossController = go.GetComponent <chrControllerEnemyBoss>();
            if (bossController != null)
            {
                BossQuickPacket packet = new BossQuickPacket(data);
                BossQuickAttack attack = packet.GetPacket();

                string targetName  = attack.target;
                float  attackPower = attack.power;

                Debug.Log("Receive boss range attack[Ramge:" + targetName + " Power:" + attackPower + "]");
                dbwin.console().print("Receive boss range attack[Ramge:" + targetName + " Power:" + attackPower + "]");

                bossController.cmdBossQuickAttack(targetName, attackPower);
            }
        }
    }
Exemplo n.º 12
0
        public static NetWriter CreatePacket(PacketId packetId)
        {
            var p = _packets[(int)packetId];

            p.Clear(_packetClearStartBits);
            return(p);
        }
Exemplo n.º 13
0
    // ================================================================ //
    //
    //  하급 몬스터 관계 조작 명령 패킷 수신.
    //

    public void OnReceiveMonsterDataPacket(int node, PacketId id, byte[] data)
    {
        if (m_isHost)
        {
            // 호스트의 몬스터는 발생 완료.
            return;
        }

        MonsterPacket packet  = new MonsterPacket(data);
        MonsterData   monster = packet.GetPacket();

        //Debug.Log("[CLIENT] Receive monster data packet:" + monster.lairId + " - " + monster.monsterId);

        var lairs = enemies.FindAll(x => (x.behavior as chrBehaviorEnemy_Lair) != null);

        foreach (var lair in lairs)
        {
            if (lair.name == monster.lairId)
            {
                QuerySpawn query = new QuerySpawn(lair.name, monster.monsterId);

                query.set_done(true);
                query.set_success(true);

                QueryManager.get().registerQuery(query);
            }
        }
    }
Exemplo n.º 14
0
 public Type GetPacketType(PacketId id)
 {
     Type type = GetPacketTypeOrNull(id);
     if (type == null)
         throw new InvalidOperationException("Packet id is missing: " + id);
     return type;
 }
Exemplo n.º 15
0
 public IPacket CreatePacket(PacketId id, byte[] body)
 {
     var pck = CreatePacket(id);
     using (var ms = new MemoryStream(body))
         pck.Read(ms);
     return pck;
 }
Exemplo n.º 16
0
 public Packet(PacketId packetId, List <object> args)
 {
     PacketId = packetId;
     Data     = new List <object>(args);
     ShouldInvokeSynchronously = bool.Parse(args[1].ToString());
     args.RemoveRange(0, 2);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="GAF.Net.PacketHeader"/> class.
 /// </summary>
 /// <param name="packetId">Packet identifier.</param>
 /// <param name="objectId">Object identifier.</param>
 /// <param name="dataLength">Data length.</param>
 public PacketHeader(PacketId packetId, Guid objectId, int dataLength)
 {
     // get the byte representation of the header elements
     PacketId   = packetId;
     ObjectId   = objectId;
     DataLength = dataLength;
 }
Exemplo n.º 18
0
    public void OnReceiveRangeAttackPacket(int node, PacketId id, byte[] data)
    {
        if (m_isHost)
        {
            // 호스트의 몬스터는 실행 완료.
            return;
        }

        // 패킷에서 파라미터를 추출해서 ↓의 코드 스니펫을 호출한다.
        GameObject go = GameObject.FindGameObjectWithTag("Boss");

        if (go != null)
        {
            chrControllerEnemyBoss bossController = go.GetComponent <chrControllerEnemyBoss>();
            if (bossController != null)
            {
                BossRangePacket packet = new BossRangePacket(data);
                BossRangeAttack attack = packet.GetPacket();

                float attackPower = attack.power;
                float attackRange = attack.range;

                Debug.Log("Receive boss quick attack[Power:" + attackPower + " Ramge:" + attackRange + "]");
                bossController.cmdBossRangeAttack(attackPower, attackRange);
            }
        }
    }
Exemplo n.º 19
0
    public void     OnReceiveAttackPacket(int node, PacketId id, byte[] data)
    {
        AttackPacket packet = new AttackPacket(data);
        AttackData   attack = packet.GetPacket();

        //Debug.Log("[CLIENT] Receive Attack packet:" + attack.characterId);

        chrController controller = findPlayer(attack.characterId);

        if (controller == null)
        {
            return;
        }

        // 캐릭터 좌표 보간.
        chrBehaviorNet behavior = controller.behavior as chrBehaviorNet;

        if (behavior != null)
        {
            if (attack.attackKind == 0)
            {
                behavior.cmdShotAttack();
            }
            else
            {
                behavior.cmdMeleeAttack();
            }
        }
    }
Exemplo n.º 20
0
    // 대미지양 통지 정보 수신 함수.
    public void OnReceiveDamageNotifyPacket(int node, PacketId id, byte[] data)
    {
        DamageNotifyPacket packet = new DamageNotifyPacket(data);
        DamageData         damage = packet.GetPacket();

#if false
        string      avator_name  = "";
        AccountData account_data = AccountManager.get().getAccountData(damage.attacker);
        avator_name = account_data.avator_id;

        string log = "ReceiveDamageNotifyPacket:" + damage.target + "(" + damage.attacker + ") Damage:" + damage.damage;
        Debug.Log(log);
#endif
        chrBehaviorEnemy behavior = findCharacter <chrBehaviorEnemy>(damage.target);
        if (behavior == null)
        {
            return;
        }

        //log = "Cause damage:" + avator_name + " -> " + damage.target + " Damage:" + damage.damage;
        //Debug.Log(log);

        // 캐릭터의 대미지를 반영.
        behavior.control.causeDamage(damage.damage, damage.attacker, false);
    }
Exemplo n.º 21
0
    // HP 통지 정보 수신 함수.
    public void OnReceiveHitPointPacket(int node, PacketId id, byte[] data)
    {
        HitPointPacket packet = new HitPointPacket(data);
        HpData         hpData = packet.GetPacket();

        //Debug.Log("[CLIENT] Receive hitpoint packet:" + hpData.characterId);

        chrBehaviorBase behavior = findCharacter <chrBehaviorBase>(hpData.characterId);

        if (behavior == null)
        {
            return;
        }

        chrController controller = behavior.control;

        if (controller == null)
        {
            return;
        }

        if (controller.global_index < 0)
        {
            return;
        }

        //string log = "[CLIENT] Set HP:" + hpData.characterId + " HP:" + hpData.hp;
        //Debug.Log(log);

        // 캐릭터의 HP 반영.
        controller.setHitPoint(hpData.hp);
    }
Exemplo n.º 22
0
 public Packet(PacketId packetId, bool shouldInvokeSynchronously)
 {
     PacketId = packetId;
     ShouldInvokeSynchronously = shouldInvokeSynchronously;
     Data.Add((int)PacketId);
     Data.Add(ShouldInvokeSynchronously);
 }
Exemplo n.º 23
0
 public void OnReceiveReflectionPacket(int node, PacketId id, byte[] data)
 {
     if (network_ != null) {
         Debug.Log("[SERVER]OnReceiveReflectionData from node:" + node);
         network_.SendReliableToAll(id, data);
     }
 }
Exemplo n.º 24
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;
 }
Exemplo n.º 25
0
 /// <summary>
 /// Sends a packet.
 /// </summary>
 /// <param name="p">The packet to send</param>
 /// <param name="Stream">The stream to send it on.</param>
 public static void Send(Packet p, ModUpdaterNetworkStream Stream)
 {
     if (Stream.Disposed)
     {
         return;
     }
     while (busy)
     {
         ;
     }
     busy = true;
     try
     {
         PacketId id = GetPacketId(p);
         Stream.WriteNetworkByte((byte)id);
         //Write timestamp
         Stream.WriteLong(new UnixTime().Value);
         //Write packet.
         p.Write(Stream);
         lastSent = p;
         MinecraftModUpdater.Logger.Log(Logger.Level.Debug, string.Format("Sent packet {0}", id.ToString()));
     }
     catch (Exception e) { MinecraftModUpdater.Logger.Log(e); MinecraftModUpdater.Logger.Log(e); }
     busy = false;
 }
Exemplo n.º 26
0
        public static NetOutgoingMessage CreateMessage(this NetClient client, PacketId packetId, int initialCapacity)
        {
            var message = client.CreateMessage(initialCapacity + 4);

            message.Write((uint)packetId);
            return(message);
        }
Exemplo n.º 27
0
        public static void OnPacket(Client client, BallPosition ballPosition)
        {
            PacketId packid = PacketManager.me.typeIdSets[typeof(BallPosition)];

            ClientPool.xx[ballPosition.BallIndex] = ballPosition.X;
            Console.WriteLine("BallId:" + ballPosition.BallIndex + " X:" + ballPosition.X);
        }
Exemplo n.º 28
0
        public static NetOutgoingMessage CreateMessage(this NetClient client, PacketId packetId)
        {
            var message = client.CreateMessage();

            message.Write((uint)packetId);
            return(message);
        }
Exemplo n.º 29
0
        public static NetOutgoingMessage CreateMessage(this NetServer server, PacketId packetId, int initialCapacity)
        {
            var message = server.CreateMessage(initialCapacity + 4);

            message.Write((uint)packetId);
            return(message);
        }
Exemplo n.º 30
0
        public static NetOutgoingMessage CreateMessage(this NetServer server, PacketId packetId)
        {
            var message = server.CreateMessage();

            message.Write((uint)packetId);
            return(message);
        }
Exemplo n.º 31
0
    public void OnReceiveUseItemPacket(int node, PacketId id, byte[] data)
    {
        ItemUsePacket packet  = new ItemUsePacket(data);
        ItemUseData   useData = packet.GetPacket();

        Debug.Log("Receive UseItemPacket:" + useData.userId + " -> " +
                  useData.targetId + " (" + useData.itemCategory + ")");

        chrController user = CharacterRoot.getInstance().findPlayer(useData.userId);

        AccountData account_data = AccountManager.get().getAccountData(GlobalParam.getInstance().global_account_id);

        if (user != null && account_data.avator_id != useData.userId)
        {
            Debug.Log("use item. favor:" + useData.itemFavor);

            Item.Favor favor = new Item.Favor();
            favor.category = (Item.CATEGORY)useData.itemCategory;
            this.useItem(-1, favor, useData.userId, useData.targetId, false);
        }
        else
        {
            Debug.Log("Receive packet is already done.");
        }
    }
Exemplo n.º 32
0
    public void EnqueuePacket(Client client, PacketId packetId, byte[] data)
    {
        if (this.registeredPacketHandlerActions.TryGetValue(packetId, out var handlers))
        {
            foreach (var handler in handlers)
            {
                try
                {
                    handler(client, data);
                }
                catch (Exception e)
                {
                    this.logger.LogError($"Enqueueing packet ({packetId}) failed.\n{e.Message}\n{e.StackTrace}");
                }
            }
        }
        else
        {
            this.logger.LogWarning($"Received unregistered packet {packetId}");
        }

        if (this.registeredQueueHandlers.ContainsKey(packetId))
        {
            foreach (IQueueHandler queueHandler in this.registeredQueueHandlers[packetId])
            {
                queueHandler.EnqueuePacket(client, packetId, data);
                this.logger.LogWarning($"Use of deprecated queue handler {packetId} {queueHandler}");
            }
        }
    }
Exemplo n.º 33
0
        private protected override void ParsePacket(PacketId packetId, object[] args, EndPointId endPointId, SocketInfo socketInfo)
        {
            switch (packetId)
            {
            case PacketId.DircetInterfaceInitiating:
                DircetInterfaceInitiatingPacket initiatingPacket = new DircetInterfaceInitiatingPacket(args.ToList());
                EndPoint   eP;
                EndPointId clientId = initiatingPacket.EndPointId;
                lock (clients)
                {
                    if (clients.TryGetValue(clientId, out eP))
                    {
                        eP.UdpPort        = socketInfo.Port;
                        clients[clientId] = eP;
                    }
                    else
                    {
                        PrintWarning("UDP NOT init for: " + clientId);
                    }
                }
                clientsBeforeSync.Remove(clientId);
                OnClientEventHandlerSynchronizedEvent?.Invoke(clientId);
                break;

            case PacketId.BeginSynchronization:
                Synchronize(endPointId, new EndPoint(socketInfo.Ip, socketInfo.Port));
                break;

            default:
                base.ParsePacket(packetId, args, endPointId, socketInfo);
                break;
            }
        }
        public unsafe void QueuePacket(IMessage message, PacketId packetId, IPlugin plugin, Channel channel)
        {
            lock (AddQueueLock)
            {
                if (sizeCounter > MaxPacketQueueSize)
                {
                    while (packetQueue.Count > 0)
                    {
                        SendQueue();
                    }
                }

                NetworkPayloadWriter temp = message.WritePacket(message, conn);
                message.RawSize = temp.Length - conn.HEADER_SIZE;
                byte[] packet = temp.GetPayload();

                lock (packetQueue)
                {
                    packetQueue.Enqueue(new PacketQueueInfo(packet, packetId, plugin, channel, conn.messageHandler.GetMessageId(message.GetType())));
                    sizeCounter += packet.Length;
                }

                if (!threadRunning)
                {
                    threadRunning = true;
                    ThreadPool.QueueUserWorkItem((object obj) => WorkerThread());
                }
                arSizeUpdate.Set();
            }
        }
Exemplo n.º 35
0
    //======================================================
    public void OnReceiveHitPointPacket(int node, PacketId id, byte[] data)
    {
        // 패킷 수신
        HitPointPacket packet = new HitPointPacket(data);
        HpData hpData = packet.GetPacket();

        // 송신한 플레이어 구별
        GameObject netplayer = findPlayer(hpData.characterId);

        // 캐릭터 hp 감소
        netplayer.GetComponent<NetPlayerCtrl>().hp = hpData.hp;
    }
Exemplo n.º 36
0
    public void OnReceiveCharacterPacket(int node, PacketId id, byte[] data)
    {
        // 패킷 수신
        CharacterDataPacket packet = new CharacterDataPacket(data);
        CharacterData characterData = packet.GetPacket();

        // 송신한 플레이어 구별
        GameObject netplayer = findPlayer(characterData.characterId);

        // 캐릭터 좌표 보간
        if (netplayer != null)
        {
            netplayer.GetComponent<NetPlayerCtrl>().CalcCoordinates(characterData.index, characterData.coordinates);
        }
    }
Exemplo n.º 37
0
    public void OnReceiveAttackPacket(int node, PacketId id, byte[] data)
    {
        // 패킷 수신
        AttackPacket packet = new AttackPacket(data);
        AttackData attackData = packet.GetPacket();
        Debug.Log("fireAngle:" + attackData.fireAngle);
        Debug.Log("fireForce:" + attackData.fireForce);

        // 송신한 플레이어 구별
        GameObject netplayer = findPlayer(attackData.characterId);

        // 해당 플레이어에게 좌표 전달
        if(netplayer != null)
        {
            netplayer.GetComponent<NetFireCtrl>().SetFirePos(attackData.fireCoord);
            netplayer.GetComponent<NetFireCtrl>().SetFireAngle(attackData.fireAngle);
            netplayer.GetComponent<NetFireCtrl>().SetFireForce(attackData.fireForce);
        }
    }
Exemplo n.º 38
0
    // ================================================================ //
    public void OnReceiveGameSyncPacket(int node, PacketId id, byte[] data)
    {
        GameSyncPacket packet = new GameSyncPacket(data);
        GameSyncInfo info = packet.GetPacket();

        Debug.Log("[SERVER] Receive Init packet");

        // 게임서버에서 난수 동기화 작업
        TimeSpan ts = new TimeSpan(DateTime.Now.Ticks);
        double seconds = ts.TotalSeconds;
        info.seed = (int)((long)seconds - (long)(seconds / 1000.0) * 1000);
        Debug.Log("Seed: " + info.seed);

        // 세션 관리 정보와 플레이어 글로벌 ID를 연결
        info.members = new CharacterID[NetConfig.PLAYER_MAX];
        for(int i = 0; i < NetConfig.PLAYER_MAX; i++)
        {
            info.members[i].globalId = i;
            if (!m_nodes.ContainsKey(node))
            {
                m_nodes.Add(node, info.members[i].globalId);
            }
        }
    }
Exemplo n.º 39
0
	void OnReceiveSearchRoom(int node, PacketId id, byte[] data)
	{
		Debug.Log("ReceiveSearchRoom");

		SearchRoomPacket packet = new SearchRoomPacket(data);
		SearchRoomResponse response = packet.GetPacket();

		string str = "Created room num:" + response.roomNum;
		Debug.Log(str);

		SearchRoomResponse(response.roomNum, response.rooms);
	}
Exemplo n.º 40
0
        void ReadPacket( byte opcode )
        {
            reader.Remove( 1 ); // remove opcode
            lastOpcode = (PacketId)opcode;

            switch( (PacketId)opcode ) {
                case PacketId.Handshake:
                    {
                        byte protocolVer = reader.ReadUInt8();
                        ServerName = reader.ReadAsciiString();
                        ServerMotd = reader.ReadAsciiString();
                        game.LocalPlayer.SetUserType( reader.ReadUInt8() );
                        receivedFirstPosition = false;
                        game.LocalPlayer.ParseHackFlags( ServerName, ServerMotd );
                    } break;

                case PacketId.Ping:
                    break;

                case PacketId.LevelInitialise:
                    {
                        game.Map.Reset();
                        game.SetNewScreen( new LoadingMapScreen( game, ServerName, ServerMotd ) );
                        if( ServerMotd.Contains( "cfg=" ) ) {
                            ReadWomConfigurationAsync();
                        }
                        receivedFirstPosition = false;
                        gzipHeader = new GZipHeaderReader();
                        // Workaround because built in mono stream assumes that the end of stream
                        // has been reached the first time a read call returns 0. (MS.NET doesn't)
                        #if __MonoCS__
                        gzipStream = new DeflateStream( gzippedMap, true );
                        #else
                        gzipStream = new DeflateStream( gzippedMap, CompressionMode.Decompress );
                        if( OpenTK.Configuration.RunningOnMono ) {
                            Utils.LogWarning( "You are running on Mono, but this build does not support the Mono workaround." );
                            Utils.LogWarning( "You should either download the Mono compatible build or define '__MonoCS__' when targeting Mono. " +
                                             "(The Mono compiler already defines this by default)" );
                            Utils.LogWarning( "You will likely experience an 'Internal error (no progress possible) ReadInternal' exception when decompressing the map." );
                        }
                        #endif
                        mapSizeIndex = 0;
                        mapIndex = 0;
                        receiveStart = DateTime.UtcNow;
                    } break;

                case PacketId.LevelDataChunk:
                    {
                        int usedLength = reader.ReadInt16();
                        gzippedMap.Position = 0;
                        gzippedMap.SetLength( usedLength );

                        if( gzipHeader.done || gzipHeader.ReadHeader( gzippedMap ) ) {
                            if( mapSizeIndex < 4 ) {
                                mapSizeIndex += gzipStream.Read( mapSize, mapSizeIndex, 4 - mapSizeIndex );
                            }

                            if( mapSizeIndex == 4 ) {
                                if( map == null ) {
                                    int size = mapSize[0] << 24 | mapSize[1] << 16 | mapSize[2] << 8 | mapSize[3];
                                    map = new byte[size];
                                }
                                mapIndex += gzipStream.Read( map, mapIndex, map.Length - mapIndex );
                            }
                        }
                        reader.Remove( 1024 );
                        byte progress = reader.ReadUInt8();
                        game.Events.RaiseMapLoading( progress );
                    } break;

                case PacketId.LevelFinalise:
                    {
                        game.SetNewScreen( new NormalScreen( game ) );
                        int mapWidth = reader.ReadInt16();
                        int mapHeight = reader.ReadInt16();
                        int mapLength = reader.ReadInt16();

                        double loadingMs = ( DateTime.UtcNow - receiveStart ).TotalMilliseconds;
                        Utils.LogDebug( "map loading took:" + loadingMs );
                        game.Map.UseRawMap( map, mapWidth, mapHeight, mapLength );
                        game.Events.RaiseOnNewMapLoaded();
                        map = null;
                        gzipStream.Close();
                        if( sendWomId && !sentWomId ) {
                            SendChat( "/womid WoMClient-2.0.7" );
                            sentWomId = true;
                        }
                        gzipStream = null;
                        GC.Collect( 0 );
                    } break;

                case PacketId.SetBlock:
                    {
                        int x = reader.ReadInt16();
                        int y = reader.ReadInt16();
                        int z = reader.ReadInt16();
                        byte type = reader.ReadUInt8();
                        if( !game.Map.IsNotLoaded )
                            game.UpdateBlock( x, y, z, type );
                        else
                            Utils.LogWarning( "Server tried to update a block while still sending us the map!" );
                    } break;

                case PacketId.AddEntity:
                    {
                        byte entityId = reader.ReadUInt8();
                        string name = reader.ReadAsciiString();
                        AddEntity( entityId, name, name, true );
                    }  break;

                case PacketId.EntityTeleport:
                    {
                        byte entityId = reader.ReadUInt8();
                        ReadAbsoluteLocation( entityId, true );
                    } break;

                case PacketId.RelPosAndOrientationUpdate:
                    ReadRelativeLocation();
                    break;

                case PacketId.RelPosUpdate:
                    ReadRelativePosition();
                    break;

                case PacketId.OrientationUpdate:
                    ReadOrientation();
                    break;

                case PacketId.RemoveEntity:
                    {
                        byte entityId = reader.ReadUInt8();
                        Player player = game.Players[entityId];
                        if( entityId != 0xFF && player != null ) {
                            game.Events.RaiseEntityRemoved( entityId );
                            player.Despawn();
                            game.Players[entityId] = null;
                        }
                    } break;

                case PacketId.Message:
                    {
                        byte messageType = reader.ReadUInt8();
                        string text = reader.ReadChatString( ref messageType, useMessageTypes );
                        game.Chat.Add( text, (CpeMessage)messageType );
                    } break;

                case PacketId.Kick:
                    {
                        string reason = reader.ReadAsciiString();
                        game.Disconnect( "&eLost connection to the server", reason );
                        Dispose();
                    } break;

                case PacketId.SetPermission:
                    {
                        game.LocalPlayer.SetUserType( reader.ReadUInt8() );
                    } break;

                case PacketId.CpeExtInfo:
                    {
                        string appName = reader.ReadAsciiString();
                        Utils.LogDebug( "Server identified itself as: " + appName );
                        cpeServerExtensionsCount = reader.ReadInt16();
                    } break;

                case PacketId.CpeExtEntry:
                    {
                        string extName = reader.ReadAsciiString();
                        int extVersion = reader.ReadInt32();
                        Utils.LogDebug( "cpe ext: " + extName + " , " + extVersion );
                        if( extName == "HeldBlock" ) {
                            sendHeldBlock = true;
                        } else if( extName == "MessageTypes" ) {
                            useMessageTypes = true;
                        } else if( extName == "ExtPlayerList" ) {
                            UsingExtPlayerList = true;
                        } else if( extName == "PlayerClick" ) {
                            UsingPlayerClick = true;
                        } else if( extName == "EnvMapAppearance" && extVersion == 2 ) {
                            usingTexturePack = true;
                        }
                        cpeServerExtensionsCount--;

                        if( cpeServerExtensionsCount == 0 ) {
                            MakeExtInfo( Utils.AppName, clientExtensions.Length );
                            SendPacket();
                            for( int i = 0; i < clientExtensions.Length; i++ ) {
                                string name = clientExtensions[i];
                                int version = (name == "ExtPlayerList" || name == "EnvMapApperance") ? 2 : 1;
                                MakeExtEntry( name, version );
                                SendPacket();
                            }
                        }
                    } break;

                case PacketId.CpeSetClickDistance:
                    {
                        game.LocalPlayer.ReachDistance = reader.ReadInt16() / 32f;
                    } break;

                case PacketId.CpeCustomBlockSupportLevel:
                    {
                        byte supportLevel = reader.ReadUInt8();
                        MakeCustomBlockSupportLevel( 1 );
                        SendPacket();

                        if( supportLevel == 1 ) {
                            for( int i = (int)Block.CobblestoneSlab; i <= (int)Block.StoneBrick; i++ ) {
                                game.Inventory.CanPlace[i] = true;
                                game.Inventory.CanDelete[i] = true;
                            }
                            game.Events.RaiseBlockPermissionsChanged();
                        } else {
                            Utils.LogWarning( "Server's block support level is {0}, this client only supports level 1.", supportLevel );
                            Utils.LogWarning( "You won't be able to see or use blocks from levels above level 1" );
                        }
                    } break;

                case PacketId.CpeHoldThis:
                    {
                        byte blockType = reader.ReadUInt8();
                        bool canChange = reader.ReadUInt8() == 0;
                        game.Inventory.CanChangeHeldBlock = true;
                        game.Inventory.HeldBlock = (Block)blockType;
                        game.Inventory.CanChangeHeldBlock = canChange;
                    } break;

                case PacketId.CpeExtAddPlayerName:
                    {
                        short nameId = reader.ReadInt16();
                        string playerName = Utils.StripColours( reader.ReadAsciiString() );
                        string listName = reader.ReadAsciiString();
                        string groupName = reader.ReadAsciiString();
                        byte groupRank = reader.ReadUInt8();
                        if( nameId >= 0 && nameId <= 255 ) {
                            CpeListInfo oldInfo = game.CpePlayersList[nameId];
                            CpeListInfo info = new CpeListInfo( (byte)nameId, playerName, listName, groupName, groupRank );
                            game.CpePlayersList[nameId] = info;

                            if( oldInfo != null ) {
                                game.Events.RaiseCpeListInfoChanged( (byte)nameId );
                            } else {
                                game.Events.RaiseCpeListInfoAdded( (byte)nameId );
                            }
                        }
                    } break;

                case PacketId.CpeExtAddEntity:
                    {
                        byte entityId = reader.ReadUInt8();
                        string displayName = reader.ReadAsciiString();
                        string skinName = reader.ReadAsciiString();
                        AddEntity( entityId, displayName, skinName, false );
                    } break;

                case PacketId.CpeExtRemovePlayerName:
                    {
                        short nameId = reader.ReadInt16();
                        if( nameId >= 0 && nameId <= 255 ) {
                            game.Events.RaiseCpeListInfoRemoved( (byte)nameId );
                            game.CpePlayersList[nameId] = null;
                        }
                    } break;

                case PacketId.CpeMakeSelection:
                    {
                        byte selectionId = reader.ReadUInt8();
                        string label = reader.ReadAsciiString();
                        short startX = reader.ReadInt16();
                        short startY = reader.ReadInt16();
                        short startZ = reader.ReadInt16();
                        short endX = reader.ReadInt16();
                        short endY = reader.ReadInt16();
                        short endZ = reader.ReadInt16();

                        byte r = (byte)reader.ReadInt16();
                        byte g = (byte)reader.ReadInt16();
                        byte b = (byte)reader.ReadInt16();
                        byte a = (byte)reader.ReadInt16();

                        Vector3I p1 = Vector3I.Min( startX, startY, startZ, endX, endY, endZ );
                        Vector3I p2 = Vector3I.Max( startX, startY, startZ, endX, endY, endZ );
                        FastColour col = new FastColour( r, g, b, a );
                        game.SelectionManager.AddSelection( selectionId, p1, p2, col );
                    } break;

                case PacketId.CpeRemoveSelection:
                    {
                        byte selectionId = reader.ReadUInt8();
                        game.SelectionManager.RemoveSelection( selectionId );
                    } break;

                case PacketId.CpeEnvColours:
                    {
                        byte variable = reader.ReadUInt8();
                        short red = reader.ReadInt16();
                        short green = reader.ReadInt16();
                        short blue = reader.ReadInt16();
                        bool invalid = red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255;
                        FastColour col = new FastColour( red, green, blue );

                        if( variable == 0 ) { // sky colour
                            game.Map.SetSkyColour( invalid ? Map.DefaultSkyColour : col );
                        } else if( variable == 1 ) { // clouds colour
                            game.Map.SetCloudsColour( invalid ? Map.DefaultCloudsColour : col );
                        } else if( variable == 2 ) { // fog colour
                            game.Map.SetFogColour( invalid ? Map.DefaultFogColour : col );
                        } else if( variable == 3 ) { // ambient light (shadow light)
                            game.Map.SetShadowlight( invalid ? Map.DefaultShadowlight : col );
                        } else if( variable == 4 ) { // diffuse light (sun light)
                            game.Map.SetSunlight( invalid ? Map.DefaultSunlight : col );
                        }
                    } break;

                case PacketId.CpeSetBlockPermission:
                    {
                        byte blockId = reader.ReadUInt8();
                        bool canPlace = reader.ReadUInt8() != 0;
                        bool canDelete = reader.ReadUInt8() != 0;
                        Inventory inv = game.Inventory;

                        if( blockId == 0 ) {
                            for( int i = 1; i < BlockInfo.CpeBlocksCount; i++ ) {
                                inv.CanPlace.SetNotOverridable( canPlace, i );
                                inv.CanDelete.SetNotOverridable( canDelete, i );
                            }
                        } else {
                            inv.CanPlace.SetNotOverridable( canPlace, blockId );
                            inv.CanDelete.SetNotOverridable( canDelete, blockId );
                        }
                        game.Events.RaiseBlockPermissionsChanged();
                    } break;

                case PacketId.CpeChangeModel:
                    {
                        byte playerId = reader.ReadUInt8();
                        string modelName = reader.ReadAsciiString().ToLowerInvariant();
                        Player player = game.Players[playerId];
                        if( player != null ) {
                            player.SetModel( modelName );
                        }
                    } break;

                case PacketId.CpeEnvSetMapApperance:
                    {
                        string url = reader.ReadAsciiString();
                        byte sideBlock = reader.ReadUInt8();
                        byte edgeBlock = reader.ReadUInt8();
                        short waterLevel = reader.ReadInt16();
                        game.Map.SetWaterLevel( waterLevel );
                        game.Map.SetEdgeBlock( (Block)edgeBlock );
                        game.Map.SetSidesBlock( (Block)sideBlock );
                        if( url == String.Empty ) {
                            TexturePackExtractor extractor = new TexturePackExtractor();
                            extractor.Extract( game.defaultTexPack, game );
                        } else {
                            game.Animations.Dispose();
                            if( usingTexturePack )
                                game.AsyncDownloader.DownloadData( url, true, "texturePack" );
                            else
                                game.AsyncDownloader.DownloadImage( url, true, "terrain" );

                        }
                        Utils.LogDebug( "Image url: " + url );
                    } break;

                case PacketId.CpeEnvWeatherType:
                    game.Map.SetWeather( (Weather)reader.ReadUInt8() );
                    break;

                case PacketId.CpeHackControl:
                    {
                        game.LocalPlayer.CanFly = reader.ReadUInt8() != 0;
                        game.LocalPlayer.CanNoclip = reader.ReadUInt8() != 0;
                        game.LocalPlayer.CanSpeed = reader.ReadUInt8() != 0;
                        game.LocalPlayer.CanRespawn = reader.ReadUInt8() != 0;
                        game.CanUseThirdPersonCamera = reader.ReadUInt8() != 0;
                        if( !game.CanUseThirdPersonCamera ) {
                            game.SetCamera( false );
                        }
                        float jumpHeight = reader.ReadInt16() / 32f;
                        if( jumpHeight < 0 ) jumpHeight = 1.4f;
                        game.LocalPlayer.CalculateJumpVelocity( jumpHeight );
                    } break;

                case PacketId.CpeExtAddEntity2:
                    {
                        byte entityId = reader.ReadUInt8();
                        string displayName = reader.ReadAsciiString();
                        string skinName = reader.ReadAsciiString();
                        AddEntity( entityId, displayName, skinName, true );
                    } break;

                case PacketId.CpeDefineBlock:
                case PacketId.CpeDefineLiquid:
                    {
                        byte block = reader.ReadUInt8();
                        BlockInfo info = game.BlockInfo;
                        info.ResetBlockInfo( block );

                        info.Name[block] = reader.ReadAsciiString();
                        info.CollideType[block] = (BlockCollideType)reader.ReadUInt8();
                        // TODO: Liquid collide type not properly supported.
                        info.SpeedMultiplier[block] = (float)Math.Pow( 2, (reader.ReadUInt8() - 128) / 64f );
                        info.SetTop( reader.ReadUInt8(), (Block)block );
                        info.SetSide( reader.ReadUInt8(), (Block)block );
                        info.SetBottom( reader.ReadUInt8(), (Block)block );
                        reader.ReadUInt8(); // opacity hint, but we ignore this.
                        info.BlocksLight[block] = reader.ReadUInt8() == 0;
                        reader.ReadUInt8(); // walk sound, but we ignore this.
                        info.EmitsLight[block] = reader.ReadUInt8() != 0;

                        if( opcode == (byte)PacketId.CpeDefineBlock ) {
                            byte shape = reader.ReadUInt8();
                            if( shape == 1 ) info.Height[block] = 1;
                            else if( shape == 2 ) info.Height[block] = 0.5f;
                            // TODO: upside down slab not properly supported
                            else if( shape == 3 ) info.Height[block] = 0.5f;
                            else if( shape == 4 ) info.IsSprite[block] = true;

                            byte blockDraw = reader.ReadUInt8();
                            if( blockDraw == 0 ) info.IsOpaque[block] = true;
                            else if( blockDraw == 1 ) info.IsTransparent[block] = true;
                            else if( blockDraw == 2 ) info.IsTranslucent[block] = true;
                            else if( blockDraw == 3 ) info.IsTranslucent[block] = true;

                            Console.WriteLine( block + " : " + shape + "," + blockDraw );
                        } else {
                            byte fogDensity = reader.ReadUInt8();
                            info.FogDensity[block] = fogDensity == 0 ? 0 : (fogDensity + 1) / 128f;
                            info.FogColour[block] = new FastColour(
                                reader.ReadUInt8(), reader.ReadUInt8(), reader.ReadUInt8() );
                        }
                        info.SetupCullingCache();
                    } break;

                case PacketId.CpeRemoveBlockDefinition:
                    game.BlockInfo.ResetBlockInfo( reader.ReadUInt8() );
                    break;

                default:
                    throw new NotImplementedException( "Unsupported packet:" + (PacketId)opcode );
            }
        }
Exemplo n.º 41
0
	public void OnReceiveUseItemPacket(int node, PacketId id, byte[] data)
	{
		ItemUsePacket packet = new ItemUsePacket(data);
		ItemUseData useData = packet.GetPacket();

		Debug.Log ("Receive UseItemPacket:" + useData.userId + " -> " + 
		           								useData.targetId + " (" + useData.itemCategory + ")");

		chrController	user = CharacterRoot.getInstance().findPlayer(useData.userId);

		AccountData	account_data = AccountManager.get().getAccountData(GlobalParam.getInstance().global_account_id);

		if (user != null && account_data.avator_id != useData.userId) {
			Debug.Log("use item. favor:" + useData.itemFavor);

			Item.Favor	favor = new Item.Favor();
			favor.category = (Item.CATEGORY) useData.itemCategory;
			this.useItem(-1, favor, useData.userId, useData.targetId, false);
		}
		else {
			Debug.Log("Receive packet is already done.");
		}
	}
 /// <summary>
 /// Registers a packet handler.  This is NOT needed for an EncryptionStatus packet.
 /// </summary>
 /// <param name="id">The packet id.</param>
 /// <param name="handler">The handler for the packet.</param>
 public void RegisterPacketHandler(PacketId id, PacketEvent handler)
 {
     lock (eventLock)
     {
         try
         {
             EventHandler.Add(id, handler);
         }
         catch (Exception e) { throw e; }
     }
 }
Exemplo n.º 43
0
	// ================================================================ //
	
	// 아이템 정보 패킷 취득 함수.
	public void OnReceiveItemPacket(int node, PacketId id, byte[] data)
	{
		ItemPacket packet = new ItemPacket(data);
		ItemData item = packet.GetPacket();

		// 서버 상태와 동기화.
		ItemState istate = new ItemState();
		istate.item_id = item.itemId;
		ItemController.State state = (ItemController.State)item.state;
		istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state;
		istate.owner = item.ownerId;
		if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id)) {
			GlobalParam.getInstance().item_table.Remove(istate.item_id); 
		}
		GlobalParam.getInstance().item_table.Add(istate.item_id, istate);
		
		string log = "[CLIENT] Receive itempacket [" +
			"itemId:" + item.itemId +
				" state:" + state.ToString() +
				" ownerId:" + item.ownerId + "]";
		Debug.Log(log);
		dbwin.console().print(log);

		if (state == ItemController.State.Picked) {
			Debug.Log("Receive item pick.");
			dbwin.console().print("Receive item pick.");

			// 응답이 있는  쿼리를 탐색.
			QueryItemPick	query_pick = QueryManager.get().findQuery<QueryItemPick>(x => x.target == item.itemId);

			bool remote_pick = true;
			
			if (query_pick != null) {
				string account_name = PartyControl.get().getLocalPlayer().getAcountID();
				if (item.ownerId == account_name) {                                                 
					Debug.Log("Receive item pick local:" + item.ownerId);
					dbwin.console().print("Receive item pick local:" + item.ownerId);

					item_query_done(query_pick, true);
					remote_pick = false;
				}
				else {
					Debug.Log("Receive item pick remote:" + item.ownerId);
					dbwin.console().print("Receive item pick remote:" + item.ownerId);

					item_query_done(query_pick, false);
				}
			}
			
			if (remote_pick == true) {
				Debug.Log("Remote pick item:" + item.ownerId);
				dbwin.console().print("Remote pick item:" + item.ownerId);

				// 리모트 캐릭터가 가지게 한다.
				chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
				if (remote) {
					// 아이템 획득 쿼리 발행.
					QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true);
					if (query != null) {
						item_query_done(query, true);
					}
				}
			}

			// 아이템 획득 상태 변경.
			this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId);
		}
		else if (state == ItemController.State.Dropped) {
			Debug.Log("Receive item drop.");	

			// 응답이 있는 쿼리를 검색.
			QueryItemDrop	query_drop = QueryManager.get().findQuery<QueryItemDrop>(x => x.target == item.itemId);

			
			bool remote_drop = true;
			
			if (query_drop != null) {
				// 요청에 대한 응답이 있다.
				string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id;
				if (item.ownerId == account_name) { 
					// 자신이 획득.
					Debug.Log("Receive item drop local:" + item.ownerId);
					item_query_done(query_drop, true);
					remote_drop = false;
				}
				else {
					// 상대가 획득.
					Debug.Log("Receive item pick remote:" + item.ownerId);
					item_query_done(query_drop, false);
				}
			}
			
			if (remote_drop == true) {                                                 
				// 리모트 캐릭터가 획득.
				chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
				if (remote) {
					// 아이템획득 쿼리 발행.
					Debug.Log ("QuetyitemDrop:cmdItemQueryDrop");
				 	remote.cmdItemDrop(item.itemId, false);
				}
			}
		}
		else {
			Debug.Log("Receive item error.");
		}
	}
Exemplo n.º 44
0
	public void OnReceiveItemPacket(PacketId id, byte[] data)
	{
		ItemPacket packet = new ItemPacket(data);
		ItemData item = packet.GetPacket();

		PickupState state = (PickupState) item.state;

		string log = "[SERVER] ReceiveItemData " +
						"itemId:" + item.itemId +
						" state:" + state.ToString() +
						" ownerId:" + item.ownerId;
		Debug.Log(log);

		switch (state) {
		case PickupState.PickingUp:
			MediatePickupItem(item.itemId, item.ownerId);
			break;

		case PickupState.Dropping:
			MediateDropItem(item.itemId, item.ownerId);
			break;

		default:
			break;
		}
	}
 /// <summary>
 /// Un-registers the packet handler for a packet.
 /// </summary>
 /// <param name="id">The packet id to un-register.</param>
 public void RemovePacketHandler(PacketId id)
 {
     lock (eventLock)
     {
         try
         {
             EventHandler.Remove(id);
         }
         catch (Exception e) { throw e; }
     }
 }
Exemplo n.º 46
0
	//
	// 패킷 수신 처리.
	//
	
	void OnReceiveMatchingResponse(int node, PacketId id, byte[] data)
	{
		MatchingResponsePacket packet = new MatchingResponsePacket(data);
		MatchingResponse response = packet.GetPacket();

		string str = "ReceiveMatchingResponse:" + response.request;
		Debug.Log(str);

		switch (response.request) {
		case MatchingRequestId.CreateRoom:
			CreateRoomResponse(response.result, response.roomId);
			break;

		case MatchingRequestId.JoinRoom:
			JoinRoomResponse(response.result, response.roomId) ;
			break;

		default:
			Debug.Log("Unknown request.");
			break;
		}
	}
Exemplo n.º 47
0
	// ================================================================ //
	
	// ?꾩씠???뺣낫 ?⑦궥 痍⑤뱷 ?⑥닔.
	public void OnReceiveItemPacket(int node, PacketId id, byte[] data)
	{
		ItemPacket packet = new ItemPacket(data);
		ItemData item = packet.GetPacket();

		// ?쒕쾭 ?곹깭?€ ?숆린??
		ItemState istate = new ItemState();
		istate.item_id = item.itemId;
		ItemController.State state = (ItemController.State)item.state;
		istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state;
		istate.owner = item.ownerId;
		if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id)) {
			GlobalParam.getInstance().item_table.Remove(istate.item_id); 
		}
		GlobalParam.getInstance().item_table.Add(istate.item_id, istate);
		
		string log = "[CLIENT] Receive itempacket [" +
			"itemId:" + item.itemId +
				" state:" + state.ToString() +
				" ownerId:" + item.ownerId + "]";
		Debug.Log(log);
		dbwin.console().print(log);

		if (state == ItemController.State.Picked) {
			Debug.Log("Receive item pick.");
			dbwin.console().print("Receive item pick.");

			// ?묐떟???덈뒗  荑쇰━瑜??먯깋.
			QueryItemPick	query_pick = QueryManager.get().findQuery<QueryItemPick>(x => x.target == item.itemId);

			bool remote_pick = true;
			
			if (query_pick != null) {
				string account_name = PartyControl.get().getLocalPlayer().getAcountID();
				if (item.ownerId == account_name) {                                                 
					Debug.Log("Receive item pick local:" + item.ownerId);
					dbwin.console().print("Receive item pick local:" + item.ownerId);

					item_query_done(query_pick, true);
					remote_pick = false;
				}
				else {
					Debug.Log("Receive item pick remote:" + item.ownerId);
					dbwin.console().print("Receive item pick remote:" + item.ownerId);

					item_query_done(query_pick, false);
				}
			}
			
			if (remote_pick == true) {
				Debug.Log("Remote pick item:" + item.ownerId);
				dbwin.console().print("Remote pick item:" + item.ownerId);

				// 由щえ??罹먮┃?곌? 媛€吏€寃??쒕떎.
				chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
				if (remote) {
					// ?꾩씠???띾뱷 荑쇰━ 諛쒗뻾.
					QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true);
					if (query != null) {
						item_query_done(query, true);
					}
				}
			}

			// ?꾩씠???띾뱷 ?곹깭 蹂€寃?
			this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId);
		}
		else if (state == ItemController.State.Dropped) {
			Debug.Log("Receive item drop.");	

			// ?묐떟???덈뒗 荑쇰━瑜?寃€??
			QueryItemDrop	query_drop = QueryManager.get().findQuery<QueryItemDrop>(x => x.target == item.itemId);

			
			bool remote_drop = true;
			
			if (query_drop != null) {
				// ?붿껌???€???묐떟???덈떎.
				string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id;
				if (item.ownerId == account_name) { 
					// ?먯떊???띾뱷.
					Debug.Log("Receive item drop local:" + item.ownerId);
					item_query_done(query_drop, true);
					remote_drop = false;
				}
				else {
					// ?곷?媛€ ?띾뱷.
					Debug.Log("Receive item pick remote:" + item.ownerId);
					item_query_done(query_drop, false);
				}
			}
			
			if (remote_drop == true) {                                                 
				// 由щえ??罹먮┃?곌? ?띾뱷.
				chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
				if (remote) {
					// ?꾩씠?쒗쉷??荑쇰━ 諛쒗뻾.
					Debug.Log ("QuetyitemDrop:cmdItemQueryDrop");
				 	remote.cmdItemDrop(item.itemId, false);
				}
			}
		}
		else {
			Debug.Log("Receive item error.");
		}
	}
Exemplo n.º 48
0
 public PacketBuilder(Packet p)
 {
     Buffer.BlockCopy(p.Data, 0, _buffer, 0, p.Data.Length);
     _id = p.Id;
 }
Exemplo n.º 49
0
 public PacketBuilder(PacketId id)
 {
     _id = id;
 }
Exemplo n.º 50
0
 public Packet(PacketId id)
 {
     Id = id;
 }
Exemplo n.º 51
0
        public void Parse(Encoder s)
        {
            packetType = s.Read<PacketType>();
            reserved1 = s.ReadByte();
            reserved2 = s.ReadByte();
            reserved3 = s.ReadByte();
            packetId = s.Read<PacketId>();
            reserved = s.ReadUshort();
            dataSize = s.ReadUint();

            switch (packetId)
            {
                case PacketId.StartSession:
                    data = new PSessionStarted();
                    data.Parse(s);
                    break;
                case PacketId.ProductData:
                    data = new PProductData();
                    data.Parse(s);
                    break;
                case PacketId.ProtocolArray:
                    data = new PProtocolArray();
                    data.Parse(s);
                    break;
                case PacketId.RecordCount:
                    data = new PRecords();
                    data.Parse(s);
                    break;
                case PacketId.TrackData:
                    data = new PTrkData();
                    data.Parse(s);
                    break;
                case PacketId.TrackHeader:
                    data = new PTrackHeader();
                    data.Parse(s);
                    break;
                case PacketId.TransferComplete:
                    data = new PXferComplete();
                    data.Parse(s);
                    break;
                case PacketId.CourseTrackData:
                    data = new PTrkData();
                    data.Parse(s);
                    break;
            }
        }
Exemplo n.º 52
0
	// ================================================================ //

	public void OnReceiveGoingOutPacket(PacketId id, byte[] data)
	{
		GoingOutPacket packet = new GoingOutPacket(data);
		GoingOutData go = packet.GetPacket();

		Debug.Log("OnReceiveGoingOutPacket");
		if (GlobalParam.get().account_name == go.characterId) {
			// 자신은 이미 행동이 끝났으므로 처리하지 않습니다.
			return;
		}

		if (GlobalParam.get().is_in_my_home) {
			// 자신의 정원에 있습니다..
			if (go.goingOut) {
				// 친구가 찾아왔습니다.
				this.step.set_next(STEP.WELCOME);	
				GlobalParam.get().is_remote_in_my_home = true;		
			}
			else {
				// 친구가 돌아갑니다.
				this.step.set_next(STEP.BYEBYE);
				GlobalParam.get().is_remote_in_my_home = false;		
			}
		}
		else {
			// 친구 정원에 있습니다.
			if (go.goingOut) {
				// 친구가 갑니다.
				this.step.set_next(STEP.BYEBYE);
				GlobalParam.get().is_remote_in_my_home = true;		
			}
			else {
				// 친구가 돌아옵니다.
				this.step.set_next(STEP.WELCOME);
				GlobalParam.get().is_remote_in_my_home = false;		
			}
		}
	}
Exemplo n.º 53
0
 public Packet(PacketId id,byte[] bytes)
 {
     Id = id;
     Data = bytes;
 }
Exemplo n.º 54
0
 public IPacket CreatePacket(PacketId id)
 {
     return (IPacket)Activator.CreateInstance(GetPacketType(id));
 }
Exemplo n.º 55
0
	void OnReceiveStartSession(int node, PacketId id, byte[] data)
	{
		Debug.Log("ReceiveStartSession");

#if UNUSE_MATCHING_SERVER
		SessionData response = new SessionData();

		{
			int memberNum = NetConfig.PLAYER_MAX;
			string hostname = Dns.GetHostName();
			IPAddress[] adrList = Dns.GetHostAddresses(hostname);
			response.endPoints = new EndPointData[memberNum];

			response.result = MatchingResult.Success;
			response.playerId = GlobalParam.get().global_account_id;
			response.members = memberNum;

			for (int i = 0; i < memberNum; ++i) {
				response.endPoints[i] = new EndPointData();
				response.endPoints[i].ipAddress = adrList[0].ToString();
				response.endPoints[i].port = NetConfig.GAME_PORT;
			}

		}
#else
		SessionPacket packet = new SessionPacket(data);
		SessionData response = packet.GetPacket();
#endif
		playerId = response.playerId;

		SetSessionMembers(response.result, response.members, response.endPoints);

		matchingState = State.MatchingEnded;
	}
Exemplo n.º 56
0
 public Type GetPacketTypeOrNull(PacketId id)
 {
     Type type;
     return IdToType.TryGetValue(id, out type) ? type : null;
 }
Exemplo n.º 57
0
	// ---------------------------------------------------------------- //
	// 패킷 수신 함수].

	// 동기 대기 패킷 수신.
	public void OnReceiveSyncPacket(int node, PacketId id, byte[] data)
	{
		Debug.Log("[CLIENT]OnReceiveSyncPacket");
		
		GameSyncPacket packet = new GameSyncPacket(data);
		GameSyncInfo sync = packet.GetPacket();

		GlobalParam.get().seed = sync.seed;

		// 초기 장비를 보존한다.
		for (int i = 0; i < sync.items.Length; ++i) {

			CharEquipment equip = sync.items[i];

			GlobalParam.get().shot_type[equip.globalId] = (SHOT_TYPE)equip.shotType;
			this.select_done_players[equip.globalId] = true;

			Debug.Log("[CLIENT] AccountID:" + equip.globalId + " ShotType:" + equip.shotType);
		}

		// 응답이 있는 쿼리를 검색.
		string account_id = this.player.control.getAccountID();
		QuerySelectFinish	query = QueryManager.get().findQuery<QuerySelectFinish>(x => x.account_id == account_id);

		if (query != null) {
			Debug.Log("[CLIENT]QuerySelectDone done");
			query.set_done(true);
			query.set_success(true);
		}
		
		Debug.Log("[CLIENT]Recv seed:" + sync.seed);
	}
Exemplo n.º 58
0
        void ReadPacket( byte opcode )
        {
            reader.Remove( 1 ); // remove opcode
            lastOpcode = (PacketId)opcode;
            Action handler;

            if( opcode >= maxHandledPacket || (handler = handlers[opcode]) == null)
                throw new NotImplementedException( "Unsupported packet:" + (PacketId)opcode );
            handler();
        }
Exemplo n.º 59
0
	public void OnReceiveReflectionData(PacketId id, byte[] data)
	{
		Debug.Log("[SERVER]OnReceiveReflectionData");
		network_.SendReliableToAll(id, data);
	}
Exemplo n.º 60
0
	// 아이템 정보 패킷 획득 함수.
	public void OnReceiveItemPacket(PacketId id, byte[] data)
	{
		ItemPacket packet = new ItemPacket(data);
		ItemData item = packet.GetPacket();

		// 서버의 상태와 동기화합니다.
		ItemState istate = new ItemState();
		istate.item_id = item.itemId;
		ItemController.State state = (ItemController.State)item.state;
		istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state;
		istate.owner = item.ownerId;
		if (GlobalParam.get().item_table.ContainsKey(item.itemId)) {
			GlobalParam.get().item_table.Remove(istate.item_id); 
		}
		GlobalParam.get().item_table.Add(istate.item_id, istate);

		string log = "[CLIENT] Receive itempacket. " +
			"itemId:" + item.itemId +
				" state:" + state.ToString() +
				" ownerId:" + item.ownerId;
		Debug.Log(log);
		
		if (state == ItemController.State.Picked) {
			Debug.Log("Receive item pick.");

			// 응답이 있는 쿼리를 검색.
			QueryItemPick	query_pick = null;
			foreach(var query in this.queries) {
				QueryItemPick pick = query as QueryItemPick;
				if (pick != null && pick.target == item.itemId) {
					query_pick = pick;
					break;
				}
			}

			bool remote_pick = true;

			if (query_pick != null) {
				if (item.ownerId == GlobalParam.get().account_name) {                                                 
					Debug.Log("Receive item pick local:" + item.ownerId);
					item_query_done(query_pick, true);
					remote_pick = false;
				}
				else {
					Debug.Log("Receive item pick remote:" + item.ownerId);
					item_query_done(query_pick, false);
				}
			}

			if (remote_pick == true) {
				// 리모트 캐릭터가 취득하게 합니다.
				chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
				if (remote) {
					// 아이템 획득 쿼리 발행.
					QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true);
					if (query != null) {
						item_query_done(query, true);
					}
				}
			}
		}
		else if (state == ItemController.State.Dropped) {
			Debug.Log("Receive item drop.");

			// 응답이 있는 쿼리를 검색.
			QueryItemDrop	query_drop = null;
			foreach(var query in this.queries) {
				QueryItemDrop drop = query as QueryItemDrop;
				if (drop != null && drop.target == item.itemId) {
					query_drop = drop;
					break;
				}
			}

			bool remote_drop = true;

			if (query_drop != null) {
				// 요청에 대한 응답이 있을 때.
				if (item.ownerId == GlobalParam.get().account_name) { 
					// 자신이 획득.
					Debug.Log("Receive item drop local:" + item.ownerId);
					item_query_done(query_drop, true);
					remote_drop = false;
				}
				else {
					// 상대가 획득.
					Debug.Log("Receive item pick remote:" + item.ownerId);
					item_query_done(query_drop, false);
				}
			}

			if (remote_drop == true) {                                                 
				// 리모트 캐릭터가 회득하게 합니다.
				chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
				if (remote) {
					// 아이템 획득 쿼리 발행.
					Debug.Log ("QuetyitemDrop:cmdItemQueryDrop");
					QueryItemDrop query = remote.cmdItemQueryDrop(false);
					if (query != null) {
						query.is_drop_done = true;
						item_query_done(query, true);
					}
				}
			}
		}
		else {
			Debug.Log("Receive item error.");
		}
	}