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

添加家具debug模式

This commit is contained in:
XiaoMoMi
2025-12-04 22:56:00 +08:00
parent af592e4287
commit 568d1c2b7b
15 changed files with 91 additions and 34 deletions

View File

@@ -78,11 +78,6 @@ public class CustomFurnitureHitboxConfig extends AbstractFurnitureHitBoxConfig<C
}
}
@Override
public void collectBoundingBox(Consumer<AABB> aabbConsumer) {
aabbConsumer.accept(AABB.makeBoundingBox(this.position, this.width, this.height));
}
@Override
public CustomFurnitureHitbox create(Furniture furniture) {
return new CustomFurnitureHitbox(furniture, this);

View File

@@ -63,11 +63,6 @@ public class HappyGhastFurnitureHitboxConfig extends AbstractFurnitureHitBoxConf
}
}
@Override
public void collectBoundingBox(Consumer<AABB> aabbConsumer) {
aabbConsumer.accept(AABB.makeBoundingBox(this.position, 4 * this.scale, 4 * this.scale));
}
public static class Factory implements FurnitureHitBoxConfigFactory<HappyGhastFurnitureHitbox> {
@Override

View File

@@ -77,11 +77,6 @@ public class InteractionFurnitureHitboxConfig extends AbstractFurnitureHitBoxCon
}
}
@Override
public void collectBoundingBox(Consumer<AABB> aabbConsumer) {
aabbConsumer.accept(AABB.makeBoundingBox(this.position, size.x, size.y));
}
@Override
public InteractionFurnitureHitbox create(Furniture furniture) {
return new InteractionFurnitureHitbox(furniture, this);

View File

@@ -153,11 +153,6 @@ public class ShulkerFurnitureHitboxConfig extends AbstractFurnitureHitBoxConfig<
}
}
@Override
public void collectBoundingBox(Consumer<AABB> aabbConsumer) {
aabbConsumer.accept(this.aabbCreator.create(position.x, position.y, position.z, 180, new Vector3f(0)));
}
public float scale() {
return this.scale;
}

View File

@@ -31,7 +31,6 @@ import net.momirealms.craftengine.core.world.WorldPosition;
import net.momirealms.craftengine.core.world.collision.AABB;
import net.momirealms.sparrow.nbt.CompoundTag;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.World;
import java.nio.file.Path;
@@ -121,7 +120,14 @@ 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())) {
if (player != null && player.enableFurnitureDebug() && VersionHelper.isPaper()) {
// bukkitPlayer.getWorld().spawnParticle(Particle.FLAME, , List.of(bukkitPlayer), );
player.playSound(Key.of("minecraft:entity.villager.no"));
Key flame = Key.of("flame");
for (AABB aabb : aabbs) {
List<Vec3d> edgePoints = aabb.getEdgePoints(0.125);
for (Vec3d edgePoint : edgePoints) {
player.playParticle(flame, edgePoint.x(), edgePoint.y(), edgePoint.z());
}
}
}
return InteractionResult.FAIL;
}

View File

@@ -15,7 +15,6 @@ import net.momirealms.craftengine.core.pack.obfuscation.ObfA;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.locale.TranslationManager;
import net.momirealms.craftengine.core.plugin.locale.TranslationManagerImpl;
import net.momirealms.craftengine.core.util.Base64Utils;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.bukkit.Bukkit;

View File

@@ -50,6 +50,7 @@ public class BukkitCommandManager extends AbstractCommandManager<CommandSender>
new DebugAppearanceStateUsageCommand(this, plugin),
new DebugClearCooldownCommand(this, plugin),
new DebugEntityIdCommand(this, plugin),
new DebugFurnitureCommand(this, plugin),
new DebugRealStateUsageCommand(this, plugin),
new DebugItemDataCommand(this, plugin),
new DebugSetBlockCommand(this, plugin),

View File

@@ -0,0 +1,36 @@
package net.momirealms.craftengine.bukkit.plugin.command.feature;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.momirealms.craftengine.bukkit.api.BukkitAdaptors;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.incendo.cloud.Command;
public class DebugFurnitureCommand extends BukkitCommandFeature<CommandSender> {
public DebugFurnitureCommand(CraftEngineCommandManager<CommandSender> commandManager, CraftEngine plugin) {
super(commandManager, plugin);
}
@Override
public Command.Builder<? extends CommandSender> assembleCommand(org.incendo.cloud.CommandManager<CommandSender> manager, Command.Builder<CommandSender> builder) {
return builder
.senderType(Player.class)
.handler(context -> {
BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(context.sender());
boolean b = !serverPlayer.enableFurnitureDebug();
serverPlayer.setEnableFurnitureDebug(b);
serverPlayer.sendMessage(Component.text("Furniture Debug Mode: ").append(Component.text(b ? "ON" : "OFF").color(b ? NamedTextColor.GREEN : NamedTextColor.RED)), false);
});
}
@Override
public String getFeatureID() {
return "debug_furniture";
}
}

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.bukkit.plugin.network;
import com.destroystokyo.paper.ParticleBuilder;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.gson.JsonElement;

