From 0c84e81490304cc88b7137ced2fe7e8eca0c6048 Mon Sep 17 00:00:00 2001 From: Mcayear Date: Thu, 18 Jan 2024 14:51:34 +0800 Subject: [PATCH] Fix stone (#3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * (fix) 更正了宝石属性的计算 --- .../java/RcRPG/AttrManager/PlayerAttr.java | 4 +- src/main/java/RcRPG/Events.java | 4 +- src/main/java/RcRPG/Form/inlayForm.java | 98 ++++++++++--------- src/main/java/RcRPG/Handle.java | 10 +- src/main/java/RcRPG/RPG/Armour.java | 2 +- src/main/java/RcRPG/RPG/Stone.java | 14 ++- src/main/java/RcRPG/RPG/Weapon.java | 2 +- 7 files changed, 75 insertions(+), 59 deletions(-) diff --git a/src/main/java/RcRPG/AttrManager/PlayerAttr.java b/src/main/java/RcRPG/AttrManager/PlayerAttr.java index 90df1c8..e3d446a 100644 --- a/src/main/java/RcRPG/AttrManager/PlayerAttr.java +++ b/src/main/java/RcRPG/AttrManager/PlayerAttr.java @@ -138,11 +138,11 @@ public void checkItemStoneAttr(String mainItemName, LinkedList list, Arra if(!map.containsKey(stone.getLabel())){ attr.clear(); OverAttr(attr,stone.getMainAttr()); - setItemAttrConfig(stone.getLabel(), attr); + setItemAttrConfig(mainItemName + " -> " + stone.getLabel(), attr); map.put(stone.getLabel(),attr); }else{ OverAttr(map.get(stone.getLabel()),stone.getMainAttr()); - setItemAttrConfig(stone.getLabel(), map.get(stone.getLabel())); + setItemAttrConfig(mainItemName + " -> " + stone.getLabel(), map.get(stone.getLabel())); } beforLabel.remove(mainItemName + " -> " + stone.getLabel()); labelList.add(mainItemName + " -> " + stone.getLabel()); diff --git a/src/main/java/RcRPG/Events.java b/src/main/java/RcRPG/Events.java index 8d2f9ca..28d25cb 100644 --- a/src/main/java/RcRPG/Events.java +++ b/src/main/java/RcRPG/Events.java @@ -361,10 +361,10 @@ public void damageEvent(EntityDamageByEntityEvent event){ } // 闪避率处理 - if (getProbabilisticResults(WAttr.dodgeChance - DAttr.hitChance)) { + float dodge = WAttr.dodgeChance > 0 ? WAttr.dodgeChance : 0; + if (getProbabilisticResults(dodge - DAttr.hitChance)) { if (woundedIsPlayer) { wounded.getLevel().addSound(wounded, Sound.valueOf("GAME_PLAYER_ATTACK_NODAMAGE")); - ((Player) wounded).sendMessage("你闪避了 " + damagerName + " §r的攻击"); ((Player) wounded).sendMessage(Main.getI18n().tr(((Player) wounded).getLanguageCode(), "rcrpg.events.dodge_message_you_evaded", damagerName)); } if (damagerIsPlayer) { diff --git a/src/main/java/RcRPG/Form/inlayForm.java b/src/main/java/RcRPG/Form/inlayForm.java index c62f704..0369875 100644 --- a/src/main/java/RcRPG/Form/inlayForm.java +++ b/src/main/java/RcRPG/Form/inlayForm.java @@ -16,19 +16,20 @@ import cn.nukkit.form.window.FormWindowSimple; import cn.nukkit.item.Item; +import java.util.ArrayList; import java.util.Collections; -import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.stream.Collectors; public class inlayForm { private static final String NO_STONE = "无"; private static final String SUCCESS_MESSAGE = "宝石操作成功!"; - private LinkedHashMap playerStone = new LinkedHashMap<>(); - private LinkedHashMap playerClick = new LinkedHashMap<>(); + private Stone beforeStone; + private int beforeClick; private Item handItem = null; private Weapon weaponItem = null; private Armour armourItem = null; + private LinkedList originStones = new LinkedList<>(); public void makeInlayForm(Player player, Item item) { handItem = item; @@ -52,20 +53,33 @@ public void makeInlayForm(Player player, Item item) { private FormWindowSimple getStateWindow() { String label = ""; LinkedList stones = new LinkedList<>(); + ArrayList stoneSlots = new ArrayList<>(); if (weaponItem != null) { stones = Weapon.getStones(handItem); label = weaponItem.getLabel(); + stoneSlots = weaponItem.getStoneList(); } else if (armourItem != null) { stones = Armour.getStones(handItem); label = armourItem.getLabel(); + stoneSlots = armourItem.getStoneList(); } int stoneCount = stones.size(); + String slotShow = ""; + if (!stoneSlots.isEmpty()) { + // 构建特定格式的字符串 + StringBuilder stringBuilder = new StringBuilder(); + for (String stone : stoneSlots) { + stringBuilder.append("- ").append(stone).append(" -\n"); + } + slotShow = stringBuilder.toString(); + } + this.originStones = stones; return new FormWindowSimple( label + "宝石列表", - stoneCount > 0 ? "装备拥有 " + stoneCount + " 个宝石槽" : "本装备没有宝石槽", + stoneCount > 0 ? "装备拥有 " + stoneCount + " 个宝石槽:\n"+slotShow : "本装备没有宝石槽", stones.stream() - .map(stone -> new ElementButton(stone == null ? NO_STONE : stone.getLabel())) + .map(stone -> new ElementButton(stone == null ? NO_STONE : stone.getShowName())) .collect(Collectors.toList())); } @@ -74,8 +88,16 @@ private void handleStateWindowResponse(FormWindowSimple form, Player player) { return; } FormResponseSimple response = form.getResponse(); - String clickedStoneLabel = response.getClickedButton().getText(); - Stone clickedStone = NO_STONE.equals(clickedStoneLabel) ? null : Handle.getStoneByLabel(clickedStoneLabel); + int clicked = response.getClickedButtonId(); + String yamlName; + if (this.originStones.get(clicked) == null) { + yamlName = NO_STONE; + } else { + yamlName = this.originStones.get(clicked).getName(); + } + + beforeClick = response.getClickedButtonId(); + beforeStone = NO_STONE.equals(yamlName) ? null : Handle.getStoneViaName(yamlName); String type = null; if (weaponItem != null) { @@ -84,29 +106,24 @@ private void handleStateWindowResponse(FormWindowSimple form, Player player) { type = armourItem.getStoneList().get(response.getClickedButtonId()); } - LinkedList playerStones = Stone.getStones(player, clickedStoneLabel, type); - playerStones.addFirst(clickedStoneLabel); + LinkedList playerStones = Stone.getStonesViaType(player, type); if (!playerStones.contains(NO_STONE)) playerStones.addLast(NO_STONE); - FormWindowCustom form_ = getStoneWindow(clickedStoneLabel, playerStones); + FormWindowCustom form_ = getStoneWindow(yamlName, playerStones); form_.addHandler(FormResponseHandler.withoutPlayer(ignored -> { if (form_.wasClosed()) return; - handleStoneWindowResponse(form_, player, clickedStone); + handleStoneWindowResponse(form_, player); })); player.showFormWindow(form_); - - playerClick.put(player, response.getClickedButtonId()); - playerStone.put(player, clickedStone); } - private FormWindowCustom getStoneWindow(String stoneLabel, LinkedList stones) { + private FormWindowCustom getStoneWindow(String yamlName, LinkedList stones) { ElementDropdown dropdown = new ElementDropdown("", stones); dropdown.setDefaultOptionIndex(0); - return new FormWindowCustom(stoneLabel, Collections.singletonList(dropdown)); + return new FormWindowCustom(yamlName, Collections.singletonList(dropdown)); } - private void handleStoneWindowResponse(FormWindowCustom form, Player player, Stone clickedStone) { - + private void handleStoneWindowResponse(FormWindowCustom form, Player player) { String itemName = ""; LinkedList stones = new LinkedList<>(); if (weaponItem != null) { @@ -119,41 +136,17 @@ private void handleStoneWindowResponse(FormWindowCustom form, Player player, Sto FormResponseCustom response = form.getResponse(); FormResponseData responseData = response.getDropdownResponse(0); + // 选择的是 yamlName 还是 NO_STONE String responseContent = responseData.getElementContent(); - Main.getInstance().getLogger().info("宝石槽数:" + stones.size()); - Item item = player.getInventory().getItemInHand(); if (item.getNamedTag() == null) return; if (!itemName.equals(item.getNamedTag().getString("name"))) return; player.sendMessage(SUCCESS_MESSAGE); - if (responseData.getElementID() != 0) { - int clickedButtonId = playerClick.get(player); - Stone newStone = NO_STONE.equals(responseContent) ? null : Handle.getStoneByLabel(responseContent); - updateStones(stones, clickedButtonId, newStone); - - if (newStone != null) { - Handle.removeStoneByLabel(player, newStone.getLabel()); - } - Stone previousStone = playerStone.get(player);// 过去的宝石 - if (previousStone != null) { - Stone.giveStone(player, previousStone.getName(), 1); - } - - if (weaponItem != null) { - Weapon.setStone(player, handItem, stones); - } else if (armourItem != null) { - Armour.setStone(player, handItem, stones); - } - } - - playerStone.remove(player); - playerClick.remove(player); - //makeInlayForm(player, player.getInventory().getItemInHand()); - } + int clickedButtonId = beforeClick; + Stone newStone = NO_STONE.equals(responseContent) ? null : Handle.getStoneViaName(responseContent); - private void updateStones(LinkedList stones, int clickedButtonId, Stone newStone) { for (int i = 0; i < stones.size(); i++) { if (i == clickedButtonId) { if (newStone != null) { @@ -164,5 +157,20 @@ private void updateStones(LinkedList stones, int clickedButtonId, Stone n break; } } + + if (newStone != null) { + Handle.removeStoneViaName(player, responseContent); + } + if (beforeStone != null) {// 过去的宝石 + Stone.giveStone(player, beforeStone.getName(), 1); + } + + if (weaponItem != null) { + Weapon.setStone(player, handItem, stones); + } else if (armourItem != null) { + Armour.setStone(player, handItem, stones); + } + //makeInlayForm(player, player.getInventory().getItemInHand()); } + } \ No newline at end of file diff --git a/src/main/java/RcRPG/Handle.java b/src/main/java/RcRPG/Handle.java index f74f4e9..af2f7fb 100644 --- a/src/main/java/RcRPG/Handle.java +++ b/src/main/java/RcRPG/Handle.java @@ -59,18 +59,18 @@ public static Effect StringToEffect(String s){ return Effect.getEffect(Integer.parseInt(ss[0])).setAmplifier(Integer.parseInt(ss[1])-1).setDuration(Integer.parseInt(ss[2])*20); } - public static Stone getStoneByLabel(String label){ - for(Stone stone : Main.loadStone.values()){ - if(stone.getLabel().equals(label)) return stone; + public static Stone getStoneViaName(String yamlName){ + if (Main.loadStone.containsKey(yamlName)) { + return Main.loadStone.get(yamlName); } return null; } - public static void removeStoneByLabel(Player player,String label){ + public static void removeStoneViaName(Player player,String yamlName){ for(int i =0;i < player.getInventory().getSize();i++){ Item item = player.getInventory().getItem(i); if(Stone.isStone(item)){ - if(Main.loadStone.get(item.getNamedTag().getString("name")).getLabel().equals(label)){ + if(item.getNamedTag().getString("name").equals(yamlName)){ if(item.getCount() == 1){ player.getInventory().remove(item); }else{ diff --git a/src/main/java/RcRPG/RPG/Armour.java b/src/main/java/RcRPG/RPG/Armour.java index 4b893d3..220a7fc 100644 --- a/src/main/java/RcRPG/RPG/Armour.java +++ b/src/main/java/RcRPG/RPG/Armour.java @@ -188,7 +188,7 @@ public static LinkedList getStones(Item item){ if (!isArmour(item) || item.getNamedTag() == null) return list; ListTag tags = item.getNamedTag().getList("stone",StringTag.class); for(StringTag tag : tags.getAll()){ - list.add(Handle.getStoneByLabel(tag.parseValue())); + list.add(Handle.getStoneViaName(tag.parseValue())); } Armour armour = Main.loadArmour.get(item.getNamedTag().getString("name")); while(list.size() < armour.getStone()){ diff --git a/src/main/java/RcRPG/RPG/Stone.java b/src/main/java/RcRPG/RPG/Stone.java index 496cad7..040362b 100644 --- a/src/main/java/RcRPG/RPG/Stone.java +++ b/src/main/java/RcRPG/RPG/Stone.java @@ -183,14 +183,22 @@ public static boolean isStone(Item item){ return false; } - public static LinkedList getStones(Player player,String df,String type){ + /** + * 通过 label 获取玩家背包中所有该类型的宝石 + * @param player 玩家对象 + * @param type 宝石类型 + * @return 宝石的yamlName列表 + */ + public static LinkedList getStonesViaType(Player player, String type){ LinkedList list = new LinkedList<>(); Item item; for(int i = 0;i < player.getInventory().getSize();i++){ item = player.getInventory().getItem(i); if(Stone.isStone(item)){ - if(!list.contains(Main.loadStone.get(item.getNamedTag().getString("name")).getLabel()) && !Main.loadStone.get(item.getNamedTag().getString("name")).getLabel().equals(df) && Main.loadStone.get(item.getNamedTag().getString("name")).getType().equals(type)){ - list.add(Main.loadStone.get(item.getNamedTag().getString("name")).getLabel()); + if(!list.contains(item.getNamedTag().getString("name")) && + Main.loadStone.get(item.getNamedTag().getString("name")).getType().equals(type) + ){ + list.add(item.getNamedTag().getString("name")); } } } diff --git a/src/main/java/RcRPG/RPG/Weapon.java b/src/main/java/RcRPG/RPG/Weapon.java index 1535dbf..4096eba 100644 --- a/src/main/java/RcRPG/RPG/Weapon.java +++ b/src/main/java/RcRPG/RPG/Weapon.java @@ -233,7 +233,7 @@ public static LinkedList getStones(Item item){ if (!isWeapon(item) || item.getNamedTag() == null) return list; ListTag tags = item.getNamedTag().getList("stone",StringTag.class); for(StringTag tag : tags.getAll()){ - list.add(Handle.getStoneByLabel(tag.parseValue())); + list.add(Handle.getStoneViaName(tag.parseValue())); } Weapon weapon = Main.loadWeapon.get(item.getNamedTag().getString("name")); while(list.size() < weapon.getStone()){