private async void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(500);
            var respond = await GetRespond <ReceiveFrameBase>();

            if (respond != null && respond.Code == Code.DeviceRequestPacket)
            {
                DeviceRequestPacket deviceRequestPacket = new DeviceRequestPacket();
                deviceRequestPacket.Create(respond.FullFrame);
                var data = GetPacket?.Invoke(deviceRequestPacket.PacketIndex, deviceRequestPacket.MD5Number, deviceRequestPacket);
                if (data != null)
                {
                    SerialPort.DataReceived -= SerialPort_DataReceived;
                    Request(data);
                }
                else
                {
                    Debug.Fail("找不到指定包");
                }
            }
            else if (respond != null && respond.Code == Code.DeviceRespondUpdateResult)
            {
                DeviceRespondUpdateResult deviceRespondUpdate = new DeviceRespondUpdateResult();
                deviceRespondUpdate.Create(respond.FullFrame);
                UpdateSuccess?.Invoke(deviceRespondUpdate.State);
                SerialPort.DataReceived -= SerialPort_DataReceived;
            }
        }
示例#2
0
        public void GetItem(GetPacket getPacket)
        {
            if (!Session.Character.MapInstance.MapItems.ContainsKey(getPacket.VisualId))
            {
                return;
            }

            var mapItem = Session.Character.MapInstance.MapItems[getPacket.VisualId];

            var canpick = false;

            switch (getPacket.PickerType)
            {
            case PickerType.Character:
                canpick = Heuristic.Octile(Math.Abs(Session.Character.PositionX - mapItem.PositionX),
                                           Math.Abs(Session.Character.PositionY - mapItem.PositionY)) < 8;
                break;

            case PickerType.Mate:
                return;

            default:
                _logger.Error(LogLanguage.Instance.GetMessageFromKey(LogLanguageKey.UNKNOWN_PICKERTYPE));
                return;
            }

            if (!canpick)
            {
                return;
            }

            //TODO add group drops
            if (mapItem.OwnerId != null && mapItem.DroppedAt.AddSeconds(30) > SystemTime.Now() &&
                mapItem.OwnerId != Session.Character.CharacterId)
            {
                Session.SendPacket(Session.Character.GenerateSay(
                                       Language.Instance.GetMessageFromKey(LanguageKey.NOT_YOUR_ITEM, Session.Account.Language),
                                       SayColorType.Yellow));
                return;
            }

            mapItem.Requests.OnNext(new RequestData <Tuple <MapItem, GetPacket> >(Session,
                                                                                  new Tuple <MapItem, GetPacket>(mapItem, getPacket)));
        }
        public void GetItem(GetPacket getPacket)
        {
            if (getPacket.VisualId < 100000)
            {
                //TODO buttons
            }
            else
            {
                if (!Session.Character.MapInstance.DroppedList.ContainsKey(getPacket.VisualId))
                {
                    return;
                }

                var mapItem = Session.Character.MapInstance.DroppedList[getPacket.VisualId];

                var canpick = false;
                switch (getPacket.PickerType)
                {
                case PickerType.Character:
                    canpick = PathFinder.Heuristic.Octile(Math.Abs(Session.Character.PositionX - mapItem.PositionX), Math.Abs(Session.Character.PositionY - mapItem.PositionY)) < 8;
                    break;

                case PickerType.Mate:

                    break;
                }

                if (!canpick)
                {
                    return;
                }
                ItemInstance mapItemInstance = ItemInstance.Create(mapItem.VNum, mapItem.OwnerId ?? Session.Character.CharacterId, mapItem.Amount);
                //TODO not your item
                if (mapItem.VNum != 1046)
                {
                    if (mapItemInstance.Item.ItemType == ItemType.Map)
                    {
                        if (mapItemInstance.Item.Effect == 71)
                        {
                            Session.Character.SpPoint += mapItemInstance.Item.EffectValue;
                            if (Session.Character.SpPoint > 10000)
                            {
                                Session.Character.SpPoint = 10000;
                            }
                            Session.SendPacket(new MsgPacket()
                            {
                                Message = string.Format(Language.Instance.GetMessageFromKey(LanguageKey.SP_POINTSADDED, Session.Account.Language), mapItemInstance.Item.EffectValue), Type = 0
                            });
                            Session.SendPacket(Session.Character.GenerateSpPoint());
                        }
                        Session.Character.MapInstance.DroppedList.TryRemove(getPacket.VisualId, out _);
                        Session.Character.MapInstance.Broadcast(Session.Character.GenerateGet(getPacket.VisualId));
                    }
                    else
                    {
                        var amount = mapItem.Amount;
                        var inv    = Session.Character.Inventory.AddItemToPocket(mapItemInstance).FirstOrDefault();

                        if (inv != null)
                        {
                            Session.SendPacket(inv.GeneratePocketChange(inv.Type, inv.Slot));
                            Session.Character.MapInstance.DroppedList.TryRemove(getPacket.VisualId, out var value);
                            Session.Character.MapInstance.Broadcast(Session.Character.GenerateGet(getPacket.VisualId));
                            if (getPacket.PickerType == PickerType.Mate)
                            {
                                Session.SendPacket(Session.Character.GenerateIcon(1, inv.ItemVNum));
                            }
                            Session.SendPacket(Session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey(LanguageKey.ITEM_ACQUIRED, Session.Account.Language)}: {inv.Item.Name} x {amount}", SayColorType.Green));
                            if (Session.Character.MapInstance.MapInstanceType == MapInstanceType.LodInstance)
                            {
                                Session.Character.MapInstance.Broadcast(Session.Character.GenerateSay($"{string.Format(Language.Instance.GetMessageFromKey(LanguageKey.ITEM_ACQUIRED_LOD, Session.Account.Language), Session.Character.Name)}: {inv.Item.Name} x {mapItem.Amount}", SayColorType.Yellow));
                            }
                        }
                        else
                        {
                            Session.SendPacket(new MsgPacket()
                            {
                                Message = Language.Instance.GetMessageFromKey(LanguageKey.NOT_ENOUGH_PLACE, Session.Account.Language), Type = 0
                            });
                        }
                    }
                }
                else
                {
                    // handle gold drop
                    var maxGold = _worldConfiguration.MaxGoldAmount;
                    if (Session.Character.Gold + mapItem.Amount <= maxGold)
                    {
                        if (getPacket.PickerType == PickerType.Mate)
                        {
                            Session.SendPacket(Session.Character.GenerateIcon(1, mapItem.VNum));
                        }
                        Session.Character.Gold += mapItem.Amount;
                        Session.SendPacket(Session.Character.GenerateSay($"{Language.Instance.GetMessageFromKey(LanguageKey.ITEM_ACQUIRED, Session.Account.Language)}: {mapItemInstance.Item.Name} x {mapItem.Amount}", SayColorType.Green));
                    }
                    else
                    {
                        Session.Character.Gold = maxGold;
                        Session.SendPacket(new MsgPacket()
                        {
                            Message = Language.Instance.GetMessageFromKey(LanguageKey.MAX_GOLD, Session.Account.Language), Type = 0
                        });
                    }
                    Session.SendPacket(Session.Character.GenerateGold());
                    Session.Character.MapInstance.DroppedList.TryRemove(getPacket.VisualId, out _);
                    Session.Character.MapInstance.Broadcast(Session.Character.GenerateGet(getPacket.VisualId));
                }
            }
        }