diff --git a/.github/workflows/ci_build_1.21.yml b/.github/workflows/ci_build.yml similarity index 97% rename from .github/workflows/ci_build_1.21.yml rename to .github/workflows/ci_build.yml index 5068440..1fe3acb 100644 --- a/.github/workflows/ci_build_1.21.yml +++ b/.github/workflows/ci_build.yml @@ -1,4 +1,4 @@ -name: Build1.21 +name: Build on: push diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b589d56..b86273d 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 9d0bbd3..031d9d3 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,6 @@ - - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 55c33c0..3b1026f 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,14 +2,8 @@ - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/Minecraft_Server.xml b/.idea/runConfigurations/Minecraft_Server.xml index 5f372c2..27bc6a0 100644 --- a/.idea/runConfigurations/Minecraft_Server.xml +++ b/.idea/runConfigurations/Minecraft_Server.xml @@ -12,5 +12,5 @@ - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index e103273..46a9212 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { id 'maven-publish' } -version = project.mod_version +version = project.findProperty("minecraft_version")?.toString()?:"1.0" group = project.maven_group repositories { mavenCentral() diff --git a/gradle.properties b/gradle.properties index a655a86..174c29c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,12 +3,12 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties # check these on https://modmuss50.me/fabric.html - minecraft_version=1.20.4 - yarn_mappings=1.20.4+build.3 - loader_version=0.16.0 + minecraft_version=1.20.1 + yarn_mappings=1.20.1+build.10 + loader_version=0.16.12 #Fabric api - fabric_version=0.97.2+1.20.4 + fabric_version=0.92.5+1.20.1 # Mod Properties mod_version = 1.0 diff --git a/readme.md b/readme.md index e0ab337..970e11e 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,22 @@ -## 一个MC工具组 +
-> 仍在开发 \ No newline at end of file +# Minecraft 工具集(Fabric) + +
+ +## 支持功能 +此mod的所有功能为**c开头** +1. 自动工具(挖掘、砍伐、亡灵、锋利、伤害等评级)(/cautotool) +2. 自动钓鱼 (/cautofish) +3. 自动武器(与工具为合并功能) +4. 伽马高亮(/fullbirght) +5. C键放大 +6. 基本信息HUD +7. 药水状态HUD +8. 聊天栏头像补丁 +9. 强制Tab列表显示头像补丁 +10. 查询Bukkit系服务器插件(/cqserverplugins) +11. 自动重生(/cautorespawn) +12. 自动挂边(/csafewalk) +13. 无衰落伤害(/cnofallpacket) +14. 快速丢弃(WIP)(/cfastdrop) \ No newline at end of file diff --git a/src/main/java/com/expvintl/mctools/FeaturesSettings.java b/src/main/java/com/expvintl/mctools/FeaturesSettings.java new file mode 100644 index 0000000..5b50a9f --- /dev/null +++ b/src/main/java/com/expvintl/mctools/FeaturesSettings.java @@ -0,0 +1,14 @@ +package com.expvintl.mctools; + +import com.expvintl.mctools.settingtype.BooleanSetting; + +public class FeaturesSettings { + public final static FeaturesSettings INSTANCE=new FeaturesSettings(); + public final BooleanSetting autoRespawn = new BooleanSetting(); + public final BooleanSetting safeWalk = new BooleanSetting(); + public final BooleanSetting checkBukkitPlugins = new BooleanSetting(); + public final BooleanSetting autoTool = new BooleanSetting(); + public final BooleanSetting autoToolIncludePlayer = new BooleanSetting(); + public final BooleanSetting autoFish = new BooleanSetting(); + public final BooleanSetting noFallPacket = new BooleanSetting(); +} diff --git a/src/main/java/com/expvintl/mctools/Globals.java b/src/main/java/com/expvintl/mctools/Globals.java deleted file mode 100644 index 37bc5db..0000000 --- a/src/main/java/com/expvintl/mctools/Globals.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.expvintl.mctools; - -import com.expvintl.mctools.types.Setting; - -public class Globals { - public static Setting autoRespawn=new Setting(); - public static Setting selfWalk=new Setting(); - public static Setting checkBukkitPlugins=new Setting(); - public static Setting autoTool=new Setting(); - public static Setting autoFish=new Setting(); - public static Setting noFallPacket=new Setting(); - public static int TPS=0; -} diff --git a/src/main/java/com/expvintl/mctools/MCToolsClient.java b/src/main/java/com/expvintl/mctools/MCToolsClient.java index bc646f7..e590a43 100644 --- a/src/main/java/com/expvintl/mctools/MCToolsClient.java +++ b/src/main/java/com/expvintl/mctools/MCToolsClient.java @@ -2,6 +2,7 @@ package com.expvintl.mctools; import com.expvintl.mctools.commands.*; import com.expvintl.mctools.modules.BetterTooltip; +import com.expvintl.mctools.modules.CameraZoom; import com.expvintl.mctools.modules.PlayerListTextLatency; import com.expvintl.mctools.texthud.MCInfo; import com.expvintl.mctools.texthud.PotionInfo; @@ -34,6 +35,7 @@ public class MCToolsClient implements ClientModInitializer { public void InitModules(){ BetterTooltip.INSTANCE.init(); PlayerListTextLatency.INSTANCE.init(); + CameraZoom.INSTANCE.init(); } private static void registerCommands(CommandDispatcher dispatcher, CommandRegistryAccess registryAccess) { @@ -45,7 +47,6 @@ public class MCToolsClient implements ClientModInitializer { CAutoToolCommand.register(dispatcher); CQServerPluginsCommand.register(dispatcher); CNoFallPacketCommand.register(dispatcher); - CFindBlockCommand.register(dispatcher); CFastDropCommand.register(dispatcher,registryAccess); } } diff --git a/src/main/java/com/expvintl/mctools/commands/CAutoFishCommand.java b/src/main/java/com/expvintl/mctools/commands/CAutoFishCommand.java index e739b8c..84971f0 100644 --- a/src/main/java/com/expvintl/mctools/commands/CAutoFishCommand.java +++ b/src/main/java/com/expvintl/mctools/commands/CAutoFishCommand.java @@ -1,6 +1,6 @@ package com.expvintl.mctools.commands; -import com.expvintl.mctools.Globals; +import com.expvintl.mctools.FeaturesSettings; import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.client.sounds.PlaySoundEvent; import com.expvintl.mctools.utils.CommandUtils; @@ -22,23 +22,23 @@ public class CAutoFishCommand { private static final CAutoFishCommand INSTANCE=new CAutoFishCommand(); public static void register(CommandDispatcher dispatcher){ MCEventBus.INSTANCE.register(INSTANCE); - CommandUtils.CreateStatusCommand("cautofish",Globals.autoFish,dispatcher); + CommandUtils.CreateStatusCommand("cautofish", FeaturesSettings.INSTANCE.autoFish, dispatcher); dispatcher.register(literal("cautofish").then(argument("开关", BoolArgumentType.bool()).executes(CAutoFishCommand::execute))); } private static int execute(CommandContext context) { - Globals.autoFish.set(context.getArgument("开关", Boolean.class)); - if(Globals.autoFish.get()){ - context.getSource().getPlayer().sendMessage(Text.literal("已启用自动钓鱼!")); + FeaturesSettings.INSTANCE.autoFish.setValue(context.getArgument("开关", Boolean.class)); + if(FeaturesSettings.INSTANCE.autoFish.getValue()){ + context.getSource().getPlayer().sendMessage(Text.literal("已启用自动钓鱼!"),false); }else{ - context.getSource().getPlayer().sendMessage(Text.literal("已禁用自动钓鱼!")); + context.getSource().getPlayer().sendMessage(Text.literal("已禁用自动钓鱼!"),false); } return Command.SINGLE_SUCCESS; } @Subscribe private void onPlaySound(PlaySoundEvent event){ - if(Globals.autoFish.get()) { + if(FeaturesSettings.INSTANCE.autoFish.getValue()) { //自动钓鱼 if (event.soundInstance.getId().getPath().equals("entity.fishing_bobber.splash")) { //收杆 diff --git a/src/main/java/com/expvintl/mctools/commands/CAutoRespawnCommand.java b/src/main/java/com/expvintl/mctools/commands/CAutoRespawnCommand.java index 0254dff..533d27b 100644 --- a/src/main/java/com/expvintl/mctools/commands/CAutoRespawnCommand.java +++ b/src/main/java/com/expvintl/mctools/commands/CAutoRespawnCommand.java @@ -1,6 +1,6 @@ package com.expvintl.mctools.commands; -import com.expvintl.mctools.Globals; +import com.expvintl.mctools.FeaturesSettings; import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.client.OpenScreenEvent; import com.expvintl.mctools.utils.CommandUtils; @@ -21,22 +21,22 @@ public class CAutoRespawnCommand { private static final CAutoRespawnCommand INSTANCE=new CAutoRespawnCommand(); public static void register(CommandDispatcher dispatcher){ MCEventBus.INSTANCE.register(INSTANCE); - CommandUtils.CreateStatusCommand("cautorespawn",Globals.autoRespawn,dispatcher); + CommandUtils.CreateStatusCommand("cautorespawn", FeaturesSettings.INSTANCE.autoRespawn, dispatcher); dispatcher.register(literal("cautorespawn").then(argument("开关", BoolArgumentType.bool()).executes(CAutoRespawnCommand::execute))); } private static int execute(CommandContext context) { - Globals.autoRespawn.set(context.getArgument("开关", Boolean.class)); - if(Globals.autoRespawn.get()){ - context.getSource().getPlayer().sendMessage(Text.literal("已启用自动重生!")); + FeaturesSettings.INSTANCE.autoRespawn.setValue(context.getArgument("开关", Boolean.class)); + if(FeaturesSettings.INSTANCE.autoRespawn.getValue()){ + context.getSource().getPlayer().sendMessage(Text.literal("已启用自动重生!"),false); }else{ - context.getSource().getPlayer().sendMessage(Text.literal("已禁用自动重生!")); + context.getSource().getPlayer().sendMessage(Text.literal("已禁用自动重生!"),false); } return Command.SINGLE_SUCCESS; } @Subscribe private void onOpenScreen(OpenScreenEvent event){ - if(Globals.autoRespawn.get()) { + if(FeaturesSettings.INSTANCE.autoRespawn.getValue()) { //自动重生 if (event.screen instanceof DeathScreen) { if (MinecraftClient.getInstance().player != null) { diff --git a/src/main/java/com/expvintl/mctools/commands/CAutoToolCommand.java b/src/main/java/com/expvintl/mctools/commands/CAutoToolCommand.java index ec9122b..b62e5ed 100644 --- a/src/main/java/com/expvintl/mctools/commands/CAutoToolCommand.java +++ b/src/main/java/com/expvintl/mctools/commands/CAutoToolCommand.java @@ -1,73 +1,82 @@ package com.expvintl.mctools.commands; -import com.expvintl.mctools.Globals; +import com.expvintl.mctools.FeaturesSettings; import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.player.PlayerAttackBlockEvent; import com.expvintl.mctools.events.player.PlayerAttackEntityEvent; import com.expvintl.mctools.events.player.PlayerBreakBlockEvent; import com.expvintl.mctools.mixin.interfaces.ClientPlayerInteractionManagerAccessor; import com.expvintl.mctools.utils.CommandUtils; -import com.expvintl.mctools.utils.Utils; +import com.google.common.collect.Multimap; 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.block.BambooBlock; -import net.minecraft.block.BambooShootBlock; -import net.minecraft.block.BlockState; +import net.minecraft.block.*; import net.minecraft.client.MinecraftClient; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.*; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.item.*; import net.minecraft.text.Text; +import java.util.Collection; + import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; public class CAutoToolCommand { private static final CAutoToolCommand INSTANCE=new CAutoToolCommand(); - private int lastSlot=-1; public static void register(CommandDispatcher dispatcher){ MCEventBus.INSTANCE.register(INSTANCE); - CommandUtils.CreateStatusCommand("cautotool",Globals.autoTool,dispatcher); - dispatcher.register(literal("cautotool").then(argument("开关", BoolArgumentType.bool()).executes(CAutoToolCommand::execute))); + CommandUtils.CreateStatusCommand("cautotool", FeaturesSettings.INSTANCE.autoTool, dispatcher); + dispatcher.register( + literal("cautotool") + .then(argument("开关", BoolArgumentType.bool()) + .executes(CAutoToolCommand::execute) + .then(argument("包含玩家",BoolArgumentType.bool()) + .executes(CAutoToolCommand::execute)))); } private static int execute(CommandContext context) { - Globals.autoTool.set(context.getArgument("开关", Boolean.class)); - if(Globals.autoTool.get()){ - context.getSource().getPlayer().sendMessage(Text.literal("已启用智能工具!")); + FeaturesSettings.INSTANCE.autoTool.setValue(context.getArgument("开关", Boolean.class)); + try{ + FeaturesSettings.INSTANCE.autoToolIncludePlayer.setValue(context.getArgument("包含玩家", Boolean.class)); + }catch (IllegalArgumentException ignored){ + } + if(FeaturesSettings.INSTANCE.autoTool.getValue()){ + context.getSource().getPlayer().sendMessage(Text.literal("已启用智能工具! 对玩家使用智能武器:"+FeaturesSettings.INSTANCE.autoToolIncludePlayer.getValue()),false); }else{ - context.getSource().getPlayer().sendMessage(Text.literal("已禁用智能工具!")); + context.getSource().getPlayer().sendMessage(Text.literal("已禁用智能工具!"),false); } return Command.SINGLE_SUCCESS; } - @Subscribe - private void onBreakBlock(PlayerBreakBlockEvent event){ - if(!Globals.autoTool.get()) return; - MinecraftClient mc=MinecraftClient.getInstance(); - if (mc.world == null||mc.player==null) return; - if (lastSlot!=-1){ - //破坏方块后切换回去 - mc.player.getInventory().selectedSlot=lastSlot; - lastSlot=-1; - } - } + + // @Subscribe +// private void onBreakBlock(PlayerBreakBlockEvent event){ +// if(!Globals.autoTool.get()) return; +// MinecraftClient mc=MinecraftClient.getInstance(); +// if (mc.world == null||mc.player==null) return; +// } + @Subscribe private void onAttackEntity(PlayerAttackEntityEvent event){ - if(!Globals.autoTool.get()) return; + if(!FeaturesSettings.INSTANCE.autoTool.getValue()) return; if(event.target.hasCustomName()) return; - //不对玩家使用 - if(event.target.isPlayer()) return; + //对玩家使用 + if(FeaturesSettings.INSTANCE.autoToolIncludePlayer.getValue()&&event.target.isPlayer()) return; float bestScore=-1; int slot=-1; for(int i=0;i<9;i++) { - float score=getWeaponScore(event.player,event.target,i); - if(score<0) continue; + ItemStack item = event.player.getInventory().getStack(i); + if(!isSwordItem(item.getItem())&&!isToolItem(item.getItem())) continue; + float score=getWeaponScore(event.target, item); + if(score<=0) continue; //选出最好分数的工具 if(score>bestScore){ bestScore=score; @@ -77,18 +86,19 @@ public class CAutoToolCommand { if(slot==-1) return; ItemStack currentItem = event.player.getInventory().getStack(slot); //低耐久测试 - if(!lowDurability(currentItem)) { + if(!isLowDurability(currentItem)) { //切换过去 - event.player.getInventory().selectedSlot = slot; + event.player.getInventory().selectedSlot=slot; MinecraftClient mc=MinecraftClient.getInstance(); if(mc.interactionManager!=null) { ((ClientPlayerInteractionManagerAccessor) mc.interactionManager).syncSelectedSlot(); } } } + //方块挖掘 @Subscribe private void onAttackBlock(PlayerAttackBlockEvent event){ - if(!Globals.autoTool.get()) return; + if(!FeaturesSettings.INSTANCE.autoTool.getValue()) return; //自动工具 MinecraftClient mc=MinecraftClient.getInstance(); if (mc.world == null||mc.player==null) return; @@ -103,7 +113,7 @@ public class CAutoToolCommand { for(int i=0;i<9;i++){ ItemStack item = mc.player.getInventory().getStack(i); float score= getToolsScore(item,state); - if(score<0) continue; + if(score<=0) continue; //选出最好分数的工具 if(score>bestScore){ bestScore=score; @@ -113,21 +123,79 @@ public class CAutoToolCommand { if(slot==-1) return; ItemStack currentItem = mc.player.getInventory().getStack(slot); //确定已经选择好了工具就切换 - if(!lowDurability(currentItem)) { - //记住上一次的槽方便恢复 - lastSlot=mc.player.getInventory().selectedSlot; + if(!isLowDurability(currentItem)) { //切换过去 - mc.player.getInventory().selectedSlot = slot; + mc.player.getInventory().selectedSlot=slot; if(mc.interactionManager!=null) { ((ClientPlayerInteractionManagerAccessor) mc.interactionManager).syncSelectedSlot(); } } } + public boolean isSwordItem(Item item){ + return item==Items.STONE_SWORD||item==Items.DIAMOND_SWORD||item==Items.GOLDEN_SWORD||item==Items.IRON_SWORD||item==Items.NETHERITE_SWORD||item==Items.WOODEN_SWORD; + } + public boolean isToolItem(Item item){ + return item == Items.WOODEN_PICKAXE || item == Items.STONE_PICKAXE || item == Items.IRON_PICKAXE || item == Items.GOLDEN_PICKAXE || item == Items.DIAMOND_PICKAXE || item == Items.NETHERITE_PICKAXE + || item == Items.WOODEN_AXE || item == Items.STONE_AXE || item == Items.IRON_AXE || item == Items.GOLDEN_AXE || item == Items.DIAMOND_AXE || item == Items.NETHERITE_AXE + || item == Items.WOODEN_SHOVEL || item == Items.STONE_SHOVEL || item == Items.IRON_SHOVEL || item == Items.GOLDEN_SHOVEL || item == Items.DIAMOND_SHOVEL || item == Items.NETHERITE_SHOVEL + || item == Items.WOODEN_HOE || item == Items.STONE_HOE || item == Items.IRON_HOE || item == Items.GOLDEN_HOE || item == Items.DIAMOND_HOE || item == Items.NETHERITE_HOE + || item == Items.WOODEN_SWORD || item == Items.STONE_SWORD || item == Items.IRON_SWORD || item == Items.GOLDEN_SWORD || item == Items.DIAMOND_SWORD || item == Items.NETHERITE_SWORD; + } + public boolean isOreBlock(Item item) { + return item == Items.COAL_ORE || // 煤矿石 + item == Items.DEEPSLATE_COAL_ORE || // 深层煤矿石 + item == Items.IRON_ORE || // 铁矿石 + item == Items.DEEPSLATE_IRON_ORE || // 深层铁矿石 + item == Items.COPPER_ORE || // 铜矿石 + item == Items.DEEPSLATE_COPPER_ORE || // 深层铜矿石 + item == Items.GOLD_ORE || // 金矿石 + item == Items.DEEPSLATE_GOLD_ORE || // 深层金矿石 + item == Items.REDSTONE_ORE || // 红石矿石 + item == Items.DEEPSLATE_REDSTONE_ORE ||// 深层红石矿石 + item == Items.EMERALD_ORE || // 绿宝石矿石 + item == Items.DEEPSLATE_EMERALD_ORE ||// 深层绿宝石矿石 + item == Items.LAPIS_ORE || // 青金石矿石 + item == Items.DEEPSLATE_LAPIS_ORE || // 深层青金石矿石 + item == Items.DIAMOND_ORE || // 钻石矿石 + item == Items.DEEPSLATE_DIAMOND_ORE ||// 深层钻石矿石 + item == Items.NETHER_GOLD_ORE || // 下界金矿石 + item == Items.NETHER_QUARTZ_ORE; // 下界石英矿石 + } + private boolean isBlockFortune(Block block) { + if (block == Blocks.COAL_ORE || block == Blocks.DEEPSLATE_COAL_ORE || + block == Blocks.COPPER_ORE || block == Blocks.DEEPSLATE_COPPER_ORE || + block == Blocks.IRON_ORE || block == Blocks.DEEPSLATE_IRON_ORE || + block == Blocks.GOLD_ORE || block == Blocks.DEEPSLATE_GOLD_ORE || + block == Blocks.REDSTONE_ORE || block == Blocks.DEEPSLATE_REDSTONE_ORE || + block == Blocks.LAPIS_ORE || block == Blocks.DEEPSLATE_LAPIS_ORE || + block == Blocks.DIAMOND_ORE || block == Blocks.DEEPSLATE_DIAMOND_ORE || + block == Blocks.EMERALD_ORE || block == Blocks.DEEPSLATE_EMERALD_ORE || + block == Blocks.NETHER_QUARTZ_ORE || block == Blocks.NETHER_GOLD_ORE || + block == Blocks.AMETHYST_CLUSTER) { // 紫水晶簇也受时运影响 + return true; + } + + if (block == Blocks.WHEAT || // 小麦 + block == Blocks.CARROTS || // 胡萝卜 + block == Blocks.POTATOES || // 马铃薯 + block == Blocks.BEETROOTS || // 甜菜根 + block == Blocks.NETHER_WART) { // 下界疣 + return true; + } + + if (block == Blocks.GLOWSTONE || // 荧石 + block == Blocks.MELON || // 西瓜 + block == Blocks.GRAVEL || // 沙砾 (影响燧石掉落概率) + block == Blocks.SEA_LANTERN){ // 海晶灯 + return true; + } + return false; + } public float getToolsScore(ItemStack item, BlockState state){ float score=0; - if(item.getItem() instanceof ToolItem || item.getItem() instanceof ShearsItem){ + if(isToolItem(item.getItem())||item.getItem() instanceof ShearsItem){ //根据挖掘速度提升评分 - score+=item.getMiningSpeedMultiplier(state)*30; + score+=item.getMiningSpeedMultiplier(state)*2; //附魔加分 //耐久 score+= EnchantmentHelper.getLevel(Enchantments.UNBREAKING, item); @@ -135,33 +203,65 @@ public class CAutoToolCommand { score+=EnchantmentHelper.getLevel(Enchantments.EFFICIENCY,item); //经验修补 score+=EnchantmentHelper.getLevel(Enchantments.MENDING,item); - if (item.getItem() instanceof SwordItem item1 && (state.getBlock() instanceof BambooBlock|| state.getBlock() instanceof BambooShootBlock)) - //根据挖掘等级加分 - score += 90 + (item1.getMaterial().getMiningSpeedMultiplier() * 10); + + if(isBlockFortune(state.getBlock())){ + score+=EnchantmentHelper.getLevel(Enchantments.FORTUNE,item);//时运 + } + + if (isSwordItem(item.getItem()) && (state.getBlock() instanceof BambooBlock)) { + if(item.getItem() instanceof ToolItem tool){ + //根据挖掘等级加分 + score += 90 + tool.getMaterial().getMiningSpeedMultiplier(); + } + } } return score; } - public float getWeaponScore(PlayerEntity player,Entity target,int slot) { + public float getWeaponScore(Entity ent, ItemStack item) { float damageScore = 0; - ItemStack item = player.getInventory().getStack(slot); //剑优先 - if(item.getItem() instanceof SwordItem) damageScore+=10; - //使用所有工具组 - if (item.getItem() instanceof ToolItem tool) { - damageScore += tool.getMaterial().getAttackDamage(); - //锋利加分 - damageScore += EnchantmentHelper.getLevel(Enchantments.SHARPNESS, item) * 2; - //精修 - damageScore+=EnchantmentHelper.getLevel(Enchantments.MENDING,item); - //火焰附加 - damageScore+=EnchantmentHelper.getLevel(Enchantments.FIRE_ASPECT,item)*3; - //击退 - damageScore+=EnchantmentHelper.getLevel(Enchantments.KNOCKBACK,item)*2; + if (isSwordItem(item.getItem())) damageScore += 100; + //计算物品的基础伤害属性(较为复杂) + Multimap modifiers = item.getAttributeModifiers(EquipmentSlot.MAINHAND); + Collection damageModifiers = modifiers.get(EntityAttributes.GENERIC_ATTACK_DAMAGE); + for (EntityAttributeModifier modifier : damageModifiers) { + if (modifier.getOperation() == EntityAttributeModifier.Operation.ADDITION) { + damageScore+=(float) modifier.getValue(); + break; + } } + //节肢杀手 + EntityType id=ent.getType(); + if(id==EntityType.SPIDER||id==EntityType.CAVE_SPIDER||id==EntityType.SILVERFISH||id==EntityType.ENDERMITE||id==EntityType.BEE) { + damageScore += EnchantmentHelper.getLevel(Enchantments.BANE_OF_ARTHROPODS, item) * 3; + } + //亡灵杀手(这伤害通常更高) + if(((LivingEntity)ent).getGroup()==EntityGroup.UNDEAD){ + damageScore+=EnchantmentHelper.getLevel(Enchantments.SMITE,item)*3;// 3倍 + } + //锋利加分 + damageScore += EnchantmentHelper.getLevel(Enchantments.SHARPNESS, item) * 2; + //精修 + damageScore += EnchantmentHelper.getLevel(Enchantments.MENDING, item); + //火焰附加 + damageScore += EnchantmentHelper.getLevel(Enchantments.FIRE_ASPECT, item); + //击退 + damageScore += EnchantmentHelper.getLevel(Enchantments.KNOCKBACK, item); return damageScore; } //停用低耐久度 - private boolean lowDurability(ItemStack itemStack) { - return (itemStack.getMaxDamage() - itemStack.getDamage()) < (itemStack.getMaxDamage() * 10 / 100); + private boolean isLowDurability(ItemStack itemStack) { + Item item = itemStack.getItem(); + boolean isWooden = item == Items.WOODEN_SWORD || item == Items.WOODEN_PICKAXE || + item == Items.WOODEN_AXE || item == Items.WOODEN_SHOVEL || + item == Items.WOODEN_HOE; + boolean isStone = item == Items.STONE_SWORD || item == Items.STONE_PICKAXE || + item == Items.STONE_AXE || item == Items.STONE_SHOVEL || + item == Items.STONE_HOE; + boolean isIron = item == Items.IRON_SWORD || item == Items.IRON_PICKAXE || + item == Items.IRON_AXE || item == Items.IRON_SHOVEL || + item == Items.IRON_HOE; + return !(isWooden||isStone||isIron) //忽略木/石/铁工具 + &&(itemStack.getMaxDamage() - itemStack.getDamage()) < (itemStack.getMaxDamage() * 2 / 100); } } diff --git a/src/main/java/com/expvintl/mctools/commands/CFastDropCommand.java b/src/main/java/com/expvintl/mctools/commands/CFastDropCommand.java index b7b6d77..149dc38 100644 --- a/src/main/java/com/expvintl/mctools/commands/CFastDropCommand.java +++ b/src/main/java/com/expvintl/mctools/commands/CFastDropCommand.java @@ -36,12 +36,12 @@ public class CFastDropCommand { for(Item i:trashItem){ sb.append(i.getName().getString()).append(","); } - context.getSource().getPlayer().sendMessage(Text.literal(sb.toString())); + context.getSource().getPlayer().sendMessage(Text.literal(sb.toString()),false); return Command.SINGLE_SUCCESS; })))); dispatcher.register(literal("cfastdrop").then(literal("clear").executes((context -> { trashItem.clear(); - context.getSource().getPlayer().sendMessage(Text.literal("已清除全部物品!")); + context.getSource().getPlayer().sendMessage(Text.literal("已清除全部物品!"),false); return Command.SINGLE_SUCCESS; })))); dispatcher.register(literal("cfastdrop").then(literal("del").then(argument("物品", ItemStackArgumentType.itemStack(access)).suggests(((context, builder) -> suggestItems(builder))).executes(cmd->{ @@ -49,12 +49,12 @@ public class CFastDropCommand { if (item != Items.AIR) { // 确保找到的物品是有效的 if (trashItem.contains(item)) { trashItem.remove(item); - cmd.getSource().getPlayer().sendMessage(Text.literal("已移除 " + item.getName().getString())); + cmd.getSource().getPlayer().sendMessage(Text.literal("已移除 " + item.getName().getString()),false); }else{ - cmd.getSource().getPlayer().sendMessage(Text.literal("没有找到 " + item.getName().getString())); + cmd.getSource().getPlayer().sendMessage(Text.literal("没有找到 " + item.getName().getString()),false); } }else{ - cmd.getSource().getPlayer().sendMessage(Text.literal("无效物品!")); + cmd.getSource().getPlayer().sendMessage(Text.literal("无效物品!"),false); return 0; } return Command.SINGLE_SUCCESS; @@ -63,13 +63,13 @@ public class CFastDropCommand { Item item=ItemStackArgumentType.getItemStackArgument(cmd,"物品").getItem(); if (item != Items.AIR) { // 确保找到的物品是有效的 if(trashItem.contains(item)){ - cmd.getSource().getPlayer().sendMessage(Text.literal( item.getName().getString() + " 已存在!")); + cmd.getSource().getPlayer().sendMessage(Text.literal( item.getName().getString() + " 已存在!"),false); }else { trashItem.add(item); - cmd.getSource().getPlayer().sendMessage(Text.literal("已添加 " + item.getName().getString() + " 到垃圾物品列表")); + cmd.getSource().getPlayer().sendMessage(Text.literal("已添加 " + item.getName().getString() + " 到垃圾物品列表"),false); } }else{ - cmd.getSource().getPlayer().sendMessage(Text.literal("无效物品!")); + cmd.getSource().getPlayer().sendMessage(Text.literal("无效物品!"),false); return 0; } return Command.SINGLE_SUCCESS; @@ -104,15 +104,15 @@ public class CFastDropCommand { return 0; } PlayerInventory inv=player.getInventory(); - for(int i=0;i dispatcher){ - MCEventBus.INSTANCE.register(INSTANCE); - dispatcher.register(literal("cfindblock").then(argument("方块名字", StringArgumentType.string()).executes(CFindBlockCommand::execute))); - } - private static int execute(CommandContext context) { - String blockName=context.getArgument("方块名字", String.class); - Utils.findBlock(mc.player,blockName,10); - return Command.SINGLE_SUCCESS; - } - @Subscribe - private void onRenderWorld(RenderWorldEvent event){ - - } -} diff --git a/src/main/java/com/expvintl/mctools/commands/CFullbirghtCommand.java b/src/main/java/com/expvintl/mctools/commands/CFullbirghtCommand.java index 08d1d9a..3f70ad5 100644 --- a/src/main/java/com/expvintl/mctools/commands/CFullbirghtCommand.java +++ b/src/main/java/com/expvintl/mctools/commands/CFullbirghtCommand.java @@ -9,14 +9,14 @@ import net.minecraft.text.Text; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; -public class CFullbirghtCommand{ - public static void register(CommandDispatcher dispatcher){ +public class CFullbirghtCommand { + public static void register(CommandDispatcher dispatcher) { dispatcher.register(literal("cfullbirght").executes(CFullbirghtCommand::execute)); } private static int execute(CommandContext context) { - ((SimpleOptionAccessor)(Object)context.getSource().getClient().options.getGamma()).forceSetValue(32767.0); - context.getSource().getPlayer().sendMessage(Text.literal("已应用高亮")); + ((SimpleOptionAccessor) (Object) context.getSource().getClient().options.getGamma()).forceSetValue(32767.0); + context.getSource().getPlayer().sendMessage(Text.literal("已应用高亮"), false); return Command.SINGLE_SUCCESS; } diff --git a/src/main/java/com/expvintl/mctools/commands/CNoFallPacketCommand.java b/src/main/java/com/expvintl/mctools/commands/CNoFallPacketCommand.java index 5db3383..c8eca35 100644 --- a/src/main/java/com/expvintl/mctools/commands/CNoFallPacketCommand.java +++ b/src/main/java/com/expvintl/mctools/commands/CNoFallPacketCommand.java @@ -1,6 +1,6 @@ package com.expvintl.mctools.commands; -import com.expvintl.mctools.Globals; +import com.expvintl.mctools.FeaturesSettings; import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.network.PacketSendEvent; import com.expvintl.mctools.mixin.interfaces.PlayerMoveC2SPacketAccessor; @@ -23,17 +23,17 @@ public class CNoFallPacketCommand { private static final MinecraftClient mc=MinecraftClient.getInstance(); public static void register(CommandDispatcher dispatcher){ MCEventBus.INSTANCE.register(INSTANCE); - CommandUtils.CreateStatusCommand("cnofallpacket",Globals.noFallPacket,dispatcher); + CommandUtils.CreateStatusCommand("cnofallpacket", FeaturesSettings.INSTANCE.noFallPacket, dispatcher); dispatcher.register(literal("cnofallpacket").then(argument("开关", BoolArgumentType.bool()).executes(CNoFallPacketCommand::execute))); } private static int execute(CommandContext context) { - Globals.noFallPacket.set(context.getArgument("开关", Boolean.class)); - if(Globals.noFallPacket.get()){ - context.getSource().getPlayer().sendMessage(Text.literal("已启用摔落伤害!")); + FeaturesSettings.INSTANCE.noFallPacket.setValue(context.getArgument("开关", Boolean.class)); + if(FeaturesSettings.INSTANCE.noFallPacket.getValue()){ + context.getSource().getPlayer().sendMessage(Text.literal("已启用摔落伤害!"),false); }else{ - context.getSource().getPlayer().sendMessage(Text.literal("已禁用摔落伤害!")); + context.getSource().getPlayer().sendMessage(Text.literal("已禁用摔落伤害!"),false); } return Command.SINGLE_SUCCESS; } @@ -42,8 +42,8 @@ public class CNoFallPacketCommand { //跳过非移动的数据包 if(!(event.packet instanceof PlayerMoveC2SPacket)) return; //跳过创造 - if(Globals.noFallPacket.get()&& !mc.player.getAbilities().creativeMode){ - if(mc.player.isFallFlying()) return; + if(FeaturesSettings.INSTANCE.noFallPacket.getValue()&& !mc.player.getAbilities().creativeMode){ + if(mc.player.fallDistance<=mc.player.getSafeFallDistance()) return; if(mc.player.getVelocity().y> -0.5) return; //直接发送在地面的数据包来免伤 ((PlayerMoveC2SPacketAccessor)event.packet).setOnGround(true); diff --git a/src/main/java/com/expvintl/mctools/commands/CQServerPluginsCommand.java b/src/main/java/com/expvintl/mctools/commands/CQServerPluginsCommand.java index 7eda4a0..b9bef85 100644 --- a/src/main/java/com/expvintl/mctools/commands/CQServerPluginsCommand.java +++ b/src/main/java/com/expvintl/mctools/commands/CQServerPluginsCommand.java @@ -1,6 +1,6 @@ package com.expvintl.mctools.commands; -import com.expvintl.mctools.Globals; +import com.expvintl.mctools.FeaturesSettings; import com.expvintl.mctools.events.MCEventBus; import com.expvintl.mctools.events.network.PacketReceiveEvent; import com.expvintl.mctools.utils.Utils; @@ -29,13 +29,13 @@ public class CQServerPluginsCommand { private static int execute(CommandContext context) { //注册数据包接受事件 MCEventBus.INSTANCE.register(INSTANCE); - Globals.checkBukkitPlugins.set(true); + FeaturesSettings.INSTANCE.checkBukkitPlugins.setValue(true); context.getSource().getPlayer().networkHandler.sendPacket(new RequestCommandCompletionsC2SPacket(new Random().nextInt(200),"bukkit:ver ")); //1秒后关闭避免识别其他命令提示 Utils.timer.schedule(new TimerTask() { @Override public void run() { - Globals.checkBukkitPlugins.set(false); + FeaturesSettings.INSTANCE.checkBukkitPlugins.setValue(false); MCEventBus.INSTANCE.unregister(INSTANCE); } },1000); @@ -44,7 +44,7 @@ public class CQServerPluginsCommand { @Subscribe public void onReceivePacket(PacketReceiveEvent p){ //探测bukkit服务器插件 - if (!MinecraftClient.getInstance().isIntegratedServerRunning()&& Globals.checkBukkitPlugins.get()) { + if (!MinecraftClient.getInstance().isIntegratedServerRunning()&& FeaturesSettings.INSTANCE.checkBukkitPlugins.getValue()) { if (p.packet instanceof CommandSuggestionsS2CPacket sg) { StringBuilder buf=new StringBuilder(); buf.append(String.format("找到%d个插件:",sg.getSuggestions().getList().size())).append('\n'); @@ -52,9 +52,9 @@ public class CQServerPluginsCommand { buf.append('[').append(s.getText()).append(']').append(' '); } if(MinecraftClient.getInstance().player!=null){ - MinecraftClient.getInstance().player.sendMessage(Text.literal(buf.toString())); + MinecraftClient.getInstance().player.sendMessage(Text.literal(buf.toString()),false); } - Globals.checkBukkitPlugins.set(false); + FeaturesSettings.INSTANCE.checkBukkitPlugins.setValue(false); //取消事件注册 MCEventBus.INSTANCE.unregister(INSTANCE); } diff --git a/src/main/java/com/expvintl/mctools/commands/CSafeWalkCommand.java b/src/main/java/com/expvintl/mctools/commands/CSafeWalkCommand.java index 12adaed..9ea8959 100644 --- a/src/main/java/com/expvintl/mctools/commands/CSafeWalkCommand.java +++ b/src/main/java/com/expvintl/mctools/commands/CSafeWalkCommand.java @@ -1,6 +1,6 @@ package com.expvintl.mctools.commands; -import com.expvintl.mctools.Globals; +import com.expvintl.mctools.FeaturesSettings; import com.expvintl.mctools.utils.CommandUtils; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; @@ -14,17 +14,17 @@ import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.lit public class CSafeWalkCommand { public static void register(CommandDispatcher dispatcher){ - CommandUtils.CreateStatusCommand("cselfwalk",Globals.selfWalk,dispatcher); + CommandUtils.CreateStatusCommand("cselfwalk", FeaturesSettings.INSTANCE.safeWalk, dispatcher); dispatcher.register(literal("cselfwalk").then(argument("开关", BoolArgumentType.bool()).executes(CSafeWalkCommand::execute))); } private static int execute(CommandContext context) { - Globals.selfWalk.set(context.getArgument("开关", Boolean.class)); - if(Globals.selfWalk.get()){ - context.getSource().getPlayer().sendMessage(Text.literal("已启用自动挂边!")); + FeaturesSettings.INSTANCE.safeWalk.setValue(context.getArgument("开关", Boolean.class)); + if(FeaturesSettings.INSTANCE.safeWalk.getValue()){ + context.getSource().getPlayer().sendMessage(Text.literal("已启用自动挂边!"),false); }else{ - context.getSource().getPlayer().sendMessage(Text.literal("已禁用自动挂边!")); + context.getSource().getPlayer().sendMessage(Text.literal("已禁用自动挂边!"),false); } return Command.SINGLE_SUCCESS; } diff --git a/src/main/java/com/expvintl/mctools/mixin/client/GameRendererMixin.java b/src/main/java/com/expvintl/mctools/mixin/client/GameRendererMixin.java new file mode 100644 index 0000000..cc9b05d --- /dev/null +++ b/src/main/java/com/expvintl/mctools/mixin/client/GameRendererMixin.java @@ -0,0 +1,15 @@ +package com.expvintl.mctools.mixin.client; + +import com.expvintl.mctools.modules.CameraZoom; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import net.minecraft.client.render.GameRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(GameRenderer.class) +public class GameRendererMixin { + @ModifyReturnValue(method = "getFov",at=@At("RETURN")) + private double getFov(double original){ + return CameraZoom.INSTANCE.isZoom?20.f:original; + } +} diff --git a/src/main/java/com/expvintl/mctools/mixin/hud/ChatHudMixin.java b/src/main/java/com/expvintl/mctools/mixin/hud/ChatHudMixin.java index d3f0f00..5992823 100644 --- a/src/main/java/com/expvintl/mctools/mixin/hud/ChatHudMixin.java +++ b/src/main/java/com/expvintl/mctools/mixin/hud/ChatHudMixin.java @@ -17,11 +17,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; public class ChatHudMixin { @ModifyReceiver(method = "render",at=@At(value = "INVOKE",target = "Lnet/minecraft/client/gui/DrawContext;drawTextWithShadow(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/text/OrderedText;III)I")) private DrawContext onRenderDrawTextWithShadow(DrawContext context, TextRenderer renderer, OrderedText text, int x, int y, int color, @Local ChatHudLine.Visible line){ - RenderSystem.enableBlend(); - RenderSystem.setShaderColor(1,1,1,((color >> 24) & 0x000000FF)/255f); Utils.DrawHeadIcon(context,line,y); - RenderSystem.setShaderColor(1,1,1,1); - RenderSystem.disableBlend(); return context; } } diff --git a/src/main/java/com/expvintl/mctools/mixin/player/PlayerEntityMixin.java b/src/main/java/com/expvintl/mctools/mixin/player/PlayerEntityMixin.java index 8aba7fc..d8252d5 100644 --- a/src/main/java/com/expvintl/mctools/mixin/player/PlayerEntityMixin.java +++ b/src/main/java/com/expvintl/mctools/mixin/player/PlayerEntityMixin.java @@ -1,6 +1,6 @@ package com.expvintl.mctools.mixin.player; -import com.expvintl.mctools.Globals; +import com.expvintl.mctools.FeaturesSettings; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.player.PlayerEntity; import org.spongepowered.asm.mixin.Mixin; @@ -15,7 +15,7 @@ public class PlayerEntityMixin { if(MinecraftClient.getInstance().world!=null&&MinecraftClient.getInstance().player!=null) { if (!MinecraftClient.getInstance().world.isClient) return; //挂住边缘 - if (Globals.selfWalk.get() && !MinecraftClient.getInstance().player.isSneaking()) cir.setReturnValue(true); + if (FeaturesSettings.INSTANCE.safeWalk.getValue() && !MinecraftClient.getInstance().player.isSneaking()) cir.setReturnValue(true); } } } diff --git a/src/main/java/com/expvintl/mctools/modules/CameraZoom.java b/src/main/java/com/expvintl/mctools/modules/CameraZoom.java new file mode 100644 index 0000000..60756f9 --- /dev/null +++ b/src/main/java/com/expvintl/mctools/modules/CameraZoom.java @@ -0,0 +1,20 @@ +package com.expvintl.mctools.modules; + +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.util.InputUtil; +import org.lwjgl.glfw.GLFW; + +public class CameraZoom { + public static CameraZoom INSTANCE=new CameraZoom(); + public boolean isZoom=false; + public void init(){ + KeyBinding zoom= KeyBindingHelper.registerKeyBinding(new KeyBinding("镜头放大", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_C,"MyTools")); + ClientTickEvents.END_CLIENT_TICK.register(client -> { + isZoom=zoom.isPressed(); + }); + } + +} diff --git a/src/main/java/com/expvintl/mctools/modules/PlayerListTextLatency.java b/src/main/java/com/expvintl/mctools/modules/PlayerListTextLatency.java index d7ee39d..8bc041a 100644 --- a/src/main/java/com/expvintl/mctools/modules/PlayerListTextLatency.java +++ b/src/main/java/com/expvintl/mctools/modules/PlayerListTextLatency.java @@ -14,9 +14,9 @@ public class PlayerListTextLatency { private int calcLatencyColor(int latency){ if(latency>=0&&latency<=60){ //0-60 return 0x00FF00; //绿色 - }else if(latency>60&&latency<=120){ //60-120 + }else if(latency>60&&latency<=100){ //60-100 return 0xFFFF00; //黄色 - }else if(latency>120&&latency<=200){//120-200 + }else if(latency>100&&latency<=200){//100-200 return 0xFFA500; //橙色 }else if(latency>200){ //>200 return 0xFF0000; //红色 diff --git a/src/main/java/com/expvintl/mctools/settingtype/BooleanSetting.java b/src/main/java/com/expvintl/mctools/settingtype/BooleanSetting.java new file mode 100644 index 0000000..07a4931 --- /dev/null +++ b/src/main/java/com/expvintl/mctools/settingtype/BooleanSetting.java @@ -0,0 +1,13 @@ +package com.expvintl.mctools.settingtype; + +public class BooleanSetting { + private boolean value; + + public void setValue(boolean value) { + this.value = value; + } + + public boolean getValue() { + return value; + } +} diff --git a/src/main/java/com/expvintl/mctools/texthud/MCInfo.java b/src/main/java/com/expvintl/mctools/texthud/MCInfo.java index 6b6dd74..8aea33a 100644 --- a/src/main/java/com/expvintl/mctools/texthud/MCInfo.java +++ b/src/main/java/com/expvintl/mctools/texthud/MCInfo.java @@ -11,6 +11,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.Colors; import net.minecraft.util.math.Vec3d; +import java.util.Objects; + public class MCInfo { private static String gameDayToRealTimeFormat(long gameDays) { // 游戏 1 小时等于 20 分钟 @@ -42,10 +44,10 @@ public class MCInfo { return timeString.toString(); } - public static void drawHUD(DrawContext drawContext,float v) { + public static void drawHUD(DrawContext drawContext, float v) { MinecraftClient mc=MinecraftClient.getInstance(); //跳过调试 - if(mc.getDebugHud().shouldShowDebugHud()||mc.options.hudHidden) return; + if(mc.options.debugEnabled||mc.options.hudHidden) return; if(mc.world!=null&&mc.player!=null) { DrawUtils.leftTextY =1; int selfPing=0; @@ -67,10 +69,10 @@ public class MCInfo { DrawUtils.AddLeftText(drawContext,String.format("X:%.2f Y:%.2f Z:%.2f",playerPos.x,playerPos.y,playerPos.z)); } DrawUtils.AddLeftText(drawContext,String.format("世界时间: %d天 (%s)",mc.world.getTimeOfDay()/24000,gameDayToRealTimeFormat(mc.world.getTimeOfDay()/24000))); - DrawUtils.AddLeftText(drawContext,String.format("当前区块: [%d,%d],方块:[%d,%d,%d]",mc.player.getChunkPos().x,mc.player.getChunkPos().z,mc.player.getBlockX()&0xF,mc.player.getBlockY()&0xF,mc.player.getBlockZ()&0xF)); + DrawUtils.AddLeftText(drawContext,String.format("当前区块: %d,%d 方块:[%d,%d]",mc.player.getChunkPos().x,mc.player.getChunkPos().z,mc.player.getBlockX()&0xf,mc.player.getBlockZ()&0xf)); DrawUtils.AddLeftText(drawContext,String.format("本地难度:%.2f",mc.world.getLocalDifficulty(mc.player.getBlockPos()).getLocalDifficulty())); - ItemStack currentItem=p.getInventory().getMainHandStack(); - if(currentItem!=null&¤tItem.isDamageable()){ + ItemStack currentItem=p.getMainHandStack(); + if(Objects.nonNull(currentItem)&¤tItem.isDamageable()){ DrawUtils.AddLeftText(drawContext,String.format("耐久度:%d/%d",currentItem.getMaxDamage()-currentItem.getDamage(),currentItem.getMaxDamage())); } } diff --git a/src/main/java/com/expvintl/mctools/texthud/PotionInfo.java b/src/main/java/com/expvintl/mctools/texthud/PotionInfo.java index be23d9c..af3f7ca 100644 --- a/src/main/java/com/expvintl/mctools/texthud/PotionInfo.java +++ b/src/main/java/com/expvintl/mctools/texthud/PotionInfo.java @@ -6,7 +6,6 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.RenderTickCounter; import net.minecraft.client.resource.language.I18n; import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.util.Colors; import java.util.Collection; @@ -14,7 +13,7 @@ public class PotionInfo { public static void drawHUD(DrawContext drawContext, float v) { MinecraftClient mc=MinecraftClient.getInstance(); //跳过调试 - if(mc.getDebugHud().shouldShowDebugHud()||mc.options.hudHidden) return; + if(mc.options.debugEnabled||mc.options.hudHidden) return; if(mc.world!=null&&mc.player!=null) { DrawUtils.rightBottomY=1; diff --git a/src/main/java/com/expvintl/mctools/types/Setting.java b/src/main/java/com/expvintl/mctools/types/Setting.java deleted file mode 100644 index 01f16b3..0000000 --- a/src/main/java/com/expvintl/mctools/types/Setting.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.expvintl.mctools.types; - -public class Setting { - public boolean value=false; - public boolean get(){ - return this.value; - } - public void set(boolean value){ - this.value=value; - } -} \ No newline at end of file diff --git a/src/main/java/com/expvintl/mctools/utils/CommandUtils.java b/src/main/java/com/expvintl/mctools/utils/CommandUtils.java index 5586ead..ec214e5 100644 --- a/src/main/java/com/expvintl/mctools/utils/CommandUtils.java +++ b/src/main/java/com/expvintl/mctools/utils/CommandUtils.java @@ -1,15 +1,16 @@ package com.expvintl.mctools.utils; -import com.expvintl.mctools.types.Setting; +import com.expvintl.mctools.FeaturesSettings; +import com.expvintl.mctools.settingtype.BooleanSetting; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.text.Text; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; public class CommandUtils { - public static void CreateStatusCommand(String cmd, Setting toggle, CommandDispatcher dispatcher){ + public static void CreateStatusCommand(String cmd, BooleanSetting setting, CommandDispatcher dispatcher){ dispatcher.register(literal(cmd).executes((context -> { - context.getSource().getPlayer().sendMessage(Text.literal("当前启用状态: "+toggle.get())); + context.getSource().getPlayer().sendMessage(Text.literal("当前启用状态: "+setting.getValue()),false); return Command.SINGLE_SUCCESS; }))); } diff --git a/src/main/java/com/expvintl/mctools/utils/Utils.java b/src/main/java/com/expvintl/mctools/utils/Utils.java index ec2fb3e..a036979 100644 --- a/src/main/java/com/expvintl/mctools/utils/Utils.java +++ b/src/main/java/com/expvintl/mctools/utils/Utils.java @@ -8,9 +8,11 @@ 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.PlayerSkinDrawer; import net.minecraft.client.gui.hud.ChatHudLine; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.client.render.RenderLayer; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.ItemStack; @@ -30,6 +32,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.Timer; +import java.util.function.Function; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -196,18 +199,6 @@ public class Utils { return "未知"; } -// public static int GetEnchantLevel(RegistryKey enchantName, ItemStack item){ -// //跳过附魔书 -// if(item.getItem()== Items.ENCHANTED_BOOK) return 0; -// Set>> enchants=item.getEnchantments().getEnchantmentEntries(); -// for(Object2IntMap.Entry> entry:enchants){ -// //返回找到的附魔等级 -// if(entry.getKey().matchesKey(enchantName)) { -// return entry.getIntValue(); -// } -// } -// return 0; -// } public static void rightClick() { ((MinecraftClientAccessor) mc).doItemUse(); } @@ -220,7 +211,7 @@ public class Utils { 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))); + mc.player.sendMessage(Text.literal(String.format("找到方块:%d,%d,%d", x, hight, z)),false); } } } @@ -242,11 +233,7 @@ public class Utils { if(sender==null) return; PlayerListEntry entry = mc.getNetworkHandler().getPlayerListEntry(sender.getId()); if (entry == null) return; - - Identifier skin = entry.getSkinTextures().texture(); - - draw.drawTexture(skin, 0, y, 8, 8, 8, 8, 8, 8, 64, 64); - draw.drawTexture(skin, 0, y, 8, 8, 40, 8, 8, 8, 64, 64); + PlayerSkinDrawer.draw(draw,entry.getSkinTexture(),0,y,8); draw.getMatrices().translate(10, 0, 0); } public static GameProfile getChatSender(String text){ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 3220f02..0958473 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -21,6 +21,6 @@ "depends": { "fabricloader": ">=0.8.0", "fabric": "*", - "minecraft": "~1.20.4" + "minecraft": "~1.20.1" } } diff --git a/src/main/resources/mctools.mixins.json b/src/main/resources/mctools.mixins.json index e0a2256..1b8ddd6 100644 --- a/src/main/resources/mctools.mixins.json +++ b/src/main/resources/mctools.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.expvintl.mctools.mixin", - "compatibilityLevel": "JAVA_21", + "compatibilityLevel": "JAVA_17", "mixins": [ "hud.ChatHudMixin", "hud.PlayerListHudMixin", @@ -14,6 +14,7 @@ "client": [ "MinecraftClientMixin", "SoundSystemMixin", + "client.GameRendererMixin", "interfaces.ClientPlayerInteractionManagerAccessor", "interfaces.MinecraftClientAccessor", "interfaces.SimpleOptionAccessor",