nofall
This commit is contained in:
@ -6,4 +6,5 @@ public class FeaturesBool {
|
||||
public static boolean checkBukkitPlugins=false;
|
||||
public static boolean autoTool=false;
|
||||
public static boolean autoFish=false;
|
||||
public static boolean noFallPacket=false;
|
||||
}
|
||||
|
@ -25,11 +25,22 @@ public class MCToolsClient implements ClientModInitializer {
|
||||
//初始化命令注册回调
|
||||
ClientCommandRegistrationCallback.EVENT.register(MCToolsClient::registerCommands);
|
||||
HudRenderCallback.EVENT.register(MCToolsClient::drawHUD);
|
||||
}
|
||||
|
||||
}
|
||||
private static String gameDayToRealTimeFormat(long gameDays){
|
||||
long min=gameDays*20;
|
||||
if(min<60){
|
||||
return String.format("%d 分钟",min);
|
||||
}else if(min>60&&min<1440){
|
||||
return String.format("%d 小时",min/60);
|
||||
}else if(min>1440){
|
||||
return String.format("%d 天",(min/60)/24);
|
||||
}else {
|
||||
return String.format("%d 分钟",min);
|
||||
}
|
||||
}
|
||||
private static void drawHUD(DrawContext drawContext, float v) {
|
||||
MinecraftClient mc=MinecraftClient.getInstance();
|
||||
|
||||
//跳过调试
|
||||
if(mc.options.debugEnabled) return;
|
||||
|
||||
@ -53,7 +64,7 @@ public class MCToolsClient implements ClientModInitializer {
|
||||
}else{
|
||||
AddText(drawContext,String.format("X:%.2f Y:%.2f Z:%.2f",playerPos.x,playerPos.y,playerPos.z));
|
||||
}
|
||||
AddText(drawContext,String.format("世界时间: %d天 (%d 小时)",mc.world.getTimeOfDay()/24000,((mc.world.getTimeOfDay()/24000)*20)/60));
|
||||
AddText(drawContext,String.format("世界时间: %d天 (%s)",mc.world.getTimeOfDay()/24000,gameDayToRealTimeFormat(mc.world.getTimeOfDay()/24000)));
|
||||
AddText(drawContext,String.format("当前区块: [%d,%d]",mc.player.getChunkPos().x,mc.player.getChunkPos().z));
|
||||
ItemStack currentItem=p.getInventory().getMainHandStack();
|
||||
if(currentItem!=null&¤tItem.isDamageable()){
|
||||
@ -63,7 +74,7 @@ public class MCToolsClient implements ClientModInitializer {
|
||||
}
|
||||
private static void AddText(DrawContext drawContext,String text){
|
||||
TextRenderer renderer=MinecraftClient.getInstance().textRenderer;
|
||||
drawContext.drawText(renderer,text,0,infoY,Colors.GRAY,false);
|
||||
drawContext.drawText(renderer,text,0,infoY,Colors.WHITE,false);
|
||||
infoY+=10;
|
||||
}
|
||||
private static void registerCommands(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandRegistryAccess registryAccess) {
|
||||
@ -74,5 +85,7 @@ public class MCToolsClient implements ClientModInitializer {
|
||||
CAutoFishCommand.register(dispatcher);
|
||||
CAutoToolCommand.register(dispatcher);
|
||||
CQServerPluginsCommand.register(dispatcher);
|
||||
CNoFallPacketCommand.register(dispatcher);
|
||||
CFindBlockCommand.register(dispatcher);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,36 @@
|
||||
package com.expvintl.mctools.commands;
|
||||
|
||||
import com.expvintl.mctools.FeaturesBool;
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.client.RenderWorldEvent;
|
||||
import com.expvintl.mctools.utils.Utils;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import com.mojang.brigadier.Command;
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import com.mojang.brigadier.arguments.BoolArgumentType;
|
||||
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
|
||||
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
|
||||
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
|
||||
|
||||
public class CFindBlockCommand {
|
||||
private static final MinecraftClient mc=MinecraftClient.getInstance();
|
||||
private static final CFindBlockCommand INSTANCE=new CFindBlockCommand();
|
||||
|
||||
public static void register(CommandDispatcher<FabricClientCommandSource> dispatcher){
|
||||
MCEventBus.INSTANCE.register(INSTANCE);
|
||||
dispatcher.register(literal("cfindblock").then(argument("方块名字", StringArgumentType.string()).executes(CFindBlockCommand::execute)));
|
||||
}
|
||||
private static int execute(CommandContext<FabricClientCommandSource> context) {
|
||||
String blockName=context.getArgument("方块名字", String.class);
|
||||
Utils.findBlock(mc.player,blockName,10);
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
@Subscribe
|
||||
private void onRenderWorld(RenderWorldEvent event){
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package com.expvintl.mctools.commands;
|
||||
|
||||
import com.expvintl.mctools.FeaturesBool;
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.network.PacketSendEvent;
|
||||
import com.expvintl.mctools.mixin.interfaces.PlayerMoveC2SPacketAccessor;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import com.mojang.brigadier.Command;
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import com.mojang.brigadier.arguments.BoolArgumentType;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
|
||||
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
|
||||
|
||||
public class CNoFallPacketCommand {
|
||||
private static final CNoFallPacketCommand INSTANCE=new CNoFallPacketCommand();
|
||||
private static final MinecraftClient mc=MinecraftClient.getInstance();
|
||||
public static void register(CommandDispatcher<FabricClientCommandSource> dispatcher){
|
||||
MCEventBus.INSTANCE.register(INSTANCE);
|
||||
dispatcher.register(literal("cnofallpacket").then(argument("开关", BoolArgumentType.bool()).executes(CNoFallPacketCommand::execute)));
|
||||
}
|
||||
|
||||
private static int execute(CommandContext<FabricClientCommandSource> context) {
|
||||
FeaturesBool.noFallPacket=context.getArgument("开关", Boolean.class);
|
||||
if(FeaturesBool.noFallPacket){
|
||||
context.getSource().getPlayer().sendMessage(Text.literal("已启用无坠落数据包!"));
|
||||
}else{
|
||||
context.getSource().getPlayer().sendMessage(Text.literal("已禁用无坠落数据包!"));
|
||||
}
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
@Subscribe
|
||||
private void onSendPacket(PacketSendEvent event){
|
||||
//跳过非移动的数据包
|
||||
if(!(event.packet instanceof PlayerMoveC2SPacket)) return;
|
||||
//跳过创造
|
||||
if(FeaturesBool.noFallPacket&& !mc.player.getAbilities().creativeMode){
|
||||
if(mc.player.isFallFlying()) return;
|
||||
if(mc.player.getVelocity().y>-0.5) return;
|
||||
//直接发送在地面的数据包来免伤
|
||||
((PlayerMoveC2SPacketAccessor)event.packet).setOnGround(true);
|
||||
}
|
||||
}
|
||||
}
|
@ -2,7 +2,7 @@ package com.expvintl.mctools.commands;
|
||||
|
||||
import com.expvintl.mctools.FeaturesBool;
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.network.PacketEvent;
|
||||
import com.expvintl.mctools.events.network.PacketReceiveEvent;
|
||||
import com.expvintl.mctools.utils.Utils;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import com.mojang.brigadier.Command;
|
||||
@ -42,7 +42,7 @@ public class CQServerPluginsCommand {
|
||||
return Command.SINGLE_SUCCESS;
|
||||
}
|
||||
@Subscribe
|
||||
public void onReceivePacket(PacketEvent p){
|
||||
public void onReceivePacket(PacketReceiveEvent p){
|
||||
//探测bukkit服务器插件
|
||||
if (!MinecraftClient.getInstance().isIntegratedServerRunning()&&FeaturesBool.checkBukkitPlugins) {
|
||||
if (p.packet instanceof CommandSuggestionsS2CPacket sg) {
|
||||
|
@ -0,0 +1,19 @@
|
||||
package com.expvintl.mctools.events.client;
|
||||
|
||||
import net.minecraft.client.render.Camera;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
|
||||
public class RenderWorldEvent {
|
||||
private static final RenderWorldEvent INSTANCE=new RenderWorldEvent();
|
||||
public MatrixStack matrices;
|
||||
public float tickDelta;
|
||||
public Camera cam;
|
||||
|
||||
public static RenderWorldEvent get(float tickDelta,Camera cam,MatrixStack matrices){
|
||||
INSTANCE.tickDelta=tickDelta;
|
||||
INSTANCE.cam=cam;
|
||||
INSTANCE.matrices=matrices;
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.expvintl.mctools.events.network;
|
||||
|
||||
import net.minecraft.network.packet.Packet;
|
||||
|
||||
public class PacketReceiveEvent {
|
||||
private static final PacketReceiveEvent INSTANCE=new PacketReceiveEvent();
|
||||
public Packet<?> packet;
|
||||
public static PacketReceiveEvent get(Packet<?> pack){
|
||||
INSTANCE.packet=pack;
|
||||
return INSTANCE;
|
||||
}
|
||||
}
|
@ -2,10 +2,10 @@ package com.expvintl.mctools.events.network;
|
||||
|
||||
import net.minecraft.network.packet.Packet;
|
||||
|
||||
public class PacketEvent {
|
||||
private static final PacketEvent INSTANCE=new PacketEvent();
|
||||
public class PacketSendEvent {
|
||||
private static final PacketSendEvent INSTANCE=new PacketSendEvent();
|
||||
public Packet<?> packet;
|
||||
public static PacketEvent get(Packet<?> pack){
|
||||
public static PacketSendEvent get(Packet<?> pack){
|
||||
INSTANCE.packet=pack;
|
||||
return INSTANCE;
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.expvintl.mctools.mixin;
|
||||
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.client.RenderWorldEvent;
|
||||
import net.minecraft.client.render.Camera;
|
||||
import net.minecraft.client.render.GameRenderer;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import org.joml.Matrix3f;
|
||||
import org.joml.Matrix4f;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||
|
||||
@Mixin(GameRenderer.class)
|
||||
public abstract class GameRendererMixin {
|
||||
|
||||
@Inject(method = "renderWorld",at=@At(value = "INVOKE_STRING",target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V",args = {"ldc=hand"}),locals = LocalCapture.CAPTURE_FAILEXCEPTION)
|
||||
private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo ci, MatrixStack matrices1, boolean bl, Camera camera, MatrixStack matrixStack, double d, float f, float g, Matrix4f matrix4f, Matrix3f matrix3f){
|
||||
MCEventBus.INSTANCE.post(RenderWorldEvent.get(tickDelta,camera,matrices));
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.expvintl.mctools.mixin.interfaces;
|
||||
|
||||
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Mutable;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(PlayerMoveC2SPacket.class)
|
||||
public interface PlayerMoveC2SPacketAccessor {
|
||||
@Mutable
|
||||
@Accessor("y")
|
||||
void setY(double y);
|
||||
|
||||
@Mutable
|
||||
@Accessor("onGround")
|
||||
void setOnGround(boolean ground);
|
||||
}
|
@ -1,7 +1,8 @@
|
||||
package com.expvintl.mctools.mixin.network;
|
||||
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.network.PacketEvent;
|
||||
import com.expvintl.mctools.events.network.PacketReceiveEvent;
|
||||
import com.expvintl.mctools.events.network.PacketSendEvent;
|
||||
import net.minecraft.network.ClientConnection;
|
||||
import net.minecraft.network.listener.PacketListener;
|
||||
import net.minecraft.network.packet.Packet;
|
||||
@ -15,6 +16,10 @@ public class ClientConnectionMixin {
|
||||
@Inject(method = "handlePacket",at=@At("HEAD"))
|
||||
private static <T extends PacketListener> void onHandlePacket(Packet<T> packet, PacketListener listener, CallbackInfo info) {
|
||||
//传入事件
|
||||
MCEventBus.INSTANCE.post(PacketEvent.get(packet));
|
||||
MCEventBus.INSTANCE.post(PacketReceiveEvent.get(packet));
|
||||
}
|
||||
@Inject(method = "send(Lnet/minecraft/network/packet/Packet;)V",at=@At("TAIL"))
|
||||
private void onSendPakcet(Packet<?> packet, CallbackInfo ci){
|
||||
MCEventBus.INSTANCE.post(PacketSendEvent.get(packet));
|
||||
}
|
||||
}
|
||||
|
@ -1,108 +1,211 @@
|
||||
package com.expvintl.mctools.utils;
|
||||
|
||||
import com.expvintl.mctools.mixin.interfaces.MinecraftClientAccessor;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.hud.ChatHudLine;
|
||||
import net.minecraft.client.network.ClientPlayerEntity;
|
||||
import net.minecraft.client.network.PlayerListEntry;
|
||||
import net.minecraft.registry.RegistryKey;
|
||||
import net.minecraft.text.MutableText;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Timer;
|
||||
|
||||
public class Utils {
|
||||
private static final MinecraftClient mc=MinecraftClient.getInstance();
|
||||
public static final Timer timer=new Timer();
|
||||
public static String getCurrentDimensionName(){
|
||||
if(mc.world!=null){
|
||||
String dismenName=mc.world.getDimensionKey().getValue().toString();
|
||||
switch (dismenName){
|
||||
private static final MinecraftClient mc = MinecraftClient.getInstance();
|
||||
public static final Timer timer = new Timer();
|
||||
|
||||
public static String getCurrentDimensionName() {
|
||||
if (mc.world != null) {
|
||||
String dismenName = mc.world.getDimensionKey().getValue().toString();
|
||||
switch (dismenName) {
|
||||
case "minecraft:overworld":
|
||||
return "主世界";
|
||||
case "minecraft:the_nether":
|
||||
return "下界";
|
||||
case "minecraft:the_end":
|
||||
return "末地";
|
||||
default: return dismenName;
|
||||
default:
|
||||
return dismenName;
|
||||
}
|
||||
}
|
||||
return "未知";
|
||||
}
|
||||
public static String getCurrentBiomeName(){
|
||||
if(Objects.nonNull(mc.world)&&Objects.nonNull(mc.player)){
|
||||
Optional<RegistryKey<Biome>> biomeName=mc.world.getBiome(mc.player.getBlockPos()).getKey();
|
||||
if(biomeName.isPresent()){
|
||||
String name=biomeName.get().getValue().toString();
|
||||
switch (name){
|
||||
case "minecraft:badlands": return "恶地 (badlands)";
|
||||
case "minecraft:bamboo_jungle": return "竹林 (bamboo_jungle)";
|
||||
case "minecraft:basalt_deltas": return "玄武岩三角洲 (basalt_deltas)";
|
||||
case "minecraft:beach":return "沙滩 (beach)";
|
||||
case "minecraft:ocean": return "海洋 (ocean)";
|
||||
case "minecraft:plains": return "平原 (plains)";
|
||||
case "minecraft:river": return "河流 (river)";
|
||||
case "minecraft:birch_forest":return "桦木森林 (birch_forest)";
|
||||
case "minecraft:cherry_grove":return "樱花树林 (cherry_grove)";
|
||||
case "minecraft:cold_ocean": return "冷水海洋 (cold_ocean)";
|
||||
case "minecraft:crimson_forest": return "绯红森林 (crimson_forest)";
|
||||
case "minecraft:dark_forest": return "黑森林 (dark_forest)";
|
||||
case "minecraft:deep_cold_ocean": return "冷水深海 (deep_cold_ocean)";
|
||||
case "minecraft:deep_dark": return "深暗之域 (deep_dark)";
|
||||
case "minecraft:deep_frozen_ocean": return "冰冻深海 (deep_frozen_ocean)";
|
||||
case "minecraft:deep_lukewarm_ocean":return "温水深海 (deep_lukewarm_ocean)";
|
||||
case "minecraft:deep_ocean":return "深海 (deep_ocean)";
|
||||
case "minecraft:desert":return "沙漠 (desert)";
|
||||
case "minecraft:dripstone_caves":return "溶洞 (dripstone_caves)";
|
||||
case "minecraft:end_barrens": return "末地荒地 (end_barrens)";
|
||||
case "minecraft:end_highlands": return "末地高地 (end_highlands)";
|
||||
case "minecraft:eroded_badlands": return "风蚀恶地 (eroded_badlands)";
|
||||
case "minecraft:flower_forest":return "繁花森林 (flower_forest)";
|
||||
case "minecraft:forest":return "森林 (forest)";
|
||||
case "minecraft:frozen_ocean":return "冻洋 (frozen_ocean)";
|
||||
case "minecraft:frozen_peaks":return "冰封山峰 (frozen_peaks)";
|
||||
case "minecraft:frozen_river":return "冻河 (frozen_river)";
|
||||
case "minecraft:grove": return "雪林 (grove)";
|
||||
case "minecraft:ice_spikes": return "冰刺之地 (ice_spikes)";
|
||||
case "minecraft:jagged_peaks": return "尖峭山峰 (jagged_peaks)";
|
||||
case "minecraft:jungle":return "丛林 (jungle)";
|
||||
case "minecraft:lukewarm_ocean":return "温水海洋 (lukewarm_ocean)";
|
||||
case "minecraft:lush_caves":return "繁茂洞穴 (lush_caves)";
|
||||
case "minecraft:mangrove_swamp":return "红树林沼泽 (mangrove_swamp)";
|
||||
case "minecraft:meadow":return "草甸 (meadow)";
|
||||
case "minecraft:mushroom_fields": return "蘑菇岛 (mushroom_fields)";
|
||||
case "minecraft:nether_wastes": return "下界荒地 (nether_wastes)";
|
||||
case "minecraft:old_growth_birch_forest":return "原始桦木森林 (old_growth_birch_forest)";
|
||||
case "minecraft:old_growth_pine_taiga":return "原始松木针叶林 (old_growth_pine_taiga)";
|
||||
case "minecraft:old_growth_spruce_taiga":return "原始云杉针叶林 (old_growth_spruce_taiga)";
|
||||
case "minecraft:savanna":return "热带草原 (savanna)";
|
||||
case "minecraft:savanna_plateau": return "热带高原 (savanna_plateau)";
|
||||
case "minecraft:small_end_islands":return "末地小型岛屿 (small_end_islands)";
|
||||
case "minecraft:snowy_beach":return "积雪沙滩 (snowy_beach)";
|
||||
case "minecraft:snowy_plains":return "雪原 (snowy_plains)";
|
||||
case "minecraft:snowy_slopes": return "积雪山坡 (snowy_slopes)";
|
||||
case "minecraft:snowy_taiga":return "积雪针叶林 (snowy_taiga)";
|
||||
case "minecraft:soul_sand_valley":return "灵魂沙峡谷 (soul_sand_valley)";
|
||||
case "minecraft:sparse_jungle": return "稀疏丛林 (sparse_jungle)";
|
||||
case "minecraft:stony_peaks": return "裸岩山峰 (stony_peaks)";
|
||||
case "minecraft:stony_shore": return "石岸 (stony_shore)";
|
||||
case "minecraft:sunflower_plains": return "向日葵平原 (sunflower_plains)";
|
||||
case "minecraft:swamp":return "沼泽 (swamp)";
|
||||
case "minecraft:taiga":return "针叶林 (taiga)";
|
||||
case "minecraft:the_end":return "末地 (the_end)";
|
||||
case "minecraft:the_void": return "虚空 (the_void)";
|
||||
case "minecraft:warm_ocean":return "暖水海洋 (warm_ocean)";
|
||||
case "minecraft:warped_forest":return "诡异森林 (warped_forest)";
|
||||
case "minecraft:windswept_forest":return "风袭森林 (windswept_forest)";
|
||||
case "minecraft:windswept_gravelly_hills":return "风袭沙砾丘陵 (windswept_gravelly_hills)";
|
||||
case "minecraft:windswept_hills":return "风袭丘陵 (windswept_hills)";
|
||||
case "minecraft:windswept_savanna":return "风袭热带草原 (windswept_savanna)";
|
||||
case "minecraft:wooded_badlands":return "疏林恶地 (wooded_badlands)";
|
||||
default:return name;
|
||||
|
||||
public static String getCurrentBiomeName() {
|
||||
if (Objects.nonNull(mc.world) && Objects.nonNull(mc.player)) {
|
||||
Optional<RegistryKey<Biome>> biomeName = mc.world.getBiome(mc.player.getBlockPos()).getKey();
|
||||
if (biomeName.isPresent()) {
|
||||
String name = biomeName.get().getValue().toString();
|
||||
switch (name) {
|
||||
case "minecraft:badlands":
|
||||
return "恶地 (badlands)";
|
||||
case "minecraft:bamboo_jungle":
|
||||
return "竹林 (bamboo_jungle)";
|
||||
case "minecraft:basalt_deltas":
|
||||
return "玄武岩三角洲 (basalt_deltas)";
|
||||
case "minecraft:beach":
|
||||
return "沙滩 (beach)";
|
||||
case "minecraft:ocean":
|
||||
return "海洋 (ocean)";
|
||||
case "minecraft:plains":
|
||||
return "平原 (plains)";
|
||||
case "minecraft:river":
|
||||
return "河流 (river)";
|
||||
case "minecraft:birch_forest":
|
||||
return "桦木森林 (birch_forest)";
|
||||
case "minecraft:cherry_grove":
|
||||
return "樱花树林 (cherry_grove)";
|
||||
case "minecraft:cold_ocean":
|
||||
return "冷水海洋 (cold_ocean)";
|
||||
case "minecraft:crimson_forest":
|
||||
return "绯红森林 (crimson_forest)";
|
||||
case "minecraft:dark_forest":
|
||||
return "黑森林 (dark_forest)";
|
||||
case "minecraft:deep_cold_ocean":
|
||||
return "冷水深海 (deep_cold_ocean)";
|
||||
case "minecraft:deep_dark":
|
||||
return "深暗之域 (deep_dark)";
|
||||
case "minecraft:deep_frozen_ocean":
|
||||
return "冰冻深海 (deep_frozen_ocean)";
|
||||
case "minecraft:deep_lukewarm_ocean":
|
||||
return "温水深海 (deep_lukewarm_ocean)";
|
||||
case "minecraft:deep_ocean":
|
||||
return "深海 (deep_ocean)";
|
||||
case "minecraft:desert":
|
||||
return "沙漠 (desert)";
|
||||
case "minecraft:dripstone_caves":
|
||||
return "溶洞 (dripstone_caves)";
|
||||
case "minecraft:end_barrens":
|
||||
return "末地荒地 (end_barrens)";
|
||||
case "minecraft:end_highlands":
|
||||
return "末地高地 (end_highlands)";
|
||||
case "minecraft:eroded_badlands":
|
||||
return "风蚀恶地 (eroded_badlands)";
|
||||
case "minecraft:flower_forest":
|
||||
return "繁花森林 (flower_forest)";
|
||||
case "minecraft:forest":
|
||||
return "森林 (forest)";
|
||||
case "minecraft:frozen_ocean":
|
||||
return "冻洋 (frozen_ocean)";
|
||||
case "minecraft:frozen_peaks":
|
||||
return "冰封山峰 (frozen_peaks)";
|
||||
case "minecraft:frozen_river":
|
||||
return "冻河 (frozen_river)";
|
||||
case "minecraft:grove":
|
||||
return "雪林 (grove)";
|
||||
case "minecraft:ice_spikes":
|
||||
return "冰刺之地 (ice_spikes)";
|
||||
case "minecraft:jagged_peaks":
|
||||
return "尖峭山峰 (jagged_peaks)";
|
||||
case "minecraft:jungle":
|
||||
return "丛林 (jungle)";
|
||||
case "minecraft:lukewarm_ocean":
|
||||
return "温水海洋 (lukewarm_ocean)";
|
||||
case "minecraft:lush_caves":
|
||||
return "繁茂洞穴 (lush_caves)";
|
||||
case "minecraft:mangrove_swamp":
|
||||
return "红树林沼泽 (mangrove_swamp)";
|
||||
case "minecraft:meadow":
|
||||
return "草甸 (meadow)";
|
||||
case "minecraft:mushroom_fields":
|
||||
return "蘑菇岛 (mushroom_fields)";
|
||||
case "minecraft:nether_wastes":
|
||||
return "下界荒地 (nether_wastes)";
|
||||
case "minecraft:old_growth_birch_forest":
|
||||
return "原始桦木森林 (old_growth_birch_forest)";
|
||||
case "minecraft:old_growth_pine_taiga":
|
||||
return "原始松木针叶林 (old_growth_pine_taiga)";
|
||||
case "minecraft:old_growth_spruce_taiga":
|
||||
return "原始云杉针叶林 (old_growth_spruce_taiga)";
|
||||
case "minecraft:savanna":
|
||||
return "热带草原 (savanna)";
|
||||
case "minecraft:savanna_plateau":
|
||||
return "热带高原 (savanna_plateau)";
|
||||
case "minecraft:small_end_islands":
|
||||
return "末地小型岛屿 (small_end_islands)";
|
||||
case "minecraft:snowy_beach":
|
||||
return "积雪沙滩 (snowy_beach)";
|
||||
case "minecraft:snowy_plains":
|
||||
return "雪原 (snowy_plains)";
|
||||
case "minecraft:snowy_slopes":
|
||||
return "积雪山坡 (snowy_slopes)";
|
||||
case "minecraft:snowy_taiga":
|
||||
return "积雪针叶林 (snowy_taiga)";
|
||||
case "minecraft:soul_sand_valley":
|
||||
return "灵魂沙峡谷 (soul_sand_valley)";
|
||||
case "minecraft:sparse_jungle":
|
||||
return "稀疏丛林 (sparse_jungle)";
|
||||
case "minecraft:stony_peaks":
|
||||
return "裸岩山峰 (stony_peaks)";
|
||||
case "minecraft:stony_shore":
|
||||
return "石岸 (stony_shore)";
|
||||
case "minecraft:sunflower_plains":
|
||||
return "向日葵平原 (sunflower_plains)";
|
||||
case "minecraft:swamp":
|
||||
return "沼泽 (swamp)";
|
||||
case "minecraft:taiga":
|
||||
return "针叶林 (taiga)";
|
||||
case "minecraft:the_end":
|
||||
return "末地 (the_end)";
|
||||
case "minecraft:the_void":
|
||||
return "虚空 (the_void)";
|
||||
case "minecraft:warm_ocean":
|
||||
return "暖水海洋 (warm_ocean)";
|
||||
case "minecraft:warped_forest":
|
||||
return "诡异森林 (warped_forest)";
|
||||
case "minecraft:windswept_forest":
|
||||
return "风袭森林 (windswept_forest)";
|
||||
case "minecraft:windswept_gravelly_hills":
|
||||
return "风袭沙砾丘陵 (windswept_gravelly_hills)";
|
||||
case "minecraft:windswept_hills":
|
||||
return "风袭丘陵 (windswept_hills)";
|
||||
case "minecraft:windswept_savanna":
|
||||
return "风袭热带草原 (windswept_savanna)";
|
||||
case "minecraft:wooded_badlands":
|
||||
return "疏林恶地 (wooded_badlands)";
|
||||
default:
|
||||
return name;
|
||||
}
|
||||
}
|
||||
}
|
||||
return "未知";
|
||||
}
|
||||
public static void rightClick(){
|
||||
((MinecraftClientAccessor)mc).doItemUse();
|
||||
|
||||
public static void rightClick() {
|
||||
((MinecraftClientAccessor) mc).doItemUse();
|
||||
}
|
||||
|
||||
public static Identifier getPlayerSkinTexture(String name) {
|
||||
if (Objects.isNull(mc.getNetworkHandler())) return null;
|
||||
PlayerListEntry entry = mc.getNetworkHandler().getPlayerListEntry(name);
|
||||
if (Objects.isNull(entry)) return null;
|
||||
return entry.getSkinTexture();
|
||||
}
|
||||
|
||||
public static void findBlock(ClientPlayerEntity player, String itemName, int radius) {
|
||||
if (mc.world == null) return;
|
||||
Vec3d pos = player.getBlockPos().toCenterPos();
|
||||
for (int hight = (int)pos.y - 5; hight < pos.y; hight++) {
|
||||
for (int x = (int) pos.x; x < (pos.x + radius); x++) {
|
||||
for (int z = (int) pos.z; z < (pos.z + radius); z++) {
|
||||
BlockState b = mc.world.getBlockState(new BlockPos(x, hight, z));
|
||||
if (b.getBlock().asItem().getName().getString().equals(itemName)) {
|
||||
mc.player.sendMessage(Text.literal(String.format("找到方块:%d,%d,%d", x, hight, z)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,6 +22,6 @@
|
||||
"depends": {
|
||||
"fabricloader": ">=${loader_version}",
|
||||
"fabric": "*",
|
||||
"minecraft": "${minecraft_version}"
|
||||
"minecraft": "1.20.1"
|
||||
}
|
||||
}
|
||||
|
@ -4,10 +4,12 @@
|
||||
"package": "com.expvintl.mctools.mixin",
|
||||
"compatibilityLevel": "JAVA_17",
|
||||
"mixins": [
|
||||
"interfaces.PlayerMoveC2SPacketAccessor",
|
||||
"network.ClientConnectionMixin",
|
||||
"player.PlayerEntityMixin"
|
||||
],
|
||||
"client": [
|
||||
"GameRendererMixin",
|
||||
"MinecraftClientMixin",
|
||||
"SoundSystemMixin",
|
||||
"interfaces.ClientPlayerInteractionManagerAccessor",
|
||||
|
Reference in New Issue
Block a user