From 9774c73507a260368995f175f9f836ba8cd68167 Mon Sep 17 00:00:00 2001 From: Xiao-MoMi <70987828+Xiao-MoMi@users.noreply.github.com> Date: Fri, 5 May 2023 00:44:29 +0800 Subject: [PATCH] 3.0.7 --- build.gradle | 2 +- .../customcrops/api/object/InteractCrop.java | 3 +- .../api/object/condition/DeathCondition.java | 37 ++++++-- .../customcrops/api/util/AdventureUtils.java | 90 ++++++++++++------- .../customcrops/api/util/ConfigUtils.java | 17 +++- 5 files changed, 104 insertions(+), 45 deletions(-) diff --git a/build.gradle b/build.gradle index d7b8174..ffbf19a 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'net.momirealms' -version = '3.0.6-hotfix2' +version = '3.0.7' repositories { mavenCentral() diff --git a/src/main/java/net/momirealms/customcrops/api/object/InteractCrop.java b/src/main/java/net/momirealms/customcrops/api/object/InteractCrop.java index 9d24382..048afd0 100644 --- a/src/main/java/net/momirealms/customcrops/api/object/InteractCrop.java +++ b/src/main/java/net/momirealms/customcrops/api/object/InteractCrop.java @@ -32,7 +32,7 @@ public class InteractCrop { private final Action[] actions; private final Requirement[] requirements; - public InteractCrop(@NotNull String id, boolean consume, @Nullable String returned, @Nullable Action[] actions, @Nullable Requirement[] requirements) { + public InteractCrop(@Nullable String id, boolean consume, @Nullable String returned, @Nullable Action[] actions, @Nullable Requirement[] requirements) { this.consume = consume; this.id = id; this.returned = returned; @@ -41,6 +41,7 @@ public class InteractCrop { } public boolean isRightItem(String item) { + if (id == null || id.equals("*")) return true; return item.equals(id); } diff --git a/src/main/java/net/momirealms/customcrops/api/object/condition/DeathCondition.java b/src/main/java/net/momirealms/customcrops/api/object/condition/DeathCondition.java index 23b1989..2a7fe97 100644 --- a/src/main/java/net/momirealms/customcrops/api/object/condition/DeathCondition.java +++ b/src/main/java/net/momirealms/customcrops/api/object/condition/DeathCondition.java @@ -20,10 +20,13 @@ package net.momirealms.customcrops.api.object.condition; import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.api.object.ItemMode; import net.momirealms.customcrops.api.object.world.SimpleLocation; +import org.bukkit.Chunk; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.concurrent.CompletableFuture; + public class DeathCondition { private final String dead_model; @@ -46,12 +49,32 @@ public class DeathCondition { public void applyDeadModel(SimpleLocation simpleLocation, ItemMode itemMode) { Location location = simpleLocation.getBukkitLocation(); if (location == null) return; - CustomCrops.getInstance().getScheduler().callSyncMethod(() -> { - CustomCrops.getInstance().getPlatformInterface().removeCustomItem(location, itemMode); - if (dead_model != null) { - CustomCrops.getInstance().getPlatformInterface().placeCustomItem(location, dead_model, itemMode); - } - return null; - }); + CompletableFuture asyncGetChunk = location.getWorld().getChunkAtAsync(location.getBlockX() >> 4, location.getBlockZ() >> 4); + if (itemMode == ItemMode.ITEM_FRAME || itemMode == ItemMode.ITEM_DISPLAY) { + CompletableFuture loadEntities = asyncGetChunk.thenApply((chunk) -> { + chunk.getEntities(); + return chunk.isEntitiesLoaded(); + }); + loadEntities.whenComplete((result, throwable) -> + CustomCrops.getInstance().getScheduler().callSyncMethod(() -> { + if (CustomCrops.getInstance().getPlatformInterface().removeCustomItem(location, itemMode)) { + if (dead_model != null) { + CustomCrops.getInstance().getPlatformInterface().placeCustomItem(location, dead_model, itemMode); + } + } + return null; + })); + } + else { + asyncGetChunk.whenComplete((result, throwable) -> + CustomCrops.getInstance().getScheduler().callSyncMethod(() -> { + if (CustomCrops.getInstance().getPlatformInterface().removeCustomItem(location, itemMode)) { + if (dead_model != null) { + CustomCrops.getInstance().getPlatformInterface().placeCustomItem(location, dead_model, itemMode); + } + } + return null; + })); + } } } diff --git a/src/main/java/net/momirealms/customcrops/api/util/AdventureUtils.java b/src/main/java/net/momirealms/customcrops/api/util/AdventureUtils.java index 2e41119..3cd420e 100644 --- a/src/main/java/net/momirealms/customcrops/api/util/AdventureUtils.java +++ b/src/main/java/net/momirealms/customcrops/api/util/AdventureUtils.java @@ -134,43 +134,65 @@ public class AdventureUtils { au.playSound(sound); } - - /** - * Replace the legacy codes with MiniMessage Format - * @param str text - * @return MiniMessage format text - */ - public static String replaceLegacy(String str) { + public static String replaceLegacy(String legacy) { StringBuilder stringBuilder = new StringBuilder(); - char[] chars = str.replace("&","§").toCharArray(); + char[] chars = legacy.toCharArray(); for (int i = 0; i < chars.length; i++) { - if (chars[i] == '§') { + if (isColorCode(chars[i])) { if (i + 1 < chars.length) { switch (chars[i+1]) { - case '0' -> {i++;stringBuilder.append("");} - case '1' -> {i++;stringBuilder.append("");} - case '2' -> {i++;stringBuilder.append("");} - case '3' -> {i++;stringBuilder.append("");} - case '4' -> {i++;stringBuilder.append("");} - case '5' -> {i++;stringBuilder.append("");} - case '6' -> {i++;stringBuilder.append("");} - case '7' -> {i++;stringBuilder.append("");} - case '8' -> {i++;stringBuilder.append("");} - case '9' -> {i++;stringBuilder.append("");} - case 'a' -> {i++;stringBuilder.append("");} - case 'b' -> {i++;stringBuilder.append("");} - case 'c' -> {i++;stringBuilder.append("");} - case 'd' -> {i++;stringBuilder.append("");} - case 'e' -> {i++;stringBuilder.append("");} - case 'f' -> {i++;stringBuilder.append("");} - case 'r' -> {i++;stringBuilder.append("");} - case 'l' -> {i++;stringBuilder.append("");} - case 'm' -> {i++;stringBuilder.append("");} - case 'o' -> {i++;stringBuilder.append("");} - case 'n' -> {i++;stringBuilder.append("");} - case 'k' -> {i++;stringBuilder.append("");} - case 'x' -> {stringBuilder.append("<#").append(chars[i+3]).append(chars[i+5]).append(chars[i+7]).append(chars[i+9]).append(chars[i+11]).append(chars[i+13]).append(">");i += 13;} + case '0' -> stringBuilder.append(""); + case '1' -> stringBuilder.append(""); + case '2' -> stringBuilder.append(""); + case '3' -> stringBuilder.append(""); + case '4' -> stringBuilder.append(""); + case '5' -> stringBuilder.append(""); + case '6' -> stringBuilder.append(""); + case '7' -> stringBuilder.append(""); + case '8' -> stringBuilder.append(""); + case '9' -> stringBuilder.append(""); + case 'a' -> stringBuilder.append(""); + case 'b' -> stringBuilder.append(""); + case 'c' -> stringBuilder.append(""); + case 'd' -> stringBuilder.append(""); + case 'e' -> stringBuilder.append(""); + case 'f' -> stringBuilder.append(""); + case 'r' -> stringBuilder.append(""); + case 'l' -> stringBuilder.append(""); + case 'm' -> stringBuilder.append(""); + case 'o' -> stringBuilder.append(""); + case 'n' -> stringBuilder.append(""); + case 'k' -> stringBuilder.append(""); + case 'x' -> { + if (i + 13 >= chars.length + || !isColorCode(chars[i+2]) + || !isColorCode(chars[i+4]) + || !isColorCode(chars[i+6]) + || !isColorCode(chars[i+8]) + || !isColorCode(chars[i+10]) + || !isColorCode(chars[i+12])) { + stringBuilder.append(chars[i]); + continue; + } + stringBuilder + .append("<#") + .append(chars[i+3]) + .append(chars[i+5]) + .append(chars[i+7]) + .append(chars[i+9]) + .append(chars[i+11]) + .append(chars[i+13]) + .append(">"); + i += 13; + } + default -> { + stringBuilder.append(chars[i]); + continue; + } } + i++; + } else { + stringBuilder.append(chars[i]); } } else { @@ -179,4 +201,8 @@ public class AdventureUtils { } return stringBuilder.toString(); } + + private static boolean isColorCode(char c) { + return c == '§' || c == '&'; + } } diff --git a/src/main/java/net/momirealms/customcrops/api/util/ConfigUtils.java b/src/main/java/net/momirealms/customcrops/api/util/ConfigUtils.java index 9a9db18..3b2789b 100644 --- a/src/main/java/net/momirealms/customcrops/api/util/ConfigUtils.java +++ b/src/main/java/net/momirealms/customcrops/api/util/ConfigUtils.java @@ -176,8 +176,14 @@ public class ConfigUtils { switch (type) { case "water_less_than" -> conditions.add(new WaterLessThan(map2.getInt("value"))); case "water_more_than" -> conditions.add(new WaterMoreThan(map2.getInt("value"))); - case "unsuitable_season" -> conditions.add(new WrongSeason(map2.getStringList("value").stream().map(s -> CCSeason.valueOf(s.toUpperCase())).toList().toArray(new CCSeason[0]))); - case "suitable_season" -> conditions.add(new RightSeason(map2.getStringList("value").stream().map(s -> CCSeason.valueOf(s.toUpperCase())).toList().toArray(new CCSeason[0]))); + case "unsuitable_season" -> { + if (!ConfigManager.enableSeason) return; + conditions.add(new WrongSeason(map2.getStringList("value").stream().map(s -> CCSeason.valueOf(s.toUpperCase())).toList().toArray(new CCSeason[0]))); + } + case "suitable_season" -> { + if (!ConfigManager.enableSeason) return; + conditions.add(new RightSeason(map2.getStringList("value").stream().map(s -> CCSeason.valueOf(s.toUpperCase())).toList().toArray(new CCSeason[0]))); + } case "crow_attack" -> conditions.add(new CrowAttack(map2.getDouble("value.chance"), map2.getString("value.fly-model"), map2.getString("value.stand-model"))); case "random" -> conditions.add(new Random(map2.getDouble("value"))); } @@ -201,7 +207,10 @@ public class ConfigUtils { case "biome" -> requirements.add(new BiomeImpl(msg, new HashSet<>(innerSec.getStringList("value")))); case "weather" -> requirements.add(new WeatherImpl(msg, innerSec.getStringList("value"))); case "ypos" -> requirements.add(new YPosImpl(msg, innerSec.getStringList("value"))); - case "season" -> requirements.add(new SeasonImpl(msg, innerSec.getStringList("value").stream().map(str -> CCSeason.valueOf(str.toUpperCase())).collect(Collectors.toList()))); + case "season" -> { + if (!ConfigManager.enableSeason) continue; + requirements.add(new SeasonImpl(msg, innerSec.getStringList("value").stream().map(str -> CCSeason.valueOf(str.toUpperCase())).collect(Collectors.toList()))); + } case "world" -> requirements.add(new WorldImpl(msg, innerSec.getStringList("value"))); case "permission" -> requirements.add(new PermissionImpl(msg, innerSec.getString("value"))); case "time" -> requirements.add(new TimeImpl(msg, innerSec.getStringList("value"))); @@ -439,7 +448,7 @@ public class ConfigUtils { ConfigurationSection innerSec = section.getConfigurationSection(key); if (innerSec == null) continue; InteractCrop interactCrop = new InteractCrop( - innerSec.getString("item", "AIR"), + innerSec.getString("item"), innerSec.getBoolean("reduce-amount", false), innerSec.getString("return"), getActions(innerSec.getConfigurationSection("actions"), stageModel),