コード例 #1
0
    public void OnPreReceiveData(SocketClient socketClient, byte[] Buffer)
    {
        BasePacket basePacket = (BasePacket)PacketDeserializer.Deserialize(Buffer, PacketHeaderSize.HeaderSize);

        if (basePacket.packetType == PacketType.ConnectionStat)
        {
            ConnectionPacket connectionpacket = (ConnectionPacket)basePacket;
            if (socketServer.clientsManager.SocketClients.ContainsKey(connectionpacket.ClientId))
            {
                socketClient.SendPacket(new ConnectionPacket(false, 0, false, true));
                socketClient.Dispose();
                IGConsole.Instance.println("Same Client Already Connected");
            }
            else
            {
                socketServer.clientsManager.UpdatePreClient(connectionpacket.ClientId, connectionpacket.IsBot, socketClient);
                if (connectionpacket.IsBot)
                {
                    clientsManagerObj.clientsManager.AddClient(new HardwareClient(connectionpacket.ClientId, socketClient));
                }
                else
                {
                    clientsManagerObj.clientsManager.AddClient(new ConsoleClient(connectionpacket.ClientId, socketClient, clientsManagerObj.clientsManager.Clients));
                }
                socketClient.SendPacket(new ConnectionPacket(true, 0, false));
                IGConsole.Instance.println("Client Connected    ID(" + connectionpacket.ClientId + ") ISBOT(" + connectionpacket.IsBot + ")");
            }
        }
        else
        {
            IGConsole.Instance.println("Client Reset has Problem");
        }
    }
コード例 #2
0
        private Task DispatchLoginPackets(UncompressedPacket packet)
        {
            var  br = new SpanReader(packet.Data);
            Task task;

            switch (packet.PacketId)
            {
            // Login Start
            case 0x00:
                task = DispatchPacket(PacketDeserializer.Deserialize <LoginStart>(ref br));
                break;

            // Encryption Response
            case 0x01:
                task = DispatchPacket(PacketDeserializer.Deserialize <EncryptionResponse>(ref br));
                break;

            default:
                throw new InvalidDataException($"Unrecognizable packet id: 0x{packet.PacketId:X2}.");
            }

            if (!br.IsCosumed)
            {
                throw new InvalidDataException($"Packet data is not fully consumed.");
            }
            return(task);
        }
コード例 #3
0
        private void OnReceive(object sender, ReceiveData data)
        {
            var buffer = data.Packet.Payload;

            OnDataReceived(new SocketDataReceived
            {
                Packet = PacketDeserializer.Deserialize(buffer, 0, buffer.Length),
                Time   = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
            });
        }
コード例 #4
0
        private async Task Receiving()
        {
            DebugUtil.LogNormal <GsTcpClient>(
                Type == GSLiveType.TurnBased ? DebugLocation.TurnBased : DebugLocation.Command, "Receiving",
                "GsTcpClient -> Start Receiving...");

            while (IsConnected())
            {
                try
                {
                    BufferReceivedBytes += await _clientStream.ReadAsync(Buffer, BufferOffset,
                                                                         Buffer.Length - BufferOffset, OperationCancellationToken.Token);

                    if (!IsConnected())
                    {
                        break;
                    }

                    DataBuilder.Append(Encoding.UTF8.GetString(Buffer, BufferOffset, BufferReceivedBytes));
                    var packets = PacketValidator.ValidateDataAndReturn(DataBuilder);

                    foreach (var packet in packets)
                    {
                        OnDataReceived(new SocketDataReceived
                        {
                            Packet = PacketDeserializer.Deserialize(packet, Key, Type == GSLiveType.Command)
                        });
                    }

                    BufferReceivedBytes = 0;
                }
                catch (Exception e)
                {
                    if (!(e is OperationCanceledException || e is ObjectDisposedException ||
                          e is ArgumentOutOfRangeException))
                    {
                        e.LogException <GsTcpClient>(
                            Type == GSLiveType.TurnBased ? DebugLocation.TurnBased : DebugLocation.Command,
                            "Receiving");

                        OnClosed(new ErrorArg {
                            Error = e.ToString()
                        });
                    }

                    break;
                }
            }

            DebugUtil.LogNormal <GsTcpClient>(
                Type == GSLiveType.TurnBased ? DebugLocation.TurnBased : DebugLocation.Command, "Receiving",
                "GsTcpClient -> Receiving Done!");
        }
コード例 #5
0
        private void OnMessage(object sender, MessageEventArgs message)
        {
            if (!message.IsText)
            {
                return;
            }

            OnDataReceived(new SocketDataReceived
            {
                Packet = PacketDeserializer.Deserialize(message.Data, Key, Type == GSLiveType.Command)
            });
        }
