public override void HandlePacket(IPacketStream packet) { if (this.Socket == null) { _logger.LogTrace("Skip to handle packet. Reason: client is no more connected."); return; } try { PacketDeserializeHandler handler; if (PacketHandlers.TryGetValue(packet.PacketType, out handler)) { var deserializedPacket = handler.Invoke(packet); OnPacketArrived?.Invoke(this, deserializedPacket); } else { if (Enum.IsDefined(typeof(PacketType), packet.PacketType)) { _logger.LogWarning("Received an unimplemented packet {0} from {1}.", packet.PacketType, this.RemoteEndPoint); } else { _logger.LogWarning("Received an unknown packet 0x{0} from {1}.", ((ushort)packet.PacketType).ToString("X2"), this.RemoteEndPoint); } } } catch (Exception exception) { _logger.LogError("Packet handle error from {0}. {1}", this.RemoteEndPoint, exception.Message); _logger.LogDebug(exception.InnerException?.StackTrace); } }
public GMTeleportPlayerPacket(IPacketStream packet) { Name = packet.ReadString(21); X = packet.Read <float>(); Z = packet.Read <float>(); MapId = packet.Read <ushort>(); }
protected override void Dispose(bool disposing) { if (disposing) { lock (this) { if (_stream != null) { _stream.Dispose(); } if (_tcp != null) { _tcp.Close(); } ConnectionState = ClientState.Unconnected; _tcp = null; _stream = null; _localPlayerNumber = -1; _playerData = default(TPlayerData); } } base.Dispose(disposing); }
/// <summary>Join a local game.</summary> /// <param name="server">the local server to join.</param> /// <param name="playerName">the name with which to register.</param> /// <param name="playerData">additional data to be associated with our player.</param> public void Join(IServerSession server, string playerName, object playerData) { if (ConnectionState != ClientState.Unconnected) { throw new InvalidOperationException("Must leave the current session first."); } if (!(server is HybridServerSession <TPlayerData>)) { throw new InvalidOperationException("Incompatible server type."); } if (!(playerData is TPlayerData)) { throw new ArgumentException("Invalid type.", "playerData"); } Logger.Debug("Begin connecting to local server."); _playerName = playerName; _playerData = (TPlayerData)playerData; ConnectionState = ClientState.Connecting; // Check if the server is already full. if (server.PlayerCount >= server.MaxPlayers) { Logger.Debug("Join failed, server already full."); Reset(); return; } // Create the two 'pipes' we use to pass data from client to server // and vice versa. var toClient = new SlidingStream(); var toServer = new SlidingStream(); // Our stream is the one where the sink is the server. // The server gets one in the other direction (see below). _stream = new SlidingPacketStream(toClient, toServer); using (var packet = new Packet()) { using (var packetInner = new Packet()) { packetInner. Write(_playerName). Write(_playerData); packet. Write((byte)SessionMessage.JoinRequest). Write((IWritablePacket)packetInner); var written = _stream.Write(packet); // Statistics. Info.PutOutgoingTraffic(written, TrafficTypes.Protocol); Info.PutOutgoingPacketSize(written); Info.PutOutgoingPacketCompression((packet.Length / (float)written) - 1f); } } // Let's try this. This can throw if the server is already // full, but that shouldn't happen, because we checked above. ((HybridServerSession <TPlayerData>)server). Add(new SlidingPacketStream(toServer, toClient)); }
public TradeAddItemPacket(IPacketStream packet) { Bag = packet.Read <byte>(); Slot = packet.Read <byte>(); Quantity = packet.Read <byte>(); SlotInTradeWindow = packet.Read <byte>(); }
public IResolverSession GetProtocolResolver(IPacketStream packetStream, CancellationToken cancellationToken) { var resolver = new Resolver(); resolver.LoadFromReference <ProtocolTests>(); var session = resolver.CreateSession(); var handler = new HandlerProvider(session.Resolve <IMethodContextInfoProvider>()); handler.LoadFromReference <ProtocolTests>(); var converter = new Serializer(); converter.LoadFromReference <ProtocolTests>(); var protocol = new SocketProtocolHandler(session, packetStream, converter, handler); session.Resolver.Register(protocol); session.Resolver.Register(handler); session.Resolver.Register(converter); var listenTask = protocol.ListenAsync(cancellationToken); return(session); }
public static void OnSelectServer(LoginClient client, IPacketStream packet) { if (packet.Length != 9) { return; } var selectServerPacket = new SelectServerPacket(packet); var server = DependencyContainer.Instance.Resolve <ILoginServer>(); var worldInfo = server.GetWorldByID(selectServerPacket.WorldId); if (worldInfo == null) { LoginPacketFactory.SelectServerFailed(client, SelectServer.CannotConnect); return; } if (worldInfo.BuildVersion != selectServerPacket.BuildClient) { LoginPacketFactory.SelectServerFailed(client, SelectServer.VersionDoesntMatch); return; } if (worldInfo.ConnectedUsers >= worldInfo.MaxAllowedUsers) { LoginPacketFactory.SelectServerFailed(client, SelectServer.ServerSaturated); return; } LoginPacketFactory.SelectServerSuccess(client, worldInfo.Host); }
public DyeSelectItemPacket(IPacketStream packet) { DyeItemBag = packet.Read <byte>(); DyeItemSlot = packet.Read <byte>(); TargetItemBag = packet.Read <byte>(); TargetItemSlot = packet.Read <byte>(); }
public override void HandlePacket(IPacketStream packet) { if (this.Socket == null) { this.logger.LogTrace("Skip to handle packet from {0}. Reason: socket is no more connected.", this.RemoteEndPoint); return; } try { if (!PacketHandler <ISClient> .Invoke(this, packet, packet.PacketType)) { if (Enum.IsDefined(typeof(PacketType), packet.PacketType)) { this.logger.LogWarning("Received an unimplemented packet {0} from {2}.", packet.PacketType, this.RemoteEndPoint); } else { this.logger.LogWarning("Received an unknown packet 0x{0} from {1}.", ((ushort)packet.PacketType).ToString("X2"), this.RemoteEndPoint); } } } catch (Exception exception) { this.logger.LogError("Packet handle error from {0}. {1}", this.RemoteEndPoint, exception.Message); this.logger.LogDebug(exception.InnerException?.StackTrace); } }
public static void OnLoginRequest(LoginClient client, IPacketStream packet) { if (packet.Length != 52) { return; } var authenticationPacket = new AuthenticationPacket(packet); var result = Authentication(authenticationPacket.Username, authenticationPacket.Password); if (result != AuthenticationResult.SUCCESS) { LoginPacketFactory.AuthenticationFailed(client, result); return; } var loginServer = DependencyContainer.Instance.Resolve <ILoginServer>(); using var database = DependencyContainer.Instance.Resolve <IDatabase>(); DbUser dbUser = database.Users.Get(x => x.Username.Equals(authenticationPacket.Username, StringComparison.OrdinalIgnoreCase)); if (loginServer.IsClientConnected(dbUser.Id)) { client.Disconnect(); return; } dbUser.LastConnectionTime = DateTime.Now; database.Users.Update(dbUser); database.Complete(); client.SetClientUserID(dbUser.Id); LoginPacketFactory.AuthenticationFailed(client, result, dbUser); }
public MoveItemInInventoryPacket(IPacketStream packet) { CurrentBag = packet.Read <byte>(); CurrentSlot = packet.Read <byte>(); DestinationBag = packet.Read <byte>(); DestinationSlot = packet.Read <byte>(); }
public ChatWhisperPacket(IPacketStream packet) { TargetName = packet.ReadString(21); var messageLength = packet.Read <byte>(); Message = packet.ReadString(messageLength); }
public GMNoticeAdminsPacket(IPacketStream packet) { var messageLength = packet.Read <byte>(); // Message always ends with an empty character Message = packet.ReadString(messageLength - 1); }
public AesKeyResponsePacket(IPacketStream packet) { // First goes session id. byte[] guidBytes = new byte[16]; for (int i = 0; i < 16; i++) { guidBytes[i] = packet.Read <byte>(); } Guid = new Guid(guidBytes); // After that aes key. Key = new byte[16]; for (int i = 0; i < 16; i++) { Key[i] = packet.Read <byte>(); } // After that iv. IV = new byte[16]; for (int i = 0; i < 16; i++) { IV[i] = packet.Read <byte>(); } }
public static void OnSelectServer(LoginClient client, IPacketStream packet) { if (packet.Length != 9) { return; } var selectServerPacket = new SelectServerPacket(packet); var server = DependencyContainer.Instance.Resolve <ILoginServer>(); var worldInfo = server.GetWorldByID(selectServerPacket.WorldId); if (worldInfo == null) { LoginPacketFactory.SelectServerFailed(client, SelectServer.CannotConnect); return; } // For some reason, the current game.exe has version -1. Maybe this is somehow connected with decrypted packages? // In any case, for now client version check is disabled. if (worldInfo.BuildVersion != selectServerPacket.BuildClient && selectServerPacket.BuildClient != -1) { LoginPacketFactory.SelectServerFailed(client, SelectServer.VersionDoesntMatch); return; } if (worldInfo.ConnectedUsers >= worldInfo.MaxAllowedUsers) { LoginPacketFactory.SelectServerFailed(client, SelectServer.ServerSaturated); return; } LoginPacketFactory.SelectServerSuccess(client, worldInfo.Host); }
public ItemComposePacket(IPacketStream packet) { RuneBag = packet.Read <byte>(); RuneSlot = packet.Read <byte>(); ItemBag = packet.Read <byte>(); ItemSlot = packet.Read <byte>(); }
public MoveCharacterPacket(IPacketStream packet) { MovementType = (MovementType)packet.Read <byte>(); Angle = packet.Read <ushort>(); X = packet.Read <float>(); Y = packet.Read <float>(); Z = packet.Read <float>(); }
public RimPacketHandlerAuthorized(IPacketStream packetStream, Contact.Contact contact, SignatureAlgorithm localSignatureAlgorithm) : base(packetStream) { this.contact = contact; Console.WriteLine("Connected to " + contact.Identity.GetFingerprintString() + "."); Stream.WritePacket(new Packet4Signature(new Packet1Message(contact.Identity, "Kekkoning is stronk!").ToSignature(localSignatureAlgorithm))); }
public GMWarningPacket(IPacketStream packet) { Name = packet.ReadString(21); var messageLength = packet.Read <byte>(); Message = packet.ReadString(messageLength); }
/// <summary> /// Add a single connection for this server. This connection will be put into login pending mode, meaning it has to /// send its login data. If it doesn't by the time <c>LoginTimeout</c> milliseconds have passed, it'll be disconnected. /// <para> /// This is used for local joins, i.e. clients running in the same program joining the game. We avoid going /// through the network stack this way. /// </para> /// </summary> /// <param name="stream">the packet stream used for this client.</param> internal void Add(IPacketStream stream) { if (PlayerCount == MaxPlayers) { throw new InvalidOperationException("Game already full."); } _pending.Add(new PendingLogin(null, stream)); }
public GMNoticeFactionPacket(IPacketStream packet) { TimeInterval = packet.Read <short>(); var messageLength = packet.Read <byte>(); // Message always ends with an empty character Message = packet.ReadString(messageLength - 1); }
public ChangeAppearancePacket(IPacketStream packet) { Bag = packet.Read <byte>(); Slot = packet.Read <byte>(); Hair = packet.Read <byte>(); Face = packet.Read <byte>(); Size = packet.Read <byte>(); Sex = packet.Read <byte>(); }
public GemAddPacket(IPacketStream packet) { Bag = packet.Read <byte>(); Slot = packet.Read <byte>(); DestinationBag = packet.Read <byte>(); DestinationSlot = packet.Read <byte>(); HammerBag = packet.Read <byte>(); HammerSlot = packet.Read <byte>(); }
public GemAddPossibilityPacket(IPacketStream packet) { GemBag = packet.Read <byte>(); GemSlot = packet.Read <byte>(); DestinationBag = packet.Read <byte>(); DestinationSlot = packet.Read <byte>(); HammerBag = packet.Read <byte>(); HammerSlot = packet.Read <byte>(); }
public GemRemovePossibilityPacket(IPacketStream packet) { Bag = packet.Read <byte>(); Slot = packet.Read <byte>(); ShouldRemoveSpecificGem = packet.Read <bool>(); GemPosition = packet.Read <byte>(); HammerBag = packet.Read <byte>(); HammerSlot = packet.Read <byte>(); }
public UpdateStatsPacket(IPacketStream packet) { Str = packet.Read <ushort>(); Dex = packet.Read <ushort>(); Rec = packet.Read <ushort>(); Int = packet.Read <ushort>(); Wis = packet.Read <ushort>(); Luc = packet.Read <ushort>(); }
public static void OnSelectCharacter(WorldClient client, IPacketStream packet) { var selectCharacterPacket = new SelectCharacterPacket(packet); using var database = DependencyContainer.Instance.Resolve <IDatabase>(); var character = database.Charaters.Include(c => c.Items).Where(c => c.Id == selectCharacterPacket.CharacterId).FirstOrDefault(); WorldPacketFactory.SendSelectedCharacter(client, character); }
public static void OnCheckAvailableName(WorldClient client, IPacketStream packet) { var checkNamePacket = new CheckCharacterAvailableNamePacket(packet); using var database = DependencyContainer.Instance.Resolve <IDatabase>(); DbCharacter character = database.Charaters.Get(c => c.Name == checkNamePacket.CharacterName); WorldPacketFactory.SendCharacterAvailability(client, character is null); }
public GuildCreatePacket(IPacketStream packet) { Name = packet.ReadString(25); #if (EP8_V2 || SHAIYA_US) Message = packet.ReadString(25, Encoding.Unicode); #else Message = packet.ReadString(25); #endif }
public AesKeyRequestPacket(IPacketStream packet) { byte[] guidBytes = new byte[16]; for (int i = 0; i < 16; i++) { guidBytes[i] = packet.Read <byte>(); } Guid = new Guid(guidBytes); }
protected TcpClient() : base() { this.ReceivedBuffer = new byte[this.BufferSize]; this.PacketStream = new PacketStream(); }
/// <summary> /// Attempts a connection to a server, provided we are not currently backing off from an offline server. /// </summary> public override void Connect() { if (this.MarkManager.RemoveExpiredMarks().IsValidMarkWindow() == true) { this.MarkManager.Mark(); if (this.Options.Hostname != null && this.Options.Port != 0) { try { this.ReceivedBuffer = new byte[this.BufferSize]; this.PacketStream = new PacketStream(); this.SequenceNumber = 0; this.ConnectionState = ConnectionState.ConnectionConnecting; this.Client = new System.Net.Sockets.TcpClient { NoDelay = true }; this.Client.BeginConnect(this.Options.Hostname, this.Options.Port, this.ConnectedCallback, this); } catch (SocketException se) { this.Shutdown(se); } catch (Exception e) { this.Shutdown(e); } } } }