mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-19 15:09:15 +00:00
旋转家具配置
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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")
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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'}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user