diff --git a/.gitignore b/.gitignore index 77da9b2..3a51eda 100644 --- a/.gitignore +++ b/.gitignore @@ -46,5 +46,6 @@ test.java cambios.md # no está terminado src/main/java/me/retucio/camtweaks/module/modules/TooltipsPlus.java - +src/main/java/me/retucio/camtweaks/util/RenderUtil.java +src/main/java/me/retucio/camtweaks/util/Layers.java remappedSrc/ \ No newline at end of file diff --git a/build.gradle b/build.gradle index 0920f84..5a9eea2 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,6 @@ dependencies { mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" } diff --git a/cambios.md b/cambios.md index 8140055..f16b156 100644 --- a/cambios.md +++ b/cambios.md @@ -1,19 +1,21 @@ -# v1.5 +# v1.6 ## novedades -sigo vivo (creo) +todo un sistema de renderizado skiddeado de https://github.com/mioclient/oyvey-ported/ ### adiciones -- editor de hud bastante básico pero por lo general funcional (`pág. arriba` por defecto). viene con muchos bugs, ojalá me caiga un rayo. +- marca de agua en la pantalla de inicio porque molo un montón +- prev. de shulkers: te permite previsualizar el contenido de cajas de shulker desde el inventario +- puntos de desconexión: te muestra el punto donde un jugador se desconecta ### arreglos / mejoras -- ya no salta un error al hacer una captura con los módulos `capturas de pantalla` y `chat plus` activos -- ahora la telemetría (abuso de privacidad al usuario de microshit) está desactivado por huevos. si quieres activarlo te jodes. -- ahora ya no puedes abrir interfaces del mod si no estás en un mundo -- mejorada la seguridad de algunas operaciones +- el scroll del freecam ahora requiere una tecla (para mayor comodidad) +- ahora puedes ver tu propio nametag (nametags -> mostrar propio) +- opción para desactivar hud en chat agregada +- arreglos menores varios ## problemas reconocidos diff --git a/credits.txt b/credits.txt index bb21c9b..8089650 100644 --- a/credits.txt +++ b/credits.txt @@ -1,5 +1,8 @@ -meteor client dev team -oyvey client (1.21 port by mioclient) -lennyboi (youtube) -packbar by cattyn on github -shotify mod \ No newline at end of file +Meteor Client: https://github.com/MeteorDevelopment/meteor-client | https://meteorclient.com +OyVey Port: https://github.com/mioclient/oyvey-ported/ +Lenny Boi: https://www.youtube.com/@lennyboi7195 +Shotify: https://modrinth.com/mod/shotify +No Telemetry: https://modrinth.com/mod/no-telemetry + +probablemente más pero como tengo demencia se me olvida +si quieres que te acredite mándame un mensaje en discord (username: retucio) y sin problemas :) \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 584025c..b1dd9b1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,18 +1,13 @@ -# Done to increase the memory available to gradle. org.gradle.jvmargs=-Xmx1G org.gradle.parallel=true -# Fabric Properties -# check these on https://fabricmc.net/develop minecraft_version=1.21.10 yarn_mappings=1.21.10+build.2 loader_version=0.17.3 loom_version=1.11-SNAPSHOT -# Mod Properties -mod_version=1.5 +mod_version=1.6 maven_group=me.retucio archives_base_name=camtweaks -# Dependencies fabric_version=0.135.0+1.21.10 \ No newline at end of file diff --git a/src/main/java/me/retucio/camtweaks/CameraTweaks.java b/src/main/java/me/retucio/camtweaks/CameraTweaks.java index 7f9b32c..50c2c57 100644 --- a/src/main/java/me/retucio/camtweaks/CameraTweaks.java +++ b/src/main/java/me/retucio/camtweaks/CameraTweaks.java @@ -17,8 +17,8 @@ import me.retucio.camtweaks.module.Module; import me.retucio.camtweaks.module.ModuleManager; import me.retucio.camtweaks.module.modules.HUD; -import me.retucio.camtweaks.ui.ClickGUI; -import me.retucio.camtweaks.ui.HudEditorScreen; +import me.retucio.camtweaks.ui.screen.ClickGUI; +import me.retucio.camtweaks.ui.screen.HudEditorScreen; import me.retucio.camtweaks.ui.HudRenderer; import me.retucio.camtweaks.ui.buttons.BindButton; import me.retucio.camtweaks.ui.buttons.SettingButton; @@ -34,10 +34,10 @@ import me.retucio.camtweaks.util.MiscUtil; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.TitleScreen; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -48,15 +48,28 @@ import org.lwjgl.glfw.GLFW; public class CameraTweaks implements ClientModInitializer { // cosas necesarias - public static final String MOD_ID = "camtweaks"; public static final CameraTweaks INSTANCE = new CameraTweaks(); - public static final Logger LOGGER = LogManager.getLogger(CameraTweaks.class); public static final EventBus EVENT_BUS = new EventBus(); + public static final Logger LOGGER = LogManager.getLogger(CameraTweaks.class); public static MinecraftClient mc; + // id y versión + public static final String MOD_ID = "camtweaks"; + public static final String MOD_VERSION; + + static { + MOD_VERSION = FabricLoader.getInstance().getModContainer(MOD_ID) + .orElseThrow() + .getMetadata() + .getVersion() + .getFriendlyString(); + } + + private Screen prevScreen; public boolean settingsApplied = false; + @Override public void onInitializeClient() { // por algún motivo aunque lo añada a los args de la JVM sigue siendo true a menos que haga esto??? puta vida diff --git a/src/main/java/me/retucio/camtweaks/config/ClientConfig.java b/src/main/java/me/retucio/camtweaks/config/ClientConfig.java index 155c59e..c314281 100644 --- a/src/main/java/me/retucio/camtweaks/config/ClientConfig.java +++ b/src/main/java/me/retucio/camtweaks/config/ClientConfig.java @@ -3,7 +3,7 @@ package me.retucio.camtweaks.config; import me.retucio.camtweaks.event.SubscribeEvent; import me.retucio.camtweaks.event.events.camtweaks.*; import me.retucio.camtweaks.module.settings.*; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/me/retucio/camtweaks/config/ConfigManager.java b/src/main/java/me/retucio/camtweaks/config/ConfigManager.java index af43552..41b09f5 100644 --- a/src/main/java/me/retucio/camtweaks/config/ConfigManager.java +++ b/src/main/java/me/retucio/camtweaks/config/ConfigManager.java @@ -6,7 +6,7 @@ import me.retucio.camtweaks.CameraTweaks; import me.retucio.camtweaks.module.Module; import me.retucio.camtweaks.module.ModuleManager; import me.retucio.camtweaks.module.settings.*; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; import me.retucio.camtweaks.ui.frames.SettingsFrame; diff --git a/src/main/java/me/retucio/camtweaks/event/events/RenderWorldEvent.java b/src/main/java/me/retucio/camtweaks/event/events/RenderWorldEvent.java new file mode 100644 index 0000000..ba862e1 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/event/events/RenderWorldEvent.java @@ -0,0 +1,31 @@ +package me.retucio.camtweaks.event.events; + +import me.retucio.camtweaks.event.Event; +import net.minecraft.client.render.Camera; +import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.util.math.MatrixStack; + +public class RenderWorldEvent extends Event { + + private final MatrixStack matrices; + private final RenderTickCounter tc; + private final Camera camera; + + public RenderWorldEvent(MatrixStack matrices, RenderTickCounter tc, Camera camera) { + this.matrices = matrices; + this.tc = tc; + this.camera = camera; + } + + public MatrixStack getMatrices() { + return matrices; + } + + public RenderTickCounter getTickCounter() { + return tc; + } + + public Camera getCamera() { + return camera; + } +} diff --git a/src/main/java/me/retucio/camtweaks/event/events/camtweaks/AddEntityEvent.java b/src/main/java/me/retucio/camtweaks/event/events/camtweaks/AddEntityEvent.java new file mode 100644 index 0000000..2e580ec --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/event/events/camtweaks/AddEntityEvent.java @@ -0,0 +1,17 @@ +package me.retucio.camtweaks.event.events.camtweaks; + +import me.retucio.camtweaks.event.Event; +import net.minecraft.entity.Entity; + +public class AddEntityEvent extends Event { + + private final Entity entity; + + public AddEntityEvent(Entity entity) { + this.entity = entity; + } + + public Entity getEntity() { + return entity; + } +} diff --git a/src/main/java/me/retucio/camtweaks/event/events/camtweaks/RemoveEntityEvent.java b/src/main/java/me/retucio/camtweaks/event/events/camtweaks/RemoveEntityEvent.java new file mode 100644 index 0000000..b2bf812 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/event/events/camtweaks/RemoveEntityEvent.java @@ -0,0 +1,17 @@ +package me.retucio.camtweaks.event.events.camtweaks; + +import me.retucio.camtweaks.event.Event; +import net.minecraft.entity.Entity; + +public class RemoveEntityEvent extends Event { + + private final Entity entity; + + public RemoveEntityEvent(Entity entity) { + this.entity = entity; + } + + public Entity getEntity() { + return entity; + } +} diff --git a/src/main/java/me/retucio/camtweaks/mixin/ClientWorldMixin.java b/src/main/java/me/retucio/camtweaks/mixin/ClientWorldMixin.java new file mode 100644 index 0000000..b1a9768 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/mixin/ClientWorldMixin.java @@ -0,0 +1,32 @@ +package me.retucio.camtweaks.mixin; + +import me.retucio.camtweaks.event.events.camtweaks.AddEntityEvent; +import me.retucio.camtweaks.event.events.camtweaks.RemoveEntityEvent; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static me.retucio.camtweaks.CameraTweaks.EVENT_BUS; + +@Mixin(ClientWorld.class) +public abstract class ClientWorldMixin { + + @Shadow @Nullable + public abstract Entity getEntityById(int id); + + @Inject(method = "addEntity", at = @At("HEAD")) + private void onEntityAdded(Entity entity, CallbackInfo ci) { + if (entity != null) EVENT_BUS.post(new AddEntityEvent(entity)); + } + + @Inject(method = "removeEntity", at = @At("HEAD")) + private void onRemoveEntity(int entityId, Entity.RemovalReason removalReason, CallbackInfo ci) { + Entity entity = getEntityById(entityId); + if (entity != null) EVENT_BUS.post(new RemoveEntityEvent(entity)); + } +} diff --git a/src/main/java/me/retucio/camtweaks/mixin/GameRendererMixin.java b/src/main/java/me/retucio/camtweaks/mixin/GameRendererMixin.java index 4344160..f64126a 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/GameRendererMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/GameRendererMixin.java @@ -1,20 +1,23 @@ package me.retucio.camtweaks.mixin; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; + import me.retucio.camtweaks.event.events.GetFOVEvent; import me.retucio.camtweaks.module.ModuleManager; import me.retucio.camtweaks.module.modules.Freecam; import me.retucio.camtweaks.module.modules.NoRender; import me.retucio.camtweaks.module.modules.Zoom; import me.retucio.camtweaks.util.interfaces.IVec3d; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.BufferBuilderStorage; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.block.BlockRenderManager; import net.minecraft.client.render.item.HeldItemRenderer; import net.minecraft.entity.Entity; + import org.joml.Matrix4f; import org.joml.Vector3d; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -23,9 +26,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import static me.retucio.camtweaks.CameraTweaks.EVENT_BUS; + @Mixin(GameRenderer.class) public abstract class GameRendererMixin { diff --git a/src/main/java/me/retucio/camtweaks/mixin/LivingEntityRendererMixin.java b/src/main/java/me/retucio/camtweaks/mixin/LivingEntityRendererMixin.java index 4822dfc..7d2332f 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/LivingEntityRendererMixin.java @@ -8,7 +8,6 @@ import me.retucio.camtweaks.module.modules.Freecam; import me.retucio.camtweaks.module.modules.Nametags; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -19,6 +18,9 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import static me.retucio.camtweaks.CameraTweaks.mc; @Mixin(LivingEntityRenderer.class) public abstract class LivingEntityRendererMixin { @@ -52,4 +54,14 @@ public abstract class LivingEntityRendererMixin { if (nametags.isEnabled() && livingEntity instanceof PlayerEntity) return nametags.entities.isEnabled(EntityType.PLAYER) && original; return original; } + + @Inject(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;D)Z", at = @At("RETURN"), cancellable = true) + private void renderSelfNametag(T livingEntity, double d, CallbackInfoReturnable cir) { + if (livingEntity instanceof PlayerEntity player) { + if (player == mc.player && nametags.showSelf.isEnabled()) { + cir.setReturnValue(true); + cir.cancel(); + } + } + } } diff --git a/src/main/java/me/retucio/camtweaks/mixin/TitleScreenMixin.java b/src/main/java/me/retucio/camtweaks/mixin/TitleScreenMixin.java new file mode 100644 index 0000000..350acd1 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/mixin/TitleScreenMixin.java @@ -0,0 +1,33 @@ +package me.retucio.camtweaks.mixin; + +import me.retucio.camtweaks.CameraTweaks; +import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; +import net.minecraft.SharedConstants; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.TitleScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.awt.*; + +import static me.retucio.camtweaks.CameraTweaks.mc; + +@Mixin(TitleScreen.class) +public abstract class TitleScreenMixin { + + // marca de agua porque soy superguay + @Inject(method = "render", at = @At("TAIL")) + private void renderWatermark(DrawContext context, int mouseX, int mouseY, float deltaTicks, CallbackInfo ci) { + String watermark = CameraTweaks.MOD_ID + "_v" + CameraTweaks.MOD_VERSION + "_" + SharedConstants.getGameVersion().name(); + context.drawText(mc.textRenderer, watermark, + mc.getWindow().getScaledWidth() - mc.textRenderer.getWidth(watermark) - 2, 2, + new Color((int) ClientSettingsFrame.guiSettings.red.getDefaultValue(), + (int) ClientSettingsFrame.guiSettings.green.getDefaultValue(), + (int) ClientSettingsFrame.guiSettings.blue.getDefaultValue(), + (int) ClientSettingsFrame.guiSettings.alpha.getDefaultValue() + ).getRGB(), false + ); + } +} diff --git a/src/main/java/me/retucio/camtweaks/mixin/WorldRendererMixin.java b/src/main/java/me/retucio/camtweaks/mixin/WorldRendererMixin.java index 9a107ba..daec09b 100644 --- a/src/main/java/me/retucio/camtweaks/mixin/WorldRendererMixin.java +++ b/src/main/java/me/retucio/camtweaks/mixin/WorldRendererMixin.java @@ -1,16 +1,25 @@ package me.retucio.camtweaks.mixin; +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import me.retucio.camtweaks.CameraTweaks; +import me.retucio.camtweaks.event.events.RenderWorldEvent; import me.retucio.camtweaks.module.ModuleManager; import me.retucio.camtweaks.module.modules.BlockOutline; import me.retucio.camtweaks.module.modules.Freecam; import me.retucio.camtweaks.module.modules.NoRender; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.*; import net.minecraft.client.render.state.WorldRenderState; +import net.minecraft.client.util.ObjectAllocator; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.ColorHelper; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.profiler.Profiler; +import org.joml.Matrix4f; +import org.joml.Vector4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -21,6 +30,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.awt.*; +import static me.retucio.camtweaks.CameraTweaks.EVENT_BUS; +import static me.retucio.camtweaks.CameraTweaks.mc; + @Mixin(WorldRenderer.class) public abstract class WorldRendererMixin { @@ -29,6 +41,23 @@ public abstract class WorldRendererMixin { return ModuleManager.INSTANCE.getModuleByClass(Freecam.class).isEnabled() || spectator; } + @Inject(method = "render", at = @At("RETURN")) + private void render(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera, Matrix4f positionMatrix, Matrix4f matrix4f, Matrix4f projectionMatrix, GpuBufferSlice fogBuffer, Vector4f fogColor, boolean renderSky, CallbackInfo ci, @Local Profiler profiler) { + if (mc == null || mc.world == null) return; + + MatrixStack matrices = new MatrixStack(); + matrices.push(); + + matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(camera.getPitch())); + matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(camera.getYaw() + 180f)); + + profiler.push(CameraTweaks.MOD_ID + "-3d"); + EVENT_BUS.post(new RenderWorldEvent(matrices, tickCounter, camera)); + + profiler.pop(); + matrices.pop(); + } + @Inject(method = "renderTargetBlockOutline", at = @At("HEAD"), cancellable = true) private void noRenderBlockOutlinesFreecam(VertexConsumerProvider.Immediate immediate, MatrixStack matrices, boolean renderBlockOutline, WorldRenderState renderStates, CallbackInfo ci) { Freecam freecam = ModuleManager.INSTANCE.getModuleByClass(Freecam.class); diff --git a/src/main/java/me/retucio/camtweaks/mixin/accessor/HandledScreenAccessor.java b/src/main/java/me/retucio/camtweaks/mixin/accessor/HandledScreenAccessor.java new file mode 100644 index 0000000..4f1aa3a --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/mixin/accessor/HandledScreenAccessor.java @@ -0,0 +1,13 @@ +package me.retucio.camtweaks.mixin.accessor; + +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.screen.slot.Slot; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(HandledScreen.class) +public interface HandledScreenAccessor { + + @Accessor("focusedSlot") + Slot getFocusedSlot(); +} diff --git a/src/main/java/me/retucio/camtweaks/module/ModuleManager.java b/src/main/java/me/retucio/camtweaks/module/ModuleManager.java index a4bfc94..e7b62df 100644 --- a/src/main/java/me/retucio/camtweaks/module/ModuleManager.java +++ b/src/main/java/me/retucio/camtweaks/module/ModuleManager.java @@ -37,11 +37,13 @@ public class ModuleManager { modules.add(new Fullbright()); modules.add(new HandView()); modules.add(new HUD()); + modules.add(new LogoutSpots()); modules.add(new Nametags()); modules.add(new NoRender()); modules.add(new PerspectivePlus()); modules.add(new PortalGUI()); modules.add(new ScreenshotPlus()); + modules.add(new ShulkerPeek()); modules.add(new TimeChanger()); // modules.add(new TooltipsPlus()); modules.add(new Zoom()); diff --git a/src/main/java/me/retucio/camtweaks/module/modules/CritsPlus.java b/src/main/java/me/retucio/camtweaks/module/modules/CritsPlus.java index bb71255..65798b4 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/CritsPlus.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/CritsPlus.java @@ -23,7 +23,7 @@ public class CritsPlus extends Module { public NumberSetting multiplier; // no sé dónde se calcula cuántas partículas aparecen :/ public NumberSetting velocityMultipler = addSetting(new NumberSetting("dispersión", "multiplicador de la velocidad de dispersión", 1, 0, 10, 0.1)); public NumberSetting gravity = addSetting(new NumberSetting("gravedad", "multiplicador de fuerza de gravedad", 1, 0, 10, 0.1)); - public NumberSetting maxAge = addSetting(new NumberSetting("vida máxima", "cuánto persiste la partícula", 4, 0, 50, 1)); + public NumberSetting maxAge = addSetting(new NumberSetting("vida máxima", "cuánto persiste la partícula", 10, 0, 50, 1)); public BooleanSetting collide = addSetting(new BooleanSetting("colisionar", "colisionar con bloques", false)); public CritsPlus() { diff --git a/src/main/java/me/retucio/camtweaks/module/modules/FakePlayer.java b/src/main/java/me/retucio/camtweaks/module/modules/FakePlayer.java index 27edae9..b779b70 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/FakePlayer.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/FakePlayer.java @@ -5,6 +5,7 @@ import me.retucio.camtweaks.module.Module; import me.retucio.camtweaks.module.settings.StringSetting; import net.minecraft.client.network.OtherClientPlayerEntity; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; import java.util.UUID; @@ -21,24 +22,28 @@ public class FakePlayer extends Module { @Override public void onEnable() { if (mc.world == null) return; - - player = new OtherClientPlayerEntity(mc.world, new GameProfile(UUID.randomUUID(), name.getValue())); -// player.copyPositionAndRotation(mc.player); - player.copyFrom(mc.player); - - mc.world.addEntity(player); - + addPlayer(mc.player, name.getValue()); super.onEnable(); } @Override public void onDisable() { if (mc.world == null || player == null) return; + removePlayer(); + super.onDisable(); + } + public OtherClientPlayerEntity addPlayer(PlayerEntity playerToCopy, String dummyName) { + player = new OtherClientPlayerEntity(mc.world, new GameProfile(UUID.randomUUID(), dummyName)); + player.copyFrom(playerToCopy); + player.setCustomNameVisible(true); + mc.world.addEntity(player); + return player; + } + + public void removePlayer() { player.setRemoved(Entity.RemovalReason.KILLED); player.onRemoved(); player = null; - - super.onDisable(); } } diff --git a/src/main/java/me/retucio/camtweaks/module/modules/Freecam.java b/src/main/java/me/retucio/camtweaks/module/modules/Freecam.java index a811b97..115e8ad 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/Freecam.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/Freecam.java @@ -5,6 +5,7 @@ import me.retucio.camtweaks.event.SubscribeEvent; import me.retucio.camtweaks.event.events.*; import me.retucio.camtweaks.module.Module; import me.retucio.camtweaks.module.settings.BooleanSetting; +import me.retucio.camtweaks.module.settings.KeySetting; import me.retucio.camtweaks.module.settings.NumberSetting; import me.retucio.camtweaks.util.ChatUtil; import me.retucio.camtweaks.util.KeyUtil; @@ -30,7 +31,6 @@ import org.lwjgl.glfw.GLFW; * @see me.retucio.camtweaks.mixin.CameraMixin * @see me.retucio.camtweaks.mixin.ChunkBorderDebugRendererMixin * @see me.retucio.camtweaks.mixin.ClientPlayerInteractionManagerMixin - * @see me.retucio.camtweaks.mixin.CompassStateMixin * @see me.retucio.camtweaks.mixin.EntityMixin * @see me.retucio.camtweaks.mixin.GameRendererMixin * @see me.retucio.camtweaks.mixin.KeyInputMixin @@ -53,13 +53,13 @@ public class Freecam extends Module { public NumberSetting speedSetting = addSetting(new NumberSetting( "velocidad", "velocidad de movimiento de la cámara", 1, 0, 10, 0.2)); + + public KeySetting scrollKey = addSetting(new KeySetting("tecla del scroll", "tecla a mantener pulsada para cambiar velocidad con el scroll", GLFW.GLFW_KEY_LEFT_CONTROL)); public NumberSetting scrollSens = addSetting(new NumberSetting( "sensibilidad del scroll", "sensibilidad de la rueda del ratón para modificar la velocidad, 0 para desactivar", - 0, 0, 2, 0.1)); + 1, 0, 2, 0.1)); - // rotate? - private final Vector3d prevPos = new Vector3d(); private float prevYaw, prevPitch; @@ -270,7 +270,7 @@ public class Freecam extends Module { @SubscribeEvent private void onMouseScroll(MouseScrollEvent event) { - if (scrollSens.getValue() > 0 && mc.currentScreen == null) { + if (scrollSens.getValue() > 0 && mc.currentScreen == null && KeyUtil.isKeyDown(scrollKey.getKey())) { speed += event.getVertical() / 4 * (scrollSens.getValue() * speed); if (speed < 0.1) speed = 0.1; event.cancel(); diff --git a/src/main/java/me/retucio/camtweaks/module/modules/HUD.java b/src/main/java/me/retucio/camtweaks/module/modules/HUD.java index 2bd03df..79d82a1 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/HUD.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/HUD.java @@ -2,12 +2,13 @@ package me.retucio.camtweaks.module.modules; import me.retucio.camtweaks.module.Module; import me.retucio.camtweaks.module.settings.*; +import me.retucio.camtweaks.ui.screen.HudEditorScreen; import org.lwjgl.glfw.GLFW; /** lógica del HUD manejada en: * @see me.retucio.camtweaks.ui.HudRenderer * @see me.retucio.camtweaks.ui.widgets.HudElement - * @see me.retucio.camtweaks.ui.HudEditorScreen + * @see HudEditorScreen */ public class HUD extends Module { @@ -27,6 +28,8 @@ public class HUD extends Module { // ajustes public BooleanSetting showOnF3 = addSetting(new BooleanSetting("mostrar en F3", "renderizar HUD en el menú de debug", false)); + public BooleanSetting showOnChat = addSetting(new BooleanSetting("mostrar en chat", "renderizar HUD en la pantalla del chat", false)); + public BooleanSetting shadow = addSetting(new BooleanSetting("sombra", "texto con sombra", true)); public NumberSetting timezone = addSetting(new NumberSetting("zona horaria", "zona horaria en UTC+n", 1, -6, 6, 1)); public EnumSetting timeFormat = addSetting(new EnumSetting<>("formato de la hora", "12h o 24h", TimeFormat.class, TimeFormat.TWENTY_FOUR_HOUR)); @@ -36,10 +39,10 @@ public class HUD extends Module { super("HUD", "superposición de la pantalla con info. adicional"); rainbow.onUpdate(v -> { + rainbowSpeed.setVisible(v); red.setVisible(!v); green.setVisible(!v); blue.setVisible(!v); - rainbowSpeed.setVisible(v); }); } diff --git a/src/main/java/me/retucio/camtweaks/module/modules/LogoutSpots.java b/src/main/java/me/retucio/camtweaks/module/modules/LogoutSpots.java new file mode 100644 index 0000000..beb05e5 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/LogoutSpots.java @@ -0,0 +1,119 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.event.SubscribeEvent; +import me.retucio.camtweaks.event.events.KeyEvent; +import me.retucio.camtweaks.event.events.RenderWorldEvent; +import me.retucio.camtweaks.event.events.camtweaks.AddEntityEvent; +import me.retucio.camtweaks.event.events.camtweaks.RemoveEntityEvent; +import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.module.ModuleManager; +import me.retucio.camtweaks.module.settings.BooleanSetting; +import me.retucio.camtweaks.module.settings.KeySetting; +import me.retucio.camtweaks.module.settings.NumberSetting; +import me.retucio.camtweaks.util.render.RenderUtil; + +import net.minecraft.client.network.OtherClientPlayerEntity; +import net.minecraft.client.render.*; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; + +import org.joml.*; +import org.lwjgl.glfw.GLFW; + +import java.awt.*; +import java.time.Instant; +import java.time.LocalTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + + +public class LogoutSpots extends Module { + + public KeySetting clearBoxesKey = addSetting(new KeySetting("vaciar cajas", "tecla asignada a olvidar todas las cajas activas", GLFW.GLFW_KEY_UNKNOWN)); + + public BooleanSetting filledBox = addSetting(new BooleanSetting("caja rellena", "rellenar caja", true)); + public BooleanSetting outlineBox = addSetting(new BooleanSetting("caja de esquinas", "contorno de caja", true)); + + public NumberSetting red = addSetting(new NumberSetting("rojo", "cantidad de rojo", 200, 0, 255, 1)); + public NumberSetting green = addSetting(new NumberSetting("verde", "cantidad de verde", 90, 0, 255, 1)); + public NumberSetting blue = addSetting(new NumberSetting("azul", "cantidad de azul", 255, 0, 255, 1)); + public NumberSetting alpha = addSetting(new NumberSetting("opacidad", "antitransparencia", 50, 0, 255, 1)); + + public NumberSetting lineWidth = addSetting(new NumberSetting("grosor", "grosor de las líneas a dibujar", 2, 1, 10, 0.5f)); + + private final List boxes = new ArrayList<>(); + + public LogoutSpots() { + super("puntos de desconexión", "te muestra los puntos donde se desconectan los jugadores"); + } + + @SubscribeEvent + public void onWorldRender(RenderWorldEvent event) { + if (mc.player == null || mc.world == null) return; + + int r = red.getIntValue(); + int g = green.getIntValue(); + int b = blue.getIntValue(); + int a = alpha.getIntValue(); + + MatrixStack matrices = event.getMatrices(); + + for (LogoutBox box : boxes) { + if (filledBox.isEnabled()) + RenderUtil.drawFilledBox(matrices, box.dummy.getBoundingBox(), new Color(r, g, b, a)); + if (outlineBox.isEnabled()) + RenderUtil.drawOutlineBox(matrices, box.dummy.getBoundingBox(), new Color(r, g, b, a), lineWidth.getFloatValue()); + } + } + + @SubscribeEvent + public void onEntityRemoved(RemoveEntityEvent event) { + if (event.getEntity() instanceof PlayerEntity player && player != mc.player) { + String playerName = player.getName().getString() + " (" + getLogoutTime(System.currentTimeMillis()) + ")"; + + boxes.add(new LogoutBox( + ModuleManager.INSTANCE.getModuleByClass(FakePlayer.class).addPlayer(player, playerName), + System.currentTimeMillis() + )); + } + } + + @SubscribeEvent + public void onEntityAdded(AddEntityEvent event) { + boxes.removeIf(box -> event.getEntity().getUuid().equals(box.dummy.getUuid())); + } + + @SubscribeEvent + public void onKey(KeyEvent event) { + if (event.getKey() == clearBoxesKey.getKey()) { + boxes.forEach(box -> { + box.dummy.setRemoved(Entity.RemovalReason.KILLED); + box.dummy.onRemoved(); + }); + + boxes.clear(); + } + } + + private String getLogoutTime(long logoutTimeMillis) { + HUD hud = ModuleManager.INSTANCE.getModuleByClass(HUD.class); + + Instant instant = Instant.ofEpochMilli(logoutTimeMillis); + + ZoneOffset offset = ZoneOffset.ofHours(hud.timezone.getIntValue()); + LocalTime logoutTime = LocalTime.from(instant.atOffset(offset)); + + boolean is24 = hud.timeFormat.is(HUD.TimeFormat.TWENTY_FOUR_HOUR); + DateTimeFormatter format = DateTimeFormatter.ofPattern(is24 ? "HH:mm" : "hh:mm a"); + + return logoutTime.format(format); + } + + public record LogoutBox( + OtherClientPlayerEntity dummy, + long logoutTime + ) {} +} diff --git a/src/main/java/me/retucio/camtweaks/module/modules/Nametags.java b/src/main/java/me/retucio/camtweaks/module/modules/Nametags.java index 40aa285..22eda29 100644 --- a/src/main/java/me/retucio/camtweaks/module/modules/Nametags.java +++ b/src/main/java/me/retucio/camtweaks/module/modules/Nametags.java @@ -51,6 +51,7 @@ public class Nametags extends Module { Lists.itemList, Lists.allTrue(Lists.itemList), Lists.itemNames)); public BooleanSetting showProjectileDamage = addSetting(new BooleanSetting("daño del proyectil", "muestra cuánto daño hace un proyectil en su nametag", true)); + public BooleanSetting showSelf = addSetting(new BooleanSetting("mostrar propio", "mostrar nametag propio", false)); public BooleanSetting distinguishBabies = addSetting(new BooleanSetting("distinguir bebés", "cambia el nametag cuando una entidad está en su fase bebé", false)); public BooleanSetting petOwner = addSetting(new BooleanSetting("mostrar dueño", "muestra el dueño de una mascota (no funciona en servers no premium)", false)); diff --git a/src/main/java/me/retucio/camtweaks/module/modules/ShulkerPeek.java b/src/main/java/me/retucio/camtweaks/module/modules/ShulkerPeek.java new file mode 100644 index 0000000..1a7e032 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/module/modules/ShulkerPeek.java @@ -0,0 +1,98 @@ +package me.retucio.camtweaks.module.modules; + +import me.retucio.camtweaks.event.SubscribeEvent; +import me.retucio.camtweaks.event.events.KeyEvent; +import me.retucio.camtweaks.mixin.accessor.HandledScreenAccessor; +import me.retucio.camtweaks.module.Module; +import me.retucio.camtweaks.module.settings.KeySetting; +import me.retucio.camtweaks.ui.screen.ShulkerPreviewScreen; + +import net.minecraft.block.ShulkerBoxBlock; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ContainerComponent; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.screen.slot.Slot; + +import org.lwjgl.glfw.GLFW; + +import java.awt.*; +import java.util.HashMap; + +public class ShulkerPeek extends Module { + + public KeySetting previewKey = addSetting(new KeySetting("tecla de previsualización", "tecla a mantener para previsualizar", GLFW.GLFW_KEY_LEFT_ALT)); + + public static final HashMap SHULKER_COLORS = new HashMap<>(); + + public ShulkerPeek() { + super("prev. de shulkers", "te permite previsualizar el contenido de shulkers desde el inventario"); + + // colores y tal (https://github.com/kgriff0n/shulker-preview) + SHULKER_COLORS.put(Items.SHULKER_BOX, new Color(142, 108, 142)); + SHULKER_COLORS.put(Items.WHITE_SHULKER_BOX, new Color(225, 230, 230)); + SHULKER_COLORS.put(Items.LIGHT_GRAY_SHULKER_BOX, new Color(137, 137, 128)); + SHULKER_COLORS.put(Items.GRAY_SHULKER_BOX, new Color(60, 65, 68)); + SHULKER_COLORS.put(Items.BLACK_SHULKER_BOX, new Color(31, 31, 35)); + SHULKER_COLORS.put(Items.BROWN_SHULKER_BOX, new Color(113, 70, 39)); + SHULKER_COLORS.put(Items.RED_SHULKER_BOX, new Color(152, 36, 34)); + SHULKER_COLORS.put(Items.ORANGE_SHULKER_BOX, new Color(241, 114, 15)); + SHULKER_COLORS.put(Items.YELLOW_SHULKER_BOX, new Color(249, 196, 35)); + SHULKER_COLORS.put(Items.LIME_SHULKER_BOX, new Color(110, 185, 24)); + SHULKER_COLORS.put(Items.GREEN_SHULKER_BOX, new Color(83, 107, 29)); + SHULKER_COLORS.put(Items.CYAN_SHULKER_BOX, new Color(22, 133, 144)); + SHULKER_COLORS.put(Items.LIGHT_BLUE_SHULKER_BOX, new Color(57, 177, 215)); + SHULKER_COLORS.put(Items.BLUE_SHULKER_BOX, new Color(49, 52, 152)); + SHULKER_COLORS.put(Items.PURPLE_SHULKER_BOX, new Color(113, 37, 166)); + SHULKER_COLORS.put(Items.MAGENTA_SHULKER_BOX, new Color(183, 61, 172)); + SHULKER_COLORS.put(Items.PINK_SHULKER_BOX, new Color(239, 135, 166)); + } + + @SubscribeEvent + public void onKey(KeyEvent event) { + if (mc.player == null) return; + if (event.getKey() != previewKey.getKey()) return; + + if (event.getAction() == GLFW.GLFW_PRESS) { + openPreviewScreen(); + return; + } + + if (event.getAction() == GLFW.GLFW_REPEAT) { + if (!(mc.currentScreen instanceof ShulkerPreviewScreen)) { + openPreviewScreen(); + return; + } + } + + if (event.getAction() == GLFW.GLFW_RELEASE) { + if (mc.currentScreen instanceof ShulkerPreviewScreen preview) + preview.close(); + } + } + + private void openPreviewScreen() { + if (!(mc.currentScreen instanceof HandledScreen prevScreen)) return; + + Slot focusedSlot = ((HandledScreenAccessor) prevScreen).getFocusedSlot(); + if (focusedSlot == null) return; + + ItemStack stack = focusedSlot.getStack(); + if (isShulkerEmpty(stack)) return; + + mc.setScreen(new ShulkerPreviewScreen(stack, prevScreen)); + } + + public static boolean isShulkerEmpty(ItemStack stack) { + if (!(stack.getItem() instanceof BlockItem blockItem)) return true; + if (!(blockItem.getBlock() instanceof ShulkerBoxBlock)) return true; + + ContainerComponent container = stack.get(DataComponentTypes.CONTAINER); + if (container == null) return true; + + return container.stream().allMatch(ItemStack::isEmpty); + } +} diff --git a/src/main/java/me/retucio/camtweaks/ui/HudRenderer.java b/src/main/java/me/retucio/camtweaks/ui/HudRenderer.java index 539a0e2..93f7e5c 100644 --- a/src/main/java/me/retucio/camtweaks/ui/HudRenderer.java +++ b/src/main/java/me/retucio/camtweaks/ui/HudRenderer.java @@ -1,6 +1,5 @@ package me.retucio.camtweaks.ui; -import me.retucio.camtweaks.CameraTweaks; import me.retucio.camtweaks.config.ConfigManager; import me.retucio.camtweaks.event.SubscribeEvent; import me.retucio.camtweaks.event.events.PacketEvent; @@ -8,10 +7,12 @@ import me.retucio.camtweaks.event.events.camtweaks.UpdateSettingEvent; import me.retucio.camtweaks.module.ModuleManager; import me.retucio.camtweaks.module.modules.Freecam; import me.retucio.camtweaks.module.modules.HUD; +import me.retucio.camtweaks.ui.screen.HudEditorScreen; import me.retucio.camtweaks.ui.widgets.HudElement; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.render.RenderTickCounter; import net.minecraft.util.math.Vec3d; @@ -131,6 +132,7 @@ public class HudRenderer { HUD hud = ModuleManager.INSTANCE.getModuleByClass(HUD.class); if (!hud.isEnabled()) return; if (mc.getDebugHud().shouldShowDebugHud() && !hud.showOnF3.isEnabled()) return; + if (mc.currentScreen instanceof ChatScreen && !hud.showOnChat.isEnabled()) return; initElements(); diff --git a/src/main/java/me/retucio/camtweaks/ui/buttons/BindButton.java b/src/main/java/me/retucio/camtweaks/ui/buttons/BindButton.java index d06f766..77960cb 100644 --- a/src/main/java/me/retucio/camtweaks/ui/buttons/BindButton.java +++ b/src/main/java/me/retucio/camtweaks/ui/buttons/BindButton.java @@ -1,18 +1,15 @@ package me.retucio.camtweaks.ui.buttons; import me.retucio.camtweaks.module.settings.KeySetting; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; import me.retucio.camtweaks.ui.frames.SettingsFrame; import me.retucio.camtweaks.util.ChatUtil; import me.retucio.camtweaks.util.Colors; -import me.retucio.camtweaks.util.KeyUtil; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.input.KeyInput; import net.minecraft.client.option.KeyBinding; import net.minecraft.client.resource.language.I18n; -import net.minecraft.text.Text; import net.minecraft.util.Formatting; import org.lwjgl.glfw.GLFW; diff --git a/src/main/java/me/retucio/camtweaks/ui/buttons/CycleButton.java b/src/main/java/me/retucio/camtweaks/ui/buttons/CycleButton.java index d09feb9..9c95ae0 100644 --- a/src/main/java/me/retucio/camtweaks/ui/buttons/CycleButton.java +++ b/src/main/java/me/retucio/camtweaks/ui/buttons/CycleButton.java @@ -1,7 +1,7 @@ package me.retucio.camtweaks.ui.buttons; import me.retucio.camtweaks.module.settings.EnumSetting; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.SettingsFrame; import me.retucio.camtweaks.util.Colors; import me.retucio.camtweaks.util.KeyUtil; diff --git a/src/main/java/me/retucio/camtweaks/ui/buttons/ListButton.java b/src/main/java/me/retucio/camtweaks/ui/buttons/ListButton.java index 937c9a3..6dca1e3 100644 --- a/src/main/java/me/retucio/camtweaks/ui/buttons/ListButton.java +++ b/src/main/java/me/retucio/camtweaks/ui/buttons/ListButton.java @@ -3,13 +3,11 @@ package me.retucio.camtweaks.ui.buttons; import me.retucio.camtweaks.module.Module; import me.retucio.camtweaks.module.settings.BooleanSetting; import me.retucio.camtweaks.module.settings.ListSetting; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.SettingsFrame; import me.retucio.camtweaks.util.Colors; -import me.retucio.camtweaks.util.KeyUtil; import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; -import org.lwjgl.glfw.GLFW; import java.util.*; @@ -60,7 +58,7 @@ public class ListButton extends SettingButton { @Override public void drawTooltip(DrawContext ctx, double mouseX, double mouseY) { if (isHovered(mouseX, mouseY)) - ctx.drawTooltip(Text.of(setting.getDescription() + "( " + countEnabled() + " de " + setting.getOptions().size() + ")"), (int) mouseX, (int) mouseY); + ctx.drawTooltip(Text.of(setting.getDescription() + " (" + countEnabled() + " de " + setting.getOptions().size() + ")"), (int) mouseX, (int) mouseY); } @Override diff --git a/src/main/java/me/retucio/camtweaks/ui/buttons/ModuleButton.java b/src/main/java/me/retucio/camtweaks/ui/buttons/ModuleButton.java index 040a31c..3e9835f 100644 --- a/src/main/java/me/retucio/camtweaks/ui/buttons/ModuleButton.java +++ b/src/main/java/me/retucio/camtweaks/ui/buttons/ModuleButton.java @@ -1,11 +1,10 @@ package me.retucio.camtweaks.ui.buttons; import me.retucio.camtweaks.module.Module; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.ModuleFrame; import me.retucio.camtweaks.util.Colors; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; // clase para el botón para cada módulo diff --git a/src/main/java/me/retucio/camtweaks/ui/buttons/SettingButton.java b/src/main/java/me/retucio/camtweaks/ui/buttons/SettingButton.java index b96794f..231aedb 100644 --- a/src/main/java/me/retucio/camtweaks/ui/buttons/SettingButton.java +++ b/src/main/java/me/retucio/camtweaks/ui/buttons/SettingButton.java @@ -1,10 +1,9 @@ package me.retucio.camtweaks.ui.buttons; import me.retucio.camtweaks.module.settings.AbstractSetting; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.SettingsFrame; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; // clase base para los botones de los ajustes diff --git a/src/main/java/me/retucio/camtweaks/ui/buttons/SliderButton.java b/src/main/java/me/retucio/camtweaks/ui/buttons/SliderButton.java index c7fa324..64e289c 100644 --- a/src/main/java/me/retucio/camtweaks/ui/buttons/SliderButton.java +++ b/src/main/java/me/retucio/camtweaks/ui/buttons/SliderButton.java @@ -3,14 +3,11 @@ package me.retucio.camtweaks.ui.buttons; import me.retucio.camtweaks.event.SubscribeEvent; import me.retucio.camtweaks.event.events.KeyEvent; import me.retucio.camtweaks.module.settings.NumberSetting; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; import me.retucio.camtweaks.ui.frames.SettingsFrame; import me.retucio.camtweaks.util.Colors; -import me.retucio.camtweaks.util.KeyUtil; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.text.Text; import org.lwjgl.glfw.GLFW; import java.awt.*; diff --git a/src/main/java/me/retucio/camtweaks/ui/buttons/TextButton.java b/src/main/java/me/retucio/camtweaks/ui/buttons/TextButton.java index 79bdede..40a621e 100644 --- a/src/main/java/me/retucio/camtweaks/ui/buttons/TextButton.java +++ b/src/main/java/me/retucio/camtweaks/ui/buttons/TextButton.java @@ -1,12 +1,11 @@ package me.retucio.camtweaks.ui.buttons; import me.retucio.camtweaks.module.settings.StringSetting; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.SettingsFrame; import me.retucio.camtweaks.util.Colors; import me.retucio.camtweaks.util.KeyUtil; import net.minecraft.client.gui.DrawContext; -import net.minecraft.text.Text; import org.lwjgl.glfw.GLFW; import static me.retucio.camtweaks.CameraTweaks.mc; diff --git a/src/main/java/me/retucio/camtweaks/ui/buttons/ToggleButton.java b/src/main/java/me/retucio/camtweaks/ui/buttons/ToggleButton.java index 3364532..7004447 100644 --- a/src/main/java/me/retucio/camtweaks/ui/buttons/ToggleButton.java +++ b/src/main/java/me/retucio/camtweaks/ui/buttons/ToggleButton.java @@ -1,14 +1,10 @@ package me.retucio.camtweaks.ui.buttons; import me.retucio.camtweaks.module.settings.BooleanSetting; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.SettingsFrame; import me.retucio.camtweaks.util.Colors; -import me.retucio.camtweaks.util.KeyUtil; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.text.Text; -import org.lwjgl.glfw.GLFW; import java.awt.*; diff --git a/src/main/java/me/retucio/camtweaks/ui/frames/ClientSettingsFrame.java b/src/main/java/me/retucio/camtweaks/ui/frames/ClientSettingsFrame.java index 8cfc933..5a7a07f 100644 --- a/src/main/java/me/retucio/camtweaks/ui/frames/ClientSettingsFrame.java +++ b/src/main/java/me/retucio/camtweaks/ui/frames/ClientSettingsFrame.java @@ -3,7 +3,7 @@ package me.retucio.camtweaks.ui.frames; import me.retucio.camtweaks.CameraTweaks; import me.retucio.camtweaks.event.events.camtweaks.GUISettingsFrameEvent; import me.retucio.camtweaks.module.modules.GUI; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.buttons.SettingButton; import me.retucio.camtweaks.util.Colors; import net.minecraft.client.gui.DrawContext; diff --git a/src/main/java/me/retucio/camtweaks/ui/frames/ModuleFrame.java b/src/main/java/me/retucio/camtweaks/ui/frames/ModuleFrame.java index b2e2c67..dbd0c4b 100644 --- a/src/main/java/me/retucio/camtweaks/ui/frames/ModuleFrame.java +++ b/src/main/java/me/retucio/camtweaks/ui/frames/ModuleFrame.java @@ -4,7 +4,7 @@ import me.retucio.camtweaks.CameraTweaks; import me.retucio.camtweaks.event.events.camtweaks.ModuleFrameEvent; import me.retucio.camtweaks.module.Module; import me.retucio.camtweaks.module.ModuleManager; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.buttons.ModuleButton; import me.retucio.camtweaks.util.Colors; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/me/retucio/camtweaks/ui/frames/SettingsFrame.java b/src/main/java/me/retucio/camtweaks/ui/frames/SettingsFrame.java index e01b0e5..54a9379 100644 --- a/src/main/java/me/retucio/camtweaks/ui/frames/SettingsFrame.java +++ b/src/main/java/me/retucio/camtweaks/ui/frames/SettingsFrame.java @@ -4,7 +4,7 @@ import me.retucio.camtweaks.CameraTweaks; import me.retucio.camtweaks.event.events.camtweaks.SettingsFrameEvent; import me.retucio.camtweaks.module.Module; import me.retucio.camtweaks.module.settings.*; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.buttons.*; import me.retucio.camtweaks.ui.buttons.SliderButton; import me.retucio.camtweaks.ui.buttons.TextButton; diff --git a/src/main/java/me/retucio/camtweaks/ui/ClickGUI.java b/src/main/java/me/retucio/camtweaks/ui/screen/ClickGUI.java similarity index 99% rename from src/main/java/me/retucio/camtweaks/ui/ClickGUI.java rename to src/main/java/me/retucio/camtweaks/ui/screen/ClickGUI.java index c407fd7..d92203a 100644 --- a/src/main/java/me/retucio/camtweaks/ui/ClickGUI.java +++ b/src/main/java/me/retucio/camtweaks/ui/screen/ClickGUI.java @@ -1,4 +1,4 @@ -package me.retucio.camtweaks.ui; +package me.retucio.camtweaks.ui.screen; import me.retucio.camtweaks.CameraTweaks; import me.retucio.camtweaks.event.SubscribeEvent; diff --git a/src/main/java/me/retucio/camtweaks/ui/HudEditorScreen.java b/src/main/java/me/retucio/camtweaks/ui/screen/HudEditorScreen.java similarity index 98% rename from src/main/java/me/retucio/camtweaks/ui/HudEditorScreen.java rename to src/main/java/me/retucio/camtweaks/ui/screen/HudEditorScreen.java index 20e83be..baf9e2b 100644 --- a/src/main/java/me/retucio/camtweaks/ui/HudEditorScreen.java +++ b/src/main/java/me/retucio/camtweaks/ui/screen/HudEditorScreen.java @@ -1,10 +1,9 @@ -package me.retucio.camtweaks.ui; +package me.retucio.camtweaks.ui.screen; import me.retucio.camtweaks.config.ConfigManager; import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; import me.retucio.camtweaks.ui.widgets.HudElement; import me.retucio.camtweaks.util.Colors; -import me.retucio.camtweaks.util.KeyUtil; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Click; @@ -16,7 +15,6 @@ import net.minecraft.text.Text; import org.lwjgl.glfw.GLFW; import org.jetbrains.annotations.Nullable; -import java.awt.*; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/me/retucio/camtweaks/ui/screen/ShulkerPreviewScreen.java b/src/main/java/me/retucio/camtweaks/ui/screen/ShulkerPreviewScreen.java new file mode 100644 index 0000000..1fa6f50 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/ui/screen/ShulkerPreviewScreen.java @@ -0,0 +1,112 @@ +package me.retucio.camtweaks.ui.screen; + +import me.retucio.camtweaks.CameraTweaks; +import me.retucio.camtweaks.module.modules.ShulkerPeek; +import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; +import me.retucio.camtweaks.util.Colors; +import net.minecraft.client.gl.RenderPipelines; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.awt.*; +import java.util.List; + +// https://github.com/kgriff0n/shulker-preview/blob/master/src/main/java/io/github/kgriff0n/screen/FakeShulkerScreen.java +public class ShulkerPreviewScreen extends Screen { + + private static final Identifier TEXTURE = Identifier.of(CameraTweaks.MOD_ID, "textures/gui/shulker.png"); + + private int x, y; + private final int bgWidth = 176; + private final int bgHeight = 78; + + private final Color color; + private final Text title; + private final List inventory; + private final Screen parent; + + public ShulkerPreviewScreen(ItemStack shulker, Screen parent) { + super(Text.literal("previsualización del shulker")); + this.color = ShulkerPeek.SHULKER_COLORS.get(shulker.getItem()); + this.title = shulker.getName(); + this.inventory = shulker.get(DataComponentTypes.CONTAINER).stream().toList(); + this.parent = parent; + } + + @Override + protected void init() { + this.x = (width - bgWidth) / 2; + this.y = (height - bgHeight) / 2; + } + + @Override + public void render(DrawContext ctx, int mouseX, int mouseY, float delta) { + super.render(ctx, mouseX, mouseY, delta); + + this.renderBackground(ctx, mouseX, mouseY, delta); + this.renderItems(ctx, inventory, x + 8, y + 18); + + int selectedSlot = getSlot(mouseX, mouseY); + if (selectedSlot > -1 && selectedSlot < inventory.size() && !inventory.get(selectedSlot).isOf(Items.AIR)) + renderTooltip(ctx, inventory.get(selectedSlot), mouseX, mouseY); + } + + @Override + public void renderBackground(DrawContext ctx, int mouseX, int mouseY, float delta) { + ctx.fill(0, 0, width, height, Colors.hudEditorScreenBackgroundColor.getRGB()); + ctx.drawTexture(RenderPipelines.GUI_TEXTURED, TEXTURE, x, y, 0, 0, bgWidth, bgHeight, 256, 256, color.getRGB()); + ctx.drawText(textRenderer, title, x + 8, y + 6, Colors.instructionsTextColor.getRGB(), false); + } + + private void renderItems(DrawContext context, List inventory, int x, int y) { + int baseX = x; + int count = 0; + for (ItemStack item : inventory) { + count++; + context.drawItem(item, x, y); + context.drawStackOverlay(textRenderer, item, x, y); + x += 18; + if (count % 9 == 0) { + x = baseX; + y += 18; + } + } + } + + private int getSlot(int i, int j) { + int x = this.x + 7; + int y = this.y + 17; + + int slotX = (i - x) / 18; + int slotY = (j - y) / 18; + + if (i < x || j < y || i > x + 9 * 18 - 1 || j > y + 3 * 18 - 1) + return -1; + + return slotX + slotY * 9; + } + + private void renderTooltip(DrawContext ctx, ItemStack stack, int x, int y) { + ctx.drawItemTooltip(textRenderer, stack, x, y); + } + + @Override + public void close() { + client.setScreen(parent); + } + + @Override + public void applyBlur(DrawContext ctx) { + if (ClientSettingsFrame.guiSettings.blur.isEnabled()) super.applyBlur(ctx); + } + + @Override + public boolean shouldPause() { + return false; + } +} diff --git a/src/main/java/me/retucio/camtweaks/ui/widgets/HudElement.java b/src/main/java/me/retucio/camtweaks/ui/widgets/HudElement.java index 041303e..68700f9 100644 --- a/src/main/java/me/retucio/camtweaks/ui/widgets/HudElement.java +++ b/src/main/java/me/retucio/camtweaks/ui/widgets/HudElement.java @@ -2,7 +2,7 @@ package me.retucio.camtweaks.ui.widgets; import me.retucio.camtweaks.module.ModuleManager; import me.retucio.camtweaks.module.modules.HUD; -import me.retucio.camtweaks.ui.HudEditorScreen; +import me.retucio.camtweaks.ui.screen.HudEditorScreen; import me.retucio.camtweaks.ui.HudRenderer; import me.retucio.camtweaks.util.Colors; @@ -10,11 +10,6 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; -import java.awt.*; -import java.time.LocalTime; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; - public class HudElement { diff --git a/src/main/java/me/retucio/camtweaks/ui/widgets/ScrollBarWidget.java b/src/main/java/me/retucio/camtweaks/ui/widgets/ScrollBarWidget.java index af22c8a..796bbb5 100644 --- a/src/main/java/me/retucio/camtweaks/ui/widgets/ScrollBarWidget.java +++ b/src/main/java/me/retucio/camtweaks/ui/widgets/ScrollBarWidget.java @@ -1,6 +1,6 @@ package me.retucio.camtweaks.ui.widgets; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; import me.retucio.camtweaks.util.Colors; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/me/retucio/camtweaks/ui/widgets/SearchBarWidget.java b/src/main/java/me/retucio/camtweaks/ui/widgets/SearchBarWidget.java index 7d282da..3da0108 100644 --- a/src/main/java/me/retucio/camtweaks/ui/widgets/SearchBarWidget.java +++ b/src/main/java/me/retucio/camtweaks/ui/widgets/SearchBarWidget.java @@ -1,8 +1,7 @@ package me.retucio.camtweaks.ui.widgets; -import me.retucio.camtweaks.ui.ClickGUI; +import me.retucio.camtweaks.ui.screen.ClickGUI; import me.retucio.camtweaks.ui.frames.ClientSettingsFrame; -import me.retucio.camtweaks.util.ChatUtil; import me.retucio.camtweaks.util.Colors; import me.retucio.camtweaks.util.KeyUtil; import net.minecraft.client.MinecraftClient; @@ -56,7 +55,7 @@ public class SearchBarWidget { ctx.drawHorizontalLine(x + 4, x + 16, renderY + 3 * i + 5, Color.LIGHT_GRAY.getRGB()); // texto - Text label = Text.literal(focused ? buffer + "_" : (buffer.isEmpty() ? Formatting.ITALIC + "buscar..." : buffer.toString())); + Text label = Text.literal(focused ? buffer + "_" : (buffer.isEmpty() ? Formatting.ITALIC + "\uD83D\uDD0D buscar..." : buffer.toString())); ctx.drawText(mc.textRenderer, label, x + 24, renderY + h / 2 - mc.textRenderer.fontHeight / 2, (buffer.isEmpty() && !focused) ? Color.LIGHT_GRAY.getRGB() : -1, true); diff --git a/src/main/java/me/retucio/camtweaks/util/render/Layers.java b/src/main/java/me/retucio/camtweaks/util/render/Layers.java new file mode 100644 index 0000000..0955c62 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/util/render/Layers.java @@ -0,0 +1,42 @@ +package me.retucio.camtweaks.util.render; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderPhase; +import net.minecraft.util.Util; + +import java.util.OptionalDouble; +import java.util.function.Function; + +import static me.retucio.camtweaks.util.render.Pipelines.GLOBAL_LINES_PIPELINE; +import static me.retucio.camtweaks.util.render.Pipelines.GLOBAL_QUADS_PIPELINE; + +public class Layers { + + private static final RenderLayer GLOBAL_QUADS; + private static final Function GLOBAL_LINES; + + public static RenderLayer getGlobalLines(double width) { + return GLOBAL_LINES.apply(width); + } + + public static RenderLayer getGlobalQuads() { + return GLOBAL_QUADS; + } + + private static RenderLayer.MultiPhaseParameters.Builder builder() { + return RenderLayer.MultiPhaseParameters.builder(); + } + + private static RenderLayer.MultiPhaseParameters empty() { + return builder().build(false); + } + + static { + GLOBAL_QUADS = RenderLayer.of("global_fill", 156, GLOBAL_QUADS_PIPELINE, empty()); + + GLOBAL_LINES = Util.memoize(l -> { + RenderPhase.LineWidth width = new RenderPhase.LineWidth(OptionalDouble.of(l)); + return RenderLayer.of("global_lines", 156, GLOBAL_LINES_PIPELINE, builder().lineWidth(width).build(false)); + }); + } +} \ No newline at end of file diff --git a/src/main/java/me/retucio/camtweaks/util/render/Pipelines.java b/src/main/java/me/retucio/camtweaks/util/render/Pipelines.java new file mode 100644 index 0000000..536715f --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/util/render/Pipelines.java @@ -0,0 +1,52 @@ +package me.retucio.camtweaks.util.render; + +import com.mojang.blaze3d.pipeline.BlendFunction; +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.platform.DepthTestFunction; +import com.mojang.blaze3d.vertex.VertexFormat; +import me.retucio.camtweaks.CameraTweaks; +import net.minecraft.client.gl.RenderPipelines; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.RenderPhase; +import net.minecraft.client.render.VertexFormats; +import net.minecraft.util.Identifier; +import net.minecraft.util.Util; + +import java.util.OptionalDouble; +import java.util.function.Function; + + +public class Pipelines { + + static final RenderPipeline GLOBAL_LINES_PIPELINE = RenderPipeline.builder(RenderPipelines.RENDERTYPE_LINES_SNIPPET) + .withLocation(Identifier.of(CameraTweaks.MOD_ID, "pipeline/global_lines")) + .withVertexFormat(VertexFormats.POSITION_COLOR_NORMAL, VertexFormat.DrawMode.LINES) + .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) + .withDepthWrite(false) + .withCull(false) + .build(); + + static final RenderPipeline GLOBAL_QUADS_PIPELINE = RenderPipeline.builder(RenderPipelines.POSITION_COLOR_SNIPPET) + .withLocation("pipeline/global_fill_pipeline") + .withVertexFormat(VertexFormats.POSITION_COLOR, VertexFormat.DrawMode.QUADS) + .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) + .withBlend(BlendFunction.TRANSLUCENT) + .withDepthWrite(false) + .withCull(false) + .build(); + + static final Function GLOBAL_LINES_LAYER = Util.memoize(lineWidth -> { + RenderPhase.LineWidth lineState = new RenderPhase.LineWidth(OptionalDouble.of(lineWidth)); + RenderLayer.MultiPhaseParameters compositeState = RenderLayer.MultiPhaseParameters.builder() + .lineWidth(lineState) + .build(false); + return RenderLayer.of("global_lines", RenderLayer.DEFAULT_BUFFER_SIZE, GLOBAL_LINES_PIPELINE, compositeState); + }); + + + + + public static RenderLayer getGlobalLinesLayer(double lineWidth) { + return GLOBAL_LINES_LAYER.apply(lineWidth); + } +} \ No newline at end of file diff --git a/src/main/java/me/retucio/camtweaks/util/render/RenderUtil.java b/src/main/java/me/retucio/camtweaks/util/render/RenderUtil.java new file mode 100644 index 0000000..54955a7 --- /dev/null +++ b/src/main/java/me/retucio/camtweaks/util/render/RenderUtil.java @@ -0,0 +1,82 @@ +package me.retucio.camtweaks.util.render; + +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.*; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; + +import java.awt.*; + +// literalmente robado de https://github.com/mioclient/oyvey-ported/ (perdón) +public class RenderUtil { + + private static final MinecraftClient mc = MinecraftClient.getInstance(); + private static final Tessellator tesselator = Tessellator.getInstance(); + + public static void drawOutlineBox(MatrixStack stack, Box box, Color color, double lineWidth) { + float r = color.getRed() / 255f; + float g = color.getGreen() / 255f; + float b = color.getBlue() / 255f; + float a = color.getAlpha() / 255f; + + Vec3d cameraPos = mc.gameRenderer.getCamera().getPos(); + float minX = (float) (box.minX - cameraPos.x); + float minY = (float) (box.minY - cameraPos.y); + float minZ = (float) (box.minZ - cameraPos.z); + float maxX = (float) (box.maxX - cameraPos.x); + float maxY = (float) (box.maxY - cameraPos.y); + float maxZ = (float) (box.maxZ - cameraPos.z); + + BufferBuilder buffer = tesselator.begin(VertexFormat.DrawMode.LINES, VertexFormats.POSITION_COLOR_NORMAL); + + VertexRendering.drawBox(stack.peek(), buffer, minX, minY, minZ, maxX, maxY, maxZ, r, g, b, a); + + Layers.getGlobalLines(lineWidth).draw(buffer.end()); + } + + public static void drawFilledBox(MatrixStack matrices, Box box, Color color) { + Vec3d cameraPos = mc.gameRenderer.getCamera().getPos(); + float minX = (float) (box.minX - cameraPos.x); + float minY = (float) (box.minY - cameraPos.y); + float minZ = (float) (box.minZ - cameraPos.z); + float maxX = (float) (box.maxX - cameraPos.x); + float maxY = (float) (box.maxY - cameraPos.y); + float maxZ = (float) (box.maxZ - cameraPos.z); + + BufferBuilder buffer = tesselator.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); + + buffer.vertex(matrices.peek().getPositionMatrix(), minX, minY, minZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, minY, minZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, minY, maxZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), minX, minY, maxZ).color(color.getRGB()); + + buffer.vertex(matrices.peek().getPositionMatrix(), minX, maxY, minZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), minX, maxY, maxZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, maxY, maxZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, maxY, minZ).color(color.getRGB()); + + buffer.vertex(matrices.peek().getPositionMatrix(), minX, minY, minZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), minX, maxY, minZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, maxY, minZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, minY, minZ).color(color.getRGB()); + + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, minY, minZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, maxY, minZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, maxY, maxZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, minY, maxZ).color(color.getRGB()); + + buffer.vertex(matrices.peek().getPositionMatrix(), minX, minY, maxZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, minY, maxZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), maxX, maxY, maxZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), minX, maxY, maxZ).color(color.getRGB()); + + buffer.vertex(matrices.peek().getPositionMatrix(), minX, minY, minZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), minX, minY, maxZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), minX, maxY, maxZ).color(color.getRGB()); + buffer.vertex(matrices.peek().getPositionMatrix(), minX, maxY, minZ).color(color.getRGB()); + + Layers.getGlobalQuads().draw(buffer.end()); + } +} diff --git a/src/main/resources/assets/camtweaks/textures/gui/shulker.png b/src/main/resources/assets/camtweaks/textures/gui/shulker.png new file mode 100644 index 0000000..efb8599 Binary files /dev/null and b/src/main/resources/assets/camtweaks/textures/gui/shulker.png differ diff --git a/src/main/resources/camtweaks.accesswidener b/src/main/resources/camtweaks.accesswidener index 3257b7b..b87b453 100644 --- a/src/main/resources/camtweaks.accesswidener +++ b/src/main/resources/camtweaks.accesswidener @@ -8,4 +8,6 @@ accessible field net/minecraft/client/particle/Particle velocityMultiplier F accessible field net/minecraft/client/particle/Particle gravityStrength F accessible field net/minecraft/client/particle/Particle collidesWithWorld Z -accessible method net/minecraft/client/render/WorldRenderer method_74752 (Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;Z)V \ No newline at end of file +accessible method net/minecraft/client/render/WorldRenderer method_74752 (Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;Z)V +accessible method net/minecraft/client/render/GameRenderer getProjectionMatrix (F)Lorg/joml/Matrix4f; +accessible method net/minecraft/client/render/command/DebugHitboxCommandRenderer renderDebugHitbox (Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/entity/state/EntityHitboxAndView;Lnet/minecraft/client/render/VertexConsumer;F)V \ No newline at end of file diff --git a/src/main/resources/camtweaks.mixins.json b/src/main/resources/camtweaks.mixins.json index 86f1a69..63072c1 100644 --- a/src/main/resources/camtweaks.mixins.json +++ b/src/main/resources/camtweaks.mixins.json @@ -33,6 +33,7 @@ "ClientPlayerEntityMixin", "ClientPlayerInteractionManagerMixin", "ClientPlayNetworkHandlerMixin", + "ClientWorldMixin", "ClientWorldPropertiesMixin", "DamageParticleFactoryMixin", "DamageParticleMixin", @@ -57,9 +58,11 @@ "TelemetryManagerMixin", "TextRendererDrawerMixin", "TextRendererMixin", + "TitleScreenMixin", "WeatherRenderingMixin", "WorldRendererMixin", "accessor.ClientPlayNetworkHandlerAccessor", + "accessor.HandledScreenAccessor", "accessor.KeyBindingAccessor" ] } \ No newline at end of file