Tree Feller now partially destroys trees if the whole tree is too big

Fixes #4811
This commit is contained in:
nossr50
2022-08-07 15:55:19 -07:00
parent fb738d85f6
commit 101c43a4bc
4 changed files with 115 additions and 118 deletions

View File

@ -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
* <p>
* 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<String> 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
// * <p>
// * 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<String> 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()) {

View File

@ -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)

View File

@ -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: