9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

旋转家具配置

This commit is contained in:
XiaoMoMi
2025-12-05 04:09:45 +08:00
parent b310559c0d
commit 37eaf97dc4
25 changed files with 171 additions and 71 deletions

View File

@@ -1,10 +1,8 @@
package net.momirealms.craftengine.bukkit.compatibility.papi; package net.momirealms.craftengine.bukkit.compatibility.papi;
import me.clip.placeholderapi.expansion.PlaceholderExpansion; 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.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; 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.entity.player.InteractionHand;
import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.plugin.CraftEngine; 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.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.function.Predicate;
public class CheckItemExpansion extends PlaceholderExpansion { public class CheckItemExpansion extends PlaceholderExpansion {
private final CraftEngine plugin; private final CraftEngine plugin;

View File

@@ -54,6 +54,8 @@ public class BukkitFurniture extends Furniture {
FurnitureVariant variant = this.config.getVariant(variantName); FurnitureVariant variant = this.config.getVariant(variantName);
if (variant == null) return false; if (variant == null) return false;
if (this.currentVariant == variant) return false; if (this.currentVariant == variant) return false;
// 删除椅子
super.destroySeats();
BukkitFurnitureManager.instance().invalidateFurniture(this); BukkitFurnitureManager.instance().invalidateFurniture(this);
super.clearColliders(); super.clearColliders();
super.setVariantInternal(variant); super.setVariantInternal(variant);
@@ -74,10 +76,20 @@ public class BukkitFurniture extends Furniture {
hitBoxConfig.prepareBoundingBox(position, aabbs::add, false); hitBoxConfig.prepareBoundingBox(position, aabbs::add, false);
} }
if (!aabbs.isEmpty()) { 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); return CompletableFuture.completedFuture(false);
} }
} }
// 删除椅子
super.destroySeats();
// 准备传送 // 准备传送
CompletableFuture<Boolean> future = new CompletableFuture<>(); CompletableFuture<Boolean> future = new CompletableFuture<>();
BukkitFurnitureManager.instance().invalidateFurniture(this); BukkitFurnitureManager.instance().invalidateFurniture(this);

View File

@@ -5,19 +5,15 @@ import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors;
import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; 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.reflection.minecraft.NetworkReflections;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.bukkit.util.ComponentUtils;
import net.momirealms.craftengine.bukkit.world.BukkitWorldManager; 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.entity.player.InteractionHand;
import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.item.ItemKeys;
import net.momirealms.craftengine.core.plugin.CraftEngine; 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.CEWorld;
import net.momirealms.craftengine.core.world.WorldPosition;
import net.momirealms.craftengine.core.world.chunk.CEChunk; import net.momirealms.craftengine.core.world.chunk.CEChunk;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.ItemDisplay; 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.EntitiesLoadEvent;
import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.event.world.WorldUnloadEvent; import org.bukkit.event.world.WorldUnloadEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
public class FurnitureEventListener implements Listener { public class FurnitureEventListener implements Listener {
private final BukkitFurnitureManager manager; private final BukkitFurnitureManager manager;

View File

@@ -35,22 +35,39 @@ import org.bukkit.World;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.*; import java.util.*;
import java.util.function.Predicate;
public class FurnitureItemBehavior extends ItemBehavior { public class FurnitureItemBehavior extends ItemBehavior {
public static final Factory FACTORY = new Factory(); public static final Factory FACTORY = new Factory();
private static final Set<String> ALLOWED_ANCHOR_TYPES = Set.of("wall", "ceiling", "ground"); private static final Set<String> ALLOWED_ANCHOR_TYPES = Set.of("wall", "ceiling", "ground");
private final Key id; private final Key id;
private final Map<AnchorType, Rule> rules; private final Map<AnchorType, Rule> rules;
private final boolean ignorePlacer;
private final boolean ignoreEntities;
public FurnitureItemBehavior(Key id, Map<AnchorType, Rule> rules) { public FurnitureItemBehavior(Key id, Map<AnchorType, Rule> rules, boolean ignorePlacer, boolean ignoreEntities) {
this.id = id; this.id = id;
this.rules = rules; this.rules = rules;
this.ignorePlacer = ignorePlacer;
this.ignoreEntities = ignoreEntities;
} }
public Key furnitureId() { public Key furnitureId() {
return this.id; return this.id;
} }
public Map<AnchorType, Rule> rules() {
return this.rules;
}
public boolean ignorePlacer() {
return this.ignorePlacer;
}
public boolean ignoreEntities() {
return this.ignoreEntities;
}
@Override @Override
public InteractionResult useOnBlock(UseOnContext context) { public InteractionResult useOnBlock(UseOnContext context) {
return this.place(context); return this.place(context);
@@ -118,7 +135,15 @@ public class FurnitureItemBehavior extends ItemBehavior {
} }
// 检查方块、实体阻挡 // 检查方块、实体阻挡
if (!aabbs.isEmpty()) { 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<Object> 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()) { if (player != null && player.enableFurnitureDebug() && VersionHelper.isPaper()) {
player.playSound(Key.of("minecraft:entity.villager.no")); player.playSound(Key.of("minecraft:entity.villager.no"));
Key flame = Key.of("flame"); 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")
);
} }
} }

View File

@@ -3,14 +3,12 @@ package net.momirealms.craftengine.bukkit.item.listener;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors;
import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; 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.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.bukkit.util.ComponentUtils; 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.bukkit.util.LocationUtils;
import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.CustomBlock;
import net.momirealms.craftengine.core.block.ImmutableBlockState; 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.Item;
import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.item.ItemKeys;
import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.MiscUtils;
import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;

View File

@@ -1,24 +1,18 @@
package net.momirealms.craftengine.bukkit.plugin; package net.momirealms.craftengine.bukkit.plugin;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; 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.plugin.reflection.minecraft.MRegistryOps;
import net.momirealms.craftengine.bukkit.util.ParticleUtils; import net.momirealms.craftengine.bukkit.util.ParticleUtils;
import net.momirealms.craftengine.bukkit.world.particle.BukkitParticleType; import net.momirealms.craftengine.bukkit.world.particle.BukkitParticleType;
import net.momirealms.craftengine.core.plugin.Platform; 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.util.Key;
import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.World;
import net.momirealms.craftengine.core.world.particle.ParticleType; import net.momirealms.craftengine.core.world.particle.ParticleType;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.Tag; import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Particle; import org.bukkit.Particle;
import java.util.Map;
public class BukkitPlatform implements Platform { public class BukkitPlatform implements Platform {
private final BukkitCraftEngine plugin; private final BukkitCraftEngine plugin;

View File

@@ -73,7 +73,7 @@ public final class EntityUtils {
if (!canDismount) { if (!canDismount) {
continue; continue;
} }
if (!FastNMS.INSTANCE.checkEntityCollision(serverLevel, List.of(newAABB))) { if (!FastNMS.INSTANCE.checkEntityCollision(serverLevel, List.of(newAABB), o -> true)) {
continue; continue;
} }
if (VersionHelper.isFolia()) { if (VersionHelper.isFolia()) {

View File

@@ -11,6 +11,8 @@ items:
rotation: four rotation: four
alignment: center alignment: center
furniture: furniture:
events:
- template: default:rotatable_furniture_4
settings: settings:
item: default:bench item: default:bench
sounds: sounds:

View File

@@ -31,6 +31,11 @@ items:
item-name: <!i><l10n:item.flower_basket> item-name: <!i><l10n:item.flower_basket>
furniture: furniture:
default:flower_basket: default:flower_basket:
events:
- template: default:rotatable_furniture_8
arguments:
blacklist_variants:
- wall
settings: settings:
item: default:flower_basket item: default:flower_basket
sounds: sounds:

View File

@@ -11,6 +11,8 @@ items:
rotation: any rotation: any
alignment: any alignment: any
furniture: furniture:
events:
- template: default:rotatable_furniture_8
settings: settings:
item: default:wooden_chair item: default:wooden_chair
sounds: sounds:
@@ -27,25 +29,15 @@ items:
billboard: FIXED billboard: FIXED
translation: 0,0.5,0 translation: 0,0.5,0
hitboxes: hitboxes:
$$>=1.20.5: - position: 0,0,0
- position: 0,0,0 type: interaction
type: custom blocks-building: true
entity-type: slime invisible: true
invisible: true width: 0.7
can-use-item-on: true height: 1.2
blocks-building: true interactive: true
seats: seats:
- 0,0,-0.1 0 - 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
loot: loot:
template: default:loot_table/furniture template: default:loot_table/furniture
arguments: arguments:

View File

@@ -16,7 +16,7 @@ templates:
east: south east: south
south: west south: west
west: north west: north
default:rotatable_furniture: default:rotatable_furniture_4:
on: right_click on: right_click
conditions: conditions:
- type: expression - type: expression
@@ -28,4 +28,45 @@ templates:
- type: swing_hand - type: swing_hand
- type: play_sound - type: play_sound
sound: ${rotate_sound:-'minecraft:block.bamboo.place'} sound: ${rotate_sound:-'minecraft:block.bamboo.place'}
on-failure: [] 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: <arg:player.is_sneaking>
- 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'}

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.core.entity.furniture; package net.momirealms.craftengine.core.entity.furniture;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.ImmutableSortedMap;
import net.momirealms.craftengine.core.entity.furniture.behavior.EmptyFurnitureBehavior; import net.momirealms.craftengine.core.entity.furniture.behavior.EmptyFurnitureBehavior;
import net.momirealms.craftengine.core.entity.furniture.behavior.FurnitureBehavior; import net.momirealms.craftengine.core.entity.furniture.behavior.FurnitureBehavior;

View File

@@ -39,6 +39,9 @@ public class LootConditions {
register(CommonConditions.EXPRESSION, new ExpressionCondition.FactoryImpl<>()); register(CommonConditions.EXPRESSION, new ExpressionCondition.FactoryImpl<>());
register(CommonConditions.IS_NULL, new IsNullCondition.FactoryImpl<>()); register(CommonConditions.IS_NULL, new IsNullCondition.FactoryImpl<>());
register(CommonConditions.HAND, new HandCondition.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<LootContext> factory) { public static void register(Key key, ConditionFactory<LootContext> factory) {

View File

@@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.pack;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Map; import java.util.Map;
import java.util.Objects;
public class CachedConfigSection { public class CachedConfigSection {
private final Pack pack; private final Pack pack;
@@ -10,10 +11,10 @@ public class CachedConfigSection {
private final Map<String, Object> config; private final Map<String, Object> config;
public CachedConfigSection(String prefix, Map<String, Object> config, Path filePath, Pack pack) { public CachedConfigSection(String prefix, Map<String, Object> config, Path filePath, Pack pack) {
this.config = config; this.config = Objects.requireNonNull(config);
this.filePath = filePath; this.filePath = Objects.requireNonNull(filePath);
this.pack = pack; this.pack = Objects.requireNonNull(pack);
this.prefix = prefix; this.prefix = Objects.requireNonNull(prefix);
} }
public Map<String, Object> config() { public Map<String, Object> config() {

View File

@@ -29,13 +29,21 @@ public abstract class IdSectionConfigParser extends AbstractConfigParser {
continue; continue;
} }
Map<String, Object> config = castToMap(section, false); Map<String, Object> config = castToMap(section, false);
String node = cached.prefix() + "." + key;
if ((boolean) config.getOrDefault("debug", false)) { 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)) { if (!(boolean) config.getOrDefault("enable", true)) {
continue; continue;
} }
String node = cached.prefix() + "." + key;
ResourceConfigUtils.runCatching( ResourceConfigUtils.runCatching(
cached.filePath(), cached.filePath(),
node, node,

View File

@@ -15,6 +15,7 @@ public final class CommonConditions {
public static final Key MATCH_ENTITY = Key.of("craftengine:match_entity"); 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 = Key.of("craftengine:match_block");
public static final Key MATCH_BLOCK_PROPERTY = Key.from("craftengine:match_block_property"); 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 TABLE_BONUS = Key.from("craftengine:table_bonus");
public static final Key SURVIVES_EXPLOSION = Key.from("craftengine:survives_explosion"); public static final Key SURVIVES_EXPLOSION = Key.from("craftengine:survives_explosion");
public static final Key RANDOM = Key.from("craftengine:random"); public static final Key RANDOM = Key.from("craftengine:random");

View File

@@ -1,16 +1,13 @@
package net.momirealms.craftengine.core.plugin.context.condition; package net.momirealms.craftengine.core.plugin.context.condition;
import net.momirealms.craftengine.core.entity.player.Player; 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.Condition;
import net.momirealms.craftengine.core.plugin.context.Context; 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.NumberProvider;
import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders;
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; 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.Key;
import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import org.jetbrains.annotations.Nullable;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;

View File

@@ -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<CTX extends Context> implements Condition<CTX> {
private final Set<String> variants;
public MatchFurnitureVariantCondition(Collection<String> variants) {
this.variants = new HashSet<>(variants);
}
@Override
public Key type() {
return CommonConditions.MATCH_FURNITURE_VARIANT;
}
@Override
public boolean test(CTX ctx) {
Optional<Furniture> furniture = ctx.getOptionalParameter(DirectContextParameters.FURNITURE);
return furniture.filter(value -> this.variants.contains(value.getCurrentVariant().name())).isPresent();
}
public static class FactoryImpl<CTX extends Context> implements ConditionFactory<CTX> {
@Override
public Condition<CTX> create(Map<String, Object> arguments) {
List<String> variants = MiscUtils.getAsStringList(ResourceConfigUtils.get(arguments, "variant", "variants"));
return new MatchFurnitureVariantCondition<>(variants);
}
}
}

View File

@@ -41,6 +41,7 @@ public class EventConditions {
register(CommonConditions.HAND, new HandCondition.FactoryImpl<>()); register(CommonConditions.HAND, new HandCondition.FactoryImpl<>());
register(CommonConditions.ON_COOLDOWN, new OnCooldownCondition.FactoryImpl<>()); register(CommonConditions.ON_COOLDOWN, new OnCooldownCondition.FactoryImpl<>());
register(CommonConditions.INVENTORY_HAS_ITEM, new InventoryHasItemCondition.FactoryImpl<>()); register(CommonConditions.INVENTORY_HAS_ITEM, new InventoryHasItemCondition.FactoryImpl<>());
register(CommonConditions.MATCH_FURNITURE_VARIANT, new MatchFurnitureVariantCondition.FactoryImpl<>());
} }
public static void register(Key key, ConditionFactory<Context> factory) { public static void register(Key key, ConditionFactory<Context> factory) {

View File

@@ -1,28 +1,18 @@
package net.momirealms.craftengine.core.plugin.context.function; package net.momirealms.craftengine.core.plugin.context.function;
import net.momirealms.craftengine.core.entity.furniture.Furniture; 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.Condition;
import net.momirealms.craftengine.core.plugin.context.Context; 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.event.EventFunctions;
import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; 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.number.NumberProviders;
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; 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.Key;
import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import net.momirealms.craftengine.core.world.World;
import net.momirealms.craftengine.core.world.WorldPosition; import net.momirealms.craftengine.core.world.WorldPosition;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
public class RotateFurnitureFunction<CTX extends Context> extends AbstractConditionalFunction<CTX> { public class RotateFurnitureFunction<CTX extends Context> extends AbstractConditionalFunction<CTX> {
private final NumberProvider degree; private final NumberProvider degree;
@@ -64,7 +54,7 @@ public class RotateFurnitureFunction<CTX extends Context> extends AbstractCondit
} }
public NumberProvider degree() { public NumberProvider degree() {
return degree; return this.degree;
} }
public static class FactoryImpl<CTX extends Context> extends AbstractFactory<CTX> { public static class FactoryImpl<CTX extends Context> extends AbstractFactory<CTX> {

View File

@@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.plugin.entityculling;
import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.plugin.config.Config; 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.util.MiscUtils;
import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.ChunkPos;
import net.momirealms.craftengine.core.world.MutableVec3d; import net.momirealms.craftengine.core.world.MutableVec3d;

View File

@@ -324,17 +324,20 @@ public final class ResourceConfigUtils {
} }
} }
public static void runCatching(Path configPath, String node, Runnable runnable, Supplier<String> config) { public static boolean runCatching(Path configPath, String node, Runnable runnable, Supplier<String> config) {
try { try {
runnable.run(); runnable.run();
return true;
} catch (LocalizedException e) { } catch (LocalizedException e) {
printWarningRecursively(e, configPath, node); printWarningRecursively(e, configPath, node);
return false;
} catch (Exception e) { } catch (Exception e) {
String message = "Unexpected error loading file " + configPath + " - '" + node + "'."; String message = "Unexpected error loading file " + configPath + " - '" + node + "'.";
if (config != null) { if (config != null) {
message += " Configuration details: " + config.get(); message += " Configuration details: " + config.get();
} }
CraftEngine.instance().logger().warn(message, e); CraftEngine.instance().logger().warn(message, e);
return false;
} }
} }

View File

@@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.util.snbt;
import com.mojang.brigadier.StringReader; import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
import com.mojang.serialization.DynamicOps; import com.mojang.serialization.DynamicOps;
import net.momirealms.craftengine.core.util.snbt.parse.*; import net.momirealms.craftengine.core.util.snbt.parse.*;
import net.momirealms.sparrow.nbt.util.UUIDUtil; import net.momirealms.sparrow.nbt.util.UUIDUtil;

View File

@@ -4,7 +4,6 @@ import com.mojang.brigadier.ImmutableStringReader;
import com.mojang.brigadier.Message; import com.mojang.brigadier.Message;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
import java.util.function.Function; import java.util.function.Function;

View File

@@ -48,7 +48,7 @@ byte_buddy_version=1.18.1
ahocorasick_version=0.6.3 ahocorasick_version=0.6.3
snake_yaml_version=2.5 snake_yaml_version=2.5
anti_grief_version=1.0.5 anti_grief_version=1.0.5
nms_helper_version=1.0.141 nms_helper_version=1.0.142
evalex_version=3.5.0 evalex_version=3.5.0
reactive_streams_version=1.0.4 reactive_streams_version=1.0.4
amazon_awssdk_version=2.38.7 amazon_awssdk_version=2.38.7