From 101c43a4bcf7d50c5ce086e0f649ee647d9eaadb Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 7 Aug 2022 15:55:19 -0700 Subject: [PATCH] Tree Feller now partially destroys trees if the whole tree is too big Fixes #4811 --- Changelog.txt | 2 + .../gmail/nossr50/config/BukkitConfig.java | 158 +++++++++--------- .../woodcutting/WoodcuttingManager.java | 19 +-- .../com/gmail/nossr50/util/ItemUtils.java | 54 +++--- 4 files changed, 115 insertions(+), 118 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index b26e211f2..12a0f0f8c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,7 @@ Version 2.1.217 Fixed mouse-hover tooltips (thanks Greymagic27) + Tree Feller will now break blocks within the limit instead of refusing to fell the entire tree (partial big tree destruction) + Mangrove trees resulting from growth are now marked as natural (existing trees marked unnatural before this update will not be retroactively fixed) Version 2.1.216 Reverted Unarmed changes from 2.1.215 (fixes block breaker/beserk active at all time for all players) diff --git a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java index a22990e00..e1bd830cd 100644 --- a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java +++ b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java @@ -25,7 +25,7 @@ public abstract class BukkitConfig { this.fileName = fileName; this.dataFolder = dataFolder; configFile = new File(dataFolder, fileName); - purgeComments(true); + // purgeComments(true); this.config = initConfig(); initDefaults(); updateFile(); @@ -124,84 +124,84 @@ public abstract class BukkitConfig { return configFile; } - /** - * Somewhere between December 2021-January 2022 Spigot updated their - * SnakeYAML dependency/API and due to our own crappy legacy code - * this introduced a very problematic bug where comments got duplicated - *

