diff --git a/src/main/java/eu/midnightdust/picturesign/PictureSignClient.java b/src/main/java/eu/midnightdust/picturesign/PictureSignClient.java index 41e926c..4f8416e 100755 --- a/src/main/java/eu/midnightdust/picturesign/PictureSignClient.java +++ b/src/main/java/eu/midnightdust/picturesign/PictureSignClient.java @@ -1,13 +1,19 @@ package eu.midnightdust.picturesign; +import com.igrium.videolib.VideoLib; import eu.midnightdust.picturesign.config.PictureSignConfig; +import eu.midnightdust.picturesign.render.PictureSignRenderer; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; 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.networking.v1.ClientLoginConnectionEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.client.gui.screen.ingame.SignEditScreen; import net.minecraft.client.option.KeyBinding; import net.minecraft.client.util.InputUtil; +import net.minecraft.util.Identifier; import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; import org.apache.logging.log4j.LogManager; @@ -17,8 +23,6 @@ import org.lwjgl.glfw.GLFW; public class PictureSignClient implements ClientModInitializer { public static Logger LOGGER = LogManager.getLogger("PictureSign"); public static String[] clipboard = new String[4]; - public static final KeyBinding BINDING_EDIT_SIGN = new KeyBinding("key.picturesign.edit_sign", - InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_C, "key.categories.picturesign"); public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key.picturesign.copy_sign", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories.picturesign"); @Override @@ -26,6 +30,12 @@ public class PictureSignClient implements ClientModInitializer { PictureSignConfig.init("picturesign", PictureSignConfig.class); KeyBindingHelper.registerKeyBinding(BINDING_COPY_SIGN); + ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> { + PictureSignRenderer.videoPlayers.forEach(id -> { + VideoLib.getInstance().getVideoManager().closePlayer(id); + PictureSignRenderer.videoPlayers.remove(id); + }); + }); ClientTickEvents.END_CLIENT_TICK.register(client -> { if (!PictureSignClient.BINDING_COPY_SIGN.isPressed()) return; @@ -41,33 +51,5 @@ public class PictureSignClient implements ClientModInitializer { } } }); - if (PictureSignConfig.debug) { - KeyBindingHelper.registerKeyBinding(BINDING_EDIT_SIGN); - ClientTickEvents.END_CLIENT_TICK.register(client -> { - if (!PictureSignClient.BINDING_EDIT_SIGN.isPressed()) return; - PictureSignClient.BINDING_EDIT_SIGN.setPressed(false); - if (client.player == null || client.crosshairTarget == null || client.crosshairTarget.getType() != HitResult.Type.BLOCK) return; - if (client.crosshairTarget.getType() == HitResult.Type.BLOCK && client.world.getBlockState(new BlockPos(client.crosshairTarget.getPos())).hasBlockEntity()) { - if (client.world.getBlockEntity(new BlockPos(client.crosshairTarget.getPos())) instanceof SignBlockEntity) { - BlockPos pos = new BlockPos(client.crosshairTarget.getPos()); - SignBlockEntity sign = (SignBlockEntity) client.world.getBlockEntity(pos); - sign.setEditable(true); - sign.setEditor(client.player.getUuid()); - sign.toUpdatePacket(); - sign.markDirty(); - client.world.updateListeners(pos, sign.getCachedState(), sign.getCachedState(), 3); - client.setScreen(new SignEditScreen(sign,false)); -// clipboard[0] = sign.getTextOnRow(0, false).asString(); -// clipboard[1] = sign.getTextOnRow(1, false).asString(); -// clipboard[2] = sign.getTextOnRow(2, false).asString(); -// clipboard[3] = sign.getTextOnRow(3, false).asString(); -// Block signBlock = sign.getCachedState().getBlock(); -// client.interactionManager.breakBlock(pos); -// client.player.setStackInHand(client.player.preferredHand, new ItemStack(signBlock.asItem())); -// client.interactionManager.interactBlock(client.player, client.world, client.player.preferredHand, new BlockHitResult(new Vec3d(pos.getX(), pos.getY(), pos.getZ()), Direction.DOWN, pos,false)); - } - } - }); - } } } diff --git a/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignBlockEntity.java b/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignBlockEntity.java new file mode 100644 index 0000000..84ff7bd --- /dev/null +++ b/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignBlockEntity.java @@ -0,0 +1,27 @@ +package eu.midnightdust.picturesign.mixin; + +import com.igrium.videolib.VideoLib; +import eu.midnightdust.picturesign.render.PictureSignRenderer; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(value = SignBlockEntity.class, priority = 1100) +public abstract class MixinSignBlockEntity extends BlockEntity { + public MixinSignBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + @Unique + public void markRemoved() { + VideoLib.getInstance().getVideoManager().closePlayer(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ())); + PictureSignRenderer.videoPlayers.remove(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ())); + super.markRemoved(); + } +} diff --git a/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java b/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java index 668687a..56c07c9 100755 --- a/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java +++ b/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java @@ -1,8 +1,6 @@ package eu.midnightdust.picturesign.render; import com.igrium.videolib.VideoLib; -import com.igrium.videolib.api.VideoHandle; -import com.igrium.videolib.api.VideoHandleFactory; import com.igrium.videolib.api.VideoManager; import com.igrium.videolib.api.VideoPlayer; import com.mojang.blaze3d.systems.RenderSystem; @@ -15,9 +13,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.irisshaders.iris.api.v0.IrisApi; import net.minecraft.block.Blocks; import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; -import net.minecraft.client.texture.TextureManager; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.state.property.Properties; import net.minecraft.util.Identifier; @@ -31,6 +27,7 @@ import java.util.List; public class PictureSignRenderer { VideoManager videoManager = VideoLib.getInstance().getVideoManager(); + public static List videoPlayers = new ArrayList<>(); List playedOnce = new ArrayList<>(); public void render(SignBlockEntity signBlockEntity, MatrixStack matrixStack, int light, int overlay) { @@ -85,10 +82,13 @@ public class PictureSignRenderer { } else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { videoPlayer = videoManager.getOrCreate(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ())); + videoPlayers.add(videoPlayer.getId()); try { if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { - if (!videoPlayer.getMediaInterface().hasMedia()) + if (!videoPlayer.getMediaInterface().hasMedia()) { videoPlayer.getMediaInterface().play(url); + videoPlayer.getControlsInterface().setRepeat(true); + } } else if (!videoPlayer.getMediaInterface().hasMedia() && !playedOnce.contains(pos)) videoPlayer.getMediaInterface().play(url); @@ -152,12 +152,13 @@ public class PictureSignRenderer { } else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { assert videoPlayer != null; - TextureManager textureManager = MinecraftClient.getInstance().getTextureManager(); - if (videoPlayer.getTexture() != null && videoPlayer.getCodecInterface().getFrameRate() > 1 && textureManager.getTexture(videoPlayer.getTexture()) != null && textureManager.getTexture(videoPlayer.getTexture()).getGlId() != 0) + //TextureManager textureManager = MinecraftClient.getInstance().getTextureManager(); + //if (videoPlayer.getTexture() != null && videoPlayer.getCodecInterface().getFrameRate() > 1 && textureManager.getTexture(videoPlayer.getTexture()) != null && textureManager.getTexture(videoPlayer.getTexture()).getGlId() != 0) texture = videoPlayer.getTexture(); - else texture = new Identifier("picturesign", "textures/black.png"); + //else texture = new Identifier("picturesign", "textures/black.png"); } else return; + RenderSystem.setShaderTexture(0, new Identifier("picturesign", "textures/black.png")); RenderSystem.setShaderTexture(0, texture); if (PictureSignConfig.translucency) RenderSystem.enableBlend(); diff --git a/src/main/resources/picturesign.mixins.json b/src/main/resources/picturesign.mixins.json index 7de1bba..6e7680b 100755 --- a/src/main/resources/picturesign.mixins.json +++ b/src/main/resources/picturesign.mixins.json @@ -1,10 +1,11 @@ { "required": true, "package": "eu.midnightdust.picturesign.mixin", - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_17", "client": [ "MixinSignBlockEntityRenderer", - "MixinSignEditScreen" + "MixinSignEditScreen", + "MixinSignBlockEntity" ], "injectors": { "defaultRequire": 1