Exemple #1
0
        /// <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 };
 }