diff --git a/build.gradle b/build.gradle index 02c0bd1..b7900da 100644 --- a/build.gradle +++ b/build.gradle @@ -61,9 +61,26 @@ mixin { config 'atianxray.mixins.json' } +repositories { + // Put repositories for dependencies here + // ForgeGradle automatically adds the Forge maven and Maven Central for you + maven { + url "https://cursemaven.com" + content { + includeGroup "curse.maven" + } + } + + // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: + // flatDir { + // dir 'libs' + // } +} + dependencies { minecraft 'net.minecraftforge:forge:1.20-46.0.13' annotationProcessor 'org.spongepowered:mixin:0.8.4:processor' + compileOnly fg.deobf("curse.maven:rubidium-574856:4952685") } // Example for how to get properties into the manifest for reading by the runtime.. diff --git a/src/main/java/fr/atesab/xray/XrayMain.java b/src/main/java/fr/atesab/xray/XrayMain.java index 75d482f..6a07ab3 100644 --- a/src/main/java/fr/atesab/xray/XrayMain.java +++ b/src/main/java/fr/atesab/xray/XrayMain.java @@ -9,24 +9,6 @@ import java.util.stream.Collector; import java.util.stream.Collectors; -import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; - -import net.minecraft.client.OptionInstance; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraftforge.client.ConfigScreenHandler; -import net.minecraftforge.client.event.*; -import net.minecraftforge.eventbus.api.IEventBus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.joml.Vector3f; @@ -34,6 +16,14 @@ import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; + import fr.atesab.xray.color.ColorSupplier; import fr.atesab.xray.color.IColorObject; import fr.atesab.xray.color.TextHudBuffer; @@ -51,23 +41,39 @@ import net.minecraft.client.Camera; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.OptionInstance; import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.resources.language.I18n; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.ConfigScreenHandler; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.client.event.RenderGuiOverlayEvent; +import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent.Phase; +import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; @@ -454,7 +460,8 @@ public void onRenderWorld(RenderLevelStageEvent ev) { blockPos.getX() + 1, blockPos.getY() + 1, blockPos.getZ() + 1 ); - LevelRenderer.renderLineBox(stack, buffer, aabb, r, g, b, a); + RenderUtils.renderLineBoxVanillaStyle(stack, buffer, aabb, r, g, b, a); + //LevelRenderer.renderLineBox(stack, buffer, aabb, r, g, b, a); if (esp.hasTracer()) { Vec3 center = aabb.getCenter(); @@ -500,7 +507,8 @@ public void onRenderWorld(RenderLevelStageEvent ev) { AABB aabb = type.getAABB(x, y, z); - LevelRenderer.renderLineBox(stack, buffer, aabb, r, g, b, a); + RenderUtils.renderLineBoxVanillaStyle(stack, buffer, aabb, r, g, b, a); + //LevelRenderer.renderLineBox(stack, buffer, aabb, r, g, b, a); if (esp.hasTracer()) { Vec3 center = aabb.getCenter(); diff --git a/src/main/java/fr/atesab/xray/config/LocationFormatTool.java b/src/main/java/fr/atesab/xray/config/LocationFormatTool.java index d057852..0ccb8f1 100644 --- a/src/main/java/fr/atesab/xray/config/LocationFormatTool.java +++ b/src/main/java/fr/atesab/xray/config/LocationFormatTool.java @@ -23,10 +23,10 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.resources.language.I18n; -import net.minecraft.core.Registry; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; @@ -52,6 +52,8 @@ public class LocationFormatTool implements EnumElement { public static long currentHours; public static long currentMinutes; public static long currentSeconds; + public static int currentNutrition; + public static float currentSaturation; public static final ToolFunction EMPTY_FUNCTION = (mc, player, world) -> ""; public static final LocationFormatTool PLAYER_LOCATION_X = register("x13.mod.location.opt.x", Items.BOOK, "x", @@ -104,7 +106,59 @@ public class LocationFormatTool implements EnumElement { (mc, player, world) -> LocationUtils.getTwoDigitNumberFormat().format(currentSeconds)); public static final LocationFormatTool IS_SLIME = register("x13.mod.location.opt.isSlime", Items.SLIME_BALL, "slime", (mc, player, world) -> String.valueOf(LocationUtils.isSlimeChunk(mc, player.chunkPosition()))); - public static final LocationFormatTool NEW_LINE = register("x13.mod.location.opt.lineFeed",Items.WRITABLE_BOOK, "lf", + public static final LocationFormatTool NUTRITION = register("x13.mod.location.opt.nutrition", Items.BEEF, "nutrition", + (mc, player, world) -> String.valueOf(currentNutrition)); + public static final LocationFormatTool SATURATION = register("x13.mod.location.opt.saturation", Items.COOKED_BEEF, "saturation", + (mc, player, world) -> String.format("%.1f",currentSaturation)); + public static final LocationFormatTool MAINHAND_NAME = register("x13.mod.location.opt.mainhandName", Items.DIAMOND_SWORD, "mainhandName", + (mc, player, world) -> ForgeRegistries.ITEMS.getKey(player.getMainHandItem().getItem()).getPath()); + public static final LocationFormatTool MAINHAND_NAME_TRANSLATE = register("x13.mod.location.opt.mainhandTranslate", Items.DIAMOND_SWORD, "mainhandTranslate", + (mc, player, world) -> I18n.get(player.getMainHandItem().getDescriptionId()).toString()); + public static final LocationFormatTool MAINHAND_DURABILITY = register("x13.mod.location.opt.mainhandDurability", Items.DIAMOND_SWORD, "mainhandDurability", + (mc, player, world) -> LocationUtils.getDurabilityOrFoodData(player.getMainHandItem())); + public static final LocationFormatTool MAINHAND_MAXDURABILITY = register("x13.mod.location.opt.mainhandMaxDurability", Items.DIAMOND_SWORD, "mainhandMaxDurability", + (mc, player, world) -> LocationUtils.getMaxDurabilityOrAfterFoodData(player.getMainHandItem(),currentNutrition,currentSaturation)); + public static final LocationFormatTool OFFHAND_NAME = register("x13.mod.location.opt.offhandName", Items.SHIELD, "offhandName", + (mc, player, world) -> ForgeRegistries.ITEMS.getKey(player.getOffhandItem().getItem()).getPath()); + public static final LocationFormatTool OFFHAND_NAME_TRANSLATE = register("x13.mod.location.opt.offhandTranslate", Items.SHIELD, "offhandTranslate", + (mc, player, world) -> I18n.get(player.getOffhandItem().getDescriptionId()).toString()); + public static final LocationFormatTool OFFHAND_DURABILITY = register("x13.mod.location.opt.offhandDurability", Items.SHIELD, "offhandDurability", + (mc, player, world) -> LocationUtils.getDurabilityOrFoodData(player.getOffhandItem())); + public static final LocationFormatTool OFFHAND_MAXDURABILITY = register("x13.mod.location.opt.mainhandMaxDurability", Items.SHIELD, "offhandMaxDurability", + (mc, player, world) -> LocationUtils.getMaxDurabilityOrAfterFoodData(player.getOffhandItem(),currentNutrition,currentSaturation)); + public static final LocationFormatTool HELMET_NAME = register("x13.mod.location.opt.helmetName", Items.DIAMOND_HELMET, "helmetName", + (mc, player, world) -> ForgeRegistries.ITEMS.getKey(player.getItemBySlot(EquipmentSlot.HEAD).getItem()).getPath()); + public static final LocationFormatTool HELMET_NAME_TRANSLATE = register("x13.mod.location.opt.helmetTranslate", Items.DIAMOND_HELMET, "helmetTranslate", + (mc, player, world) -> I18n.get(player.getItemBySlot(EquipmentSlot.HEAD).getDescriptionId()).toString()); + public static final LocationFormatTool HELMET_DURABILITY = register("x13.mod.location.opt.helmetDurability", Items.DIAMOND_HELMET, "helmetDurability", + (mc, player, world) -> String.valueOf(LocationUtils.getRemainDurability(player.getItemBySlot(EquipmentSlot.HEAD)))); + public static final LocationFormatTool HELMET_MAXDURABILITY = register("x13.mod.location.opt.helmetMaxDurability", Items.DIAMOND_HELMET, "helmetMaxDurability", + (mc, player, world) -> String.valueOf(player.getItemBySlot(EquipmentSlot.HEAD).getMaxDamage())); + public static final LocationFormatTool CHESTPLATE_NAME = register("x13.mod.location.opt.chestplateName", Items.DIAMOND_CHESTPLATE, "chestplateName", + (mc, player, world) -> ForgeRegistries.ITEMS.getKey(player.getItemBySlot(EquipmentSlot.CHEST).getItem()).getPath()); + public static final LocationFormatTool CHESTPLATE_NAME_TRANSLATE = register("x13.mod.location.opt.chestplateTranslate", Items.DIAMOND_CHESTPLATE, "chestplateTranslate", + (mc, player, world) -> I18n.get(player.getItemBySlot(EquipmentSlot.CHEST).getDescriptionId()).toString()); + public static final LocationFormatTool CHESTPLATE_DURABILITY = register("x13.mod.location.opt.chestplateDurability", Items.DIAMOND_CHESTPLATE, "chestplateDurability", + (mc, player, world) -> String.valueOf(LocationUtils.getRemainDurability(player.getItemBySlot(EquipmentSlot.CHEST)))); + public static final LocationFormatTool CHESTPLATE_MAXDURABILITY = register("x13.mod.location.opt.chestplateMaxDurability", Items.DIAMOND_CHESTPLATE, "chestplateMaxDurability", + (mc, player, world) -> String.valueOf(player.getItemBySlot(EquipmentSlot.CHEST).getMaxDamage())); + public static final LocationFormatTool LEGGINGS_NAME = register("x13.mod.location.opt.leggingsName", Items.DIAMOND_LEGGINGS, "leggingsName", + (mc, player, world) -> ForgeRegistries.ITEMS.getKey(player.getItemBySlot(EquipmentSlot.LEGS).getItem()).getPath()); + public static final LocationFormatTool LEGGINGS_NAME_TRANSLATE = register("x13.mod.location.opt.leggingsTranslate", Items.DIAMOND_LEGGINGS, "leggingsTranslate", + (mc, player, world) -> I18n.get(player.getItemBySlot(EquipmentSlot.LEGS).getDescriptionId()).toString()); + public static final LocationFormatTool LEGGINGS_DURABILITY = register("x13.mod.location.opt.leggingsDurability", Items.DIAMOND_LEGGINGS, "leggingsDurability", + (mc, player, world) -> String.valueOf(LocationUtils.getRemainDurability(player.getItemBySlot(EquipmentSlot.LEGS)))); + public static final LocationFormatTool LEGGINGS_MAXDURABILITY = register("x13.mod.location.opt.leggingsMaxDurability", Items.DIAMOND_LEGGINGS, "leggingsMaxDurability", + (mc, player, world) -> String.valueOf(player.getItemBySlot(EquipmentSlot.LEGS).getMaxDamage())); + public static final LocationFormatTool BOOTS_NAME = register("x13.mod.location.opt.bootsName", Items.DIAMOND_BOOTS, "bootsName", + (mc, player, world) -> ForgeRegistries.ITEMS.getKey(player.getItemBySlot(EquipmentSlot.FEET).getItem()).getPath()); + public static final LocationFormatTool BOOTS_NAME_TRANSLATE = register("x13.mod.location.opt.bootsTranslate", Items.DIAMOND_BOOTS, "bootsTranslate", + (mc, player, world) -> I18n.get(player.getItemBySlot(EquipmentSlot.FEET).getDescriptionId()).toString()); + public static final LocationFormatTool BOOTS_DURABILITY = register("x13.mod.location.opt.bootsDurability", Items.DIAMOND_BOOTS, "bootsDurability", + (mc, player, world) -> String.valueOf(LocationUtils.getRemainDurability(player.getItemBySlot(EquipmentSlot.FEET)))); + public static final LocationFormatTool BOOTS_MAXDURABILITY = register("x13.mod.location.opt.bootsMaxDurability", Items.DIAMOND_BOOTS, "bootsMaxDurability", + (mc, player, world) -> String.valueOf(player.getItemBySlot(EquipmentSlot.FEET).getMaxDamage())); + public static final LocationFormatTool NEW_LINE = register("x13.mod.location.opt.lineFeed",Items.WRITABLE_BOOK, "lf", (mc, player, world) -> "\n"); public static final LocationFormatTool ALL = register("debug",Items.WRITABLE_BOOK, "debug", (mc, player, world) -> "DEBUG\n" + TOOLS.entrySet().stream() @@ -393,6 +447,8 @@ public ListToolFunction() { public String apply(Minecraft client, LocalPlayer player, ClientLevel world) { StringBuilder bld = new StringBuilder(); updateTimeField(client, player, world); + updateFoodDataField(client, player, world); + updateHandDataField(client, player, world); for (ToolFunction func : functions) { bld.append(func.apply(client, player, world)); @@ -430,4 +486,13 @@ private static void updateTimeField(Minecraft client, LocalPlayer player, Client long fixedSeconds = Math.floorMod(fixedMinutes * 60, 1000); currentSeconds = Math.floorDiv(fixedSeconds * 60, 1000); } + + private static void updateFoodDataField(Minecraft client, LocalPlayer player, ClientLevel world) { + currentNutrition = player.getFoodData().getFoodLevel(); + currentSaturation = player.getFoodData().getSaturationLevel(); + } + + private static void updateHandDataField(Minecraft client, LocalPlayer player, ClientLevel world) { + + } } diff --git a/src/main/java/fr/atesab/xray/mixins/MixinBlock_rubidium.java b/src/main/java/fr/atesab/xray/mixins/MixinBlock_rubidium.java new file mode 100644 index 0000000..ffa8aa9 --- /dev/null +++ b/src/main/java/fr/atesab/xray/mixins/MixinBlock_rubidium.java @@ -0,0 +1,31 @@ +package fr.atesab.xray.mixins; + +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import fr.atesab.xray.XrayMain; +import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockOcclusionCache; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.VoxelShape; + +@Mixin(value = BlockOcclusionCache.class) +public class MixinBlock_rubidium { + @Inject(at = @At("RETURN"), method = "shouldDrawSide(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;)Z",cancellable = true,remap=false) + public void shouldDrawSideMixin(BlockState selfState, BlockGetter view, BlockPos pos, Direction facing, CallbackInfoReturnable ci) { + XrayMain.getMod().shouldSideBeRendered(selfState, view, pos, facing, ci); + } + + @Redirect(at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockOcclusionCache;calculate(Lnet/minecraft/world/phys/shapes/VoxelShape;Lnet/minecraft/world/phys/shapes/VoxelShape;)Z"), method = "shouldDrawSide(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;)Z",remap=false) + private boolean ignoreCache(BlockOcclusionCache cache, VoxelShape selfShape, VoxelShape adjShape) { + return true; + } + + private MixinBlock_rubidium() { + } +} diff --git a/src/main/java/fr/atesab/xray/screen/BlockSelector.java b/src/main/java/fr/atesab/xray/screen/BlockSelector.java index a09f8fb..b89c579 100644 --- a/src/main/java/fr/atesab/xray/screen/BlockSelector.java +++ b/src/main/java/fr/atesab/xray/screen/BlockSelector.java @@ -3,15 +3,12 @@ import java.util.ArrayList; import java.util.List; -import com.mojang.blaze3d.vertex.PoseStack; - import fr.atesab.xray.utils.GuiUtils; import fr.atesab.xray.widget.XrayButton; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; -import net.minecraft.core.Registry; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; @@ -116,7 +113,7 @@ public void updateSearch() { visible.clear(); blocks.stream().filter(block -> I18n.get(block.getDescriptionId()).toLowerCase().contains(query)) .forEach(visible::add); - page = Math.min(visible.size(), page); + page = Math.min(visible.size() / elementByPage, page); updateArrows(); } diff --git a/src/main/java/fr/atesab/xray/screen/XrayBlockMenu.java b/src/main/java/fr/atesab/xray/screen/XrayBlockMenu.java index 6d89923..a42e644 100644 --- a/src/main/java/fr/atesab/xray/screen/XrayBlockMenu.java +++ b/src/main/java/fr/atesab/xray/screen/XrayBlockMenu.java @@ -1,5 +1,9 @@ package fr.atesab.xray.screen; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import fr.atesab.xray.config.BlockConfig; import fr.atesab.xray.utils.GuiUtils; import fr.atesab.xray.widget.XrayButton; @@ -12,10 +16,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - public class XrayBlockMenu extends XrayScreen { private static final Component ADD = Component.literal("+").withStyle(ChatFormatting.GREEN); private static final Component REPLACE = Component.translatable("x13.mod.menu.replace") @@ -130,7 +130,7 @@ public void updateSearch() { visible.clear(); config.stream().filter(block -> I18n.get(block.getDescriptionId()).toLowerCase().contains(query)) .forEach(visible::add); - page = Math.min(visible.size(), page); + page = Math.min(visible.size() / elementByPage, page); updateArrows(); } diff --git a/src/main/java/fr/atesab/xray/screen/XrayEntityMenu.java b/src/main/java/fr/atesab/xray/screen/XrayEntityMenu.java index 854843b..d070f18 100644 --- a/src/main/java/fr/atesab/xray/screen/XrayEntityMenu.java +++ b/src/main/java/fr/atesab/xray/screen/XrayEntityMenu.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Objects; -import com.mojang.blaze3d.vertex.PoseStack; import fr.atesab.xray.color.BlockEntityTypeIcon; import fr.atesab.xray.color.EntityTypeIcon; import fr.atesab.xray.color.EnumElement; @@ -174,7 +173,7 @@ public void updateSearch() { visible.clear(); config.stream().filter(block -> I18n.get(block.text()).toLowerCase().contains(query)) .forEach(visible::add); - page = Math.min(visible.size(), page); + page = Math.min(visible.size() / elementByPage, page); updateArrows(); } diff --git a/src/main/java/fr/atesab/xray/screen/XrayLocationConfig.java b/src/main/java/fr/atesab/xray/screen/XrayLocationConfig.java index 220c73d..d1402c1 100644 --- a/src/main/java/fr/atesab/xray/screen/XrayLocationConfig.java +++ b/src/main/java/fr/atesab/xray/screen/XrayLocationConfig.java @@ -41,7 +41,7 @@ protected void init() { })); format = new EditBox(font, width / 2 - 98, height / 2 + 2, 196, 16, Component.literal("")); - format.setMaxLength(256); + format.setMaxLength(1024); format.setValue(mod.getConfig().getLocationConfig().getFormat()); format.setResponder(mod.getConfig().getLocationConfig()::setFormat); format.setFocused(true); diff --git a/src/main/java/fr/atesab/xray/utils/LocationUtils.java b/src/main/java/fr/atesab/xray/utils/LocationUtils.java index 6ed88d5..8927fe0 100644 --- a/src/main/java/fr/atesab/xray/utils/LocationUtils.java +++ b/src/main/java/fr/atesab/xray/utils/LocationUtils.java @@ -1,18 +1,19 @@ package fr.atesab.xray.utils; +import java.text.DecimalFormat; +import java.text.NumberFormat; + import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.server.IntegratedServer; import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import java.text.DecimalFormat; -import java.text.NumberFormat; - public class LocationUtils { private static final ThreadLocal localTwoDigitNfFormat = ThreadLocal.withInitial(() -> new DecimalFormat("00")); @@ -58,4 +59,34 @@ public static String isSlimeChunk(Minecraft mc, ChunkPos chunk) { return String.valueOf(WorldgenRandom.seedSlimeChunk(chunk.x, chunk.z, server.getWorldData().worldGenOptions().seed(), 987234911L).nextInt(10) == 0); } + + public static String getDurabilityOrFoodData(ItemStack item) { + if (item.isDamageableItem()) { + return String.valueOf(getRemainDurability(item)); + } else if (item.isEdible()) { + return String.valueOf(item.getFoodProperties(null).getNutrition()) + "(" + String.format("%.1f",getAddSaturation(item)) + ")"; + } else { + return "-"; + } + } + + public static String getMaxDurabilityOrAfterFoodData(ItemStack item,int currentNutrition, float currentSaturation) { + if (item.isDamageableItem()) { + return String.valueOf(item.getMaxDamage()); + } else if (item.isEdible()) { + int afterNutrition = Math.min(currentNutrition + item.getFoodProperties(null).getNutrition(), 20); + float afterSaturation = Math.min(currentSaturation + getAddSaturation(item), 20); + return String.valueOf(afterNutrition) + "(" + String.format("%.1f",afterSaturation) + ")"; + } else { + return "-"; + } + } + + public static int getRemainDurability(ItemStack item) { + return item.getMaxDamage() - item.getDamageValue(); + } + + public static float getAddSaturation(ItemStack item) { + return item.getFoodProperties(null).getNutrition() * item.getFoodProperties(null).getSaturationModifier() * 2.0F; + } } diff --git a/src/main/java/fr/atesab/xray/utils/RenderUtils.java b/src/main/java/fr/atesab/xray/utils/RenderUtils.java index d16e077..6c082eb 100644 --- a/src/main/java/fr/atesab/xray/utils/RenderUtils.java +++ b/src/main/java/fr/atesab/xray/utils/RenderUtils.java @@ -1,11 +1,13 @@ package fr.atesab.xray.utils; +import org.joml.Matrix3f; +import org.joml.Matrix4f; + import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import org.joml.Matrix3f; -import org.joml.Matrix4f; public class RenderUtils { @@ -28,6 +30,50 @@ public static void renderSingleLine(PoseStack stack, VertexConsumer buffer, floa .normal(matrix3f, normalX, normalY, normalZ).endVertex(); } + // copied vanilla code for Sodium/Rubidium compatibility, because they overwrite and broke this vanilla code. + public static void renderLineBoxVanillaStyle(PoseStack p_109647_, VertexConsumer p_109648_, AABB p_109649_, float p_109650_, float p_109651_, float p_109652_, float p_109653_) { + renderLineBoxVanillaStyle(p_109647_, p_109648_, p_109649_.minX, p_109649_.minY, p_109649_.minZ, p_109649_.maxX, p_109649_.maxY, p_109649_.maxZ, p_109650_, p_109651_, p_109652_, p_109653_, p_109650_, p_109651_, p_109652_); + } + + public static void renderLineBoxVanillaStyle(PoseStack p_109609_, VertexConsumer p_109610_, double p_109611_, double p_109612_, double p_109613_, double p_109614_, double p_109615_, double p_109616_, float p_109617_, float p_109618_, float p_109619_, float p_109620_) { + renderLineBoxVanillaStyle(p_109609_, p_109610_, p_109611_, p_109612_, p_109613_, p_109614_, p_109615_, p_109616_, p_109617_, p_109618_, p_109619_, p_109620_, p_109617_, p_109618_, p_109619_); + } + + public static void renderLineBoxVanillaStyle(PoseStack p_109622_, VertexConsumer p_109623_, double p_109624_, double p_109625_, double p_109626_, double p_109627_, double p_109628_, double p_109629_, float p_109630_, float p_109631_, float p_109632_, float p_109633_, float p_109634_, float p_109635_, float p_109636_) { + Matrix4f matrix4f = p_109622_.last().pose(); + Matrix3f matrix3f = p_109622_.last().normal(); + float f = (float)p_109624_; + float f1 = (float)p_109625_; + float f2 = (float)p_109626_; + float f3 = (float)p_109627_; + float f4 = (float)p_109628_; + float f5 = (float)p_109629_; + p_109623_.vertex(matrix4f, f, f1, f2).color(p_109630_, p_109635_, p_109636_, p_109633_).normal(matrix3f, 1.0F, 0.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f1, f2).color(p_109630_, p_109635_, p_109636_, p_109633_).normal(matrix3f, 1.0F, 0.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f1, f2).color(p_109634_, p_109631_, p_109636_, p_109633_).normal(matrix3f, 0.0F, 1.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f4, f2).color(p_109634_, p_109631_, p_109636_, p_109633_).normal(matrix3f, 0.0F, 1.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f1, f2).color(p_109634_, p_109635_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 0.0F, 1.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f1, f5).color(p_109634_, p_109635_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 0.0F, 1.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f1, f2).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 1.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f4, f2).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 1.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f4, f2).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, -1.0F, 0.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f4, f2).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, -1.0F, 0.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f4, f2).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 0.0F, 1.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f4, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 0.0F, 1.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f4, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f1, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, -1.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f1, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 1.0F, 0.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f1, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 1.0F, 0.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f1, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 0.0F, -1.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f1, f2).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 0.0F, -1.0F).endVertex(); + p_109623_.vertex(matrix4f, f, f4, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 1.0F, 0.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f4, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 1.0F, 0.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f1, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 1.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f4, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 1.0F, 0.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f4, f2).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 0.0F, 1.0F).endVertex(); + p_109623_.vertex(matrix4f, f3, f4, f5).color(p_109630_, p_109631_, p_109632_, p_109633_).normal(matrix3f, 0.0F, 0.0F, 1.0F).endVertex(); + } + private RenderUtils() { } } diff --git a/src/main/resources/assets/atianxray/lang/en_us.json b/src/main/resources/assets/atianxray/lang/en_us.json index a706909..92f7f8e 100644 --- a/src/main/resources/assets/atianxray/lang/en_us.json +++ b/src/main/resources/assets/atianxray/lang/en_us.json @@ -82,6 +82,32 @@ "x13.mod.location.opt.minutesPadding": "Minutes(with 0 Padding)", "x13.mod.location.opt.secondsPadding": "Seconds(with 0 Padding)", "x13.mod.location.opt.isSlime": "Is Slime Chunk", + "x13.mod.location.opt.nutrition": "Nutrition", + "x13.mod.location.opt.saturation": "Saturation", + "x13.mod.location.opt.mainhandName": "Mainhand Item Name", + "x13.mod.location.opt.mainhandTranslate": "Mainhand Item Name (Translated)", + "x13.mod.location.opt.mainhandDurability": "Mainhand Item Durability/Heal Nutrition", + "x13.mod.location.opt.mainhandMaxDurability": "Mainhand Item Max Durability/After Eating Nutrition", + "x13.mod.location.opt.offhandName": "Offhand Item Name", + "x13.mod.location.opt.offhandTranslate": "Offhand Item Name (Translated)", + "x13.mod.location.opt.offhandDurability": "Offhand Item Durability/Heal Nutrition", + "x13.mod.location.opt.offhandMaxDurability": "Offhand Item Max Durability/After Eating Nutrition", + "x13.mod.location.opt.helmetName": "Helmet Item Name", + "x13.mod.location.opt.helmetTranslate": "Helmet Item Name (Translated)", + "x13.mod.location.opt.helmetDurability": "Helmet Durability", + "x13.mod.location.opt.helmetMaxDurability": "Helmet Max Durability", + "x13.mod.location.opt.chestplateName": "Chestplate Item Name", + "x13.mod.location.opt.chestplateTranslate": "Chestplate Item Name (Translated)", + "x13.mod.location.opt.chestplateDurability": "Chestplate Durability", + "x13.mod.location.opt.chestplateMaxDurability": "Chestplate Max Durability", + "x13.mod.location.opt.leggingsName": "leggings Item Name", + "x13.mod.location.opt.leggingsTranslate": "leggings Item Name (Translated)", + "x13.mod.location.opt.leggingsDurability": "leggings Durability", + "x13.mod.location.opt.leggingsMaxDurability": "leggings Max Durability", + "x13.mod.location.opt.bootsName": "boots Item Name", + "x13.mod.location.opt.bootsTranslate": "boots Item Name (Translated)", + "x13.mod.location.opt.bootsDurability": "boots Durability", + "x13.mod.location.opt.bootsMaxDurability": "boots Durability", "x13.mod.location.opt.lineFeed": "Start New Line", "x13.mod.location.opt.valueSeparate": "Separate Value", diff --git a/src/main/resources/assets/atianxray/lang/ja_jp.json b/src/main/resources/assets/atianxray/lang/ja_jp.json index 8a2306d..1ff2134 100644 --- a/src/main/resources/assets/atianxray/lang/ja_jp.json +++ b/src/main/resources/assets/atianxray/lang/ja_jp.json @@ -32,6 +32,7 @@ "x13.mod.esp.template.wither": "ウィザー", "x13.mod.esp.template.aggresive": "敵対Mob", "x13.mod.esp.template.passive": "友好Mob", + "x13.mod.esp.template.chest": "チェスト", "x13.mod.esp.tracer": "ガイド線", "x13.mod.esp.selector": "エンティティを選択", @@ -40,6 +41,20 @@ "x13.mod.location.option": "オプション", "x13.mod.location.showmodes": "モードを表示", "x13.mod.location.format": "フォーマット", + "x13.mod.location.hud": "HUD表示位置", + "x13.mod.location.hud.shift.x": "X軸間隔", + "x13.mod.location.hud.shift.y": "Y軸間隔", + "x13.mod.location.hud.fontSize": "フォントサイズ", + "x13.mod.location.hud.corner": "HUD表示基準位置", + "x13.mod.location.hud.corner.top.left": "左上", + "x13.mod.location.hud.corner.top.center": "中央上", + "x13.mod.location.hud.corner.top.right": "右上", + "x13.mod.location.hud.corner.middle.left": "左中央", + "x13.mod.location.hud.corner.middle.center": "画面中央", + "x13.mod.location.hud.corner.middle.right": "右中央", + "x13.mod.location.hud.corner.bottom.left": "左下", + "x13.mod.location.hud.corner.bottom.center": "中央下", + "x13.mod.location.hud.corner.bottom.right": "右下", "x13.mod.location.opt.x": "X座標", "x13.mod.location.opt.y": "Y座標", "x13.mod.location.opt.z": "Z座標", @@ -48,6 +63,7 @@ "x13.mod.location.opt.fz": "Z座標(整数表現)", "x13.mod.location.opt.name": "プレイヤー名", "x13.mod.location.opt.fps": "FPS", + "x13.mod.location.opt.fps.debug": "FPS(デバッグ)", "x13.mod.location.opt.biome": "バイオーム", "x13.mod.location.opt.biomeCategory": "バイオーム分類", "x13.mod.location.opt.biomeTranslate": "バイオーム(日本語)", @@ -66,6 +82,32 @@ "x13.mod.location.opt.minutesPadding": "分(0埋めあり)", "x13.mod.location.opt.secondsPadding": "秒(0埋めあり)", "x13.mod.location.opt.isSlime": "スライムチャンク", + "x13.mod.location.opt.nutrition": "満腹度", + "x13.mod.location.opt.saturation": "隠し満腹度", + "x13.mod.location.opt.mainhandName": "メインハンドアイテム名", + "x13.mod.location.opt.mainhandTranslate": "メインハンドアイテム名(日本語)", + "x13.mod.location.opt.mainhandDurability": "メインハンドアイテム耐久力/満腹度回復量", + "x13.mod.location.opt.mainhandMaxDurability": "メインハンドアイテム最大耐久力/使用後満腹度", + "x13.mod.location.opt.offhandName": "オフハンドアイテム名", + "x13.mod.location.opt.offhandTranslate": "オフハンドアイテム名(日本語)", + "x13.mod.location.opt.offhandDurability": "オフハンドアイテム耐久力/満腹度回復量", + "x13.mod.location.opt.offhandMaxDurability": "オフハンドアイテム最大耐久力/使用後満腹度", + "x13.mod.location.opt.helmetName": "ヘルメット名", + "x13.mod.location.opt.helmetTranslate": "ヘルメット名(日本語)", + "x13.mod.location.opt.helmetDurability": "ヘルメット耐久力", + "x13.mod.location.opt.helmetMaxDurability": "ヘルメット最大耐久力", + "x13.mod.location.opt.chestplateName": "チェストプレート名", + "x13.mod.location.opt.chestplateTranslate": "チェストプレート(日本語)", + "x13.mod.location.opt.chestplateDurability": "チェストプレート耐久力", + "x13.mod.location.opt.chestplateMaxDurability": "チェストプレート最大耐久力", + "x13.mod.location.opt.leggingsName": "レギンス名", + "x13.mod.location.opt.leggingsTranslate": "レギンス(日本語)", + "x13.mod.location.opt.leggingsDurability": "レギンス耐久力", + "x13.mod.location.opt.leggingsMaxDurability": "レギンス最大耐久力", + "x13.mod.location.opt.bootsName": "ブーツ名", + "x13.mod.location.opt.bootsTranslate": "ブーツ(日本語)", + "x13.mod.location.opt.bootsDurability": "ブーツ耐久力", + "x13.mod.location.opt.bootsMaxDurability": "ブーツ最大耐久力", "x13.mod.location.opt.lineFeed": "改行", "x13.mod.location.opt.valueSeparate": "変数名の分割", @@ -91,6 +133,16 @@ "x13.mod.link.issue": "バグトラッカ", "x13.mod.by": "By %s", + "x13.mod.config.search": "探知", + "x13.mod.config.espDamage": "ダメージ表示", + "x13.mod.config.blockEsp": "ブロック探知", + "x13.mod.config.border": "探知範囲", + "x13.mod.config.override": "上書き設定", + "x13.mod.config.fly": "飛行モード", + "x13.mod.config.zoom": "拡大", + "x13.mod.config.espline": "ガイド線幅", + "x13.mod.config.skin": "スキン", + "x13.mod.on": "On", "x13.mod.off": "Off", "key.categories.xray": "透視" diff --git a/src/main/resources/atianxray.mixins.json b/src/main/resources/atianxray.mixins.json index 103af91..39e5bac 100644 --- a/src/main/resources/atianxray.mixins.json +++ b/src/main/resources/atianxray.mixins.json @@ -6,6 +6,7 @@ "mixins": [], "refmap": "mixins.atianxray.refmap.json", "client": [ + "MixinBlock_rubidium", "MixinBlock", "MixinLightmapTextureManager", "MixinMinecraftClient"