mirror of
				https://github.com/TheWhiteDog9487/RandomTeleporter.git
				synced 2025-11-04 15:55:05 +08:00 
			
		
		
		
	使用Minecraft内部方法搜索指定坐标内可传送玩家的合适Y
更换大量new BlockPos为BlockPos.Mutable
This commit is contained in:
		@@ -3,14 +3,18 @@ package xyz.thewhitedog9487;
 | 
			
		||||
import com.mojang.brigadier.Command;
 | 
			
		||||
import com.mojang.brigadier.arguments.IntegerArgumentType;
 | 
			
		||||
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
 | 
			
		||||
import net.minecraft.block.Block;
 | 
			
		||||
import net.minecraft.block.Blocks;
 | 
			
		||||
import net.minecraft.command.argument.EntityArgumentType;
 | 
			
		||||
import net.minecraft.command.argument.Vec2ArgumentType;
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.server.command.ServerCommandSource;
 | 
			
		||||
import net.minecraft.server.world.ServerWorld;
 | 
			
		||||
import net.minecraft.text.Text;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec2f;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraft.world.chunk.ChunkStatus;
 | 
			
		||||
import org.jetbrains.annotations.Nullable;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
@@ -19,6 +23,7 @@ import java.util.SplittableRandom;
 | 
			
		||||
 | 
			
		||||
import static net.minecraft.server.command.CommandManager.argument;
 | 
			
		||||
import static net.minecraft.server.command.CommandManager.literal;
 | 
			
		||||
import static net.minecraft.world.Heightmap.Type.MOTION_BLOCKING_NO_LEAVES;
 | 
			
		||||
 | 
			
		||||
public class CommandRegister {
 | 
			
		||||
 | 
			
		||||
@@ -229,36 +234,24 @@ public class CommandRegister {
 | 
			
		||||
                int finalCoordinate_Z1 = Coordinate_Z;
 | 
			
		||||
                // ↑ "lambda 表达式中使用的变量应为 final 或有效 final"
 | 
			
		||||
                Source.sendFeedback(()->{ return Text.translatableWithFallback("warning.radius_equal_zero", "警告:由于你设置的随机半径为0,因此在选择出合适高度之后将直接把你传送至%d %d", finalCoordinate_X1, finalCoordinate_Z1); },true);}}
 | 
			
		||||
        int Coordinate_Y = 320;
 | 
			
		||||
        for (var CurrentBlock = Source.getWorld().getBlockState(new BlockPos(Coordinate_X, Coordinate_Y, Coordinate_Z)).getBlock();
 | 
			
		||||
             // 从世界顶层往下找,直到遇到一个非空气方块
 | 
			
		||||
             Blocks.AIR == CurrentBlock ||
 | 
			
		||||
             Blocks.VOID_AIR == CurrentBlock ||
 | 
			
		||||
             Blocks.CAVE_AIR == CurrentBlock
 | 
			
		||||
                ;CurrentBlock = Source.getWorld().getBlockState(new BlockPos(Coordinate_X, Coordinate_Y, Coordinate_Z)).getBlock()){
 | 
			
		||||
            Coordinate_Y--;}
 | 
			
		||||
            for (int x = -1; x <= 1; x++) {
 | 
			
		||||
                for (int z = -1; z <= 1; z++) {
 | 
			
		||||
                    // 如果传送到的位置周围一圈是空气、水或岩浆,将其替换为玻璃
 | 
			
		||||
                    var BlockPos = new BlockPos(Coordinate_X - x, Coordinate_Y, Coordinate_Z - z);
 | 
			
		||||
                    var CurrentBlock = Source.getWorld().getBlockState(BlockPos).getBlock();
 | 
			
		||||
                    if ( CurrentBlock == Blocks.AIR ||
 | 
			
		||||
                        CurrentBlock == Blocks.VOID_AIR ||
 | 
			
		||||
                        CurrentBlock == Blocks.CAVE_AIR ||
 | 
			
		||||
                        CurrentBlock == Blocks.WATER ||
 | 
			
		||||
                        CurrentBlock == Blocks.LAVA ){
 | 
			
		||||
                        // 只替换空气、水和岩浆,其余保留
 | 
			
		||||
                            Source.getWorld().setBlockState(BlockPos, Blocks.GLASS.getDefaultState());}}}
 | 
			
		||||
//        if ( String.valueOf(entity.getWorld().getBiome(new BlockPos(Math.toIntExact(Coordinate_X), Coordinate_Y, Math.toIntExact(Coordinate_Z))).getKey()).equals("minecraft:the_void") ) {
 | 
			
		||||
        World EntityWorld = TargetEntity.getEntityWorld();
 | 
			
		||||
        World EntityWorld = TargetEntity.getEntityWorld();
 | 
			
		||||
        EntityWorld.getChunk(Coordinate_X >> 4, Coordinate_Z >> 4, ChunkStatus.FULL, true);
 | 
			
		||||
        // ↑ 加载目标区块,不然下面获取到的Coordinate_Y一定是-64
 | 
			
		||||
        // 必须是 >> 4 ,不能是 / 16
 | 
			
		||||
        int Coordinate_Y = EntityWorld.getTopY(MOTION_BLOCKING_NO_LEAVES, Coordinate_X, Coordinate_Z);
 | 
			
		||||
        BlockPos.Mutable BlockPos = new BlockPos.Mutable();
 | 
			
		||||
        for (int x = -1; x <= 1; x++) {
 | 
			
		||||
            for (int z = -1; z <= 1; z++) {
 | 
			
		||||
                // 如果传送到的位置周围一圈是ReplaceToTargetBlock的方块,将其替换为TargetBlock
 | 
			
		||||
                BlockPos.set(Coordinate_X - x, Coordinate_Y - 1, Coordinate_Z - z);
 | 
			
		||||
                var CurrentBlock = EntityWorld.getBlockState(BlockPos).getBlock();
 | 
			
		||||
                if ( ReplaceToTargetBlock.contains(CurrentBlock) ) {
 | 
			
		||||
                    // 只替换ReplaceToTargetBlock内的方块,其余保留
 | 
			
		||||
                    EntityWorld.setBlockState(BlockPos, TargetBlock.getDefaultState());}}}
 | 
			
		||||
//        if ( String.valueOf(TargetEntity.getWorld().getBiome(new BlockPos(Math.toIntExact(Coordinate_X), Coordinate_Y, Math.toIntExact(Coordinate_Z))).getKey()).equals("minecraft:the_void") ) {
 | 
			
		||||
//            Coordinate_Y++;}
 | 
			
		||||
        TargetEntity.teleport((ServerWorld) EntityWorld,Coordinate_X + 0.5, Coordinate_Y, Coordinate_Z + 0.5, new HashSet<>(), TargetEntity.getYaw(), TargetEntity.getPitch(), false);
 | 
			
		||||
        int finalCoordinate_X = Coordinate_X;
 | 
			
		||||
        int finalCoordinate_Y = Coordinate_Y;
 | 
			
		||||
        int finalCoordinate_Z = Coordinate_Z;
 | 
			
		||||
        // ↑ "lambda 表达式中使用的变量应为 final 或有效 final"
 | 
			
		||||
        final var FeedbackFallbackString = String.format("已将玩家%s传送到%d %d %d", TargetEntity.getName().getString(), Coordinate_X, Coordinate_Y, Coordinate_Z);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user