- * This method hotfixes the problem by just deleting any existing comments - * it's ugly, but it gets the job done - * - * @param silentFail when true mcMMO will report errors during the patch process or debug information - * the option to have it fail silently is because mcMMO wants to check files before they are parsed as a file with a zillion comments will fail to even load - */ - private void purgeComments(boolean silentFail) { - if(!configFile.exists()) - return; - - int dupedLines = 0, lineCount = 0, lineCountAfter = 0; - try (FileReader fileReader = new FileReader(configFile); - BufferedReader bufferedReader = new BufferedReader(fileReader)) { - StringBuilder stringBuilder = new StringBuilder(); - String line; - Set seenBefore = new HashSet<>(); - - stringBuilder.append(CURRENT_CONFIG_PATCH_VER).append(System.lineSeparator()); - boolean noPatchNeeded = false; - - // While not at the end of the file - while ((line = bufferedReader.readLine()) != null) { - lineCount++; - - if(line.startsWith(CURRENT_CONFIG_PATCH_VER)) { - noPatchNeeded = true; - break; - } - - //Older version, don't append this line - if(line.startsWith(CONFIG_PATCH_PREFIX)) - continue; - - if (isFirstCharAsciiCharacter(line, COMMENT_PREFIX)) { - if(seenBefore.contains(line)) - dupedLines++; - else - seenBefore.add(line); - - continue; //Delete the line by not appending it - } - - stringBuilder - .append(line) //Convert existing files into two-spaced format - .append(System.lineSeparator()); - lineCountAfter++; - } - - if(noPatchNeeded) - return; - - if(lineCount == 0 && !silentFail) { - mcMMO.p.getLogger().info("[config patcher] Config line count: " + lineCount); - throw new InvalidConfigurationException("[config patcher] Patching of config file resulted in an empty file, this will not be saved. Contact the mcMMO devs!"); - } - - if(dupedLines > 0 && !silentFail) { - mcMMO.p.getLogger().info("[config patcher] Found "+dupedLines+" duplicate comments in config file: " + configFile.getName()); - mcMMO.p.getLogger().info("[config patcher] Purging the duplicate comments... (Nothing is broken, this is just info used for debugging)"); - mcMMO.p.getLogger().info("[config patcher] Line count before: "+lineCount); - mcMMO.p.getLogger().info("[config patcher] Line count after: "+lineCountAfter); - } - - // Write out the *patched* file - // AKA the file without any comments - try (FileWriter fileWriter = new FileWriter(configFile)) { - fileWriter.write(stringBuilder.toString()); - } - } catch (IOException | InvalidConfigurationException ex) { - mcMMO.p.getLogger().severe("Failed to patch config file: " + configFile.getName()); - ex.printStackTrace(); - } - } +// /** +// * Somewhere between December 2021-January 2022 Spigot updated their +// * SnakeYAML dependency/API and due to our own crappy legacy code +// * this introduced a very problematic bug where comments got duplicated +// *

+// * This method hotfixes the problem by just deleting any existing comments +// * it's ugly, but it gets the job done +// * +// * @param silentFail when true mcMMO will report errors during the patch process or debug information +// * the option to have it fail silently is because mcMMO wants to check files before they are parsed as a file with a zillion comments will fail to even load +// */ +// private void purgeComments(boolean silentFail) { +// if(!configFile.exists()) +// return; +// +// int dupedLines = 0, lineCount = 0, lineCountAfter = 0; +// try (FileReader fileReader = new FileReader(configFile); +// BufferedReader bufferedReader = new BufferedReader(fileReader)) { +// StringBuilder stringBuilder = new StringBuilder(); +// String line; +// Set seenBefore = new HashSet<>(); +// +// stringBuilder.append(CURRENT_CONFIG_PATCH_VER).append(System.lineSeparator()); +// boolean noPatchNeeded = false; +// +// // While not at the end of the file +// while ((line = bufferedReader.readLine()) != null) { +// lineCount++; +// +// if(line.startsWith(CURRENT_CONFIG_PATCH_VER)) { +// noPatchNeeded = true; +// break; +// } +// +// //Older version, don't append this line +// if(line.startsWith(CONFIG_PATCH_PREFIX)) +// continue; +// +// if (isFirstCharAsciiCharacter(line, COMMENT_PREFIX)) { +// if(seenBefore.contains(line)) +// dupedLines++; +// else +// seenBefore.add(line); +// +// continue; //Delete the line by not appending it +// } +// +// stringBuilder +// .append(line) //Convert existing files into two-spaced format +// .append(System.lineSeparator()); +// lineCountAfter++; +// } +// +// if(noPatchNeeded) +// return; +// +// if(lineCount == 0 && !silentFail) { +// mcMMO.p.getLogger().info("[config patcher] Config line count: " + lineCount); +// throw new InvalidConfigurationException("[config patcher] Patching of config file resulted in an empty file, this will not be saved. Contact the mcMMO devs!"); +// } +// +// if(dupedLines > 0 && !silentFail) { +// mcMMO.p.getLogger().info("[config patcher] Found "+dupedLines+" duplicate comments in config file: " + configFile.getName()); +// mcMMO.p.getLogger().info("[config patcher] Purging the duplicate comments... (Nothing is broken, this is just info used for debugging)"); +// mcMMO.p.getLogger().info("[config patcher] Line count before: "+lineCount); +// mcMMO.p.getLogger().info("[config patcher] Line count after: "+lineCountAfter); +// } +// +// // Write out the *patched* file +// // AKA the file without any comments +// try (FileWriter fileWriter = new FileWriter(configFile)) { +// fileWriter.write(stringBuilder.toString()); +// } +// } catch (IOException | InvalidConfigurationException ex) { +// mcMMO.p.getLogger().severe("Failed to patch config file: " + configFile.getName()); +// ex.printStackTrace(); +// } +// } private boolean isFirstCharAsciiCharacter(String line, char character) { if(line == null || line.isEmpty()) { diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java index 866ef91d2..e894d22ab 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -85,6 +85,9 @@ public class WoodcuttingManager extends SkillManager { } public void processWoodcuttingBlockXP(@NotNull BlockState blockState) { + if(mcMMO.getPlaceStore().isTrue(blockState)) + return; + int xp = getExperienceFromLog(blockState); applyXpGain(xp, XPGainReason.PVE); } @@ -102,19 +105,6 @@ public class WoodcuttingManager extends SkillManager { processTree(blockState, treeFellerBlocks); - // If the player is trying to break too many blocks - if (treeFellerReachedThreshold) { - treeFellerReachedThreshold = false; - - NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Woodcutting.Skills.TreeFeller.Threshold"); - - //Tree feller won't be activated for this block, award normal xp. - processWoodcuttingBlockXP(blockState); - processHarvestLumber(blockState); - - return; - } - // If the tool can't sustain the durability loss if (!handleDurabilityLoss(treeFellerBlocks, player.getInventory().getItemInMainHand(), player)) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Woodcutting.Skills.TreeFeller.Splinter"); @@ -352,6 +342,9 @@ public class WoodcuttingManager extends SkillManager { * @return Amount of experience */ private static int processTreeFellerXPGains(BlockState blockState, int woodCount) { + if(mcMMO.getPlaceStore().isTrue(blockState)) + return 0; + int rawXP = ExperienceConfig.getInstance().getXp(PrimarySkillType.WOODCUTTING, blockState.getType()); if(rawXP <= 0) diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 2e46341c2..9f3d58e23 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -510,32 +510,34 @@ public final class ItemUtils { * @return true if the item is a woodcutting drop, false otherwise */ public static boolean isWoodcuttingDrop(ItemStack item) { - switch (item.getType()) { - case ACACIA_LOG: - case BIRCH_LOG: - case DARK_OAK_LOG: - case JUNGLE_LOG: - case OAK_LOG: - case SPRUCE_LOG: - case STRIPPED_ACACIA_LOG: - case STRIPPED_BIRCH_LOG: - case STRIPPED_DARK_OAK_LOG: - case STRIPPED_JUNGLE_LOG: - case STRIPPED_OAK_LOG: - case STRIPPED_SPRUCE_LOG: - case ACACIA_SAPLING: - case SPRUCE_SAPLING: - case BIRCH_SAPLING: - case DARK_OAK_SAPLING: - case JUNGLE_SAPLING: - case OAK_SAPLING: - case ACACIA_LEAVES: - case BIRCH_LEAVES: - case DARK_OAK_LEAVES: - case JUNGLE_LEAVES: - case OAK_LEAVES: - case SPRUCE_LEAVES: - case APPLE: + switch (item.getType().toString()) { + case "ACACIA_LOG": + case "BIRCH_LOG": + case "DARK_OAK_LOG": + case "JUNGLE_LOG": + case "OAK_LOG": + case "SPRUCE_LOG": + case "STRIPPED_ACACIA_LOG": + case "STRIPPED_BIRCH_LOG": + case "STRIPPED_DARK_OAK_LOG": + case "STRIPPED_JUNGLE_LOG": + case "STRIPPED_OAK_LOG": + case "STRIPPED_SPRUCE_LOG": + case "STRIPPED_MANGROVE_LOG": + case "ACACIA_SAPLING": + case "SPRUCE_SAPLING": + case "BIRCH_SAPLING": + case "DARK_OAK_SAPLING": + case "JUNGLE_SAPLING": + case "OAK_SAPLING": + case "ACACIA_LEAVES": + case "BIRCH_LEAVES": + case "DARK_OAK_LEAVES": + case "JUNGLE_LEAVES": + case "OAK_LEAVES": + case "SPRUCE_LEAVES": + case "BEE_NEST": + case "APPLE": return true; default: