This commit is contained in:
expvintl
2023-09-07 21:37:56 +08:00
parent ae531ea6ab
commit b86130c6f7
198 changed files with 424 additions and 123 deletions

View File

@ -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;
}

View File

@ -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&&currentItem.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);
}
}

View File

@ -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){
}
}

View File

@ -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);
}
}
}

View File

@ -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) {

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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));
}
}

View File

@ -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);
}

View File

@ -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));
}
}

View File

@ -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)));
}
}
}
}
}
}

View File

@ -22,6 +22,6 @@
"depends": {
"fabricloader": ">=${loader_version}",
"fabric": "*",
"minecraft": "${minecraft_version}"
"minecraft": "1.20.1"
}
}

View File

@ -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",