添加Tab显示优化,聊天HUD增加头像
This commit is contained in:
@ -1,13 +1,13 @@
|
||||
package com.expvintl.mctools;
|
||||
|
||||
import com.expvintl.mctools.types.GBool;
|
||||
import com.expvintl.mctools.types.Setting;
|
||||
|
||||
public class Globals {
|
||||
public static GBool autoRespawn=new GBool();
|
||||
public static GBool selfWalk=new GBool();
|
||||
public static GBool checkBukkitPlugins=new GBool();
|
||||
public static GBool autoTool=new GBool();
|
||||
public static GBool autoFish=new GBool();
|
||||
public static GBool noFallPacket=new GBool();
|
||||
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;
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
package com.expvintl.mctools;
|
||||
|
||||
import com.expvintl.mctools.commands.*;
|
||||
import com.expvintl.mctools.modules.BetterTooltip;
|
||||
import com.expvintl.mctools.modules.PlayerListTextLatency;
|
||||
import com.expvintl.mctools.utils.Utils;
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
@ -22,11 +24,14 @@ public class MCToolsClient implements ClientModInitializer {
|
||||
private static int infoY=1;
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
|
||||
//初始化命令注册回调
|
||||
ClientCommandRegistrationCallback.EVENT.register(MCToolsClient::registerCommands);
|
||||
HudRenderCallback.EVENT.register(MCToolsClient::drawHUD);
|
||||
|
||||
InitModules();
|
||||
}
|
||||
public void InitModules(){
|
||||
BetterTooltip.INSTANCE.init();
|
||||
PlayerListTextLatency.INSTANCE.init();
|
||||
}
|
||||
private static String gameDayToRealTimeFormat(long gameDays) {
|
||||
// 游戏 1 小时等于 20 分钟
|
||||
|
@ -3,7 +3,6 @@ package com.expvintl.mctools.commands;
|
||||
import com.expvintl.mctools.Globals;
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.client.OpenScreenEvent;
|
||||
import com.expvintl.mctools.types.GBool;
|
||||
import com.expvintl.mctools.utils.CommandUtils;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import com.mojang.brigadier.Command;
|
||||
|
@ -102,7 +102,7 @@ public class CAutoToolCommand {
|
||||
//遍历每一个物品槽
|
||||
for(int i=0;i<9;i++){
|
||||
ItemStack item = mc.player.getInventory().getStack(i);
|
||||
float score=getScore(item,state);
|
||||
float score= getToolsScore(item,state);
|
||||
if(score<0) continue;
|
||||
//选出最好分数的工具
|
||||
if(score>bestScore){
|
||||
@ -123,9 +123,8 @@ public class CAutoToolCommand {
|
||||
}
|
||||
}
|
||||
}
|
||||
public float getScore(ItemStack item, BlockState state){
|
||||
public float getToolsScore(ItemStack item, BlockState state){
|
||||
float score=0;
|
||||
//Is Tool!!
|
||||
if(item.getItem() instanceof ToolItem || item.getItem() instanceof ShearsItem){
|
||||
//根据挖掘速度提升评分
|
||||
score+=item.getMiningSpeedMultiplier(state)*30;
|
||||
@ -134,7 +133,7 @@ public class CAutoToolCommand {
|
||||
score+= Utils.GetEnchantLevel(Enchantments.UNBREAKING, item);
|
||||
//效率
|
||||
score+=Utils.GetEnchantLevel(Enchantments.EFFICIENCY,item);
|
||||
//经验修补(此项最优先)
|
||||
//经验修补
|
||||
score+=Utils.GetEnchantLevel(Enchantments.MENDING,item);
|
||||
if (item.getItem() instanceof SwordItem item1 && (state.getBlock() instanceof BambooBlock|| state.getBlock() instanceof BambooShootBlock))
|
||||
//根据挖掘等级加分
|
||||
|
@ -0,0 +1,22 @@
|
||||
package com.expvintl.mctools.events.hud;
|
||||
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.network.PlayerListEntry;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
public class RenderLatencyIconEvent {
|
||||
public static RenderLatencyIconEvent INSTANCE=new RenderLatencyIconEvent();
|
||||
public DrawContext draw;
|
||||
public PlayerListEntry entry;
|
||||
public CallbackInfo callback;
|
||||
public int x,y,width;
|
||||
public static RenderLatencyIconEvent get(DrawContext draw,int width,int x,int y,PlayerListEntry entry,CallbackInfo callback){
|
||||
INSTANCE.draw=draw;
|
||||
INSTANCE.callback=callback;
|
||||
INSTANCE.entry=entry;
|
||||
INSTANCE.y=y;
|
||||
INSTANCE.x=x;
|
||||
INSTANCE.width=width;
|
||||
return INSTANCE;
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.expvintl.mctools.events.item;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ItemStackTooltipEvent {
|
||||
public static ItemStackTooltipEvent INSTANCE=new ItemStackTooltipEvent();
|
||||
public ItemStack item;
|
||||
public List<Text> textList;
|
||||
|
||||
public static ItemStackTooltipEvent get(ItemStack item,List<Text> list){
|
||||
INSTANCE.item=item;
|
||||
INSTANCE.textList=list;
|
||||
return INSTANCE;
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.expvintl.mctools.mixin.hud;
|
||||
|
||||
import com.expvintl.mctools.utils.Utils;
|
||||
import com.llamalad7.mixinextras.injector.ModifyReceiver;
|
||||
import com.llamalad7.mixinextras.sugar.Local;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.hud.ChatHud;
|
||||
import net.minecraft.client.gui.hud.ChatHudLine;
|
||||
import net.minecraft.text.OrderedText;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
||||
@Mixin(ChatHud.class)
|
||||
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;
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package com.expvintl.mctools.mixin.hud;
|
||||
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.hud.RenderLatencyIconEvent;
|
||||
import com.expvintl.mctools.utils.Utils;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.hud.PlayerListHud;
|
||||
import net.minecraft.client.network.PlayerListEntry;
|
||||
import net.minecraft.text.Text;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(PlayerListHud.class)
|
||||
public class PlayerListHudMixin {
|
||||
@ModifyArg(method = "render",at=@At(value = "INVOKE",target = "Ljava/lang/Math;min(II)I"),index = 0)
|
||||
private int fixWidth(int width){
|
||||
return width+25;
|
||||
}
|
||||
@Inject(method = "getPlayerName",at=@At("HEAD"),cancellable = true)
|
||||
private void getPlayerName(PlayerListEntry entry, CallbackInfoReturnable<Text> info){
|
||||
if(Utils.isReady()){
|
||||
Text name=entry.getDisplayName();
|
||||
if(entry.getProfile().getId().toString().equals(MinecraftClient.getInstance().player.getGameProfile().getId().toString())){
|
||||
info.setReturnValue(Text.literal(name.getString()).setStyle(name.getStyle().withColor(0xff0000)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "renderLatencyIcon",at=@At("HEAD"),cancellable = true)
|
||||
private void onRenderLatencyIcon(DrawContext draw, int width, int x, int y, PlayerListEntry entry, CallbackInfo info){
|
||||
MCEventBus.INSTANCE.post(RenderLatencyIconEvent.get(draw,width,x,y,entry,info));
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.expvintl.mctools.mixin.item;
|
||||
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.item.ItemStackTooltipEvent;
|
||||
import com.expvintl.mctools.utils.Utils;
|
||||
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.text.Text;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(ItemStack.class)
|
||||
public class ItemStackMixin {
|
||||
@ModifyReturnValue(method = "getTooltip",at=@At("RETURN"))
|
||||
private List<Text> onGetTooltip(List<Text> list) {
|
||||
if(Utils.isReady()) {
|
||||
ItemStackTooltipEvent event=ItemStackTooltipEvent.get((ItemStack) (Object) this, list);
|
||||
MCEventBus.INSTANCE.post(event);
|
||||
return event.textList;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.expvintl.mctools.modules;
|
||||
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.item.ItemStackTooltipEvent;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
public class BetterTooltip {
|
||||
public static BetterTooltip INSTANCE=new BetterTooltip();
|
||||
public void init(){
|
||||
MCEventBus.INSTANCE.register(INSTANCE);
|
||||
}
|
||||
@Subscribe
|
||||
public void onGetTooltip(ItemStackTooltipEvent event){
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.expvintl.mctools.modules;
|
||||
|
||||
import com.expvintl.mctools.events.MCEventBus;
|
||||
import com.expvintl.mctools.events.hud.RenderLatencyIconEvent;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
|
||||
public class PlayerListTextLatency {
|
||||
public static PlayerListTextLatency INSTANCE=new PlayerListTextLatency();
|
||||
public void init(){
|
||||
MCEventBus.INSTANCE.register(INSTANCE);
|
||||
}
|
||||
@Subscribe
|
||||
public void onRenderLatencyIcon(RenderLatencyIconEvent event){
|
||||
TextRenderer renderer=MinecraftClient.getInstance().textRenderer;
|
||||
int latency=Math.clamp(event.entry.getLatency(),0,9999);
|
||||
String text=latency+" ms";
|
||||
event.draw.drawTextWithShadow(renderer,text, event.x+event.width-renderer.getWidth(text),event.y,0x00E970);
|
||||
event.callback.cancel();
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
package com.expvintl.mctools.types;
|
||||
|
||||
public class GBool{
|
||||
public class Setting {
|
||||
public boolean value=false;
|
||||
public boolean get(){
|
||||
return this.value;
|
@ -1,13 +1,13 @@
|
||||
package com.expvintl.mctools.utils;
|
||||
|
||||
import com.expvintl.mctools.types.GBool;
|
||||
import com.expvintl.mctools.types.Setting;
|
||||
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, GBool toggle, CommandDispatcher<FabricClientCommandSource> dispatcher){
|
||||
public static void CreateStatusCommand(String cmd, Setting toggle, CommandDispatcher<FabricClientCommandSource> dispatcher){
|
||||
dispatcher.register(literal(cmd).executes((context -> {
|
||||
context.getSource().getPlayer().sendMessage(Text.literal("当前启用状态: "+toggle.get()));
|
||||
return Command.SINGLE_SUCCESS;
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.expvintl.mctools.utils;
|
||||
|
||||
import com.expvintl.mctools.mixin.interfaces.MinecraftClientAccessor;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
||||
import net.minecraft.block.Block;
|
||||
@ -17,6 +18,7 @@ import net.minecraft.item.Items;
|
||||
import net.minecraft.registry.RegistryKey;
|
||||
import net.minecraft.registry.entry.RegistryEntry;
|
||||
import net.minecraft.text.MutableText;
|
||||
import net.minecraft.text.OrderedText;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
@ -29,10 +31,13 @@ import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class Utils {
|
||||
private static final MinecraftClient mc = MinecraftClient.getInstance();
|
||||
public static final Timer timer = new Timer();
|
||||
private static final Pattern usernameRegex = Pattern.compile("^(?:<[0-9]{2}:[0-9]{2}>\\s)?<(.*?)>.*");
|
||||
|
||||
public static String getCurrentDimensionName() {
|
||||
if (mc.world != null) {
|
||||
@ -221,4 +226,36 @@ public class Utils {
|
||||
}
|
||||
}
|
||||
}
|
||||
public static boolean isReady(){
|
||||
MinecraftClient cli=MinecraftClient.getInstance();
|
||||
return cli!=null&&cli.world!=null&&cli.player!=null;
|
||||
}
|
||||
|
||||
public static void DrawHeadIcon(DrawContext draw, ChatHudLine.Visible text,int y){
|
||||
StringBuffer buf=new StringBuffer();
|
||||
text.content().accept((idx,style,codePoint)->{
|
||||
buf.appendCodePoint(codePoint);
|
||||
return true;
|
||||
});
|
||||
String txt=buf.toString();
|
||||
GameProfile sender=getChatSender(txt);
|
||||
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);
|
||||
draw.getMatrices().translate(10, 0, 0);
|
||||
}
|
||||
public static GameProfile getChatSender(String text){
|
||||
Matcher usernameMatcher=usernameRegex.matcher(text);
|
||||
if(usernameMatcher.matches()){
|
||||
String username=usernameMatcher.group(1);
|
||||
PlayerListEntry entry=mc.getNetworkHandler().getPlayerListEntry(username);
|
||||
if(entry!=null) return entry.getProfile();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,10 @@
|
||||
"package": "com.expvintl.mctools.mixin",
|
||||
"compatibilityLevel": "JAVA_21",
|
||||
"mixins": [
|
||||
"hud.ChatHudMixin",
|
||||
"hud.PlayerListHudMixin",
|
||||
"interfaces.PlayerMoveC2SPacketAccessor",
|
||||
"item.ItemStackMixin",
|
||||
"network.ClientConnectionMixin",
|
||||
"player.PlayerEntityMixin"
|
||||
],
|
||||
|
Reference in New Issue
Block a user