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; } }
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)); } } }