View File

@@ -7,7 +7,9 @@ import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks;
import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture;
import net.momirealms.craftengine.bukkit.block.entity.BlockEntityHolder;
import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurniture;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
@@ -26,6 +28,8 @@ import net.momirealms.craftengine.core.block.entity.BlockEntity;
import net.momirealms.craftengine.core.block.entity.render.ConstantBlockEntityRenderer;
import net.momirealms.craftengine.core.entity.data.EntityData;
import net.momirealms.craftengine.core.entity.furniture.Furniture;
import net.momirealms.craftengine.core.entity.furniture.FurnitureVariant;
import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfig;
import net.momirealms.craftengine.core.entity.player.GameMode;
import net.momirealms.craftengine.core.entity.player.InteractionHand;
import net.momirealms.craftengine.core.entity.player.Player;
@@ -156,6 +160,10 @@ public class BukkitServerPlayer extends Player {
private Location eyeLocation;
// 是否启用家具调试
private boolean enableFurnitureDebug;
// 上一次对准的家具
private BukkitFurniture lastHitFurniture;
// 缓存的tick
private int lastHitFurnitureTick;
public BukkitServerPlayer(BukkitCraftEngine plugin, @Nullable Channel channel) {
this.channel = channel;
@@ -542,6 +550,33 @@ public class BukkitServerPlayer extends Player {
this.updateGUI();
}
if (this.enableFurnitureDebug) {
BukkitFurniture furniture = CraftEngineFurniture.rayTrace(platformPlayer());
boolean forceShow = furniture != this.lastHitFurniture;
if (forceShow) {
this.lastHitFurnitureTick = 0;
} else {
this.lastHitFurnitureTick++;
if (this.lastHitFurnitureTick % 30 == 0) {
forceShow = true;
}
}
this.lastHitFurniture = furniture;
if (furniture != null && forceShow) {
FurnitureVariant currentVariant = furniture.getCurrentVariant();
List<AABB> aabbs = new ArrayList<>();
for (FurnitureHitBoxConfig<?> config : currentVariant.hitBoxConfigs()) {
config.prepareForPlacement(furniture.position(), aabbs::add);
}
Key endRod = Key.of("end_rod");
for (AABB aabb : aabbs) {
for (Vec3d point : aabb.getEdgePoints(0.125)) {
this.playParticle(endRod, point.x, point.y, point.z);
}
}
}
}
// 更新眼睛位置
{
Location unsureEyeLocation = bukkitPlayer.getEyeLocation();

View File

@@ -270,6 +270,13 @@ debug_generate_internal_assets:
- /craftengine debug generate-internal-assets
- /ce debug generate-internal-assets
debug_furniture:
enable: true
permission: ce.command.debug.furniture
usage:
- /craftengine debug furniture
- /ce debug furniture
debug_test:
enable: true
permission: ce.command.debug.test

View File

@@ -18,7 +18,6 @@ import net.momirealms.craftengine.core.util.GsonHelper;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.MiscUtils;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import net.momirealms.craftengine.core.world.collision.AABB;
import org.incendo.cloud.suggestion.Suggestion;
import org.joml.Vector3f;
@@ -166,8 +165,6 @@ public abstract class AbstractFurnitureManager implements FurnitureManager {
AbstractFurnitureManager.this.byId.put(id, furniture);
}
private CullingData parseCullingData(Object arguments) {
if (arguments instanceof Boolean b && !b)
return null;

View File

@@ -24,5 +24,4 @@ public interface FurnitureHitBoxConfig<H extends FurnitureHitBox> {
void prepareForPlacement(WorldPosition targetPos, Consumer<AABB> aabbConsumer);
void collectBoundingBox(Consumer<AABB> aabbConsumer);
}

View File

@@ -31,7 +31,10 @@ import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.config.ConfigParser;
import net.momirealms.craftengine.core.plugin.config.SectionConfigParser;
import net.momirealms.craftengine.core.plugin.config.StringKeyConstructor;
import net.momirealms.craftengine.core.plugin.locale.*;
import net.momirealms.craftengine.core.plugin.locale.LangData;
import net.momirealms.craftengine.core.plugin.locale.LocalizedException;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.plugin.locale.TranslationManager;
import net.momirealms.craftengine.core.plugin.logger.Debugger;
import net.momirealms.craftengine.core.sound.AbstractSoundManager;
import net.momirealms.craftengine.core.sound.SoundEvent;

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.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;
@@ -95,10 +94,6 @@ public final class EntityCulling {
if (distanceSq > maxDistanceSq) {
return false;
}
// 太近了,不剔除
else if (distanceSq < 1) {
return true;
}
}
if (!rayTracing || !cullable.rayTracing) {