This commit is contained in:
expvintl
2023-09-03 12:55:42 +08:00
parent 290dd9ea52
commit ae531ea6ab
43 changed files with 182 additions and 38 deletions

1
.gitgnone Normal file
View File

@ -0,0 +1 @@
build

Binary file not shown.

View File

@ -1,7 +1,17 @@
{ {
"mappings": { "mappings": {
"com/expvintl/mctools/mixin/MinecraftClientMixin": { "com/expvintl/mctools/mixin/MinecraftClientMixin": {
"setScreen": "Lnet/minecraft/class_310;method_1507(Lnet/minecraft/class_437;)V" "setScreen": "Lnet/minecraft/class_310;method_1507(Lnet/minecraft/class_437;)V",
"tick": "Lnet/minecraft/class_310;method_1574()V"
},
"com/expvintl/mctools/mixin/SoundSystemMixin": {
"play(Lnet/minecraft/client/sound/SoundInstance;)V": "Lnet/minecraft/class_1140;method_4854(Lnet/minecraft/class_1113;)V"
},
"com/expvintl/mctools/mixin/interfaces/ClientPlayerInteractionManagerAccessor": {
"syncSelectedSlot": "method_2911()V"
},
"com/expvintl/mctools/mixin/interfaces/MinecraftClientAccessor": {
"doItemUse": "method_1583()V"
}, },
"com/expvintl/mctools/mixin/interfaces/SimpleOptionAccessor": { "com/expvintl/mctools/mixin/interfaces/SimpleOptionAccessor": {
"value": "field_37868:Ljava/lang/Object;" "value": "field_37868:Ljava/lang/Object;"
@ -20,7 +30,17 @@
"data": { "data": {
"named:intermediary": { "named:intermediary": {
"com/expvintl/mctools/mixin/MinecraftClientMixin": { "com/expvintl/mctools/mixin/MinecraftClientMixin": {
"setScreen": "Lnet/minecraft/class_310;method_1507(Lnet/minecraft/class_437;)V" "setScreen": "Lnet/minecraft/class_310;method_1507(Lnet/minecraft/class_437;)V",
"tick": "Lnet/minecraft/class_310;method_1574()V"
},
"com/expvintl/mctools/mixin/SoundSystemMixin": {
"play(Lnet/minecraft/client/sound/SoundInstance;)V": "Lnet/minecraft/class_1140;method_4854(Lnet/minecraft/class_1113;)V"
},
"com/expvintl/mctools/mixin/interfaces/ClientPlayerInteractionManagerAccessor": {
"syncSelectedSlot": "method_2911()V"
},
"com/expvintl/mctools/mixin/interfaces/MinecraftClientAccessor": {
"doItemUse": "method_1583()V"
}, },
"com/expvintl/mctools/mixin/interfaces/SimpleOptionAccessor": { "com/expvintl/mctools/mixin/interfaces/SimpleOptionAccessor": {
"value": "field_37868:Ljava/lang/Object;" "value": "field_37868:Ljava/lang/Object;"

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -9,6 +9,9 @@
], ],
"client": [ "client": [
"MinecraftClientMixin", "MinecraftClientMixin",
"SoundSystemMixin",
"interfaces.ClientPlayerInteractionManagerAccessor",
"interfaces.MinecraftClientAccessor",
"interfaces.SimpleOptionAccessor", "interfaces.SimpleOptionAccessor",
"player.ClientPlayerInteractionManagerMixin" "player.ClientPlayerInteractionManagerMixin"
], ],

View File

@ -5,4 +5,5 @@ public class FeaturesBool {
public static boolean selfWalk=false; public static boolean selfWalk=false;
public static boolean checkBukkitPlugins=false; public static boolean checkBukkitPlugins=false;
public static boolean autoTool=false; public static boolean autoTool=false;
public static boolean autoFish=false;
} }

View File

@ -10,16 +10,12 @@ import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.network.ServerInfo;
import net.minecraft.command.CommandRegistryAccess; import net.minecraft.command.CommandRegistryAccess;
import net.minecraft.server.MinecraftServer; import net.minecraft.item.ItemStack;
import net.minecraft.util.Colors; import net.minecraft.util.Colors;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import java.util.Objects;
public class MCToolsClient implements ClientModInitializer { public class MCToolsClient implements ClientModInitializer {
private static int infoY=1; private static int infoY=1;
@ -57,7 +53,12 @@ public class MCToolsClient implements ClientModInitializer {
}else{ }else{
AddText(drawContext,String.format("X:%.2f Y:%.2f Z:%.2f",playerPos.x,playerPos.y,playerPos.z)); 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,%d]",mc.player.getChunkPos().x,mc.player.getChunkPos().z)); AddText(drawContext,String.format("当前区块: [%d,%d]",mc.player.getChunkPos().x,mc.player.getChunkPos().z));
ItemStack currentItem=p.getInventory().getMainHandStack();
if(currentItem!=null&&currentItem.isDamageable()){
AddText(drawContext,String.format("耐久度:%d/%d",currentItem.getMaxDamage()-currentItem.getDamage(),currentItem.getMaxDamage()));
}
} }
} }
private static void AddText(DrawContext drawContext,String text){ private static void AddText(DrawContext drawContext,String text){
@ -70,6 +71,7 @@ public class MCToolsClient implements ClientModInitializer {
CFullbirghtCommand.register(dispatcher); CFullbirghtCommand.register(dispatcher);
CAutoRespawnCommand.register(dispatcher); CAutoRespawnCommand.register(dispatcher);
CSafeWalkCommand.register(dispatcher); CSafeWalkCommand.register(dispatcher);
CAutoFishCommand.register(dispatcher);
CAutoToolCommand.register(dispatcher); CAutoToolCommand.register(dispatcher);
CQServerPluginsCommand.register(dispatcher); CQServerPluginsCommand.register(dispatcher);
} }

View File

@ -0,0 +1,53 @@
package com.expvintl.mctools.commands;
import com.expvintl.mctools.FeaturesBool;
import com.expvintl.mctools.events.MCEventBus;
import com.expvintl.mctools.events.client.sounds.PlaySoundEvent;
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.context.CommandContext;
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import net.minecraft.text.Text;
import java.util.TimerTask;
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
public class CAutoFishCommand {
private static final CAutoFishCommand INSTANCE=new CAutoFishCommand();
public static void register(CommandDispatcher<FabricClientCommandSource> dispatcher){
MCEventBus.INSTANCE.register(INSTANCE);
dispatcher.register(literal("cautofish").then(argument("开关", BoolArgumentType.bool()).executes(CAutoFishCommand::execute)));
}
private static int execute(CommandContext<FabricClientCommandSource> context) {
FeaturesBool.autoFish=context.getArgument("开关", Boolean.class);
if(FeaturesBool.autoFish){
context.getSource().getPlayer().sendMessage(Text.literal("已启用自动钓鱼!"));
}else{
context.getSource().getPlayer().sendMessage(Text.literal("已禁用自动钓鱼!"));
}
return Command.SINGLE_SUCCESS;
}
@Subscribe
private void onPlaySound(PlaySoundEvent event){
if(FeaturesBool.autoFish) {
//自动钓鱼
if (event.soundInstance.getId().getPath().equals("entity.fishing_bobber.splash")) {
//收杆
Utils.rightClick();
Utils.timer.schedule(new TimerTask() {
@Override
public void run() {
Utils.rightClick();
}
},300);
}
}
}
}

View File

@ -3,7 +3,6 @@ package com.expvintl.mctools.commands;
import com.expvintl.mctools.FeaturesBool; import com.expvintl.mctools.FeaturesBool;
import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.MCEventBus;
import com.expvintl.mctools.events.client.OpenScreenEvent; import com.expvintl.mctools.events.client.OpenScreenEvent;
import com.expvintl.mctools.mixin.interfaces.SimpleOptionAccessor;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.mojang.brigadier.Command; import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.CommandDispatcher;

View File

@ -4,6 +4,7 @@ import com.expvintl.mctools.FeaturesBool;
import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.MCEventBus;
import com.expvintl.mctools.events.player.PlayerAttackBlockEvent; import com.expvintl.mctools.events.player.PlayerAttackBlockEvent;
import com.expvintl.mctools.events.player.PlayerBreakBlockEvent; import com.expvintl.mctools.events.player.PlayerBreakBlockEvent;
import com.expvintl.mctools.mixin.interfaces.ClientPlayerInteractionManagerAccessor;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.mojang.brigadier.Command; import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.CommandDispatcher;
@ -14,6 +15,8 @@ import net.minecraft.block.BambooBlock;
import net.minecraft.block.BambooSaplingBlock; import net.minecraft.block.BambooSaplingBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.ShearsItem; import net.minecraft.item.ShearsItem;
import net.minecraft.item.SwordItem; import net.minecraft.item.SwordItem;
@ -76,14 +79,14 @@ public class CAutoToolCommand {
} }
} }
//确定已经选择好了工具就切换 //确定已经选择好了工具就切换
if((slot!=-1&&bestScore>getScore(currentItem,state))||shouldStopUsing(currentItem)||!isTools(currentItem)) { if((slot!=-1&&bestScore>getScore(currentItem,state)&&!lowDurability(currentItem))||!isTools(currentItem)) {
//记住上一次的槽方便恢复 //记住上一次的槽方便恢复
lastSlot=mc.player.getInventory().selectedSlot; lastSlot=mc.player.getInventory().selectedSlot;
//切换过去 //切换过去
mc.player.getInventory().selectedSlot = slot; mc.player.getInventory().selectedSlot = slot;
if(mc.interactionManager!=null) {
((ClientPlayerInteractionManagerAccessor) mc.interactionManager).syncSelectedSlot();
} }
if(isTools(currentItem)&&shouldStopUsing(currentItem)) {
mc.options.attackKey.setPressed(false);
} }
} }
public double getScore(ItemStack item, BlockState state){ public double getScore(ItemStack item, BlockState state){
@ -92,6 +95,13 @@ public class CAutoToolCommand {
if(item.getItem() instanceof ToolItem || item.getItem() instanceof ShearsItem){ if(item.getItem() instanceof ToolItem || item.getItem() instanceof ShearsItem){
//根据挖掘速度提升评分 //根据挖掘速度提升评分
score+=item.getMiningSpeedMultiplier(state)*10; score+=item.getMiningSpeedMultiplier(state)*10;
//附魔加分
//耐久
score+= EnchantmentHelper.getLevel(Enchantments.UNBREAKING,item)*10;
//效率
score+=EnchantmentHelper.getLevel(Enchantments.EFFICIENCY,item)*5;
//经验修补(此项最优先)
score+=EnchantmentHelper.getLevel(Enchantments.MENDING,item)*20;
if (item.getItem() instanceof SwordItem item1 && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooSaplingBlock)) if (item.getItem() instanceof SwordItem item1 && (state.getBlock() instanceof BambooBlock || state.getBlock() instanceof BambooSaplingBlock))
//根据挖掘等级加分 //根据挖掘等级加分
score += 90 + (item1.getMaterial().getMiningLevel() * 10); score += 90 + (item1.getMaterial().getMiningLevel() * 10);
@ -99,8 +109,8 @@ public class CAutoToolCommand {
return score; return score;
} }
//停用低耐久度 //停用低耐久度
private boolean shouldStopUsing(ItemStack itemStack) { private boolean lowDurability(ItemStack itemStack) {
return (itemStack.getMaxDamage() - itemStack.getDamage()) < (itemStack.getMaxDamage() * 6 / 100); return (itemStack.getMaxDamage() - itemStack.getDamage()) < (itemStack.getMaxDamage() * 10 / 100);
} }
public boolean isTools(ItemStack item){ public boolean isTools(ItemStack item){
return item.getItem() instanceof ToolItem || item.getItem() instanceof ShearsItem; return item.getItem() instanceof ToolItem || item.getItem() instanceof ShearsItem;

View File

@ -3,6 +3,7 @@ package com.expvintl.mctools.commands;
import com.expvintl.mctools.FeaturesBool; import com.expvintl.mctools.FeaturesBool;
import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.MCEventBus;
import com.expvintl.mctools.events.network.PacketEvent; import com.expvintl.mctools.events.network.PacketEvent;
import com.expvintl.mctools.utils.Utils;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.mojang.brigadier.Command; import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.CommandDispatcher;
@ -13,9 +14,10 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket; import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket;
import net.minecraft.network.packet.s2c.play.CommandSuggestionsS2CPacket; import net.minecraft.network.packet.s2c.play.CommandSuggestionsS2CPacket;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import java.util.Random; import java.util.Random;
import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
public class CQServerPluginsCommand { public class CQServerPluginsCommand {
@ -30,7 +32,7 @@ public class CQServerPluginsCommand {
FeaturesBool.checkBukkitPlugins=true; FeaturesBool.checkBukkitPlugins=true;
context.getSource().getPlayer().networkHandler.sendPacket(new RequestCommandCompletionsC2SPacket(new Random().nextInt(200),"bukkit:ver ")); context.getSource().getPlayer().networkHandler.sendPacket(new RequestCommandCompletionsC2SPacket(new Random().nextInt(200),"bukkit:ver "));
//1秒后关闭避免识别其他命令提示 //1秒后关闭避免识别其他命令提示
new Timer().schedule(new TimerTask() { Utils.timer.schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
FeaturesBool.checkBukkitPlugins=false; FeaturesBool.checkBukkitPlugins=false;

View File

@ -0,0 +1,8 @@
package com.expvintl.mctools.events.client;
public class PreTickEvent {
private static final PreTickEvent INSTANCE=new PreTickEvent();
public static PreTickEvent get(){
return INSTANCE;
}
}

View File

@ -0,0 +1,12 @@
package com.expvintl.mctools.events.client.sounds;
import net.minecraft.client.sound.SoundInstance;
public class PlaySoundEvent {
private static final PlaySoundEvent INSTANCE=new PlaySoundEvent();
public SoundInstance soundInstance;
public static PlaySoundEvent get(SoundInstance instance){
INSTANCE.soundInstance=instance;
return INSTANCE;
}
}

View File

@ -1,6 +1,5 @@
package com.expvintl.mctools.events.player; package com.expvintl.mctools.events.player;
import net.minecraft.network.packet.Packet;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;

View File

@ -1,7 +1,6 @@
package com.expvintl.mctools.events.player; package com.expvintl.mctools.events.player;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import org.lwjgl.system.windows.INPUT;
public class PlayerBreakBlockEvent { public class PlayerBreakBlockEvent {
private static final PlayerBreakBlockEvent INSTANCE=new PlayerBreakBlockEvent(); private static final PlayerBreakBlockEvent INSTANCE=new PlayerBreakBlockEvent();

View File

@ -1,10 +1,9 @@
package com.expvintl.mctools.mixin; package com.expvintl.mctools.mixin;
import com.expvintl.mctools.FeaturesBool;
import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.MCEventBus;
import com.expvintl.mctools.events.client.OpenScreenEvent; import com.expvintl.mctools.events.client.OpenScreenEvent;
import com.expvintl.mctools.events.client.PreTickEvent;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.DeathScreen;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@ -18,4 +17,9 @@ public class MinecraftClientMixin {
private void onSetScreen(Screen screen, CallbackInfo info){ private void onSetScreen(Screen screen, CallbackInfo info){
MCEventBus.INSTANCE.post(OpenScreenEvent.get(screen)); MCEventBus.INSTANCE.post(OpenScreenEvent.get(screen));
} }
@Inject(method = "tick",at=@At("HEAD"))
private void onPreTick(CallbackInfo ci){
MCEventBus.INSTANCE.register(PreTickEvent.get());
}
} }

View File

@ -0,0 +1,18 @@
package com.expvintl.mctools.mixin;
import com.expvintl.mctools.events.MCEventBus;
import com.expvintl.mctools.events.client.sounds.PlaySoundEvent;
import net.minecraft.client.sound.SoundInstance;
import net.minecraft.client.sound.SoundSystem;
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;
@Mixin(SoundSystem.class)
public class SoundSystemMixin {
@Inject(method = "play(Lnet/minecraft/client/sound/SoundInstance;)V",at=@At("HEAD"))
private void onPlaySound(SoundInstance instance, CallbackInfo ci){
MCEventBus.INSTANCE.post(PlaySoundEvent.get(instance));
}
}

View File

@ -0,0 +1,11 @@
package com.expvintl.mctools.mixin.interfaces;
import net.minecraft.client.network.ClientPlayerInteractionManager;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(ClientPlayerInteractionManager.class)
public interface ClientPlayerInteractionManagerAccessor {
@Invoker("syncSelectedSlot")
void syncSelectedSlot();
}

View File

@ -1,5 +0,0 @@
package com.expvintl.mctools.mixin.interfaces;
public interface IClientPlayerInteractionManager {
void syncSelected();
}

View File

@ -0,0 +1,11 @@
package com.expvintl.mctools.mixin.interfaces;
import net.minecraft.client.MinecraftClient;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(MinecraftClient.class)
public interface MinecraftClientAccessor {
@Invoker("doItemUse")
void doItemUse();
}

View File

@ -1,27 +1,14 @@
package com.expvintl.mctools.mixin.player; package com.expvintl.mctools.mixin.player;
import com.expvintl.mctools.FeaturesBool;
import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.MCEventBus;
import com.expvintl.mctools.events.player.PlayerAttackBlockEvent; import com.expvintl.mctools.events.player.PlayerAttackBlockEvent;
import com.expvintl.mctools.events.player.PlayerBreakBlockEvent; import com.expvintl.mctools.events.player.PlayerBreakBlockEvent;
import com.expvintl.mctools.mixin.interfaces.IClientPlayerInteractionManager;
import net.minecraft.block.BambooBlock;
import net.minecraft.block.BambooSaplingBlock;
import net.minecraft.block.BlockState;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerInteractionManager; import net.minecraft.client.network.ClientPlayerInteractionManager;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ShearsItem;
import net.minecraft.item.SwordItem;
import net.minecraft.item.ToolItem;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ClientPlayerInteractionManager.class) @Mixin(ClientPlayerInteractionManager.class)

View File

@ -1,14 +1,17 @@
package com.expvintl.mctools.utils; package com.expvintl.mctools.utils;
import com.expvintl.mctools.mixin.interfaces.MinecraftClientAccessor;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKey;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Timer;
public class Utils { public class Utils {
private static final MinecraftClient mc=MinecraftClient.getInstance(); private static final MinecraftClient mc=MinecraftClient.getInstance();
public static final Timer timer=new Timer();
public static String getCurrentDimensionName(){ public static String getCurrentDimensionName(){
if(mc.world!=null){ if(mc.world!=null){
String dismenName=mc.world.getDimensionKey().getValue().toString(); String dismenName=mc.world.getDimensionKey().getValue().toString();
@ -99,4 +102,7 @@ public class Utils {
} }
return "未知"; return "未知";
} }
public static void rightClick(){
((MinecraftClientAccessor)mc).doItemUse();
}
} }

View File

@ -9,6 +9,9 @@
], ],
"client": [ "client": [
"MinecraftClientMixin", "MinecraftClientMixin",
"SoundSystemMixin",
"interfaces.ClientPlayerInteractionManagerAccessor",
"interfaces.MinecraftClientAccessor",
"interfaces.SimpleOptionAccessor", "interfaces.SimpleOptionAccessor",
"player.ClientPlayerInteractionManagerMixin" "player.ClientPlayerInteractionManagerMixin"
], ],