コード例 #1
0
        public static void HandleExchangePlayerRequestMessage(WorldClient client, ExchangePlayerRequestMessage message)
        {
            switch ((ExchangeTypeEnum)message.exchangeType)
            {
            case ExchangeTypeEnum.PLAYER_TRADE:
                var target = World.Instance.GetCharacter((int)message.target);

                if (target == null)
                {
                    SendExchangeErrorMessage(client, ExchangeErrorEnum.BID_SEARCH_ERROR);
                    return;
                }

                if (target.Map.Id != client.Character.Map.Id)
                {
                    SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_CHARACTER_TOOL_TOO_FAR);
                    return;
                }

                if (target.IsBusy() || target.IsTrading())
                {
                    SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_CHARACTER_OCCUPIED);
                    return;
                }

                if (target.FriendsBook.IsIgnored(client.Account.Id))
                {
                    SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_CHARACTER_RESTRICTED);
                    return;
                }

                if (!target.IsAvailable(client.Character, false))
                {
                    SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_CHARACTER_OCCUPIED);
                    return;
                }

                if (!client.Character.Map.AllowExchangesBetweenPlayers)
                {
                    SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_IMPOSSIBLE);
                    return;
                }

                var request = new PlayerTradeRequest(client.Character, target);
                client.Character.OpenRequestBox(request);
                target.OpenRequestBox(request);

                request.Open();

                break;

            default:
                SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_IMPOSSIBLE);
                break;
            }
        }
コード例 #2
0
    //-------------------------------------------------------------------------
    async void c2sPlayerTradeRequest(PlayerTradeRequest player_trade_request)
    {
        IRpcSession s           = EntityMgr.LastRpcSession;
        ClientInfo  client_info = CoApp.getClientInfo(s);

        if (client_info == null)
        {
            return;
        }

        var task = await Task.Factory.StartNew <Task <MethodData> >(async() =>
        {
            MethodData method_data = new MethodData();
            method_data.method_id  = MethodType.c2sPlayerTradeRequest;
            method_data.param1     = EbTool.protobufSerialize <PlayerTradeRequest>(player_trade_request);

            MethodData r = null;
            try
            {
                var grain_playerproxy = GrainClient.GrainFactory.GetGrain <ICellPlayer>(new Guid(client_info.et_player_guid));
                r = await grain_playerproxy.c2sRequest(method_data);
            }
            catch (Exception ex)
            {
                EbLog.Error(ex.ToString());
            }

            return(r);
        });

        if (task.Status == TaskStatus.Faulted || task.Result == null)
        {
            if (task.Exception != null)
            {
                EbLog.Error(task.Exception.ToString());
            }

            return;
        }

        MethodData result = task.Result;

        if (result.method_id == MethodType.None)
        {
            return;
        }

        lock (CoApp.RpcLock)
        {
            var player_trade_response = EbTool.protobufDeserialize <PlayerTradeResponse>(result.param1);
            CoApp.rpcBySession(s, (ushort)MethodType.s2cPlayerTradeResponse, player_trade_response);
        }
    }
コード例 #3
0
        public static void HandleExchangePlayerRequestMessage(WorldClient client, ExchangePlayerRequestMessage message)
        {
            ExchangeTypeEnum exchangeType = (ExchangeTypeEnum)message.exchangeType;

            if (exchangeType != ExchangeTypeEnum.PLAYER_TRADE)
            {
                InventoryHandler.SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_IMPOSSIBLE);
            }
            else
            {
                Character character = Singleton <World> .Instance.GetCharacter((int)message.target);

                if (character == null)
                {
                    InventoryHandler.SendExchangeErrorMessage(client, ExchangeErrorEnum.BID_SEARCH_ERROR);
                }
                else
                {
                    if (character.Map.Id != client.Character.Map.Id)
                    {
                        InventoryHandler.SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_CHARACTER_TOOL_TOO_FAR);
                    }
                    else
                    {
                        if (character.IsInRequest() || character.IsTrading())
                        {
                            InventoryHandler.SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_CHARACTER_OCCUPIED);
                        }
                        else
                        {
                            if (character.IsAway)
                            {
                                InventoryHandler.SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_CHARACTER_OCCUPIED);
                            }
                            else
                            {
                                if (!client.Character.Map.AllowExchangesBetweenPlayers)
                                {
                                    InventoryHandler.SendExchangeErrorMessage(client, ExchangeErrorEnum.REQUEST_IMPOSSIBLE);
                                }
                                else
                                {
                                    PlayerTradeRequest playerTradeRequest = new PlayerTradeRequest(client.Character, character);
                                    client.Character.OpenRequestBox(playerTradeRequest);
                                    character.OpenRequestBox(playerTradeRequest);
                                    playerTradeRequest.Open();
                                }
                            }
                        }
                    }
                }
            }
        }