/// <summary> /// Expects operation <see cref = "RadarSubscribe" /> and subscribes the <paramref name = "peer" /> to the <see cref = "MmoRadar" />. /// Publishes an <see cref = "OperationResponse" /> with error code <see cref = "ReturnCode.Ok" /> if successful. /// </summary> /// <param name = "peer"> /// The client peer. /// </param> /// <param name = "request"> /// The request. /// </param> /// <param name = "sendParameters"> /// The send Parameters. /// </param> /// <returns> /// Null or an <see cref = "OperationResponse" /> with error code <see cref = "ReturnCode.WorldNotFound" />. /// </returns> public static OperationResponse OperationRadarSubscribe(PeerBase peer, OperationRequest request, SendParameters sendParameters) { var mmoPeer = (MmoPeer)peer; var operation = new RadarSubscribe(peer.Protocol, request); if (!operation.IsValid) { return new OperationResponse(request.OperationCode) { ReturnCode = (int)ReturnCode.InvalidOperationParameter, DebugMessage = operation.GetErrorMessage() }; } if (mmoPeer.MmoRadarSubscription != null) { mmoPeer.MmoRadarSubscription.Dispose(); mmoPeer.MmoRadarSubscription = null; } MmoWorld world; if (MmoWorldCache.Instance.TryGet(operation.WorldName, out world) == false) { return operation.GetOperationResponse((int)ReturnCode.WorldNotFound, "WorldNotFound"); } mmoPeer.MmoRadarSubscription = world.Radar.Channel.Subscribe(mmoPeer.RequestFiber, m => RadarChannel_OnItemEventMessage(peer, m)); // set return values var responseObject = new RadarSubscribeResponse { BottomRightCorner = world.Area.Max.ToFloatArray(2), TopLeftCorner = world.Area.Min.ToFloatArray(2), TileDimensions = world.TileDimensions.ToFloatArray(2), WorldName = world.Name }; // send response before sending radar content var response = new OperationResponse(request.OperationCode, responseObject); peer.SendOperationResponse(response, sendParameters); // send complete radar content to client world.Radar.SendContentToPeer(mmoPeer); // response already sent return null; }
/// <summary> /// Gets the operation response. /// </summary> /// <param name="errorCode"> /// The error code. /// </param> /// <param name="debugMessage"> /// The debug message. /// </param> /// <returns> /// A new operation response. /// </returns> public OperationResponse GetOperationResponse(short errorCode, string debugMessage) { var responseObject = new RadarSubscribeResponse { WorldName = this.WorldName }; return new OperationResponse(this.OperationRequest.OperationCode, responseObject) { ReturnCode = errorCode, DebugMessage = debugMessage }; }