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;
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;

View File

@@ -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<Boolean> future = new CompletableFuture<>();
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.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;

View File

@@ -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<String> ALLOWED_ANCHOR_TYPES = Set.of("wall", "ceiling", "ground");
private final Key id;
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.rules = rules;
this.ignorePlacer = ignorePlacer;
this.ignoreEntities = ignoreEntities;
}
public Key furnitureId() {
return this.id;
}
public Map<AnchorType, Rule> 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<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()) {
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")
);
}
}

View File

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

View File

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

View File

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