diff --git a/build.gradle b/build.gradle index ee7cc07..54562ca 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,7 @@ loom { dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + mappings loom.officialMojangMappings() modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" diff --git a/gradle.properties b/gradle.properties index 8b07140..5157b84 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,6 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.11 -yarn_mappings=1.21.11+build.4 loader_version=0.18.4 # Mod Properties diff --git a/src/client/java/tobinio/visibleentities/VisibleEntitiesClient.java b/src/client/java/tobinio/visibleentities/VisibleEntitiesClient.java index 26b79fe..3fedde7 100644 --- a/src/client/java/tobinio/visibleentities/VisibleEntitiesClient.java +++ b/src/client/java/tobinio/visibleentities/VisibleEntitiesClient.java @@ -5,13 +5,13 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.render.entity.EntityRendererFactories; -import net.minecraft.client.util.InputUtil; -import net.minecraft.entity.EntityType; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.renderer.entity.EntityRenderers; +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.world.entity.EntityType; +import net.minecraft.network.chat.Component; +import net.minecraft.ChatFormatting; +import net.minecraft.resources.Identifier; import org.lwjgl.glfw.GLFW; import tobinio.visibleentities.entity.InteractionEntityRenderer; import tobinio.visibleentities.entity.MarkerEntityRenderer; @@ -20,46 +20,46 @@ import tobinio.visibleentities.settings.Config; import static tobinio.visibleentities.VisibleEntities.MOD_ID; public class VisibleEntitiesClient implements ClientModInitializer { - public static final KeyBinding.Category VISIBLE_ENTITIES = KeyBinding.Category.create(id("visible-entities")); + public static final KeyMapping.Category VISIBLE_ENTITIES = KeyMapping.Category.register(id("visible-entities")); - private static final KeyBinding TOGGLE_ACTIVE_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( + private static final KeyMapping TOGGLE_ACTIVE_KEY = KeyBindingHelper.registerKeyBinding(new KeyMapping( "key.visible-entities.active", - InputUtil.Type.KEYSYM, + InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_N, VISIBLE_ENTITIES)); - private static final KeyBinding TOGGLE_VISIBILITY_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( + private static final KeyMapping TOGGLE_VISIBILITY_KEY = KeyBindingHelper.registerKeyBinding(new KeyMapping( "key.visible-entities.visibility", - InputUtil.Type.KEYSYM, + InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_UNKNOWN, VISIBLE_ENTITIES)); public static Identifier id(String path) { - return Identifier.of(MOD_ID, path); + return Identifier.fromNamespaceAndPath(MOD_ID, path); } @Override public void onInitializeClient() { Config.HANDLER.load(); - EntityRendererFactories.register(EntityType.INTERACTION, InteractionEntityRenderer::new); - EntityRendererFactories.register(EntityType.MARKER, MarkerEntityRenderer::new); + EntityRenderers.register(EntityType.INTERACTION, InteractionEntityRenderer::new); + EntityRenderers.register(EntityType.MARKER, MarkerEntityRenderer::new); ClientTickEvents.END_CLIENT_TICK.register(client -> { - while (TOGGLE_ACTIVE_KEY.wasPressed()) { + while (TOGGLE_ACTIVE_KEY.consumeClick()) { boolean isActive = Config.HANDLER.instance().isActive; - client.player.sendMessage(Text.translatable(isActive ? "visible-entities.active.disabled" : "visible-entities.active.enabled") - .formatted(Formatting.GRAY), true); + client.player.displayClientMessage(Component.translatable(isActive ? "visible-entities.active.disabled" : "visible-entities.active.enabled") + .withStyle(ChatFormatting.GRAY), true); Config.HANDLER.instance().isActive = !isActive; Config.HANDLER.save(); } - while (TOGGLE_VISIBILITY_KEY.wasPressed()) { + while (TOGGLE_VISIBILITY_KEY.consumeClick()) { boolean renderEntities = Config.HANDLER.instance().renderEntities; - client.player.sendMessage(Text.translatable(renderEntities ? "visible-entities.visibility.disabled" : "visible-entities.visibility.enabled") - .formatted(Formatting.GRAY), true); + client.player.displayClientMessage(Component.translatable(renderEntities ? "visible-entities.visibility.disabled" : "visible-entities.visibility.enabled") + .withStyle(ChatFormatting.GRAY), true); Config.HANDLER.instance().renderEntities = !renderEntities; Config.HANDLER.save(); diff --git a/src/client/java/tobinio/visibleentities/entity/InteractionEntityRenderer.java b/src/client/java/tobinio/visibleentities/entity/InteractionEntityRenderer.java index 54864ff..abb20db 100644 --- a/src/client/java/tobinio/visibleentities/entity/InteractionEntityRenderer.java +++ b/src/client/java/tobinio/visibleentities/entity/InteractionEntityRenderer.java @@ -1,16 +1,17 @@ package tobinio.visibleentities.entity; -import net.minecraft.client.render.*; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.decoration.InteractionEntity; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.ColorHelper; -import net.minecraft.world.debug.gizmo.GizmoDrawing; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.client.renderer.state.CameraRenderState; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.gizmos.GizmoStyle; +import net.minecraft.world.entity.Interaction; +import net.minecraft.world.phys.AABB; +import net.minecraft.util.ARGB; +import net.minecraft.gizmos.Gizmos; import tobinio.visibleentities.settings.Config; /** @@ -20,8 +21,8 @@ import tobinio.visibleentities.settings.Config; */ // not using custom EntityRenderState for mod compatibility -public class InteractionEntityRenderer extends EntityRenderer { - public InteractionEntityRenderer(EntityRendererFactory.Context ctx) { +public class InteractionEntityRenderer extends EntityRenderer { + public InteractionEntityRenderer(EntityRendererProvider.Context ctx) { super(ctx); } @@ -31,8 +32,8 @@ public class InteractionEntityRenderer extends EntityRenderer { - public MarkerEntityRenderer(EntityRendererFactory.Context ctx) { +public class MarkerEntityRenderer extends EntityRenderer { + public MarkerEntityRenderer(EntityRendererProvider.Context ctx) { super(ctx); } @@ -31,9 +32,9 @@ public class MarkerEntityRenderer extends EntityRenderer TRANSPARENT_ITEM_FRAME = createItemFrameStateManager(); + public static final StateDefinition TRANSPARENT_ITEM_FRAME = createItemFrameFakeState(); - public static final StateManager TRANSPARENT_GLOW_ITEM_FRAME = createItemFrameStateManager(); + public static final StateDefinition TRANSPARENT_GLOW_ITEM_FRAME = createItemFrameFakeState(); public static final Identifier TRANSPARENT_ITEM_FRAME_ID = VisibleEntitiesClient.id("transparent_item_frame"); public static final Identifier TRANSPARENT_GLOW_ITEM_FRAME_ID = VisibleEntitiesClient.id( diff --git a/src/client/java/tobinio/visibleentities/mixin/client/BlockStateDefinitionsInvoker.java b/src/client/java/tobinio/visibleentities/mixin/client/BlockStateDefinitionsInvoker.java new file mode 100644 index 0000000..681e461 --- /dev/null +++ b/src/client/java/tobinio/visibleentities/mixin/client/BlockStateDefinitionsInvoker.java @@ -0,0 +1,23 @@ +package tobinio.visibleentities.mixin.client; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.client.resources.model.BlockStateDefinitions; +import net.minecraft.world.level.block.state.StateDefinition; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + + +/** + * Created: 14.09.24 + * + * @author Tobias Frischmann + */ +@Mixin (BlockStateDefinitions.class) +public interface BlockStateDefinitionsInvoker { + + @Invoker ("createItemFrameFakeState") + static StateDefinition createItemFrameFakeState() { + throw new AssertionError(); + } +} diff --git a/src/client/java/tobinio/visibleentities/mixin/client/BlockStateDefinitionsMixin.java b/src/client/java/tobinio/visibleentities/mixin/client/BlockStateDefinitionsMixin.java new file mode 100644 index 0000000..65d4e93 --- /dev/null +++ b/src/client/java/tobinio/visibleentities/mixin/client/BlockStateDefinitionsMixin.java @@ -0,0 +1,39 @@ +package tobinio.visibleentities.mixin.client; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.client.resources.model.BlockStateDefinitions; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.resources.Identifier; +import org.spongepowered.asm.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.util.HashMap; +import java.util.Map; + +import static tobinio.visibleentities.entity.TransparentItemFrameBlockStateMangers.*; + + +/** + * Created: 14.09.24 + * + * @author Tobias Frischmann + */ +@Mixin (BlockStateDefinitions.class) +public abstract class BlockStateDefinitionsMixin { + + @Mutable + @Shadow + @Final + private static Map> STATIC_DEFINITIONS; + + @Inject (method = "", at = @At ("TAIL")) + private static void addCustomItemFrameModels(CallbackInfo ci) { + STATIC_DEFINITIONS = new HashMap<>(STATIC_DEFINITIONS); + + STATIC_DEFINITIONS.put(TRANSPARENT_ITEM_FRAME_ID, TRANSPARENT_ITEM_FRAME); + STATIC_DEFINITIONS.put(TRANSPARENT_GLOW_ITEM_FRAME_ID, TRANSPARENT_GLOW_ITEM_FRAME); + } +} diff --git a/src/client/java/tobinio/visibleentities/mixin/client/BlockStateManagersInvoker.java b/src/client/java/tobinio/visibleentities/mixin/client/BlockStateManagersInvoker.java deleted file mode 100644 index e432c2b..0000000 --- a/src/client/java/tobinio/visibleentities/mixin/client/BlockStateManagersInvoker.java +++ /dev/null @@ -1,23 +0,0 @@ -package tobinio.visibleentities.mixin.client; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.model.BlockStateManagers; -import net.minecraft.state.StateManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - - -/** - * Created: 14.09.24 - * - * @author Tobias Frischmann - */ -@Mixin (BlockStateManagers.class) -public interface BlockStateManagersInvoker { - - @Invoker ("createItemFrameStateManager") - static StateManager createItemFrameStateManager() { - throw new AssertionError(); - } -} diff --git a/src/client/java/tobinio/visibleentities/mixin/client/BlockStateManagersMixin.java b/src/client/java/tobinio/visibleentities/mixin/client/BlockStateManagersMixin.java deleted file mode 100644 index 0e5b198..0000000 --- a/src/client/java/tobinio/visibleentities/mixin/client/BlockStateManagersMixin.java +++ /dev/null @@ -1,39 +0,0 @@ -package tobinio.visibleentities.mixin.client; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.model.BlockStateManagers; -import net.minecraft.state.StateManager; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.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.util.HashMap; -import java.util.Map; - -import static tobinio.visibleentities.entity.TransparentItemFrameBlockStateMangers.*; - - -/** - * Created: 14.09.24 - * - * @author Tobias Frischmann - */ -@Mixin (BlockStateManagers.class) -public abstract class BlockStateManagersMixin { - - @Mutable - @Shadow - @Final - private static Map> STATIC_MANAGERS; - - @Inject (method = "", at = @At ("TAIL")) - private static void addCustomItemFrameModels(CallbackInfo ci) { - STATIC_MANAGERS = new HashMap<>(STATIC_MANAGERS); - - STATIC_MANAGERS.put(TRANSPARENT_ITEM_FRAME_ID, TRANSPARENT_ITEM_FRAME); - STATIC_MANAGERS.put(TRANSPARENT_GLOW_ITEM_FRAME_ID, TRANSPARENT_GLOW_ITEM_FRAME); - } -} diff --git a/src/client/java/tobinio/visibleentities/mixin/client/EntityMixin.java b/src/client/java/tobinio/visibleentities/mixin/client/EntityMixin.java index c9cbd94..d5fe816 100644 --- a/src/client/java/tobinio/visibleentities/mixin/client/EntityMixin.java +++ b/src/client/java/tobinio/visibleentities/mixin/client/EntityMixin.java @@ -1,8 +1,8 @@ package tobinio.visibleentities.mixin.client; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -26,10 +26,10 @@ public abstract class EntityMixin { public abstract EntityType getType(); @Shadow - public abstract UUID getUuid(); + public abstract UUID getUUID(); @Inject (method = "isInvisibleTo", at = @At ("HEAD"), cancellable = true) - private void overwriteVisibility(PlayerEntity player, CallbackInfoReturnable cir) { + private void overwriteVisibility(Player player, CallbackInfoReturnable cir) { Config instance = Config.HANDLER.instance(); @@ -44,14 +44,14 @@ public abstract class EntityMixin { } @Unique - private boolean isInFilterList(PlayerEntity renderingPlayer) { + private boolean isInFilterList(Player renderingPlayer) { List entityKeys = Config.HANDLER.instance().entityKeys; - if (this.getUuid() == renderingPlayer.getUuid() && entityKeys.contains("self")) { + if (this.getUUID() == renderingPlayer.getUUID() && entityKeys.contains("self")) { return true; } - var key = getType().getTranslationKey(); + var key = getType().getDescriptionId(); return entityKeys.contains(key); } } diff --git a/src/client/java/tobinio/visibleentities/mixin/client/EntityRendererMixin.java b/src/client/java/tobinio/visibleentities/mixin/client/EntityRendererMixin.java index 764ede2..731a16f 100644 --- a/src/client/java/tobinio/visibleentities/mixin/client/EntityRendererMixin.java +++ b/src/client/java/tobinio/visibleentities/mixin/client/EntityRendererMixin.java @@ -1,9 +1,9 @@ package tobinio.visibleentities.mixin.client; -import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.world.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/client/java/tobinio/visibleentities/mixin/client/ItemFrameEntityRendererMixin.java b/src/client/java/tobinio/visibleentities/mixin/client/ItemFrameEntityRendererMixin.java deleted file mode 100644 index 3d2188a..0000000 --- a/src/client/java/tobinio/visibleentities/mixin/client/ItemFrameEntityRendererMixin.java +++ /dev/null @@ -1,80 +0,0 @@ -package tobinio.visibleentities.mixin.client; - -import net.minecraft.block.BlockState; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayers; -import net.minecraft.client.render.TexturedRenderLayers; -import net.minecraft.client.render.block.BlockRenderManager; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.ItemFrameEntityRenderer; -import net.minecraft.client.render.entity.state.ItemFrameEntityRenderState; -import net.minecraft.client.render.model.BlockStateModel; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.texture.SpriteAtlasTexture; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.state.property.Properties; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import tobinio.visibleentities.settings.Config; - -import static tobinio.visibleentities.entity.TransparentItemFrameBlockStateMangers.TRANSPARENT_GLOW_ITEM_FRAME; -import static tobinio.visibleentities.entity.TransparentItemFrameBlockStateMangers.TRANSPARENT_ITEM_FRAME; - -/** - * Created: 14.09.24 - * - * @author Tobias Frischmann - */ -@Mixin (ItemFrameEntityRenderer.class) -public abstract class ItemFrameEntityRendererMixin { - @Shadow - @Final - private BlockRenderManager blockRenderManager; - - @Inject (at = @At (value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;multiply(Lorg/joml/Quaternionfc;)V", ordinal = 1), method = "render(Lnet/minecraft/client/render/entity/state/ItemFrameEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V") - private void renderTransparent(ItemFrameEntityRenderState state, MatrixStack matrixStack, - OrderedRenderCommandQueue orderedRenderCommandQueue, CameraRenderState cameraRenderState, CallbackInfo ci) { - - Config instance = Config.HANDLER.instance(); - - if (instance.isActive && instance.showItemFrames && state.invisible) { - BlockState blockState = this.getTransparentModelId(state); - BlockStateModel model = this.blockRenderManager.getModel(blockState); - - matrixStack.push(); - matrixStack.translate(-0.5F, -0.5F, -0.5F); - - orderedRenderCommandQueue.submitBlockStateModel(matrixStack, RenderLayers.entityTranslucent( - SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE), model, - 1.0F, - 1.0F, - 1.0F, - state.light, - OverlayTexture.DEFAULT_UV, - state.outlineColor - ); - matrixStack.pop(); - } - } - - @Inject (at = @At (value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;multiply(Lorg/joml/Quaternionfc;)V", ordinal = 2), method = "render(Lnet/minecraft/client/render/entity/state/ItemFrameEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V") - private void offSetMap(ItemFrameEntityRenderState state, MatrixStack matrixStack, - OrderedRenderCommandQueue orderedRenderCommandQueue, CameraRenderState cameraRenderState, CallbackInfo ci) { - - Config instance = Config.HANDLER.instance(); - - if (instance.isActive && instance.showItemFrames && state.invisible) { - matrixStack.translate(0, 0, 0.4375F - 0.5F); - } - } - - @Unique - private BlockState getTransparentModelId(ItemFrameEntityRenderState state) { - return ((state.glow ? TRANSPARENT_GLOW_ITEM_FRAME : TRANSPARENT_ITEM_FRAME).getDefaultState()).with(Properties.MAP, - state.mapId != null); - - } -} diff --git a/src/client/java/tobinio/visibleentities/mixin/client/ItemFrameRendererMixin.java b/src/client/java/tobinio/visibleentities/mixin/client/ItemFrameRendererMixin.java new file mode 100644 index 0000000..1eaf1ff --- /dev/null +++ b/src/client/java/tobinio/visibleentities/mixin/client/ItemFrameRendererMixin.java @@ -0,0 +1,81 @@ +package tobinio.visibleentities.mixin.client; + +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.ItemFrameRenderer; +import net.minecraft.client.renderer.entity.state.ItemFrameRenderState; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.state.CameraRenderState; +import net.minecraft.client.renderer.texture.TextureAtlas; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import tobinio.visibleentities.settings.Config; + +import static tobinio.visibleentities.entity.TransparentItemFrameBlockStateMangers.TRANSPARENT_GLOW_ITEM_FRAME; +import static tobinio.visibleentities.entity.TransparentItemFrameBlockStateMangers.TRANSPARENT_ITEM_FRAME; + +/** + * Created: 14.09.24 + * + * @author Tobias Frischmann + */ +@Mixin (ItemFrameRenderer.class) +public abstract class ItemFrameRendererMixin { + @Shadow + @Final + private BlockRenderDispatcher blockRenderer; + + @Inject (at = @At (value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;mulPose(Lorg/joml/Quaternionfc;)V", ordinal = 1), method = "submit(Lnet/minecraft/client/renderer/entity/state/ItemFrameRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V") + private void renderTransparent(ItemFrameRenderState state, PoseStack matrixStack, + SubmitNodeCollector orderedRenderCommandQueue, CameraRenderState cameraRenderState, CallbackInfo ci) { + + Config instance = Config.HANDLER.instance(); + + if (instance.isActive && instance.showItemFrames && state.isInvisible) { + BlockState blockState = this.getTransparentModelId(state); + BlockStateModel model = this.blockRenderer.getBlockModel(blockState); + + matrixStack.pushPose(); + matrixStack.translate(-0.5F, -0.5F, -0.5F); + + orderedRenderCommandQueue.submitBlockModel(matrixStack, RenderTypes.entityTranslucent( + TextureAtlas.LOCATION_BLOCKS), model, + 1.0F, + 1.0F, + 1.0F, + state.lightCoords, + OverlayTexture.NO_OVERLAY, + state.outlineColor + ); + matrixStack.popPose(); + } + } + + @Inject (at = @At (value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;mulPose(Lorg/joml/Quaternionfc;)V", ordinal = 2), method = "submit(Lnet/minecraft/client/renderer/entity/state/ItemFrameRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V") + private void offSetMap(ItemFrameRenderState state, PoseStack matrixStack, + SubmitNodeCollector orderedRenderCommandQueue, CameraRenderState cameraRenderState, CallbackInfo ci) { + + Config instance = Config.HANDLER.instance(); + + if (instance.isActive && instance.showItemFrames && state.isInvisible) { + matrixStack.translate(0, 0, 0.4375F - 0.5F); + } + } + + @Unique + private BlockState getTransparentModelId(ItemFrameRenderState state) { + return ((state.isGlowFrame ? TRANSPARENT_GLOW_ITEM_FRAME : TRANSPARENT_ITEM_FRAME).any()).setValue( + BlockStateProperties.MAP, + state.mapId != null); + + } +} diff --git a/src/client/java/tobinio/visibleentities/mixin/client/LivingEntityRendererMixin.java b/src/client/java/tobinio/visibleentities/mixin/client/LivingEntityRendererMixin.java index c3473f9..68cd158 100644 --- a/src/client/java/tobinio/visibleentities/mixin/client/LivingEntityRendererMixin.java +++ b/src/client/java/tobinio/visibleentities/mixin/client/LivingEntityRendererMixin.java @@ -1,14 +1,14 @@ package tobinio.visibleentities.mixin.client; import net.minecraft.client.model.Model; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.command.ModelCommandRenderer; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.state.LivingEntityRenderState; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.ColorHelper; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.feature.ModelFeatureRenderer; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.util.ARGB; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -21,18 +21,18 @@ import tobinio.visibleentities.settings.Config; */ @Mixin (LivingEntityRenderer.class) public class LivingEntityRendererMixin { - @Redirect (method = "render(Lnet/minecraft/client/render/entity/state/LivingEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At (value = "INVOKE", target = "Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/RenderLayer;IIILnet/minecraft/client/texture/Sprite;ILnet/minecraft/client/render/command/ModelCommandRenderer$CrumblingOverlayCommand;)V")) - private void defineTransparency(OrderedRenderCommandQueue instance, Model model, Object o, MatrixStack matrixStack, - RenderLayer renderLayer, int light, int overlay, int tintColor, Sprite sprite, int outlineColor, - ModelCommandRenderer.CrumblingOverlayCommand crumblingOverlayCommand) { + @Redirect (method = "submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V", at = @At (value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/rendertype/RenderType;IIILnet/minecraft/client/renderer/texture/TextureAtlasSprite;ILnet/minecraft/client/renderer/feature/ModelFeatureRenderer$CrumblingOverlay;)V")) + private void defineTransparency(SubmitNodeCollector instance, Model model, Object o, PoseStack matrixStack, + RenderType renderLayer, int light, int overlay, int tintColor, TextureAtlasSprite sprite, int outlineColor, + ModelFeatureRenderer.CrumblingOverlay crumblingOverlayCommand) { LivingEntityRenderState livingEntityRenderState = (LivingEntityRenderState) o; if (tintColor != -1) { - tintColor = ColorHelper.getArgb(Config.HANDLER.instance().transparency, ColorHelper.getRed(tintColor), ColorHelper.getGreen(tintColor), ColorHelper.getBlue(tintColor)); + tintColor = ARGB.color(Config.HANDLER.instance().transparency, ARGB.red(tintColor), ARGB.green(tintColor), ARGB.blue(tintColor)); } instance.submitModel( - model, livingEntityRenderState, matrixStack, renderLayer, livingEntityRenderState.light, overlay, tintColor, null, livingEntityRenderState.outlineColor, null + model, livingEntityRenderState, matrixStack, renderLayer, livingEntityRenderState.lightCoords, overlay, tintColor, null, livingEntityRenderState.outlineColor, null ); } } diff --git a/src/client/java/tobinio/visibleentities/settings/Config.java b/src/client/java/tobinio/visibleentities/settings/Config.java index e823cfe..3a336dc 100644 --- a/src/client/java/tobinio/visibleentities/settings/Config.java +++ b/src/client/java/tobinio/visibleentities/settings/Config.java @@ -4,7 +4,7 @@ import dev.isxander.yacl3.config.v2.api.ConfigClassHandler; import dev.isxander.yacl3.config.v2.api.SerialEntry; import dev.isxander.yacl3.config.v2.api.serializer.GsonConfigSerializerBuilder; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.util.Identifier; +import net.minecraft.resources.Identifier; import tobinio.visibleentities.VisibleEntities; import java.util.ArrayList; @@ -17,7 +17,7 @@ import java.util.List; */ public class Config { public static ConfigClassHandler HANDLER = ConfigClassHandler.createBuilder(Config.class) - .id(Identifier.of(VisibleEntities.MOD_ID, "config")) + .id(Identifier.fromNamespaceAndPath(VisibleEntities.MOD_ID, "config")) .serializer(config -> GsonConfigSerializerBuilder.create(config) .setPath(FabricLoader.getInstance().getConfigDir().resolve("visible_entities.json5")) .setJson5(true) diff --git a/src/client/java/tobinio/visibleentities/settings/ModMenuIntegration.java b/src/client/java/tobinio/visibleentities/settings/ModMenuIntegration.java index 769ca8a..74fdde9 100644 --- a/src/client/java/tobinio/visibleentities/settings/ModMenuIntegration.java +++ b/src/client/java/tobinio/visibleentities/settings/ModMenuIntegration.java @@ -4,7 +4,7 @@ import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; import dev.isxander.yacl3.api.*; import dev.isxander.yacl3.api.controller.*; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; import java.util.ArrayList; @@ -17,12 +17,12 @@ public class ModMenuIntegration implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { return parentScreen -> YetAnotherConfigLib.createBuilder() - .title(Text.literal("Visible Entities")) + .title(Component.literal("Visible Entities")) .category(ConfigCategory.createBuilder() - .name(Text.literal("General")) + .name(Component.literal("General")) .option(Option.createBuilder() - .name(Text.literal("Active")) - .description(OptionDescription.of(Text.literal( + .name(Component.literal("Active")) + .description(OptionDescription.of(Component.literal( "If the mod should be active"))) .binding(false, () -> Config.HANDLER.instance().isActive, @@ -30,8 +30,8 @@ public class ModMenuIntegration implements ModMenuApi { .controller(TickBoxControllerBuilder::create) .build()) .option(Option.createBuilder() - .name(Text.literal("Render Entities")) - .description(OptionDescription.of(Text.literal( + .name(Component.literal("Render Entities")) + .description(OptionDescription.of(Component.literal( "If Entities should be renderer at all"))) .binding(true, () -> Config.HANDLER.instance().renderEntities, @@ -39,7 +39,7 @@ public class ModMenuIntegration implements ModMenuApi { .controller(TickBoxControllerBuilder::create) .build()) .option(Option.createBuilder() - .name(Text.literal("Entity Transparency")) + .name(Component.literal("Entity Transparency")) .binding(Config.TRANSPARENCY_DEFAULT, () -> Config.HANDLER.instance().transparency, newVal -> Config.HANDLER.instance().transparency = newVal) @@ -47,10 +47,10 @@ public class ModMenuIntegration implements ModMenuApi { .build()) .build()) .category(ConfigCategory.createBuilder() - .name(Text.literal("Invisible")) + .name(Component.literal("Invisible")) .option(Option.createBuilder() - .name(Text.literal("Show Invisible")) - .description(OptionDescription.of(Text.literal( + .name(Component.literal("Show Invisible")) + .description(OptionDescription.of(Component.literal( "If invisible entities should be shown when the mod is active"))) .binding(true, () -> Config.HANDLER.instance().showEntities, @@ -58,17 +58,17 @@ public class ModMenuIntegration implements ModMenuApi { .controller(TickBoxControllerBuilder::create) .build()) .option(Option.createBuilder() - .name(Text.literal("Filter List Type")) + .name(Component.literal("Filter List Type")) .binding(Config.ListType.BLACKLIST, () -> Config.HANDLER.instance().listType, newVal -> Config.HANDLER.instance().listType = newVal) .controller(opt -> EnumControllerBuilder.create(opt) .enumClass(Config.ListType.class) - .formatValue(t -> Text.of(t.name().toLowerCase()))) + .formatValue(t -> Component.nullToEmpty(t.name().toLowerCase()))) .build()) .option(ListOption.createBuilder() - .name(Text.literal("Filter List")) - .description(OptionDescription.of(Text.literal( + .name(Component.literal("Filter List")) + .description(OptionDescription.of(Component.literal( "List of entity translation keys for rendering when transparent (blacklist/whitelist):\n 'entity.minecraft.chicken' or 'self' to refer to the player."))) .binding(new ArrayList<>(), () -> Config.HANDLER.instance().entityKeys, @@ -78,10 +78,10 @@ public class ModMenuIntegration implements ModMenuApi { .build()) .build()) .category(ConfigCategory.createBuilder() - .name(Text.literal("Special")) + .name(Component.literal("Special")) .option(Option.createBuilder() - .name(Text.literal("Show ItemFrames")) - .description(OptionDescription.of(Text.literal( + .name(Component.literal("Show ItemFrames")) + .description(OptionDescription.of(Component.literal( "If invisible ItemFrames should be shown when the mod is active"))) .binding(true, () -> Config.HANDLER.instance().showItemFrames, @@ -89,8 +89,8 @@ public class ModMenuIntegration implements ModMenuApi { .controller(TickBoxControllerBuilder::create) .build()) .option(Option.createBuilder() - .name(Text.literal("Show Interactions")) - .description(OptionDescription.of(Text.literal( + .name(Component.literal("Show Interactions")) + .description(OptionDescription.of(Component.literal( "If Interactions should be shown when the mod is active"))) .binding(true, () -> Config.HANDLER.instance().showInteractions, @@ -98,8 +98,8 @@ public class ModMenuIntegration implements ModMenuApi { .controller(TickBoxControllerBuilder::create) .build()) .option(Option.createBuilder() - .name(Text.literal("Show Marker")) - .description(OptionDescription.of(Text.literal( + .name(Component.literal("Show Marker")) + .description(OptionDescription.of(Component.literal( "If Marker should be shown when the mod is active"))) .binding(true, () -> Config.HANDLER.instance().showMarker, diff --git a/src/client/resources/visible-entities.client.mixins.json b/src/client/resources/visible-entities.client.mixins.json index 1882aa5..b00a0eb 100644 --- a/src/client/resources/visible-entities.client.mixins.json +++ b/src/client/resources/visible-entities.client.mixins.json @@ -3,11 +3,11 @@ "package": "tobinio.visibleentities.mixin.client", "compatibilityLevel": "JAVA_21", "client": [ - "BlockStateManagersInvoker", - "BlockStateManagersMixin", + "BlockStateDefinitionsInvoker", + "BlockStateDefinitionsMixin", "EntityMixin", "EntityRendererMixin", - "ItemFrameEntityRendererMixin", + "ItemFrameRendererMixin", "LivingEntityRendererMixin" ], "injectors": { diff --git a/src/main/java/tobinio/visibleentities/VisibleEntities.java b/src/main/java/tobinio/visibleentities/VisibleEntities.java index f7086dc..08636df 100644 --- a/src/main/java/tobinio/visibleentities/VisibleEntities.java +++ b/src/main/java/tobinio/visibleentities/VisibleEntities.java @@ -1,7 +1,7 @@ package tobinio.visibleentities; import net.fabricmc.api.ModInitializer; -import net.minecraft.entity.EntityType; +import net.minecraft.world.entity.EntityType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/tobinio/visibleentities/mixin/EntityTypeMixin.java b/src/main/java/tobinio/visibleentities/mixin/EntityTypeMixin.java index ad2b572..21ac7df 100644 --- a/src/main/java/tobinio/visibleentities/mixin/EntityTypeMixin.java +++ b/src/main/java/tobinio/visibleentities/mixin/EntityTypeMixin.java @@ -1,10 +1,10 @@ package tobinio.visibleentities.mixin; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.MarkerEntity; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.registry.RegistryKey; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Marker; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.resources.ResourceKey; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; @@ -22,25 +22,25 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin (EntityType.class) public abstract class EntityTypeMixin { @Shadow - protected static RegistryKey> keyOf(String id) { + protected static ResourceKey> vanillaEntityId(String id) { return null; } @Shadow - protected static EntityType register(RegistryKey> key, + protected static EntityType register(ResourceKey> key, EntityType.Builder type) { return null; } - @Inject (method = "register(Ljava/lang/String;Lnet/minecraft/entity/EntityType$Builder;)Lnet/minecraft/entity/EntityType;", at = @At ("HEAD"), cancellable = true) + @Inject (method = "register(Ljava/lang/String;Lnet/minecraft/world/entity/EntityType$Builder;)Lnet/minecraft/world/entity/EntityType;", at = @At ("HEAD"), cancellable = true) private static void registerMarker(String id, EntityType.Builder type, CallbackInfoReturnable> cir) { if (id.equals("marker")) { - var result = register(keyOf(id), - EntityType.Builder.create(MarkerEntity::new, SpawnGroup.MISC) - .dimensions(0.15F, 0.15F) - .maxTrackingRange(4)); + var result = register(vanillaEntityId(id), + EntityType.Builder.of(Marker::new, MobCategory.MISC) + .sized(0.15F, 0.15F) + .clientTrackingRange(4)); cir.setReturnValue((EntityType) result); cir.cancel(); diff --git a/src/main/java/tobinio/visibleentities/mixin/MarkerEntityMixin.java b/src/main/java/tobinio/visibleentities/mixin/MarkerEntityMixin.java deleted file mode 100644 index da7859e..0000000 --- a/src/main/java/tobinio/visibleentities/mixin/MarkerEntityMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package tobinio.visibleentities.mixin; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.MarkerEntity; -import net.minecraft.network.listener.ClientPlayPacketListener; -import net.minecraft.network.packet.Packet; -import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; -import net.minecraft.server.network.EntityTrackerEntry; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.world.World; -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.CallbackInfoReturnable; - -/** - * Created: 26.09.24 - * - * @author Tobias Frischmann - */ -@Mixin (MarkerEntity.class) -public class MarkerEntityMixin { - @Inject (method = "createSpawnPacket", at = @At ("HEAD"), cancellable = true) - public void createSpawnPacket(EntityTrackerEntry entityTrackerEntry, - CallbackInfoReturnable> cir) { - cir.setReturnValue(new EntitySpawnS2CPacket((Entity) (Object) this, entityTrackerEntry)); - } -} \ No newline at end of file diff --git a/src/main/java/tobinio/visibleentities/mixin/MarkerMixin.java b/src/main/java/tobinio/visibleentities/mixin/MarkerMixin.java new file mode 100644 index 0000000..c81bc81 --- /dev/null +++ b/src/main/java/tobinio/visibleentities/mixin/MarkerMixin.java @@ -0,0 +1,29 @@ +package tobinio.visibleentities.mixin; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Marker; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.server.level.ServerEntity; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +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.CallbackInfoReturnable; + +/** + * Created: 26.09.24 + * + * @author Tobias Frischmann + */ +@Mixin (Marker.class) +public class MarkerMixin { + @Inject (method = "getAddEntityPacket", at = @At ("HEAD"), cancellable = true) + public void createSpawnPacket(ServerEntity entityTrackerEntry, + CallbackInfoReturnable> cir) { + cir.setReturnValue(new ClientboundAddEntityPacket((Entity) (Object) this, entityTrackerEntry)); + } +} \ No newline at end of file diff --git a/src/main/resources/visible-entities.mixins.json b/src/main/resources/visible-entities.mixins.json index 320ed99..8d2842c 100644 --- a/src/main/resources/visible-entities.mixins.json +++ b/src/main/resources/visible-entities.mixins.json @@ -3,7 +3,7 @@ "package": "tobinio.visibleentities.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ - "MarkerEntityMixin", + "MarkerMixin", "EntityTypeMixin" ], "injectors": {