コード例 #6
0
        public void AddSegment(byte[] segment, int offset)
        {
            segments.Write(segment, offset, segment.Length - offset);
            AddCount++;

            if (AddCount == SegmentCount)
            {
                BasePacket basePacket = (BasePacket)PacketDeserializer.Deserialize(segments);
                OnDataInvoke?.Invoke(basePacket, SegmentID);
                segments.Close();
                segments.Dispose();
                segments = null;
            }
        }
コード例 #7
0
        private Task DispatchHandshakingPackets(UncompressedPacket packet)
        {
            var br = new SpanReader(packet.Data);

            switch (packet.PacketId)
            {
            // Handshake
            case 0x00:
                return(DispatchPacket(PacketDeserializer.Deserialize <Handshake>(ref br)));

            default:
                throw new InvalidDataException($"Unrecognizable packet id: 0x{packet.PacketId:X2}.");
            }
        }
コード例 #8
0
        private Task DispatchStatusPackets(UncompressedPacket packet)
        {
            var br = new SpanReader(packet.Data);

            switch (packet.PacketId)
            {
            // Request
            case 0x00:
                return(DispatchPacket(PacketDeserializer.Deserialize <Request>(ref br)));

            // Ping
            case 0x01:
                return(DispatchPacket(PacketDeserializer.Deserialize <Ping>(ref br)));

            default:
                throw new InvalidDataException($"Unrecognizable packet id: 0x{packet.PacketId:X2}.");
            }
        }
コード例 #9
0
        private Task DispatchPacket(UncompressedPacket packet)
        {
            var  br = new SpanReader(packet.Data);
            Task task;

            switch (packet.PacketId)
            {
            // Teleport Confirm
            case 0x00:
                task = DispatchPacket(PacketDeserializer.Deserialize <TeleportConfirm>(ref br));
                break;

            // Chat Message
            case 0x03:
                task = DispatchPacket(PacketDeserializer.Deserialize <ServerboundChatMessage>(ref br));
                break;

            // Client Settings
            case 0x05:
                task = DispatchPacket(PacketDeserializer.Deserialize <ClientSettings>(ref br));
                break;

            // Plugin Message
            case 0x0B:
                task = DispatchPacket(PacketDeserializer.Deserialize <ServerboundPluginMessage>(ref br));
                break;

            // Keep Alive
            case 0x0F:
                task = DispatchPacket(PacketDeserializer.Deserialize <ServerboundKeepAlive>(ref br));
                break;

            // Player On Ground
            case 0x0D:
                task = DispatchPacket(PacketDeserializer.Deserialize <PlayerOnGround>(ref br));
                break;

            // Player Position
            case 0x11:
                task = DispatchPacket(PacketDeserializer.Deserialize <PlayerPosition>(ref br));
                break;

            // Position And Look (In new wiki, it is Player Position And Rotation)
            case 0x12:
                task = DispatchPacket(PacketDeserializer.Deserialize <ServerboundPositionAndLook>(ref br));
                break;

            // Player Look (In new wiki, it is Player Rotation)
            case 0x13:
                task = DispatchPacket(PacketDeserializer.Deserialize <PlayerLook>(ref br));
                break;

            // Player Digging
            case 0x1A:
                task = DispatchPacket(PacketDeserializer.Deserialize <PlayerDigging>(ref br));
                break;

            // Entity Action
            case 0x1B:
                task = DispatchPacket(PacketDeserializer.Deserialize <EntityAction>(ref br));
                break;

            // Held Item Change
            case 0x23:
                task = DispatchPacket(PacketDeserializer.Deserialize <ServerboundHeldItemChange>(ref br));
                break;

            // Animation
            case 0x2A:
                task = DispatchPacket(PacketDeserializer.Deserialize <ServerboundAnimation>(ref br));
                break;

            // Player Block Placement
            case 0x2C:
                task = DispatchPacket(PacketDeserializer.Deserialize <PlayerBlockPlacement>(ref br));
                break;

            // Use Item
            case 0x2D:
                task = DispatchPacket(PacketDeserializer.Deserialize <UseItem>(ref br));
                break;

            // Click Window
            case 0x09:
                task = DispatchPacket(PacketDeserializer.Deserialize <ClickWindow>(ref br));
                break;

            // Close Window
            case 0x0A:
                task = DispatchPacket(PacketDeserializer.Deserialize <ServerboundCloseWindow>(ref br));
                break;

            default:
                Logger.LogWarning($"Unrecognizable packet id: 0x{packet.PacketId:X2}.");
                return(Task.CompletedTask);
            }

            // Logger.LogInformation($"Got packet id: 0x{packet.PacketId:X2}.");
            if (!br.IsCosumed)
            {
                throw new InvalidDataException($"Packet data is not fully consumed, packet id: 0x{packet.PacketId:X2}.");
            }
            return(task);
        }