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;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user