diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/CheckItemExpansion.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/CheckItemExpansion.java index f86fc0dbd..2a163b32d 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/CheckItemExpansion.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/CheckItemExpansion.java @@ -1,10 +1,8 @@ package net.momirealms.craftengine.bukkit.compatibility.papi; import me.clip.placeholderapi.expansion.PlaceholderExpansion; -import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; -import net.momirealms.craftengine.bukkit.util.ItemStackUtils; import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.CraftEngine; @@ -13,8 +11,6 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Predicate; - public class CheckItemExpansion extends PlaceholderExpansion { private final CraftEngine plugin; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java index c8030e0d8..08bb220f8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java @@ -54,6 +54,8 @@ public class BukkitFurniture extends Furniture { FurnitureVariant variant = this.config.getVariant(variantName); if (variant == null) return false; if (this.currentVariant == variant) return false; + // 删除椅子 + super.destroySeats(); BukkitFurnitureManager.instance().invalidateFurniture(this); super.clearColliders(); super.setVariantInternal(variant); @@ -74,10 +76,20 @@ public class BukkitFurniture extends Furniture { hitBoxConfig.prepareBoundingBox(position, aabbs::add, false); } if (!aabbs.isEmpty()) { - if (!FastNMS.INSTANCE.checkEntityCollision(position.world.serverWorld(), aabbs.stream().map(it -> FastNMS.INSTANCE.constructor$AABB(it.minX, it.minY, it.minZ, it.maxX, it.maxY, it.maxZ)).toList())) { + if (!FastNMS.INSTANCE.checkEntityCollision(position.world.serverWorld(), aabbs.stream().map(it -> FastNMS.INSTANCE.constructor$AABB(it.minX, it.minY, it.minZ, it.maxX, it.maxY, it.maxZ)).toList(), + o -> { + for (Collider collider : super.colliders) { + if (o == collider.handle()) { + return false; + } + } + return true; + })) { return CompletableFuture.completedFuture(false); } } + // 删除椅子 + super.destroySeats(); // 准备传送 CompletableFuture future = new CompletableFuture<>(); BukkitFurnitureManager.instance().invalidateFurniture(this); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java index c71a480de..74d3784b1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java @@ -5,19 +5,15 @@ import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; -import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.bukkit.world.BukkitWorldManager; -import net.momirealms.craftengine.core.entity.furniture.FurnitureVariant; import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.util.RandomUtils; import net.momirealms.craftengine.core.world.CEWorld; -import net.momirealms.craftengine.core.world.WorldPosition; import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.bukkit.entity.Entity; import org.bukkit.entity.ItemDisplay; @@ -29,12 +25,10 @@ import org.bukkit.event.world.ChunkUnloadEvent; import org.bukkit.event.world.EntitiesLoadEvent; import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.event.world.WorldUnloadEvent; -import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; -import java.util.Map; public class FurnitureEventListener implements Listener { private final BukkitFurnitureManager manager; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java index 28493cd5f..30863c737 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -35,22 +35,39 @@ import org.bukkit.World; import java.nio.file.Path; import java.util.*; +import java.util.function.Predicate; public class FurnitureItemBehavior extends ItemBehavior { public static final Factory FACTORY = new Factory(); private static final Set ALLOWED_ANCHOR_TYPES = Set.of("wall", "ceiling", "ground"); private final Key id; private final Map rules; + private final boolean ignorePlacer; + private final boolean ignoreEntities; - public FurnitureItemBehavior(Key id, Map rules) { + public FurnitureItemBehavior(Key id, Map rules, boolean ignorePlacer, boolean ignoreEntities) { this.id = id; this.rules = rules; + this.ignorePlacer = ignorePlacer; + this.ignoreEntities = ignoreEntities; } public Key furnitureId() { return this.id; } + public Map rules() { + return this.rules; + } + + public boolean ignorePlacer() { + return this.ignorePlacer; + } + + public boolean ignoreEntities() { + return this.ignoreEntities; + } + @Override public InteractionResult useOnBlock(UseOnContext context) { return this.place(context); @@ -118,7 +135,15 @@ public class FurnitureItemBehavior extends ItemBehavior { } // 检查方块、实体阻挡 if (!aabbs.isEmpty()) { - if (!FastNMS.INSTANCE.checkEntityCollision(context.getLevel().serverWorld(), aabbs.stream().map(it -> FastNMS.INSTANCE.constructor$AABB(it.minX, it.minY, it.minZ, it.maxX, it.maxY, it.maxZ)).toList())) { + Predicate entityPredicate; + if (this.ignoreEntities) { + entityPredicate = (o) -> false; + } else if (this.ignorePlacer) { + entityPredicate = player != null ? (o) -> o != player.serverPlayer() : (o) -> true; + } else { + entityPredicate = (o) -> true; + } + if (!FastNMS.INSTANCE.checkEntityCollision(context.getLevel().serverWorld(), aabbs.stream().map(it -> FastNMS.INSTANCE.constructor$AABB(it.minX, it.minY, it.minZ, it.maxX, it.maxY, it.maxZ)).toList(), entityPredicate)) { if (player != null && player.enableFurnitureDebug() && VersionHelper.isPaper()) { player.playSound(Key.of("minecraft:entity.villager.no")); Key flame = Key.of("flame"); @@ -241,7 +266,10 @@ public class FurnitureItemBehavior extends ItemBehavior { } } } - return new FurnitureItemBehavior(furnitureId, rules); + return new FurnitureItemBehavior(furnitureId, rules, + ResourceConfigUtils.getAsBoolean(arguments.get("ignore-placer"), "ignore-placer"), + ResourceConfigUtils.getAsBoolean(arguments.get("ignore-entities"), "ignore-entities") + ); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java index 88d7d106c..0a21878f0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java @@ -3,14 +3,12 @@ package net.momirealms.craftengine.bukkit.item.listener; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; -import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.ComponentUtils; -import net.momirealms.craftengine.bukkit.util.ItemStackUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; @@ -20,7 +18,6 @@ import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.util.MiscUtils; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java index 21bd8791a..08c658e0b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java @@ -1,24 +1,18 @@ package net.momirealms.craftengine.bukkit.plugin; import com.google.gson.JsonElement; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; -import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; import net.momirealms.craftengine.bukkit.util.ParticleUtils; import net.momirealms.craftengine.bukkit.world.particle.BukkitParticleType; import net.momirealms.craftengine.core.plugin.Platform; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.particle.ParticleType; -import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.Bukkit; import org.bukkit.Particle; -import java.util.Map; - public class BukkitPlatform implements Platform { private final BukkitCraftEngine plugin; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java index 81396c16e..8ff14ab33 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java @@ -73,7 +73,7 @@ public final class EntityUtils { if (!canDismount) { continue; } - if (!FastNMS.INSTANCE.checkEntityCollision(serverLevel, List.of(newAABB))) { + if (!FastNMS.INSTANCE.checkEntityCollision(serverLevel, List.of(newAABB), o -> true)) { continue; } if (VersionHelper.isFolia()) { diff --git a/common-files/src/main/resources/resources/default/configuration/furniture/bench.yml b/common-files/src/main/resources/resources/default/configuration/furniture/bench.yml index 66e36f644..595ed0f67 100644 --- a/common-files/src/main/resources/resources/default/configuration/furniture/bench.yml +++ b/common-files/src/main/resources/resources/default/configuration/furniture/bench.yml @@ -11,6 +11,8 @@ items: rotation: four alignment: center furniture: + events: + - template: default:rotatable_furniture_4 settings: item: default:bench sounds: diff --git a/common-files/src/main/resources/resources/default/configuration/furniture/flower_basket.yml b/common-files/src/main/resources/resources/default/configuration/furniture/flower_basket.yml index 4fdd08219..9f4d079ba 100644 --- a/common-files/src/main/resources/resources/default/configuration/furniture/flower_basket.yml +++ b/common-files/src/main/resources/resources/default/configuration/furniture/flower_basket.yml @@ -31,6 +31,11 @@ items: item-name: furniture: default:flower_basket: + events: + - template: default:rotatable_furniture_8 + arguments: + blacklist_variants: + - wall settings: item: default:flower_basket sounds: diff --git a/common-files/src/main/resources/resources/default/configuration/furniture/wooden_chair.yml b/common-files/src/main/resources/resources/default/configuration/furniture/wooden_chair.yml index a399a75d3..8fce322a6 100644 --- a/common-files/src/main/resources/resources/default/configuration/furniture/wooden_chair.yml +++ b/common-files/src/main/resources/resources/default/configuration/furniture/wooden_chair.yml @@ -11,6 +11,8 @@ items: rotation: any alignment: any furniture: + events: + - template: default:rotatable_furniture_8 settings: item: default:wooden_chair sounds: @@ -27,25 +29,15 @@ items: billboard: FIXED translation: 0,0.5,0 hitboxes: - $$>=1.20.5: - - position: 0,0,0 - type: custom - entity-type: slime - invisible: true - can-use-item-on: true - blocks-building: true - seats: - - 0,0,-0.1 0 - $$fallback: - - position: 0,0,0 - type: interaction - blocks-building: true - invisible: true - width: 0.7 - height: 1.2 - interactive: true - seats: - - 0,0,-0.1 0 + - position: 0,0,0 + type: interaction + blocks-building: true + invisible: true + width: 0.7 + height: 1.2 + interactive: true + seats: + - 0,0,-0.1 0 loot: template: default:loot_table/furniture arguments: diff --git a/common-files/src/main/resources/resources/default/configuration/templates/events.yml b/common-files/src/main/resources/resources/default/configuration/templates/events.yml index d0727291f..fd93462b9 100644 --- a/common-files/src/main/resources/resources/default/configuration/templates/events.yml +++ b/common-files/src/main/resources/resources/default/configuration/templates/events.yml @@ -16,7 +16,7 @@ templates: east: south south: west west: north - default:rotatable_furniture: + default:rotatable_furniture_4: on: right_click conditions: - type: expression @@ -28,4 +28,45 @@ templates: - type: swing_hand - type: play_sound sound: ${rotate_sound:-'minecraft:block.bamboo.place'} - on-failure: [] \ No newline at end of file + on-failure: + - type: rotate_furniture + degree: 180 + on-success: + - type: swing_hand + - type: play_sound + sound: ${rotate_sound:-'minecraft:block.bamboo.place'} + on-failure: + - type: rotate_furniture + degree: 270 + on-success: + - type: swing_hand + - type: play_sound + sound: ${rotate_sound:-'minecraft:block.bamboo.place'} + default:rotatable_furniture_8: + on: right_click + conditions: + - type: expression + expression: + - type: "!match_furniture_variant" + variants: ${blacklist_variants:-null} + functions: + - type: rotate_furniture + degree: 45 + on-success: + - type: swing_hand + - type: play_sound + sound: ${rotate_sound:-'minecraft:block.bamboo.place'} + on-failure: + - type: rotate_furniture + degree: 90 + on-success: + - type: swing_hand + - type: play_sound + sound: ${rotate_sound:-'minecraft:block.bamboo.place'} + on-failure: + - type: rotate_furniture + degree: 135 + on-success: + - type: swing_hand + - type: play_sound + sound: ${rotate_sound:-'minecraft:block.bamboo.place'} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureConfigImpl.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureConfigImpl.java index 2833306c8..facc01f27 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureConfigImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureConfigImpl.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.core.entity.furniture; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSortedMap; import net.momirealms.craftengine.core.entity.furniture.behavior.EmptyFurnitureBehavior; import net.momirealms.craftengine.core.entity.furniture.behavior.FurnitureBehavior; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java index eea0f0f4b..e7badf2ff 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java @@ -39,6 +39,9 @@ public class LootConditions { register(CommonConditions.EXPRESSION, new ExpressionCondition.FactoryImpl<>()); register(CommonConditions.IS_NULL, new IsNullCondition.FactoryImpl<>()); register(CommonConditions.HAND, new HandCondition.FactoryImpl<>()); + register(CommonConditions.ON_COOLDOWN, new OnCooldownCondition.FactoryImpl<>()); + register(CommonConditions.INVENTORY_HAS_ITEM, new InventoryHasItemCondition.FactoryImpl<>()); + register(CommonConditions.MATCH_FURNITURE_VARIANT, new MatchFurnitureVariantCondition.FactoryImpl<>()); } public static void register(Key key, ConditionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfigSection.java b/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfigSection.java index e8016ce2a..66165e422 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfigSection.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfigSection.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.pack; import java.nio.file.Path; import java.util.Map; +import java.util.Objects; public class CachedConfigSection { private final Pack pack; @@ -10,10 +11,10 @@ public class CachedConfigSection { private final Map config; public CachedConfigSection(String prefix, Map config, Path filePath, Pack pack) { - this.config = config; - this.filePath = filePath; - this.pack = pack; - this.prefix = prefix; + this.config = Objects.requireNonNull(config); + this.filePath = Objects.requireNonNull(filePath); + this.pack = Objects.requireNonNull(pack); + this.prefix = Objects.requireNonNull(prefix); } public Map config() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/IdSectionConfigParser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/IdSectionConfigParser.java index a15b91c71..1acba1e29 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/IdSectionConfigParser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/IdSectionConfigParser.java @@ -29,13 +29,21 @@ public abstract class IdSectionConfigParser extends AbstractConfigParser { continue; } Map config = castToMap(section, false); + String node = cached.prefix() + "." + key; if ((boolean) config.getOrDefault("debug", false)) { - CraftEngine.instance().logger().info(GsonHelper.get().toJson(CraftEngine.instance().templateManager().applyTemplates(id, config))); + if (!ResourceConfigUtils.runCatching( + cached.filePath(), + node, + () -> CraftEngine.instance().logger().info(GsonHelper.get().toJson(CraftEngine.instance().templateManager().applyTemplates(id, config))), + () -> GsonHelper.get().toJson(section) + )) { + // 发生异常 + continue; + } } if (!(boolean) config.getOrDefault("enable", true)) { continue; } - String node = cached.prefix() + "." + key; ResourceConfigUtils.runCatching( cached.filePath(), node, diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java index 16c0c5d22..256ff4e3b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java @@ -15,6 +15,7 @@ public final class CommonConditions { public static final Key MATCH_ENTITY = Key.of("craftengine:match_entity"); public static final Key MATCH_BLOCK = Key.of("craftengine:match_block"); public static final Key MATCH_BLOCK_PROPERTY = Key.from("craftengine:match_block_property"); + public static final Key MATCH_FURNITURE_VARIANT = Key.from("craftengine:match_furniture_variant"); public static final Key TABLE_BONUS = Key.from("craftengine:table_bonus"); public static final Key SURVIVES_EXPLOSION = Key.from("craftengine:survives_explosion"); public static final Key RANDOM = Key.from("craftengine:random"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java index 4b849ab41..432074e5d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java @@ -1,16 +1,13 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.entity.player.Player; -import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; -import net.momirealms.craftengine.core.util.ItemUtils; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import org.jetbrains.annotations.Nullable; import java.util.Map; import java.util.Optional; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchFurnitureVariantCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchFurnitureVariantCondition.java new file mode 100644 index 000000000..31ded2c60 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchFurnitureVariantCondition.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.plugin.context.condition; + +import net.momirealms.craftengine.core.entity.furniture.Furniture; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.*; + +public class MatchFurnitureVariantCondition implements Condition { + private final Set variants; + + public MatchFurnitureVariantCondition(Collection variants) { + this.variants = new HashSet<>(variants); + } + + @Override + public Key type() { + return CommonConditions.MATCH_FURNITURE_VARIANT; + } + + @Override + public boolean test(CTX ctx) { + Optional furniture = ctx.getOptionalParameter(DirectContextParameters.FURNITURE); + return furniture.filter(value -> this.variants.contains(value.getCurrentVariant().name())).isPresent(); + } + + public static class FactoryImpl implements ConditionFactory { + + @Override + public Condition create(Map arguments) { + List variants = MiscUtils.getAsStringList(ResourceConfigUtils.get(arguments, "variant", "variants")); + return new MatchFurnitureVariantCondition<>(variants); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java index 6d2aa4996..6c9466d0a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java @@ -41,6 +41,7 @@ public class EventConditions { register(CommonConditions.HAND, new HandCondition.FactoryImpl<>()); register(CommonConditions.ON_COOLDOWN, new OnCooldownCondition.FactoryImpl<>()); register(CommonConditions.INVENTORY_HAS_ITEM, new InventoryHasItemCondition.FactoryImpl<>()); + register(CommonConditions.MATCH_FURNITURE_VARIANT, new MatchFurnitureVariantCondition.FactoryImpl<>()); } public static void register(Key key, ConditionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RotateFurnitureFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RotateFurnitureFunction.java index 1256826a8..eb16cedd0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RotateFurnitureFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RotateFurnitureFunction.java @@ -1,28 +1,18 @@ package net.momirealms.craftengine.core.plugin.context.function; import net.momirealms.craftengine.core.entity.furniture.Furniture; -import net.momirealms.craftengine.core.entity.player.InteractionHand; -import net.momirealms.craftengine.core.entity.player.Player; -import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; -import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.event.EventFunctions; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; -import net.momirealms.craftengine.core.sound.SoundData; -import net.momirealms.craftengine.core.sound.SoundSource; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldPosition; -import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; public class RotateFurnitureFunction extends AbstractConditionalFunction { private final NumberProvider degree; @@ -64,7 +54,7 @@ public class RotateFurnitureFunction extends AbstractCondit } public NumberProvider degree() { - return degree; + return this.degree; } public static class FactoryImpl extends AbstractFactory { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java index 183558688..79dac8655 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.plugin.entityculling; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.config.Config; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.MutableVec3d; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java index e3be821e6..f445270dc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceConfigUtils.java @@ -324,17 +324,20 @@ public final class ResourceConfigUtils { } } - public static void runCatching(Path configPath, String node, Runnable runnable, Supplier config) { + public static boolean runCatching(Path configPath, String node, Runnable runnable, Supplier config) { try { runnable.run(); + return true; } catch (LocalizedException e) { printWarningRecursively(e, configPath, node); + return false; } catch (Exception e) { String message = "Unexpected error loading file " + configPath + " - '" + node + "'."; if (config != null) { message += " Configuration details: " + config.get(); } CraftEngine.instance().logger().warn(message, e); + return false; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/snbt/SnbtOperations.java b/core/src/main/java/net/momirealms/craftengine/core/util/snbt/SnbtOperations.java index 53a6fa7f0..c715eba12 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/snbt/SnbtOperations.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/snbt/SnbtOperations.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.util.snbt; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.serialization.DynamicOps; import net.momirealms.craftengine.core.util.snbt.parse.*; import net.momirealms.sparrow.nbt.util.UUIDUtil; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/snbt/parse/LocalizedDynamicCommandExceptionType.java b/core/src/main/java/net/momirealms/craftengine/core/util/snbt/parse/LocalizedDynamicCommandExceptionType.java index ee80a3bee..99dde080a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/snbt/parse/LocalizedDynamicCommandExceptionType.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/snbt/parse/LocalizedDynamicCommandExceptionType.java @@ -4,7 +4,6 @@ import com.mojang.brigadier.ImmutableStringReader; import com.mojang.brigadier.Message; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; -import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import java.util.function.Function; diff --git a/gradle.properties b/gradle.properties index 48efe6d60..2ba672eaf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -48,7 +48,7 @@ byte_buddy_version=1.18.1 ahocorasick_version=0.6.3 snake_yaml_version=2.5 anti_grief_version=1.0.5 -nms_helper_version=1.0.141 +nms_helper_version=1.0.142 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.38.7