public static void ChangeFace(GameSession session, int faceId, out Item previousFace, out Item newFace) { Random random = Random.Shared; // Grab random preset color ColorPaletteMetadata palette = ColorPaletteMetadataStorage.GetMetadata(1); // pick from palette 2. Seems like it's the correct palette for basic face colors int indexColor = random.Next(palette.DefaultColors.Count); MixedColor color = palette.DefaultColors[indexColor]; newFace = new(faceId) { Color = EquipColor.Argb(color, indexColor, palette.PaletteId), IsEquipped = true, OwnerCharacterId = session.Player.CharacterId, OwnerCharacterName = session.Player.Name }; Dictionary <ItemSlot, Item> cosmetics = session.Player.Inventory.Cosmetics; //Remove old face if (cosmetics.Remove(ItemSlot.FA, out previousFace)) { previousFace.Slot = -1; DatabaseManager.Items.Delete(previousFace.Uid); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.Player.FieldPlayer, previousFace)); } cosmetics[ItemSlot.FA] = newFace; } }
private static void HandleChooseRandomHair(GameSession session, PacketReader packet) { byte selection = packet.ReadByte(); if (selection == 0) // player chose previous hair { Dictionary <ItemSlot, Item> cosmetics = session.Player.Inventory.Cosmetics; //Remove current hair if (cosmetics.Remove(ItemSlot.HR, out Item newHair)) { newHair.Slot = -1; DatabaseManager.Items.Delete(newHair.Uid); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, newHair)); } cosmetics[ItemSlot.HR] = session.Player.HairInventory.RandomHair; // apply the previous hair session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, session.Player.HairInventory.RandomHair, ItemSlot.HR)); Item voucher = new Item(20300246) { }; // Chic Salon Voucher InventoryController.Add(session, voucher, true); session.Send(BeautyPacket.ChooseRandomHair(voucher.Id)); } else // player chose new hair { session.Send(BeautyPacket.ChooseRandomHair()); } session.Player.HairInventory.RandomHair = null; // remove random hair option from hair inventory }
private static void HandleUnequipItem(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); // Unequip gear KeyValuePair <ItemSlot, Item> kvpEquips = session.Player.Equips.FirstOrDefault(x => x.Value.Uid == itemUid); if (kvpEquips.Value != null) { if (session.Player.Equips.Remove(kvpEquips.Key, out Item unequipItem)) { unequipItem.Slot = -1; InventoryController.Add(session, unequipItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, unequipItem)); DecreaseStats(session, unequipItem); } return; } // Unequip cosmetics KeyValuePair <ItemSlot, Item> kvpCosmetics = session.Player.Cosmetics.FirstOrDefault(x => x.Value.Uid == itemUid); if (kvpCosmetics.Value != null) { if (session.Player.Cosmetics.Remove(kvpCosmetics.Key, out Item unequipItem)) { unequipItem.Slot = -1; InventoryController.Add(session, unequipItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, unequipItem)); } } }
private static void HandleChangeToSavedHair(GameSession session, PacketReader packet) { long hairUid = packet.ReadLong(); Item hair = session.Player.HairInventory.SavedHair.FirstOrDefault(x => x.Uid == hairUid); if (hair == null) { return; } BeautyMetadata beautyShop = BeautyMetadataStorage.GetShopById(510); if (!PayWithShopTokenCost(session, beautyShop)) { return; } Dictionary <ItemSlot, Item> cosmetics = session.Player.Inventory.Cosmetics; if (cosmetics.Remove(hair.ItemSlot, out Item removeItem)) { removeItem.Slot = -1; session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, removeItem)); } cosmetics[removeItem.ItemSlot] = hair; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, hair, hair.ItemSlot)); session.Send(BeautyPacket.ChangetoSavedHair()); }
// ================================================================ // public void OnReceiveEquipmentPacket(int node, PacketId id, byte[] data) { EquipmentPacket packet = new EquipmentPacket(data); CharEquipment equip = packet.GetPacket(); Debug.Log("[SERVER] Receive equipment packet [Account:" + equip.globalId + "][Shot:" + equip.shotType + "]"); // 캐릭터의 장비를 보존. if (m_equips.ContainsKey(equip.globalId)) { m_equips[equip.globalId] = equip.shotType; } else { m_equips.Add(equip.globalId, equip.shotType); } // 세션 관리 정보와 플레이어 ID를 연결. if (m_nodes.ContainsKey(node) == false) { m_nodes.Add(node, equip.globalId); } m_syncFlag = true; // 실제 체크는 checkInitidalEquipment로 매 프레임 한다. }
private static void HandleRandomHair(GameSession session, PacketReader packet) { int shopId = packet.ReadInt(); bool useVoucher = packet.ReadBool(); BeautyMetadata beautyShop = BeautyMetadataStorage.GetShopById(shopId); List <BeautyItem> beautyItems = BeautyMetadataStorage.GetGenderItems(beautyShop.ShopId, session.Player.Gender); if (!HandleShopPay(session, beautyShop, useVoucher)) { return; } // Grab random hair Random random = new Random(); int indexHair = random.Next(beautyItems.Count); BeautyItem chosenHair = beautyItems[indexHair]; //Grab a preset hair and length of hair ItemMetadata beautyItemData = ItemMetadataStorage.GetMetadata(chosenHair.ItemId); int indexPreset = random.Next(beautyItemData.HairPresets.Count); HairPresets chosenPreset = beautyItemData.HairPresets[indexPreset]; //Grab random front hair length double chosenFrontLength = random.NextDouble() * (beautyItemData.HairPresets[indexPreset].MaxScale - beautyItemData.HairPresets[indexPreset].MinScale) + beautyItemData.HairPresets[indexPreset].MinScale; //Grab random back hair length double chosenBackLength = random.NextDouble() * (beautyItemData.HairPresets[indexPreset].MaxScale - beautyItemData.HairPresets[indexPreset].MinScale) + beautyItemData.HairPresets[indexPreset].MinScale; // Grab random preset color ColorPaletteMetadata palette = ColorPaletteMetadataStorage.GetMetadata(2); // pick from palette 2. Seems like it's the correct palette for basic hair colors int indexColor = random.Next(palette.DefaultColors.Count); MixedColor color = palette.DefaultColors[indexColor]; Dictionary <ItemSlot, Item> equippedInventory = session.Player.GetEquippedInventory(InventoryTab.Gear); Item newHair = new Item(chosenHair.ItemId) { Color = EquipColor.Argb(color, indexColor, palette.PaletteId), HairD = new HairData((float)chosenBackLength, (float)chosenFrontLength, chosenPreset.BackPositionCoord, chosenPreset.BackPositionRotation, chosenPreset.FrontPositionCoord, chosenPreset.FrontPositionRotation), IsTemplate = false }; //Remove old hair if (session.Player.Equips.Remove(ItemSlot.HR, out Item previousHair)) { previousHair.Slot = -1; session.Player.HairInventory.RandomHair = previousHair; // store the previous hair session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, previousHair)); } equippedInventory[ItemSlot.HR] = newHair; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, newHair, ItemSlot.HR)); session.Send(BeautyPacket.RandomHairOption(previousHair, newHair)); }
private static void ModifyBeauty(GameSession session, PacketReader packet, Item beautyItem) { ItemSlot itemSlot = ItemMetadataStorage.GetSlot(beautyItem.Id); Dictionary <ItemSlot, Item> cosmetics = session.Player.Inventory.Cosmetics; if (cosmetics.TryGetValue(itemSlot, out Item removeItem)) { // Only remove if it isn't the same item if (removeItem.Uid != beautyItem.Uid) { cosmetics.Remove(itemSlot); removeItem.Slot = -1; DatabaseManager.Items.Delete(removeItem.Uid); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, removeItem)); } } // equip & update new item switch (itemSlot) { case ItemSlot.HR: float backLength = BitConverter.ToSingle(packet.Read(4), 0); CoordF backPositionCoord = packet.Read <CoordF>(); CoordF backPositionRotation = packet.Read <CoordF>(); float frontLength = BitConverter.ToSingle(packet.Read(4), 0); CoordF frontPositionCoord = packet.Read <CoordF>(); CoordF frontPositionRotation = packet.Read <CoordF>(); beautyItem.HairData = new HairData(backLength, frontLength, backPositionCoord, backPositionRotation, frontPositionCoord, frontPositionRotation); cosmetics[itemSlot] = beautyItem; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, beautyItem, itemSlot)); break; case ItemSlot.FA: cosmetics[itemSlot] = beautyItem; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, beautyItem, itemSlot)); break; case ItemSlot.FD: byte[] faceDecorationPosition = packet.Read(16); beautyItem.FaceDecorationData = faceDecorationPosition; cosmetics[itemSlot] = beautyItem; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, beautyItem, itemSlot)); break; } }
private static void ModifyBeauty(GameSession session, PacketReader packet, Item beautyItem) { ItemSlot itemSlot = ItemMetadataStorage.GetSlot(beautyItem.Id); // remove current item if (session.Player.Equips.Remove(itemSlot, out Item removeItem)) { removeItem.Slot = -1; session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, removeItem)); } // equip new item Dictionary <ItemSlot, Item> equippedInventory = session.Player.GetEquippedInventory(InventoryTab.Gear); switch (itemSlot) { case ItemSlot.HR: float backLength = BitConverter.ToSingle(packet.Read(4), 0); CoordF backPositionCoord = packet.Read <CoordF>(); CoordF backPositionRotation = packet.Read <CoordF>(); float frontLength = BitConverter.ToSingle(packet.Read(4), 0); CoordF frontPositionCoord = packet.Read <CoordF>(); CoordF frontPositionRotation = packet.Read <CoordF>(); beautyItem.HairD = new HairData(backLength, frontLength, backPositionCoord, backPositionRotation, frontPositionCoord, frontPositionRotation); equippedInventory[itemSlot] = beautyItem; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, beautyItem, itemSlot)); break; case ItemSlot.FA: equippedInventory[itemSlot] = beautyItem; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, beautyItem, itemSlot)); break; case ItemSlot.FD: byte[] faceDecorationPosition = packet.Read(16); beautyItem.FaceDecorationD = faceDecorationPosition; equippedInventory[itemSlot] = beautyItem; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, beautyItem, itemSlot)); break; } }
private static void HandleUnequipItem(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); bool unequipped = false; // Unequip gear foreach ((ItemSlot slot, Item item) in session.Player.Equips) { if (itemUid != item.Uid) { continue; } if (session.Player.Equips.Remove(slot, out Item unequipItem)) { unequipped = true; unequipItem.Slot = -1; InventoryController.Add(session, unequipItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, unequipItem)); break; } } if (unequipped) { return; } // Unequip cosmetic foreach ((ItemSlot slot, Item item) in session.Player.Cosmetics) { if (itemUid != item.Uid) { continue; } if (session.Player.Cosmetics.Remove(slot, out Item unequipItem)) { unequipItem.Slot = -1; InventoryController.Add(session, unequipItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, unequipItem)); break; } } }
private void HandleUnequipItem(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); foreach ((ItemSlot slot, Item item) in session.Player.Equips) { if (itemUid != item.Uid) { continue; } if (session.Player.Equips.Remove(slot, out Item unequipItem)) { InventoryController.Add(session, unequipItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, unequipItem)); break; } } }
public static void ChangeHair(GameSession session, int hairId, out Item previousHair, out Item newHair) { Random random = Random.Shared; //Grab a preset hair and length of hair ItemCustomizeMetadata customize = ItemMetadataStorage.GetMetadata(hairId).Customize; int indexPreset = random.Next(customize.HairPresets.Count); HairPresets chosenPreset = customize.HairPresets[indexPreset]; //Grab random front hair length double chosenFrontLength = random.NextDouble() * (customize.HairPresets[indexPreset].MaxScale - customize.HairPresets[indexPreset].MinScale) + customize.HairPresets[indexPreset].MinScale; //Grab random back hair length double chosenBackLength = random.NextDouble() * (customize.HairPresets[indexPreset].MaxScale - customize.HairPresets[indexPreset].MinScale) + customize.HairPresets[indexPreset].MinScale; // Grab random preset color ColorPaletteMetadata palette = ColorPaletteMetadataStorage.GetMetadata(2); // pick from palette 2. Seems like it's the correct palette for basic hair colors int indexColor = random.Next(palette.DefaultColors.Count); MixedColor color = palette.DefaultColors[indexColor]; newHair = new(hairId) { Color = EquipColor.Argb(color, indexColor, palette.PaletteId), HairData = new((float)chosenBackLength, (float)chosenFrontLength, chosenPreset.BackPositionCoord, chosenPreset.BackPositionRotation, chosenPreset.FrontPositionCoord, chosenPreset.FrontPositionRotation), IsEquipped = true, OwnerCharacterId = session.Player.CharacterId, OwnerCharacterName = session.Player.Name }; Dictionary <ItemSlot, Item> cosmetics = session.Player.Inventory.Cosmetics; //Remove old hair if (cosmetics.Remove(ItemSlot.HR, out previousHair)) { previousHair.Slot = -1; session.Player.HairInventory.RandomHair = previousHair; // store the previous hair DatabaseManager.Items.Delete(previousHair.Uid); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.Player.FieldPlayer, previousHair)); } cosmetics[ItemSlot.HR] = newHair; }
private void HandleUnequipItem(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); foreach ((EquipSlot slot, Item item) in session.Player.Equip) { if (itemUid != item.Uid) { continue; } if (session.Player.Equip.Remove(slot, out Item unequipItem)) { session.Inventory.Add(unequipItem); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, unequipItem)); session.Send(ItemInventoryPacket.Add(unequipItem)); break; } } }
//EquipmentPacket private static void HandlePacket(EquipmentPacket packet) { var entityId = packet.EntityId; if (Globals.Entities.ContainsKey(entityId)) { var entity = Globals.Entities[entityId]; if (entity != null) { if (entity == Globals.Me && packet.InventorySlots != null) { entity.MyEquipment = packet.InventorySlots; } else if (packet.ItemIds != null) { entity.Equipment = packet.ItemIds; } } } }
private static void HandleUnequipItem(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); Player player = session.Player; IInventory inventory = player.Inventory; // Unequip gear (ItemSlot itemSlot, Item item) = inventory.Equips.FirstOrDefault(x => x.Value.Uid == itemUid); if (item is not null) { if (!inventory.Equips.Remove(itemSlot, out Item unequipItem)) { return; } unequipItem.Slot = -1; unequipItem.IsEquipped = false; inventory.AddItem(session, unequipItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(player.FieldPlayer, unequipItem)); player.FieldPlayer.ComputeStats(); return; } // Unequip cosmetics (ItemSlot itemSlot2, Item item2) = inventory.Cosmetics.FirstOrDefault(x => x.Value.Uid == itemUid); if (item2 is null) { return; } if (!inventory.Cosmetics.Remove(itemSlot2, out Item unequipItem2)) { return; } unequipItem2.Slot = -1; unequipItem2.IsEquipped = false; inventory.AddItem(session, unequipItem2, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(player.FieldPlayer, unequipItem2)); }
private void HandleEquipItem(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); string equipSlotStr = packet.ReadUnicodeString(); if (!Enum.TryParse(equipSlotStr, out ItemSlot equipSlot)) { logger.Warning("Unknown equip slot: " + equipSlotStr); return; } // Remove the item from the users inventory InventoryController.Remove(session, itemUid, out Item item); // TODO: Move unequipped item into the correct slot // Move previously equipped item back to inventory if (session.Player.Equips.Remove(equipSlot, out Item prevItem)) { InventoryController.Add(session, prevItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem)); } // Equip new item session.Player.Equips[equipSlot] = item; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, item, equipSlot)); // TODO - Increase stats based on the item stats itself session.Player.Stats.CritRate.Max += 12; session.Player.Stats.CritRate.Total += 12; session.Player.Stats.MinAtk.Max += 15; session.Player.Stats.MinAtk.Total += 15; session.Player.Stats.MaxAtk.Max += 17; session.Player.Stats.MaxAtk.Total += 17; session.Player.Stats.MagAtk.Max += 15; session.Player.Stats.MagAtk.Total += 15; session.Send(StatPacket.SetStats(session.FieldPlayer)); }
public override void Execute(GameCommandTrigger trigger) { string equipSlot = trigger.Get <string>("equipSlot"); if (string.IsNullOrEmpty(equipSlot)) { trigger.Session.SendNotice($"Type '/info {Aliases.First()}' for more details."); return; } if (!Enum.TryParse(equipSlot, ignoreCase: true, out ItemSlot itemSlot) || itemSlot == ItemSlot.NONE) { trigger.Session.SendNotice($"{equipSlot} is not a valid equip slot."); string slots = ""; foreach (object slot in Enum.GetValues(typeof(ItemSlot))) { slots += $"{slot} - {((ItemSlot) slot).GetEnumDescription()}, "; } trigger.Session.SendNotice($"Available slots: {slots.TrimEnd(',', ' ')}"); return; } Player player = trigger.Session.Player; if (!player.Inventory.Equips.TryGetValue(itemSlot, out Item item)) { trigger.Session.SendNotice($"You don't have an item in slot {itemSlot}."); return; } item.Stats.Constants.Clear(); item.Stats.Randoms.Clear(); item.Stats.Statics.Clear(); player.FieldPlayer.ComputeStats(); trigger.Session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(player.FieldPlayer, item, itemSlot)); DatabaseManager.Items.Update(item); }
private static void HandleRandomHair(GameSession session, PacketReader packet) { int shopId = packet.ReadInt(); bool useVoucher = packet.ReadBool(); BeautyShop beautyShop = DatabaseManager.BeautyShops.FindById(shopId); List <BeautyShopItem> beautyItems = DatabaseManager.BeautyShopItems.FindAllByShopIdAndGender(beautyShop.Id, session.Player.Gender); if (!HandleShopPay(session, beautyShop, useVoucher)) { return; } // Grab random hair Random random = Random.Shared; int indexHair = random.Next(beautyItems.Count); BeautyShopItem chosenHair = beautyItems[indexHair]; BeautyHelper.ChangeHair(session, chosenHair.ItemId, out Item previousHair, out Item newHair); session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.Player.FieldPlayer, newHair, ItemSlot.HR)); session.Send(BeautyPacket.RandomHairOption(previousHair, newHair)); }
// 매 프레임 호출. public override void execute() { // ---------------------------------------------------------------- // // 다음 상태로 전환할지 체크. switch(this.step.do_transition()) { // 무아저씨 등장 데모. case STEP.DEMO0: { if(EventRoot.get().getCurrentEvent() == null) { this.step.set_next(STEP.SELECT_WEAPON); } } break; // 무기 아아템을 선택할 때까지. case STEP.SELECT_WEAPON: { // 무기 아이템을 선택했으면 다음으로 . if(this.player.getShotType() != SHOT_TYPE.EMPTY) { // 선택되지 않은 무기 아이템 삭제. List<ItemController> shot_items = ItemManager.get().findItems(x => x.name.StartsWith("shot")); foreach(var item in shot_items) { ItemManager.get().deleteItem(item.name); } this.select_done_players[this.player.getGlobalIndex()] = true; // 무기 아이템의 스포트 라이트를 지우고 열쇠 위치에 스포트 라이트. this.spotlight_items[0].setPosition(WeaponSelectLevelSequence.getKeyStayPosition().Y(4.0f)); this.spotlight_items[1].SetActive(false); this.step.set_next(STEP.PICKUP_KEY); } } break; // 열쇠를 주을 때까지. case STEP.PICKUP_KEY: { if(ItemManager.get().findItem(this.key_instance_name) == null) { this.spotlight_items[0].SetActive(false); this.step.set_next(STEP.ENTER_DOOR); } } break; // 문으로 들어갈 때까지. case STEP.ENTER_DOOR: { TransportEvent ev = EventRoot.get().getCurrentEvent<TransportEvent>(); if(ev != null) { ev.setEndAtHoleIn(true); this.step.set_next(STEP.TRANSPORT); } } break; // 플로어 이동 이벤트. case STEP.TRANSPORT: { TransportEvent ev = EventRoot.get().getCurrentEvent<TransportEvent>(); if(ev == null) { // 초기 장비의 동기화 대기 쿼리를 발행 . var query = new QuerySelectFinish(this.player.control.getAccountID()); // 쿼리의 타임아웃을 연장. query.timeout = 20.0f; QueryManager.get().registerQuery(query); // 선택한 무기를 게임 서버에 알림. if (this.m_network != null) { CharEquipment equip = new CharEquipment(); equip.globalId = GlobalParam.get().global_account_id; equip.shotType = (int) this.player.getShotType(); Debug.Log("[CLIENT] Send equip AccountID:" + equip.globalId + " ShotType:" + equip.shotType); EquipmentPacket packet = new EquipmentPacket(equip); int serverNode = this.m_network.GetServerNode(); this.m_network.SendReliable<CharEquipment>(serverNode, packet); } else { query.set_done(true); query.set_success(true); } this.step.set_next(STEP.WAIT_FRIEND); } } break; // 다른 플레이어 기다림. case STEP.WAIT_FRIEND: { // 던전으로 이동하는 신호 기다림. if(this.select_scene_finish) { // 만약을 위해 선택 완료가 되지 않은 아이콘을 강제로 선택 완료로 표시. // 해버린다. foreach(var icon in this.selecting_icons) { if(icon.step.get_current() == SelectingIcon.STEP.HAI) { continue; } icon.beginHai(); } this.step.set_next_delay(STEP.FINISH, 2.0f); } } break; } // ---------------------------------------------------------------- // // 상태 전환 시 초기화 while(this.step.get_next() != STEP.NONE) { switch(this.step.do_initialize()) { // 무아저씨 등장 데모. case STEP.DEMO0: { EventRoot.get().startEvent<EventWeaponSelect>(); } break; // 열쇠 줍기. case STEP.PICKUP_KEY: { // 플로어 열쇠가 외위에서 떨어진다. this.create_floor_key(); } break; // 문에 들어갈 때까지. case STEP.ENTER_DOOR: { this.spotlight_key.SetActive(true); } break; // 플로어 이동 이벤트. case STEP.TRANSPORT: { this.kabusan.onBeginTransportEvent(); } break; // 다른 플레이어 기다림. case STEP.WAIT_FRIEND: { // 다른 플레이어의 상황을 나타내는 아이콘을 표시. foreach(var icon in this.selecting_icons) { icon.setVisible(true); } } break; case STEP.FINISH: { GameRoot.get().setNextScene("GameScene"); } break; } } // ---------------------------------------------------------------- // // 각 상태에서의 실행 처리. switch(this.step.do_execution(Time.deltaTime)) { // 다른 플레이어 기다림. case STEP.WAIT_FRIEND: { foreach(var icon in this.selecting_icons) { if(icon.step.get_current() == SelectingIcon.STEP.UUN) { continue; } if(this.select_done_players[icon.player_index]) { icon.beginHai(); } } } break; } // ---------------------------------------------------------------- // this.spotlight_player.setPosition(this.player.control.getPosition().Y(4.0f)); this.spotlight_kabusan.setPosition(this.kabusan.control.getPosition().Y(8.0f)); this.update_queries(); }
private void HandleEquipItem(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); string equipSlotStr = packet.ReadUnicodeString(); if (!Enum.TryParse(equipSlotStr, out ItemSlot equipSlot)) { Logger.Warning("Unknown equip slot: " + equipSlotStr); return; } // Remove the item from the users inventory InventoryController.Remove(session, itemUid, out Item item); // Get correct equipped inventory Dictionary <ItemSlot, Item> equippedInventory = session.Player.GetEquippedInventory(item.InventoryTab); if (equippedInventory == null) { Logger.Warning("equippedInventory was null: " + item.InventoryTab); return; } // Move previously equipped item back to inventory if (equippedInventory.Remove(equipSlot, out Item prevItem)) { prevItem.Slot = item.Slot; InventoryController.Add(session, prevItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem)); } // Handle unequipping pants when equipping dresses // Handle unequipping off-hand when equipping two-handed weapons if (item.IsDress || item.IsTwoHand) { if (equippedInventory.Remove(item.IsDress ? ItemSlot.PA : ItemSlot.LH, out Item prevItem2)) { prevItem2.Slot = -1; if (prevItem == null) { prevItem2.Slot = item.Slot; } InventoryController.Add(session, prevItem2, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem2)); } } // Handle unequipping dresses when equipping pants // Handle unequipping two-handed main-hands when equipping off-hand weapons if (item.ItemSlot == ItemSlot.PA || item.ItemSlot == ItemSlot.LH) { ItemSlot prevItemSlot = item.ItemSlot == ItemSlot.PA ? ItemSlot.CL : ItemSlot.RH; if (equippedInventory.ContainsKey(prevItemSlot)) { if (equippedInventory[prevItemSlot] != null && equippedInventory[prevItemSlot].IsDress) { if (equippedInventory.Remove(prevItemSlot, out Item prevItem2)) { prevItem2.Slot = item.Slot; InventoryController.Add(session, prevItem2, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem2)); } } } } // Equip new item equippedInventory[equipSlot] = item; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, item, equipSlot)); if (item.InventoryTab == InventoryTab.Gear) { // TODO - Increase stats based on the item stats itself session.Player.Stats.CritRate.Max += 12; session.Player.Stats.CritRate.Total += 12; session.Player.Stats.MinAtk.Max += 15; session.Player.Stats.MinAtk.Total += 15; session.Player.Stats.MaxAtk.Max += 17; session.Player.Stats.MaxAtk.Total += 17; session.Player.Stats.MagAtk.Max += 15; session.Player.Stats.MagAtk.Total += 15; session.Send(StatPacket.SetStats(session.FieldPlayer)); } }
void Update() { // 오류 핸들링. NetEventHandling(); // ---------------------------------------------------------------- // // 스텝 내 경과 시간 진행. this.step_timer += Time.deltaTime; // ---------------------------------------------------------------- // // 다음 상태로 전환할지 체크한다. if(this.next_step == STEP.NONE) { switch(this.step) { case STEP.WAIT: { } break; } } // ---------------------------------------------------------------- // // 전환 시 초기화. while(this.next_step != STEP.NONE) { this.step = this.next_step; this.next_step = STEP.NONE; switch(this.step) { case STEP.MATCHING: { #if !UNUSE_MATCHING_SERVER int serverNode = -1; if (m_network != null) { serverNode = m_network.Connect(m_serverAddress, NetConfig.MATCHING_SERVER_PORT, Network.ConnectionType.Reliable); if (serverNode >= 0) { GameObject obj = new GameObject("MatchingClient"); m_client = obj.AddComponent<MatchingClient>(); if (m_client == null) { // 오류 강제 전환. m_errorMessage = "매칭을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } m_client.SetServerNode(serverNode); } else { // 오류. m_errorMessage = "매칭 서버에\n접속할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } } else { // 오류. m_errorMessage = "통신을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } #else GameObject obj = new GameObject("MatchingClient"); m_client = obj.AddComponent<MatchingClient>(); if (m_client == null) { // 오류로 강제 전환. m_errorMessage = "매칭을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } #endif } break; case STEP.SERVER_START: { m_network.ClearReceiveNotification(); Debug.Log("Launch Listening socket."); // 같은 단말에서 실행할 수 있게 포토 번호를 다르게 한다. // 다른 단말에서 실행할 때는 포트 번호가 같은 것을 사용한다. int port = NetConfig.GAME_PORT + GlobalParam.getInstance().global_account_id; bool ret = m_network.StartServer(port, NetConfig.PLAYER_MAX, Network.ConnectionType.Unreliable); if (m_isHost) { // 게임 서버 시작. int playerNum = m_client.GetMemberNum(); ret &= m_network.StartGameServer(playerNum); } if (ret == false) { // 오류로 강제 전환. m_errorMessage = "게임 통신을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } } break; case STEP.SERVER_CONNECT: { // 호스트 이름 획득. if (m_isHost) { string hostname = Dns.GetHostName(); IPAddress[] adrList = Dns.GetHostAddresses(hostname); m_serverAddress = adrList[0].ToString(); } // 게임 서버에 접속. Debug.Log("Connect to GameServer."); int serverNode = m_network.Connect(m_serverAddress, NetConfig.GAME_SERVER_PORT, Network.ConnectionType.Reliable); if (serverNode >= 0) { m_network.SetServerNode(serverNode); } else { // 오류로 강제 전환. m_errorMessage = "게임 서버와 통신할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } } break; case STEP.CLIENT_CONNECT: { Debug.Log("Connect to host."); MatchingClient.MemberList[] list = m_client.GetMemberList(); int playerNum = m_client.GetMemberNum(); for (int i = 0; i < playerNum; ++i) { // 같은 단말에서 실행할 때는 전용으로 부여한 플레이어ID로 판별한다. // 다른 단말에서 실행할 때는 IP주소로 판별할 수 있다. // 샘플 코드에서는 양쪽에 대응할 수 있는 플레어ID로 판별한다. if (m_client.GetPlayerId() == i) { // 자기 자신은 접속하지 않는다. continue; } if (list[i] == null) { continue; } // 같은 단말에서 실행할 수 있게 포트 번호를 다르게 한다. // 다른 단말에서 실행할 때는 포트 번호가 같은 것을 사용한다. int port = NetConfig.GAME_PORT + i; string memberAddress = list[i].endPoint.Address.ToString(); int clientNode = m_network.Connect(memberAddress, port, Network.ConnectionType.Unreliable); if (clientNode >= 0) { m_network.SetClientNode(i, clientNode); } else { // 오류로 강제 전환. m_errorMessage = "게임을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } } } break; #if UNUSE_MATCHING_SERVER case STEP.WAIT_SYNC: { CharEquipment equip = new CharEquipment(); equip.globalId = GlobalParam.get().global_account_id; equip.shotType = (int)SHOT_TYPE.NEGI; EquipmentPacket packet = new EquipmentPacket(equip); int serverNode = m_network.GetServerNode(); m_network.SendReliable<CharEquipment>(serverNode, packet); } break; #endif case STEP.GAME_START: { GlobalParam.getInstance().fadein_start = true; Application.LoadLevel("WeaponSelectScene"); } break; case STEP.WAIT_RESTART: { if (m_isHost) { m_network.StopGameServer(); } m_network.StopServer(); m_network.Disconnect(); } break; } this.step_timer = 0.0f; } // ---------------------------------------------------------------- // // 각 상태에서의 실행 처리. switch(this.step) { case STEP.WAIT: { } break; case STEP.MATCHING: { this.next_step = STEP.WAIT_MATCHING; } break; case STEP.WAIT_MATCHING: { #if !UNUSE_MATCHING_SERVER if (m_client != null && m_client.IsFinishedMatching()) { GlobalParam.get().global_account_id = m_client.GetPlayerId(); m_isHost = m_client.IsRoomOwner(); #else { #endif if (m_isHost) { GlobalParam.get().is_host = true; } this.next_step = STEP.SERVER_START; } } break; case STEP.SERVER_START: { // 서버가 시작하길 기다린다. #if UNUSE_MATCHING_SERVER if (this.step_timer > 5.0f){ #else if (this.step_timer > 3.0f){ #endif this.next_step = STEP.SERVER_CONNECT; } } break; case STEP.SERVER_CONNECT: { this.next_step = STEP.CLIENT_CONNECT; } break; case STEP.CLIENT_CONNECT: { #if UNUSE_MATCHING_SERVER this.next_step = STEP.WAIT_SYNC; #else this.next_step = STEP.GAME_START; #endif } break; #if UNUSE_MATCHING_SERVER case STEP.WAIT_SYNC: { // 클라이언트끼리 접속하길 기다린다. // 예제 코드에서는 대기 시간을 넣어서 접속을 기다렸다. // 원래는 UDP로 접속 처리를 작성해 커넥션을 펼 수 있게 하는 편이 좋다 bool isConnected = true; string connect = "Connect:[sync:" + m_syncFlag; for (int i = 0; i < m_client.GetMemberNum(); ++i) { if (i == GlobalParam.get().global_account_id) { continue; } int node = m_network.GetClientNode(i); isConnected &= m_network.IsConnected(node); connect += "[" + i +"(" + node + "):" + m_network.IsConnected(node) + "] "; } //Debug.Log(connect); if (isConnected || this.step_timer > 10.0f) { this.next_step = STEP.GAME_START; } ++count_; } break; #endif case STEP.GAME_START: { } break; case STEP.ERROR: { this.next_step = STEP.WAIT_RESTART; } break; case STEP.WAIT_RESTART: { } break; } // ---------------------------------------------------------------- // }
void Update() { // 오류 핸들링. NetEventHandling(); // ---------------------------------------------------------------- // // 스텝 내 경과 시간 진행. this.step_timer += Time.deltaTime; // ---------------------------------------------------------------- // // 다음 상태로 전환할지 체크한다. if (this.next_step == STEP.NONE) { switch (this.step) { case STEP.WAIT: { } break; } } // ---------------------------------------------------------------- // // 전환 시 초기화. while (this.next_step != STEP.NONE) { this.step = this.next_step; this.next_step = STEP.NONE; switch (this.step) { case STEP.MATCHING: { #if !UNUSE_MATCHING_SERVER int serverNode = -1; if (m_network != null) { serverNode = m_network.Connect(m_serverAddress, NetConfig.MATCHING_SERVER_PORT, Network.ConnectionType.Reliable); if (serverNode >= 0) { GameObject obj = new GameObject("MatchingClient"); m_client = obj.AddComponent <MatchingClient>(); if (m_client == null) { // 오류 강제 전환. m_errorMessage = "매칭을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } m_client.SetServerNode(serverNode); } else { // 오류. m_errorMessage = "매칭 서버에\n접속할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } } else { // 오류. m_errorMessage = "통신을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } #else GameObject obj = new GameObject("MatchingClient"); m_client = obj.AddComponent <MatchingClient>(); if (m_client == null) { // 오류로 강제 전환. m_errorMessage = "매칭을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } #endif } break; case STEP.SERVER_START: { m_network.ClearReceiveNotification(); Debug.Log("Launch Listening socket."); // 같은 단말에서 실행할 수 있게 포토 번호를 다르게 한다. // 다른 단말에서 실행할 때는 포트 번호가 같은 것을 사용한다. int port = NetConfig.GAME_PORT + GlobalParam.getInstance().global_account_id; bool ret = m_network.StartServer(port, NetConfig.PLAYER_MAX, Network.ConnectionType.Unreliable); if (m_isHost) { // 게임 서버 시작. int playerNum = m_client.GetMemberNum(); ret &= m_network.StartGameServer(playerNum); } if (ret == false) { // 오류로 강제 전환. m_errorMessage = "게임 통신을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } } break; case STEP.SERVER_CONNECT: { // 호스트 이름 획득. if (m_isHost) { string hostname = Dns.GetHostName(); IPAddress[] adrList = Dns.GetHostAddresses(hostname); m_serverAddress = adrList[0].ToString(); } // 게임 서버에 접속. Debug.Log("Connect to GameServer."); int serverNode = m_network.Connect(m_serverAddress, NetConfig.GAME_SERVER_PORT, Network.ConnectionType.Reliable); if (serverNode >= 0) { m_network.SetServerNode(serverNode); } else { // 오류로 강제 전환. m_errorMessage = "게임 서버와 통신할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } } break; case STEP.CLIENT_CONNECT: { Debug.Log("Connect to host."); MatchingClient.MemberList[] list = m_client.GetMemberList(); int playerNum = m_client.GetMemberNum(); for (int i = 0; i < playerNum; ++i) { // 같은 단말에서 실행할 때는 전용으로 부여한 플레이어ID로 판별한다. // 다른 단말에서 실행할 때는 IP주소로 판별할 수 있다. // 샘플 코드에서는 양쪽에 대응할 수 있는 플레어ID로 판별한다. if (m_client.GetPlayerId() == i) { // 자기 자신은 접속하지 않는다. continue; } if (list[i] == null) { continue; } // 같은 단말에서 실행할 수 있게 포트 번호를 다르게 한다. // 다른 단말에서 실행할 때는 포트 번호가 같은 것을 사용한다. int port = NetConfig.GAME_PORT + i; string memberAddress = list[i].endPoint.Address.ToString(); int clientNode = m_network.Connect(memberAddress, port, Network.ConnectionType.Unreliable); if (clientNode >= 0) { m_network.SetClientNode(i, clientNode); } else { // 오류로 강제 전환. m_errorMessage = "게임을 시작할 수 없습니다.\n\n버튼을 누르세요."; this.step = STEP.ERROR; } } } break; #if UNUSE_MATCHING_SERVER case STEP.WAIT_SYNC: { CharEquipment equip = new CharEquipment(); equip.globalId = GlobalParam.get().global_account_id; equip.shotType = (int)SHOT_TYPE.NEGI; EquipmentPacket packet = new EquipmentPacket(equip); int serverNode = m_network.GetServerNode(); m_network.SendReliable <CharEquipment>(serverNode, packet); } break; #endif case STEP.GAME_START: { GlobalParam.getInstance().fadein_start = true; Application.LoadLevel("WeaponSelectScene"); } break; case STEP.WAIT_RESTART: { if (m_isHost) { m_network.StopGameServer(); } m_network.StopServer(); m_network.Disconnect(); } break; } this.step_timer = 0.0f; } // ---------------------------------------------------------------- // // 각 상태에서의 실행 처리. switch (this.step) { case STEP.WAIT: { } break; case STEP.MATCHING: { this.next_step = STEP.WAIT_MATCHING; } break; case STEP.WAIT_MATCHING: { #if !UNUSE_MATCHING_SERVER if (m_client != null && m_client.IsFinishedMatching()) { GlobalParam.get().global_account_id = m_client.GetPlayerId(); m_isHost = m_client.IsRoomOwner(); #else { #endif if (m_isHost) { GlobalParam.get().is_host = true; } this.next_step = STEP.SERVER_START; } } break; case STEP.SERVER_START: { // 서버가 시작하길 기다린다. #if UNUSE_MATCHING_SERVER if (this.step_timer > 5.0f) { #else if (this.step_timer > 3.0f) { #endif this.next_step = STEP.SERVER_CONNECT; } } break; case STEP.SERVER_CONNECT: { this.next_step = STEP.CLIENT_CONNECT; } break; case STEP.CLIENT_CONNECT: { #if UNUSE_MATCHING_SERVER this.next_step = STEP.WAIT_SYNC; #else this.next_step = STEP.GAME_START; #endif } break; #if UNUSE_MATCHING_SERVER case STEP.WAIT_SYNC: { // 클라이언트끼리 접속하길 기다린다. // 예제 코드에서는 대기 시간을 넣어서 접속을 기다렸다. // 원래는 UDP로 접속 처리를 작성해 커넥션을 펼 수 있게 하는 편이 좋다 bool isConnected = true; string connect = "Connect:[sync:" + m_syncFlag; for (int i = 0; i < m_client.GetMemberNum(); ++i) { if (i == GlobalParam.get().global_account_id) { continue; } int node = m_network.GetClientNode(i); isConnected &= m_network.IsConnected(node); connect += "[" + i + "(" + node + "):" + m_network.IsConnected(node) + "] "; } //Debug.Log(connect); if (isConnected || this.step_timer > 10.0f) { this.next_step = STEP.GAME_START; } ++count_; } break; #endif case STEP.GAME_START: { } break; case STEP.ERROR: { this.next_step = STEP.WAIT_RESTART; } break; case STEP.WAIT_RESTART: { } break; } // ---------------------------------------------------------------- // }
private static void HandleEquipItem(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); string equipSlotStr = packet.ReadUnicodeString(); if (!Enum.TryParse(equipSlotStr, out ItemSlot equipSlot)) { Logger.Warn($"Unknown equip slot: {equipSlotStr}"); return; } // Remove the item from the users inventory Inventory inventory = session.Player.Inventory; inventory.RemoveItem(session, itemUid, out Item item); if (item == null) { return; } // Get correct equipped inventory Dictionary <ItemSlot, Item> equippedInventory = session.Player.GetEquippedInventory(item.InventoryTab); if (equippedInventory == null) { Logger.Warn($"equippedInventory was null: {item.InventoryTab}"); return; } // Move previously equipped item back to inventory if (equippedInventory.Remove(equipSlot, out Item prevItem)) { prevItem.Slot = item.Slot; prevItem.IsEquipped = false; inventory.AddItem(session, prevItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.Player.FieldPlayer, prevItem)); if (prevItem.InventoryTab == InventoryTab.Gear) { DecreaseStats(session, prevItem); } } // Handle unequipping pants when equipping dresses // Handle unequipping off-hand when equipping two-handed weapons if (item.IsDress || item.IsTwoHand) { if (equippedInventory.Remove(item.IsDress ? ItemSlot.PA : ItemSlot.LH, out Item prevItem2)) { prevItem2.Slot = -1; if (prevItem == null) { prevItem2.Slot = item.Slot; } prevItem2.IsEquipped = false; inventory.AddItem(session, prevItem2, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.Player.FieldPlayer, prevItem2)); } } // Handle unequipping dresses when equipping pants // Handle unequipping two-handed main-hands when equipping off-hand weapons if (item.ItemSlot is ItemSlot.PA or ItemSlot.LH) { ItemSlot prevItemSlot = item.ItemSlot == ItemSlot.PA ? ItemSlot.CL : ItemSlot.RH; if (equippedInventory.ContainsKey(prevItemSlot)) { if (equippedInventory[prevItemSlot] != null && equippedInventory[prevItemSlot].IsDress) { if (equippedInventory.Remove(prevItemSlot, out Item prevItem2)) { prevItem2.Slot = item.Slot; prevItem2.IsEquipped = false; inventory.AddItem(session, prevItem2, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.Player.FieldPlayer, prevItem2)); } } } } // Equip new item item.IsEquipped = true; item.ItemSlot = equipSlot; equippedInventory[equipSlot] = item; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.Player.FieldPlayer, item, equipSlot)); // Add stats if gear if (item.InventoryTab == InventoryTab.Gear) { IncreaseStats(session, item); } }
private void HandleEquipItem(GameSession session, PacketReader packet) { long itemUid = packet.ReadLong(); string equipSlotStr = packet.ReadUnicodeString(); if (!Enum.TryParse(equipSlotStr, out ItemSlot equipSlot)) { logger.Warning("Unknown equip slot: " + equipSlotStr); return; } // Remove the item from the users inventory InventoryController.Remove(session, itemUid, out Item item); // Equip cosmetic if (item.InventoryTab == InventoryTab.Outfit) { // Move previously equipped item back to inventory if (session.Player.Cosmetics.Remove(equipSlot, out Item prevItem)) { prevItem.Slot = item.Slot; InventoryController.Add(session, prevItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem)); } // Handle unequipping off-hand when equipping two-handed weapons if (item.IsTwoHand) { if (session.Player.Cosmetics.Remove(ItemSlot.LH, out Item prevItem2)) { prevItem2.Slot = -1; if (prevItem == null) { prevItem2.Slot = item.Slot; } InventoryController.Add(session, prevItem2, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem2)); } } // Handle unequipping two-handed main-hands when equipping off-hand weapons if (item.ItemSlot == ItemSlot.LH && session.Player.Cosmetics[ItemSlot.RH] != null && session.Player.Cosmetics[ItemSlot.RH].IsTwoHand) { if (session.Player.Cosmetics.Remove(ItemSlot.RH, out Item prevItem2)) { prevItem2.Slot = item.Slot; InventoryController.Add(session, prevItem2, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem2)); } } // Equip new item session.Player.Cosmetics[equipSlot] = item; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, item, equipSlot)); } // Equip gear else { // Move previously equipped item back to inventory if (session.Player.Equips.Remove(equipSlot, out Item prevItem)) { prevItem.Slot = item.Slot; InventoryController.Add(session, prevItem, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem)); } // Handle unequipping off-hand when equipping two-handed weapons if (item.IsTwoHand) { if (session.Player.Equips.Remove(ItemSlot.LH, out Item prevItem2)) { prevItem2.Slot = -1; if (prevItem == null) { prevItem2.Slot = item.Slot; } InventoryController.Add(session, prevItem2, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem2)); } } // Handle unequipping two-handed main-hands when equipping off-hand weapons if (item.ItemSlot == ItemSlot.LH && session.Player.Equips[ItemSlot.RH] != null && session.Player.Equips[ItemSlot.RH].IsTwoHand) { if (session.Player.Equips.Remove(ItemSlot.RH, out Item prevItem2)) { prevItem2.Slot = item.Slot; InventoryController.Add(session, prevItem2, false); session.FieldManager.BroadcastPacket(EquipmentPacket.UnequipItem(session.FieldPlayer, prevItem2)); } } // Equip new item session.Player.Equips[equipSlot] = item; session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(session.FieldPlayer, item, equipSlot)); // TODO - Increase stats based on the item stats itself session.Player.Stats.CritRate.Max += 12; session.Player.Stats.CritRate.Total += 12; session.Player.Stats.MinAtk.Max += 15; session.Player.Stats.MinAtk.Total += 15; session.Player.Stats.MaxAtk.Max += 17; session.Player.Stats.MaxAtk.Total += 17; session.Player.Stats.MagAtk.Max += 15; session.Player.Stats.MagAtk.Total += 15; session.Send(StatPacket.SetStats(session.FieldPlayer)); } }
// 매 프레임 호출. public override void execute() { // ---------------------------------------------------------------- // // 다음 상태로 전환할지 체크. switch (this.step.do_transition()) { // 무아저씨 등장 데모. case STEP.DEMO0: { if (EventRoot.get().getCurrentEvent() == null) { this.step.set_next(STEP.SELECT_WEAPON); } } break; // 무기 아아템을 선택할 때까지. case STEP.SELECT_WEAPON: { // 무기 아이템을 선택했으면 다음으로 . if (this.player.getShotType() != SHOT_TYPE.EMPTY) { // 선택되지 않은 무기 아이템 삭제. List <ItemController> shot_items = ItemManager.get().findItems(x => x.name.StartsWith("shot")); foreach (var item in shot_items) { ItemManager.get().deleteItem(item.name); } this.select_done_players[this.player.getGlobalIndex()] = true; // 무기 아이템의 스포트 라이트를 지우고 열쇠 위치에 스포트 라이트. this.spotlight_items[0].setPosition(WeaponSelectLevelSequence.getKeyStayPosition().Y(4.0f)); this.spotlight_items[1].SetActive(false); this.step.set_next(STEP.PICKUP_KEY); } } break; // 열쇠를 주을 때까지. case STEP.PICKUP_KEY: { if (ItemManager.get().findItem(this.key_instance_name) == null) { this.spotlight_items[0].SetActive(false); this.step.set_next(STEP.ENTER_DOOR); } } break; // 문으로 들어갈 때까지. case STEP.ENTER_DOOR: { TransportEvent ev = EventRoot.get().getCurrentEvent <TransportEvent>(); if (ev != null) { ev.setEndAtHoleIn(true); this.step.set_next(STEP.TRANSPORT); } } break; // 플로어 이동 이벤트. case STEP.TRANSPORT: { TransportEvent ev = EventRoot.get().getCurrentEvent <TransportEvent>(); if (ev == null) { // 초기 장비의 동기화 대기 쿼리를 발행 . var query = new QuerySelectFinish(this.player.control.getAccountID()); // 쿼리의 타임아웃을 연장. query.timeout = 20.0f; QueryManager.get().registerQuery(query); // 선택한 무기를 게임 서버에 알림. if (this.m_network != null) { CharEquipment equip = new CharEquipment(); equip.globalId = GlobalParam.get().global_account_id; equip.shotType = (int)this.player.getShotType(); Debug.Log("[CLIENT] Send equip AccountID:" + equip.globalId + " ShotType:" + equip.shotType); EquipmentPacket packet = new EquipmentPacket(equip); int serverNode = this.m_network.GetServerNode(); this.m_network.SendReliable <CharEquipment>(serverNode, packet); } else { query.set_done(true); query.set_success(true); } this.step.set_next(STEP.WAIT_FRIEND); } } break; // 다른 플레이어 기다림. case STEP.WAIT_FRIEND: { // 던전으로 이동하는 신호 기다림. if (this.select_scene_finish) { // 만약을 위해 선택 완료가 되지 않은 아이콘을 강제로 선택 완료로 표시. // 해버린다. foreach (var icon in this.selecting_icons) { if (icon.step.get_current() == SelectingIcon.STEP.HAI) { continue; } icon.beginHai(); } this.step.set_next_delay(STEP.FINISH, 2.0f); } } break; } // ---------------------------------------------------------------- // // 상태 전환 시 초기화 while (this.step.get_next() != STEP.NONE) { switch (this.step.do_initialize()) { // 무아저씨 등장 데모. case STEP.DEMO0: { EventRoot.get().startEvent <EventWeaponSelect>(); } break; // 열쇠 줍기. case STEP.PICKUP_KEY: { // 플로어 열쇠가 외위에서 떨어진다. this.create_floor_key(); } break; // 문에 들어갈 때까지. case STEP.ENTER_DOOR: { this.spotlight_key.SetActive(true); } break; // 플로어 이동 이벤트. case STEP.TRANSPORT: { this.kabusan.onBeginTransportEvent(); } break; // 다른 플레이어 기다림. case STEP.WAIT_FRIEND: { // 다른 플레이어의 상황을 나타내는 아이콘을 표시. foreach (var icon in this.selecting_icons) { icon.setVisible(true); } } break; case STEP.FINISH: { GameRoot.get().setNextScene("GameScene"); } break; } } // ---------------------------------------------------------------- // // 각 상태에서의 실행 처리. switch (this.step.do_execution(Time.deltaTime)) { // 다른 플레이어 기다림. case STEP.WAIT_FRIEND: { foreach (var icon in this.selecting_icons) { if (icon.step.get_current() == SelectingIcon.STEP.UUN) { continue; } if (this.select_done_players[icon.player_index]) { icon.beginHai(); } } } break; } // ---------------------------------------------------------------- // this.spotlight_player.setPosition(this.player.control.getPosition().Y(4.0f)); this.spotlight_kabusan.setPosition(this.kabusan.control.getPosition().Y(8.0f)); this.update_queries(); }
public override void Execute(GameCommandTrigger trigger) { string equipSlot = trigger.Get <string>("equipSlot"); string newAttributeId = trigger.Get <string>("newAttributeId"); float value = trigger.Get <float>("value"); byte isPercentage = trigger.Get <byte>("isPercentage"); byte category = trigger.Get <byte>("category"); if (string.IsNullOrEmpty(equipSlot)) { trigger.Session.SendNotice($"Type '/info {Aliases.First()}' for more details."); return; } if (!Enum.TryParse(equipSlot, ignoreCase: true, out ItemSlot itemSlot) || itemSlot == ItemSlot.NONE) { trigger.Session.SendNotice($"{equipSlot} is not a valid equip slot."); string slots = ""; foreach (object slot in Enum.GetValues(typeof(ItemSlot))) { slots += $"{slot} - {((ItemSlot) slot).GetEnumDescription()}, "; } trigger.Session.SendNotice($"Available slots: {slots.TrimEnd(',', ' ')}"); return; } if (!Enum.TryParse(newAttributeId, ignoreCase: true, out StatAttribute newAttribute)) { trigger.Session.SendNotice($"{newAttributeId} is not a valid attribute. Check StatAttribute.cs"); return; } Player player = trigger.Session.Player; if (!player.Inventory.Equips.TryGetValue(itemSlot, out Item item)) { trigger.Session.SendNotice($"You don't have an item in slot {itemSlot}."); return; } ItemStat itemStat; StatAttributeType attributeType = isPercentage == 1 ? StatAttributeType.Rate : StatAttributeType.Flat; if ((int)newAttribute > 11000) { itemStat = new SpecialStat(newAttribute, value, attributeType); } else { itemStat = new BasicStat(newAttribute, value, attributeType); } if (category == 0) { if (value == 0) { item.Stats.Constants.Remove(newAttribute); } else { item.Stats.Constants[newAttribute] = itemStat; } } else if (category == 1) { if (value == 0) { item.Stats.Statics.Remove(newAttribute); } else { item.Stats.Statics[newAttribute] = itemStat; } } else if (category == 2) { if (value == 0) { item.Stats.Randoms.Remove(newAttribute); } else { item.Stats.Randoms[newAttribute] = itemStat; } } trigger.Session.FieldManager.BroadcastPacket(EquipmentPacket.EquipItem(player.FieldPlayer, item, itemSlot)); player.FieldPlayer.ComputeStats(); DatabaseManager.Items.Update(item); }