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