/// <summary> /// Handles the contents of a network message. /// </summary> /// <param name="server">A reference to the tcp server instance which owns the listener at which this request landed.</param> /// <param name="incomingPacket">The packet to handle.</param> /// <param name="client">A reference to the client from where this request originated from, for context.</param> /// <returns>A collection of <see cref="IOutboundPacket"/>s that compose that synchronous response, if any.</returns> public override IEnumerable <IOutboundPacket> HandleRequestPacket(ITcpServer server, IInboundPacket incomingPacket, IClient client) { server.ThrowIfNull(nameof(server)); incomingPacket.ThrowIfNull(nameof(incomingPacket)); client.ThrowIfNull(nameof(client)); if (!(incomingPacket is IFollowInfo followInfo)) { this.Logger.LogError($"Expected packet info of type {nameof(IFollowInfo)} but got {incomingPacket.GetType().Name}."); return(null); } // First stop attacking if we are. server.RequestToAttackCreatureAsync(client.PlayerId); server.RequestToFollowCreatureAsync(client.PlayerId, followInfo.TargetCreatureId); return(null); }
/// <summary> /// Handles the contents of a network message. /// </summary> /// <param name="server">A reference to the tcp server instance which owns the listener at which this request landed.</param> /// <param name="incomingPacket">The packet to handle.</param> /// <param name="client">A reference to the client from where this request originated from, for context.</param> /// <returns>A collection of <see cref="IOutboundPacket"/>s that compose that synchronous response, if any.</returns> public override IEnumerable <IOutboundPacket> HandleRequestPacket(ITcpServer server, IInboundPacket incomingPacket, IClient client) { server.ThrowIfNull(nameof(server)); incomingPacket.ThrowIfNull(nameof(incomingPacket)); client.ThrowIfNull(nameof(client)); if (!(incomingPacket is IAttackInfo attackInfo)) { this.Logger.LogError($"Expected packet info of type {nameof(IAttackInfo)} but got {incomingPacket.GetType().Name}."); return(null); } // First stop following (formally) if we are. server.RequestToFollowCreatureAsync(client.PlayerId); // And then start attacking. Game will handle if that implicitly means follow the target of the attack. server.RequestToAttackCreatureAsync(client.PlayerId, attackInfo.TargetCreatureId); return(null); }