diff --git a/src/main/java/tobinio/visibleentities/VisibleEntities.java b/src/main/java/tobinio/visibleentities/VisibleEntities.java index 71aa0f3..4db111c 100644 --- a/src/main/java/tobinio/visibleentities/VisibleEntities.java +++ b/src/main/java/tobinio/visibleentities/VisibleEntities.java @@ -5,11 +5,17 @@ import net.fabricmc.api.ModInitializer; 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.ColorProviderRegistry; import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.color.block.BlockColorProvider; +import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.render.TexturedRenderLayers; import net.minecraft.client.util.InputUtil; import net.minecraft.entity.EntityType; +import net.minecraft.entity.decoration.ItemFrameEntity; +import net.minecraft.state.property.Properties; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.math.ColorHelper; diff --git a/src/main/java/tobinio/visibleentities/mixin/BlockStatesLoaderMixin.java b/src/main/java/tobinio/visibleentities/mixin/BlockStatesLoaderMixin.java new file mode 100644 index 0000000..dbfb4af --- /dev/null +++ b/src/main/java/tobinio/visibleentities/mixin/BlockStatesLoaderMixin.java @@ -0,0 +1,46 @@ +package tobinio.visibleentities.mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.render.model.BlockStatesLoader; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +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 tobinio.visibleentities.VisibleEntities; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created: 14.09.24 + * + * @author Tobias Frischmann + */ +@Mixin (BlockStatesLoader.class) +public class BlockStatesLoaderMixin { + @Mutable + @Shadow + @Final + private static Map> STATIC_DEFINITIONS; + + @Shadow + @Final + private static StateManager ITEM_FRAME_STATE_MANAGER; + + @Inject (method = "", at = @At ("TAIL")) + private static void modifySnowball(CallbackInfo ci) { + STATIC_DEFINITIONS = new HashMap<>(); + + STATIC_DEFINITIONS.put(Identifier.ofVanilla("item_frame"), ITEM_FRAME_STATE_MANAGER); + STATIC_DEFINITIONS.put(Identifier.ofVanilla("glow_item_frame"), ITEM_FRAME_STATE_MANAGER); + STATIC_DEFINITIONS.put(Identifier.of(VisibleEntities.MOD_ID, "transparent_item_frame"), + ITEM_FRAME_STATE_MANAGER); + STATIC_DEFINITIONS.put(Identifier.of(VisibleEntities.MOD_ID, "transparent_glow_item_frame"), + ITEM_FRAME_STATE_MANAGER); + } +} diff --git a/src/main/java/tobinio/visibleentities/mixin/ItemFrameEntityRendererMixin.java b/src/main/java/tobinio/visibleentities/mixin/ItemFrameEntityRendererMixin.java new file mode 100644 index 0000000..245cade --- /dev/null +++ b/src/main/java/tobinio/visibleentities/mixin/ItemFrameEntityRendererMixin.java @@ -0,0 +1,80 @@ +package tobinio.visibleentities.mixin; + +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.TexturedRenderLayers; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.BlockRenderManager; +import net.minecraft.client.render.entity.ItemFrameEntityRenderer; +import net.minecraft.client.render.model.BakedModelManager; +import net.minecraft.client.util.ModelIdentifier; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.decoration.ItemFrameEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +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 tobinio.visibleentities.VisibleEntities; +import tobinio.visibleentities.settings.Config; + +/** + * Created: 14.09.24 + * + * @author Tobias Frischmann + */ +@Mixin (ItemFrameEntityRenderer.class) +public abstract class ItemFrameEntityRendererMixin { + @Unique + private static final ModelIdentifier TRANSPARENT_NORMAL_FRAME = new ModelIdentifier(Identifier.of(VisibleEntities.MOD_ID, + "transparent_item_frame"), "map=false"); + @Unique + private static final ModelIdentifier TRANSPARENT_MAP_FRAME = new ModelIdentifier(Identifier.of(VisibleEntities.MOD_ID, + "transparent_item_frame"), "map=true"); + @Unique + private static final ModelIdentifier TRANSPARENT_GLOW_FRAME = new ModelIdentifier(Identifier.of(VisibleEntities.MOD_ID, + "transparent_glow_item_frame"), "map=false"); + @Unique + private static final ModelIdentifier TRANSPARENT_MAP_GLOW_FRAME = new ModelIdentifier(Identifier.of(VisibleEntities.MOD_ID, + "transparent_glow_item_frame"), "map=true"); + + @Shadow + @Final + private BlockRenderManager blockRenderManager; + + @Inject (at = @At (value = "INVOKE", target = "Lnet/minecraft/entity/decoration/ItemFrameEntity;getHeldItemStack()Lnet/minecraft/item/ItemStack;"), method = "render(Lnet/minecraft/entity/decoration/ItemFrameEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V") + private void renderTransparent(T itemFrameEntity, float f, float g, MatrixStack matrixStack, + VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { + if (VisibleEntities.isActive && Config.HANDLER.instance().showItemFrames && itemFrameEntity.isInvisible()) { + ItemStack itemStack = itemFrameEntity.getHeldItemStack(); + + BakedModelManager bakedModelManager = this.blockRenderManager.getModels().getModelManager(); + ModelIdentifier modelIdentifier = this.getTransparentModelId(itemFrameEntity, itemStack); + matrixStack.push(); + matrixStack.translate(-0.5F, -0.5F, -0.5F); + this.blockRenderManager.getModelRenderer() + .render(matrixStack.peek(), + vertexConsumerProvider.getBuffer(TexturedRenderLayers.getEntityTranslucentCull()), + null, + bakedModelManager.getModel(modelIdentifier), + 1.0F, + 1.0F, + 1.0F, + i, + OverlayTexture.DEFAULT_UV); + matrixStack.pop(); + } + } + + @Unique + private ModelIdentifier getTransparentModelId(T entity, ItemStack stack) { + boolean bl = entity.getType() == EntityType.GLOW_ITEM_FRAME; + if (stack.isOf(Items.FILLED_MAP)) { + return bl ? TRANSPARENT_MAP_GLOW_FRAME : TRANSPARENT_MAP_FRAME; + } else { + return bl ? TRANSPARENT_GLOW_FRAME : TRANSPARENT_NORMAL_FRAME; + } + } +} diff --git a/src/main/java/tobinio/visibleentities/settings/Config.java b/src/main/java/tobinio/visibleentities/settings/Config.java index 8b0d41b..0e1dc2b 100644 --- a/src/main/java/tobinio/visibleentities/settings/Config.java +++ b/src/main/java/tobinio/visibleentities/settings/Config.java @@ -21,6 +21,10 @@ public class Config { .build()) .build(); + public static final boolean SHOW_ITEM_FRAMES_DEFAULT = true; + @SerialEntry + public boolean showItemFrames = SHOW_ITEM_FRAMES_DEFAULT; + public static final boolean SHOW_ENTITIES_DEFAULT = true; @SerialEntry public boolean showEntities = SHOW_ENTITIES_DEFAULT; diff --git a/src/main/java/tobinio/visibleentities/settings/ModMenuIntegration.java b/src/main/java/tobinio/visibleentities/settings/ModMenuIntegration.java index 24c6404..be36103 100644 --- a/src/main/java/tobinio/visibleentities/settings/ModMenuIntegration.java +++ b/src/main/java/tobinio/visibleentities/settings/ModMenuIntegration.java @@ -24,6 +24,13 @@ public class ModMenuIntegration implements ModMenuApi { .title(Text.literal("Visible Entities")) .category(ConfigCategory.createBuilder() .name(Text.literal("Visible Entities")) + .option(Option.createBuilder() + .name(Text.literal("Show ItemFrames")) + .binding(Config.SHOW_ITEM_FRAMES_DEFAULT, + () -> Config.HANDLER.instance().showItemFrames, + newVal -> Config.HANDLER.instance().showItemFrames = newVal) + .controller(opt -> BooleanControllerBuilder.create(opt).coloured(true)) + .build()) .option(Option.createBuilder() .name(Text.literal("Show Entities")) .binding(Config.SHOW_ENTITIES_DEFAULT, diff --git a/src/main/resources/assets/visible-entities/blockstates/transparent_glow_item_frame.json b/src/main/resources/assets/visible-entities/blockstates/transparent_glow_item_frame.json new file mode 100644 index 0000000..4a20b90 --- /dev/null +++ b/src/main/resources/assets/visible-entities/blockstates/transparent_glow_item_frame.json @@ -0,0 +1,10 @@ +{ + "variants": { + "map=false": { + "model": "visible-entities:block/transparent_glow_item_frame" + }, + "map=true": { + "model": "visible-entities:block/transparent_glow_item_frame_map" + } + } +} diff --git a/src/main/resources/assets/visible-entities/blockstates/transparent_item_frame.json b/src/main/resources/assets/visible-entities/blockstates/transparent_item_frame.json new file mode 100644 index 0000000..ceeb07e --- /dev/null +++ b/src/main/resources/assets/visible-entities/blockstates/transparent_item_frame.json @@ -0,0 +1,10 @@ +{ + "variants": { + "map=false": { + "model": "visible-entities:block/transparent_item_frame" + }, + "map=true": { + "model": "visible-entities:block/transparent_item_frame_map" + } + } +} diff --git a/src/main/resources/assets/visible-entities/models/block/transparent_glow_item_frame.json b/src/main/resources/assets/visible-entities/models/block/transparent_glow_item_frame.json new file mode 100644 index 0000000..7c5ac98 --- /dev/null +++ b/src/main/resources/assets/visible-entities/models/block/transparent_glow_item_frame.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/template_item_frame", + "textures": { + "particle": "visible-entities:block/transparent_birch_planks", + "wood": "visible-entities:block/transparent_birch_planks", + "back": "visible-entities:block/transparent_glow_item_frame" + } +} diff --git a/src/main/resources/assets/visible-entities/models/block/transparent_glow_item_frame_map.json b/src/main/resources/assets/visible-entities/models/block/transparent_glow_item_frame_map.json new file mode 100644 index 0000000..fd78583 --- /dev/null +++ b/src/main/resources/assets/visible-entities/models/block/transparent_glow_item_frame_map.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/template_item_frame_map", + "textures": { + "particle": "visible-entities:block/transparent_birch_planks", + "wood": "visible-entities:block/transparent_birch_planks", + "back": "visible-entities:block/transparent_glow_item_frame" + } +} diff --git a/src/main/resources/assets/visible-entities/models/block/transparent_item_frame.json b/src/main/resources/assets/visible-entities/models/block/transparent_item_frame.json new file mode 100644 index 0000000..9750605 --- /dev/null +++ b/src/main/resources/assets/visible-entities/models/block/transparent_item_frame.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/template_item_frame", + "textures": { + "particle": "visible-entities:block/transparent_birch_planks", + "wood": "visible-entities:block/transparent_birch_planks", + "back": "visible-entities:block/transparent_item_frame" + } +} diff --git a/src/main/resources/assets/visible-entities/models/block/transparent_item_frame_map.json b/src/main/resources/assets/visible-entities/models/block/transparent_item_frame_map.json new file mode 100644 index 0000000..fda127b --- /dev/null +++ b/src/main/resources/assets/visible-entities/models/block/transparent_item_frame_map.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/template_item_frame_map", + "textures": { + "particle": "visible-entities:block/transparent_birch_planks", + "wood": "visible-entities:block/transparent_birch_planks", + "back": "visible-entities:block/transparent_item_frame" + } +} diff --git a/src/main/resources/assets/visible-entities/textures/block/transparent_birch_planks.png b/src/main/resources/assets/visible-entities/textures/block/transparent_birch_planks.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5c75a12312f63b496e5781647e6a67a8d806dd GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z&OX# z#WBR9w{)_9_8kL(qxIaka^Ki`OmKQMS@Epug<{3+bz91 z_%3BP{f+NDB*d;<s%g-&0a9yj<|iuAjdH{>$Co r@;I&f+s-}RXD55l>iEC>qr9g!$GmA@*p@IbFfe$!`njxgN@xNAPU_?> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/visible-entities/textures/block/transparent_glow_item_frame.png b/src/main/resources/assets/visible-entities/textures/block/transparent_glow_item_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..71b7c02baf2eb3c9c42320e4ccca3a336643950e GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z_{4c z#WBR9ckbl#*}{$@$L)8|%~=+a)RMEHeVqndEa%zy0D=ET|2M@|eO7Rpwq)yy9kwi+ zxjln*E}xXJJ@d}TtVPc1!;J6M_rC9~bo}+~tGcE#Lsa1G+Vr*Z-(J0cFY0uvqkr#$ zpqG35f+BVsZO!@lIY^0N*Cpv%0iCH&`tkH*~L8<$f$LQkt3XzbDwr%cJq7g?i^&AJzGDzn$n7-Jf<#eMS8GX2xHK z8UH>!@bdXh)0Y~FR_7S`_16fi6fPI!Iq&E5gJrO(EOeeiz@jq@^xv@wz=d1kl34KD( zZf^D7Ve59FSKz^e9ru45Sa5ZGi5F>me*V^!{rNv9-Tmk44ofy`glX=O&!06=Z z;uvDlTN`{f>#zaOzaSa+Rz9H{3$4@MY`T79^4pWYq-?*ZlkW`-3^)bHWFy|U$P%VkE6<~wx{+-vNycyz$X^NLdLlG!&36IZTDcp4|LYu?3zj9BX!1{2TT zuiUI!EHa%1ECu^MF>QL~puH{5Z`S9TPlGQ?=uW%MWL>Ja=lho_D;7;jy0!a?gCd*D z!|vKpmvZx6i97Ya9q^a-%2vPCJCC>##GT$%>TvlL?dDpWlzW7~L z+)*3G5Vnk(O~NNtZZdyOd}qR%Q5$iyB=eQ?j-_g|uD@v8(D|k@kL|K(nts*m)Qpd7 y#JJAzEuTI2_DO@(PoI|E=REM=f6mQ^{7e<|?m3;^k;lNmz~JfX=d#Wzp$PyKx~i!F literal 0 HcmV?d00001 diff --git a/src/main/resources/visible-entities.mixins.json b/src/main/resources/visible-entities.mixins.json index 0904c19..13ef083 100644 --- a/src/main/resources/visible-entities.mixins.json +++ b/src/main/resources/visible-entities.mixins.json @@ -3,7 +3,9 @@ "package": "tobinio.visibleentities.mixin", "compatibilityLevel": "JAVA_21", "client": [ + "BlockStatesLoaderMixin", "EntityMixin", + "ItemFrameEntityRendererMixin", "LivingEntityRendererMixin" ], "injectors": {