Files
fabric-carpet/src/main/java/carpet/commands/PerimeterInfoCommand.java
T
2026-07-17 17:22:31 +08:00

86 lines
4.3 KiB
Java

package carpet.commands;
import carpet.CarpetSettings;
import carpet.utils.CommandHelper;
import carpet.utils.Messenger;
import carpet.utils.PerimeterDiagnostics;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.minecraft.commands.CommandBuildContext;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.arguments.coordinates.BlockPosArgument;
import net.minecraft.commands.synchronization.SuggestionProviders;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntitySpawnRequest;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob;
import static net.minecraft.commands.Commands.argument;
import static net.minecraft.commands.Commands.literal;
import static net.minecraft.commands.arguments.ResourceArgument.getSummonableEntityType;
import static net.minecraft.commands.arguments.ResourceArgument.resource;
public class PerimeterInfoCommand
{
public static void register(CommandDispatcher<CommandSourceStack> dispatcher, CommandBuildContext commandBuildContext)
{
LiteralArgumentBuilder<CommandSourceStack> command = literal("perimeterinfo").
requires((player) -> Permissions.check(player,"carpet.command.perimeterinfo",CommandHelper.canUseCommand(player, CarpetSettings.commandPerimeterInfo))).
executes( (c) -> perimeterDiagnose(
c.getSource(),
BlockPos.containing(c.getSource().getPosition()),
null)).
then(argument("center position", BlockPosArgument.blockPos()).
executes( (c) -> perimeterDiagnose(
c.getSource(),
BlockPosArgument.getSpawnablePos(c, "center position"),
null)).
then(argument("mob", resource(commandBuildContext, Registries.ENTITY_TYPE)).
suggests(SuggestionProviders.cast(SuggestionProviders.SUMMONABLE_ENTITIES)).
executes( (c) -> perimeterDiagnose(
c.getSource(),
BlockPosArgument.getSpawnablePos(c, "center position"),
getSummonableEntityType(c, "mob").key().identifier().toString()
))));
dispatcher.register(command);
}
private static int perimeterDiagnose(CommandSourceStack source, BlockPos pos, String mobId)
{
CompoundTag nbttagcompound = new CompoundTag();
Mob entityliving = null;
if (mobId != null)
{
nbttagcompound.putString("id", mobId);
Entity baseEntity = EntityType.loadEntityRecursive(nbttagcompound, source.getLevel(), new EntitySpawnRequest(EntitySpawnReason.COMMAND, true), (entity_1x) -> {
entity_1x.snapTo(new BlockPos(pos.getX(), source.getLevel().getMinY()-10, pos.getZ()), entity_1x.getYRot(), entity_1x. getXRot());
return !source.getLevel().addWithUUID(entity_1x) ? null : entity_1x;
});
if (!(baseEntity instanceof Mob))
{
Messenger.m(source, "r /perimeterinfo requires a mob entity to test against.");
if (baseEntity != null) baseEntity.discard();
return 0;
}
entityliving = (Mob) baseEntity;
}
PerimeterDiagnostics.Result res = PerimeterDiagnostics.countSpots(source.getLevel(), pos, entityliving);
Messenger.m(source, "w Spawning spaces around ",Messenger.tp("c",pos), "w :");
Messenger.m(source, "w potential in-liquid: ","wb "+res.liquid);
Messenger.m(source, "w potential on-ground: ","wb "+res.ground);
if (entityliving != null)
{
Messenger.m(source, "w ", entityliving.getDisplayName() ,"w : ","wb "+res.specific);
res.samples.forEach(bp -> Messenger.m(source, "w ", Messenger.tp("c", bp)));
entityliving.discard(); // dicard // remove();
}
return 1;
}
}