From 358340b2cc4583f01ab97da51e6254932fe217b8 Mon Sep 17 00:00:00 2001 From: Motschen Date: Wed, 4 Jan 2023 17:05:56 +0100 Subject: [PATCH] Some more refinement --- build.gradle | 8 +- .../picturesign/PictureSignClient.java | 36 +++---- .../picturesign/config/PictureSignConfig.java | 11 +- .../mixin/MixinSignBlockEntity.java | 9 +- .../mixin/MixinSignEditScreen.java | 14 +-- .../render/PictureSignRenderer.java | 100 ++++++++---------- .../screen/PictureSignHelperScreen.java | 13 ++- .../{ => util}/PictureDownloader.java | 8 +- .../picturesign/util/PictureURLUtils.java | 4 +- .../picturesign/util/VideoHandler.java | 41 +++++++ .../assets/picturesign/lang/de_de.json | 5 + .../assets/picturesign/lang/en_us.json | 5 + 12 files changed, 156 insertions(+), 98 deletions(-) rename src/main/java/eu/midnightdust/picturesign/{ => util}/PictureDownloader.java (92%) create mode 100644 src/main/java/eu/midnightdust/picturesign/util/VideoHandler.java diff --git a/build.gradle b/build.gradle index 8b31b3f..dae4d1f 100755 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,10 @@ plugins { - id 'fabric-loom' version '0.11-SNAPSHOT' + id 'fabric-loom' version '1.0-SNAPSHOT' id 'maven-publish' } -sourceCompatibility = JavaVersion.VERSION_16 -targetCompatibility = JavaVersion.VERSION_16 +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 archivesBaseName = project.archives_base_name version = project.mod_version @@ -59,7 +59,7 @@ tasks.withType(JavaCompile).configureEach { it.options.encoding = "UTF-8" // Minecraft 1.17 (21w19a) upwards uses Java 16. - it.options.release = 16 + it.options.release = 17 } java { diff --git a/src/main/java/eu/midnightdust/picturesign/PictureSignClient.java b/src/main/java/eu/midnightdust/picturesign/PictureSignClient.java index 2d6fdaa..7ff92e1 100755 --- a/src/main/java/eu/midnightdust/picturesign/PictureSignClient.java +++ b/src/main/java/eu/midnightdust/picturesign/PictureSignClient.java @@ -1,17 +1,14 @@ package eu.midnightdust.picturesign; -import com.igrium.videolib.VideoLib; +import eu.midnightdust.lib.util.PlatformFunctions; import eu.midnightdust.picturesign.config.PictureSignConfig; -import eu.midnightdust.picturesign.render.PictureSignRenderer; +import eu.midnightdust.picturesign.util.VideoHandler; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientBlockEntityEvents; -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; @@ -23,33 +20,34 @@ import org.lwjgl.glfw.GLFW; public class PictureSignClient implements ClientModInitializer { public static Logger LOGGER = LogManager.getLogger("PictureSign"); + public static String MOD_ID = "picturesign"; public static String[] clipboard = new String[4]; - public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key.picturesign.copy_sign", - InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories.picturesign"); + public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key."+MOD_ID+".copy_sign", + InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories."+MOD_ID); @Override public void onInitializeClient() { - PictureSignConfig.init("picturesign", PictureSignConfig.class); + PictureSignConfig.init(MOD_ID, PictureSignConfig.class); KeyBindingHelper.registerKeyBinding(BINDING_COPY_SIGN); ClientLoginConnectionEvents.DISCONNECT.register((handler, client) -> { - PictureSignRenderer.videoPlayers.forEach(id -> { - VideoLib.getInstance().getVideoManager().closePlayer(id); - PictureSignRenderer.videoPlayers.remove(id); - }); + if (PlatformFunctions.isModLoaded("videolib")) { + VideoHandler.videoPlayers.forEach(VideoHandler::closePlayer); + VideoHandler.playedOnce.clear(); + } }); ClientBlockEntityEvents.BLOCK_ENTITY_UNLOAD.register((blockEntity, world) -> { - BlockPos pos = blockEntity.getPos(); - 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())); + if (PlatformFunctions.isModLoaded("videolib")) { + BlockPos pos = blockEntity.getPos(); + Identifier videoId = new Identifier(MOD_ID, pos.getX() + "_" + pos.getY() + "_" + pos.getZ()); + VideoHandler.closePlayer(videoId); + } }); - ClientTickEvents.END_CLIENT_TICK.register(client -> { if (!PictureSignClient.BINDING_COPY_SIGN.isPressed()) return; PictureSignClient.BINDING_COPY_SIGN.setPressed(false); - if (client.player == null || client.crosshairTarget == null || client.crosshairTarget.getType() != HitResult.Type.BLOCK) return; + if (client.player == null || client.world == 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) { - SignBlockEntity sign = (SignBlockEntity) client.world.getBlockEntity(new BlockPos(client.crosshairTarget.getPos())); + if (client.world.getBlockEntity(new BlockPos(client.crosshairTarget.getPos())) instanceof SignBlockEntity sign) { clipboard[0] = sign.getTextOnRow(0, false).getString(); clipboard[1] = sign.getTextOnRow(1, false).getString(); clipboard[2] = sign.getTextOnRow(2, false).getString(); diff --git a/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java b/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java index 55c4d58..c8df3d2 100755 --- a/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java +++ b/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java @@ -1,17 +1,26 @@ package eu.midnightdust.picturesign.config; +import com.google.common.collect.Lists; import eu.midnightdust.lib.config.MidnightConfig; +import java.util.List; + public class PictureSignConfig extends MidnightConfig { @Entry public static boolean enabled = true; @Entry public static boolean enableVideoSigns = true; @Entry public static boolean translucency = false; @Entry public static boolean helperUi = true; - @Entry public static boolean exceedVanillaLineLength = false; + @Entry public static boolean exceedVanillaLineLength = true; @Entry public static boolean debug = false; @Entry(min = 1, max = 10) public static int maxThreads = 4; @Entry(min = 0, max = 4096) public static int signRenderDistance = 64; @Entry public static boolean safeMode = true; @Comment public static Comment ebeWarning; @Comment public static Comment ebeWarning2; + @Entry public static List safeProviders = Lists.newArrayList("https://i.imgur.com/", "https://i.ibb.co/", "https://pictshare.net/", "https://iili.io/"); + @Entry public static MissingImageMode missingImageMode = MissingImageMode.BLACK; + + public enum MissingImageMode { + BLACK, MISSING_TEXTURE, TRANSPARENT + } } diff --git a/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignBlockEntity.java b/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignBlockEntity.java index 84ff7bd..11b55eb 100644 --- a/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignBlockEntity.java +++ b/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignBlockEntity.java @@ -1,7 +1,6 @@ package eu.midnightdust.picturesign.mixin; -import com.igrium.videolib.VideoLib; -import eu.midnightdust.picturesign.render.PictureSignRenderer; +import eu.midnightdust.picturesign.util.VideoHandler; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; @@ -11,6 +10,8 @@ import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; +import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID; + @Mixin(value = SignBlockEntity.class, priority = 1100) public abstract class MixinSignBlockEntity extends BlockEntity { public MixinSignBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { @@ -20,8 +21,8 @@ public abstract class MixinSignBlockEntity extends BlockEntity { @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())); + Identifier videoId = new Identifier(MOD_ID, pos.getX() + "_" + pos.getY() + "_" + pos.getZ()); + VideoHandler.closePlayer(videoId); super.markRemoved(); } } diff --git a/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignEditScreen.java b/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignEditScreen.java index 2fa4fdf..fe3619e 100644 --- a/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignEditScreen.java +++ b/src/main/java/eu/midnightdust/picturesign/mixin/MixinSignEditScreen.java @@ -18,11 +18,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Objects; +import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID; + @Mixin(SignEditScreen.class) public abstract class MixinSignEditScreen extends Screen { - private static final Identifier PICTURESIGN_ICON_TEXTURE = new Identifier("picturesign","textures/gui/picturesign_button.png"); - private static final Identifier CLIPBOARD_ICON_TEXTURE = new Identifier("picturesign","textures/gui/clipboard_button.png"); - private static final Identifier TRASHBIN_ICON_TEXTURE = new Identifier("picturesign","textures/gui/trashbin_button.png"); + private static final Identifier PICTURESIGN_ICON_TEXTURE = new Identifier(MOD_ID,"textures/gui/picturesign_button.png"); + private static final Identifier CLIPBOARD_ICON_TEXTURE = new Identifier(MOD_ID,"textures/gui/clipboard_button.png"); + private static final Identifier TRASHBIN_ICON_TEXTURE = new Identifier(MOD_ID,"textures/gui/trashbin_button.png"); @Shadow @Final private SignBlockEntity sign; @Shadow @Final private String[] text; @@ -39,18 +41,18 @@ public abstract class MixinSignEditScreen extends Screen { text[i] = PictureSignClient.clipboard[i]; sign.setTextOnRow(i, Text.of(text[i])); } - }, Text.of(""))); + }, Text.empty())); if (PictureSignConfig.helperUi) this.addDrawableChild(new TexturedOverlayButtonWidget(this.width - 62, this.height - 40, 20, 20, 0, 0, 20, TRASHBIN_ICON_TEXTURE, 32, 64, (buttonWidget) -> { for (int i = 0; i < 4; i++) { text[i] = ""; sign.setTextOnRow(i, Text.empty()); } - }, Text.of(""))); + }, Text.empty())); if (PictureSignConfig.helperUi) this.addDrawableChild(new TexturedOverlayButtonWidget(this.width - 40, this.height - 40, 20, 20, 0, 0, 20, PICTURESIGN_ICON_TEXTURE, 32, 64, (buttonWidget) -> { sign.setEditable(true); Objects.requireNonNull(client).setScreen(new PictureSignHelperScreen(this.sign,false)); - }, Text.of(""))); + }, Text.empty())); } } diff --git a/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java b/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java index b42dc57..ca461af 100755 --- a/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java +++ b/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java @@ -1,20 +1,18 @@ package eu.midnightdust.picturesign.render; -import com.igrium.videolib.VideoLib; -import com.igrium.videolib.api.VideoManager; -import com.igrium.videolib.api.VideoPlayer; import com.mojang.blaze3d.systems.RenderSystem; -import eu.midnightdust.picturesign.PictureDownloader; +import eu.midnightdust.lib.util.PlatformFunctions; +import eu.midnightdust.picturesign.util.*; import eu.midnightdust.picturesign.PictureSignClient; import eu.midnightdust.picturesign.config.PictureSignConfig; -import eu.midnightdust.picturesign.util.PictureInfo; -import eu.midnightdust.picturesign.util.PictureSignType; -import eu.midnightdust.picturesign.util.PictureURLUtils; 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.NativeImageBackedTexture; +import net.minecraft.client.texture.TextureManager; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.state.property.Properties; import net.minecraft.util.Identifier; @@ -22,14 +20,11 @@ import net.minecraft.util.math.*; import net.minecraft.world.World; import java.net.MalformedURLException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; + +import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID; public class PictureSignRenderer { - VideoManager videoManager = VideoLib.getInstance().getVideoManager(); - public static List videoPlayers = new ArrayList<>(); - List playedOnce = new ArrayList<>(); + private boolean isSafeUrl; public void render(SignBlockEntity signBlockEntity, MatrixStack matrixStack, int light, int overlay) { String url = PictureURLUtils.getLink(signBlockEntity); @@ -45,21 +40,25 @@ public class PictureSignRenderer { if (!url.contains("://")) { url = "https://" + url; } - //if (!url.contains(".png") && !url.contains(".jpg") && !url.contains(".jpeg")) return; - //if (PictureSignConfig.safeMode && !url.startsWith("https://i.imgur.com/") && !url.startsWith("https://i.ibb.co/") - // && !url.startsWith("https://pictshare.net/") && !url.startsWith("https://iili.io/")) - // return; + if (PictureSignType.isType(signBlockEntity, PictureSignType.PICTURE) && !url.contains(".png") && !url.contains(".jpg") && !url.contains(".jpeg")) return; + if (PictureSignConfig.safeMode) { + isSafeUrl = false; + String finalUrl = url; + PictureSignConfig.safeProviders.forEach(safe -> { + if (!isSafeUrl) isSafeUrl = finalUrl.startsWith(safe); + }); + if (!isSafeUrl) return; + } + if ((!PictureSignConfig.enableVideoSigns || !PlatformFunctions.isModLoaded("videolib")) && !PictureSignType.isType(signBlockEntity, PictureSignType.PICTURE)) return; World world = signBlockEntity.getWorld(); BlockPos pos = signBlockEntity.getPos(); + Identifier videoId = new Identifier(MOD_ID, pos.getX() + "_" + pos.getY() + "_" + pos.getZ()); if (world != null && ((world.getBlockState(pos.down()).getBlock().equals(Blocks.REDSTONE_TORCH) || world.getBlockState(pos.down()).getBlock().equals(Blocks.REDSTONE_WALL_TORCH)) && world.getBlockState(pos.down()).get(Properties.LIT).equals(false) || (world.getBlockState(pos.up()).getBlock().equals(Blocks.REDSTONE_TORCH) || world.getBlockState(pos.up()).getBlock().equals(Blocks.REDSTONE_WALL_TORCH)) && world.getBlockState(pos.up()).get(Properties.LIT).equals(false))) { - if (videoManager != null) - videoManager.closePlayer(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ())); - playedOnce.remove(pos); - videoPlayers.remove(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ())); + VideoHandler.closePlayer(videoId); PictureURLUtils.cachedJsonData.remove(url); return; } @@ -68,53 +67,48 @@ public class PictureSignRenderer { if (!lastLine.matches("(.*\\d:.*\\d:.*\\d:.*\\d:.*\\d)")) return; - List scale = Arrays.stream(lastLine.split(":")).toList(); + String[] scale = lastLine.split(":"); float width = 0; float height = 0; float x = 0; float y = 0; float z = 0; try { - width = Float.parseFloat(scale.get(0)); - height = Float.parseFloat(scale.get(1)); - x = Float.parseFloat(scale.get(2)); - y = Float.parseFloat(scale.get(3)); - z = Float.parseFloat(scale.get(4)); + width = Float.parseFloat(scale[0]); + height = Float.parseFloat(scale[1]); + x = Float.parseFloat(scale[2]); + y = Float.parseFloat(scale[3]); + z = Float.parseFloat(scale[4]); } catch (NumberFormatException ignored) {} // Download the picture data PictureDownloader.PictureData data = null; - VideoPlayer videoPlayer = null; if (PictureSignType.isType(signBlockEntity, PictureSignType.PICTURE)) { data = PictureDownloader.getInstance().getPicture(url); - if (data == null || data.identifier == null) { - return; - } + if (data == null || data.identifier == null) return; } 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()); + VideoHandler.videoPlayers.add(videoId); try { - if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { - if (!videoPlayer.getMediaInterface().hasMedia()) { - videoPlayer.getMediaInterface().play(url); - videoPlayer.getControlsInterface().setRepeat(true); - } + if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO) && !VideoHandler.hasMedia(videoId)) { + VideoHandler.play(videoId, url); + VideoHandler.setRepeat(videoId, true); } - else if (!videoPlayer.getMediaInterface().hasMedia() && !playedOnce.contains(pos)) { - videoPlayer.getMediaInterface().play(url); + else if (!VideoHandler.hasMedia(videoId) && !VideoHandler.playedOnce.contains(videoId)) { + VideoHandler.play(videoId, url); } } catch (MalformedURLException e) { PictureSignClient.LOGGER.error(e); return; } - if (info != null && info.start() > 0 && videoPlayer.getControlsInterface().getTime() < info.start()) videoPlayer.getControlsInterface().setTime(info.start()); - if (info != null && info.end() > 0 && videoPlayer.getControlsInterface().getTime() >= info.end() && !playedOnce.contains(pos)) videoPlayer.getControlsInterface().stop(); + if (info != null && info.start() > 0 && VideoHandler.getTime(videoId) < info.start()) VideoHandler.setTime(videoId, info.start()); + if (info != null && info.end() > 0 && VideoHandler.getTime(videoId) >= info.end() && !VideoHandler.playedOnce.contains(videoId)) VideoHandler.stop(videoId); } else return; - if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO)) playedOnce.add(pos); + + if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO)) VideoHandler.playedOnce.add(videoId); float xOffset = 0.0F; float zOffset = 0.0F; @@ -145,12 +139,9 @@ public class PictureSignRenderer { } else return; - Tessellator tessellator = Tessellator.getInstance(); BufferBuilder buffer = tessellator.getBuffer(); - - int l; if (FabricLoader.getInstance().isModLoaded("iris") && IrisApi.getInstance().isShaderPackInUse()) { RenderSystem.setShader(GameRenderer::getRenderTypeCutoutShader); @@ -165,15 +156,14 @@ public class PictureSignRenderer { assert data != null; texture = data.identifier; } - 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) - texture = videoPlayer.getTexture(); - //else texture = new Identifier("picturesign", "textures/black.png"); - } + else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) + texture = VideoHandler.getTexture(videoId); else return; - RenderSystem.setShaderTexture(0, new Identifier("picturesign", "textures/black.png")); + TextureManager textureManager = MinecraftClient.getInstance().getTextureManager(); + if (textureManager.getTexture(texture) == null || (textureManager.getTexture(texture) instanceof NativeImageBackedTexture nativeTexture && nativeTexture.getImage() == null)) { + if (PictureSignConfig.missingImageMode.equals(PictureSignConfig.MissingImageMode.TRANSPARENT)) return; + texture = PictureSignConfig.missingImageMode.equals(PictureSignConfig.MissingImageMode.BLACK) ? (new Identifier(MOD_ID, "textures/black.png")) : (TextureManager.MISSING_IDENTIFIER); + } RenderSystem.setShaderTexture(0, texture); if (PictureSignConfig.translucency) RenderSystem.enableBlend(); @@ -182,7 +172,7 @@ public class PictureSignRenderer { RenderSystem.depthMask(true); matrixStack.push(); - matrixStack.translate(xOffset + x, 0.00F + y, zOffset + z); + matrixStack.translate(xOffset + x, y, zOffset + z); matrixStack.multiply(yRotation); Matrix4f matrix4f = matrixStack.peek().getPositionMatrix(); diff --git a/src/main/java/eu/midnightdust/picturesign/screen/PictureSignHelperScreen.java b/src/main/java/eu/midnightdust/picturesign/screen/PictureSignHelperScreen.java index 484464c..ff1bfde 100644 --- a/src/main/java/eu/midnightdust/picturesign/screen/PictureSignHelperScreen.java +++ b/src/main/java/eu/midnightdust/picturesign/screen/PictureSignHelperScreen.java @@ -1,10 +1,8 @@ package eu.midnightdust.picturesign.screen; -import eu.midnightdust.lib.util.MidnightColorUtil; import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget; import eu.midnightdust.picturesign.PictureSignClient; import eu.midnightdust.picturesign.config.PictureSignConfig; -import eu.midnightdust.picturesign.util.PictureSignType; import eu.midnightdust.picturesign.util.PictureURLUtils; import net.minecraft.block.BlockState; import net.minecraft.block.SignBlock; @@ -27,10 +25,12 @@ import net.minecraft.util.math.Matrix4f; import java.util.Objects; import java.util.stream.IntStream; +import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID; + public class PictureSignHelperScreen extends Screen { - private static final Identifier TEXTSIGN_ICON_TEXTURE = new Identifier("picturesign","textures/gui/textsign_button.png"); - private static final Identifier CLIPBOARD_ICON_TEXTURE = new Identifier("picturesign","textures/gui/clipboard_button.png"); - private static final Identifier TRASHBIN_ICON_TEXTURE = new Identifier("picturesign","textures/gui/trashbin_button.png"); + private static final Identifier TEXTSIGN_ICON_TEXTURE = new Identifier(MOD_ID,"textures/gui/textsign_button.png"); + private static final Identifier CLIPBOARD_ICON_TEXTURE = new Identifier(MOD_ID,"textures/gui/clipboard_button.png"); + private static final Identifier TRASHBIN_ICON_TEXTURE = new Identifier(MOD_ID,"textures/gui/trashbin_button.png"); private final SignBlockEntity sign; private SignBlockEntityRenderer.SignModel model; private String[] text; @@ -43,6 +43,7 @@ public class PictureSignHelperScreen extends Screen { } protected void init() { super.init(); + if (this.client == null) return; sign.setEditable(false); text = IntStream.range(0, 4).mapToObj((row) -> sign.getTextOnRow(row, false)).map(Text::getString).toArray(String[]::new); @@ -200,6 +201,7 @@ public class PictureSignHelperScreen extends Screen { this.model = SignBlockEntityRenderer.createSignModel(this.client.getEntityModelLoader(), SignBlockEntityRenderer.getSignType(sign.getCachedState().getBlock())); } public void removed() { + if (this.client == null) return; ClientPlayNetworkHandler clientPlayNetworkHandler = this.client.getNetworkHandler(); for (int i = 0; i < 4; i++) { sign.setTextOnRow(i, Text.of(text[i])); @@ -251,6 +253,7 @@ public class PictureSignHelperScreen extends Screen { this.client.setScreen(null); } public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { + if (this.client == null) return; DiffuseLighting.disableGuiDepthLighting(); this.renderBackground(matrices); drawTextWithShadow(matrices,textRenderer, Text.of("Link" + (PictureSignConfig.safeMode ? " (imgur.com/imgbb.com/iili.io/pictshare.net)" : "")),this.width / 2 - 175, this.height / 5 + 3, -8816268); diff --git a/src/main/java/eu/midnightdust/picturesign/PictureDownloader.java b/src/main/java/eu/midnightdust/picturesign/util/PictureDownloader.java similarity index 92% rename from src/main/java/eu/midnightdust/picturesign/PictureDownloader.java rename to src/main/java/eu/midnightdust/picturesign/util/PictureDownloader.java index 895c143..10a93ad 100755 --- a/src/main/java/eu/midnightdust/picturesign/PictureDownloader.java +++ b/src/main/java/eu/midnightdust/picturesign/util/PictureDownloader.java @@ -1,5 +1,6 @@ -package eu.midnightdust.picturesign; +package eu.midnightdust.picturesign.util; +import eu.midnightdust.picturesign.PictureSignClient; import eu.midnightdust.picturesign.config.PictureSignConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.client.texture.NativeImage; @@ -13,6 +14,7 @@ import java.net.URL; import java.util.Hashtable; import java.util.concurrent.ExecutorService; +import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID; import static java.util.concurrent.Executors.newFixedThreadPool; public class PictureDownloader { @@ -65,7 +67,7 @@ public class PictureDownloader { service.submit(() -> { try { BufferedInputStream in = new BufferedInputStream(new URL(url).openStream()); - File file = File.createTempFile(".picturesign", "temp"); + File file = File.createTempFile("."+MOD_ID, "temp"); file.deleteOnExit(); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); @@ -89,7 +91,7 @@ public class PictureDownloader { NativeImage nativeImage = NativeImage.read(inputStream); NativeImageBackedTexture nativeImageBackedTexture = new NativeImageBackedTexture(nativeImage); - Identifier texture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture("picturesign/image", + Identifier texture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture(MOD_ID+"/image", nativeImageBackedTexture); // Cache the downloaded picture diff --git a/src/main/java/eu/midnightdust/picturesign/util/PictureURLUtils.java b/src/main/java/eu/midnightdust/picturesign/util/PictureURLUtils.java index 735e121..e076556 100644 --- a/src/main/java/eu/midnightdust/picturesign/util/PictureURLUtils.java +++ b/src/main/java/eu/midnightdust/picturesign/util/PictureURLUtils.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; +@SuppressWarnings("UnstableApiUsage") public class PictureURLUtils { public static final Type STRING_TYPE = new TypeToken>(){}.getType(); public static final Map cachedJsonData = new HashMap<>(); @@ -37,7 +38,8 @@ public class PictureURLUtils { } if (PictureSignConfig.debug) PictureSignClient.LOGGER.info("JsonData: "+jsonData); if (jsonData != null && !jsonData.isEmpty() && jsonData.containsKey("url")) { - result = new PictureInfo(jsonData.get("url"), getDurationMillis(jsonData.getOrDefault("start_at", "")), getDurationMillis(jsonData.getOrDefault("end_at", "")), Integer.parseInt(jsonData.getOrDefault("volume", "-1"))); + result = new PictureInfo(jsonData.get("url"), getDurationMillis(jsonData.getOrDefault("start_at", "")), + getDurationMillis(jsonData.getOrDefault("end_at", "")), Integer.parseInt(jsonData.getOrDefault("volume", "-1"))); PictureSignClient.LOGGER.info("URL successfully loaded from JSON!"); } else { PictureSignClient.LOGGER.warn("Unable to load url from JSON"); diff --git a/src/main/java/eu/midnightdust/picturesign/util/VideoHandler.java b/src/main/java/eu/midnightdust/picturesign/util/VideoHandler.java new file mode 100644 index 0000000..8e6660a --- /dev/null +++ b/src/main/java/eu/midnightdust/picturesign/util/VideoHandler.java @@ -0,0 +1,41 @@ +package eu.midnightdust.picturesign.util; + +import com.igrium.videolib.VideoLib; +import com.igrium.videolib.api.VideoManager; +import net.minecraft.util.Identifier; + +import java.net.MalformedURLException; +import java.util.ArrayList; +import java.util.List; + +public class VideoHandler { + public static List videoPlayers = new ArrayList<>(); + public static List playedOnce = new ArrayList<>(); + static VideoManager videoManager = VideoLib.getInstance().getVideoManager(); + public static void closePlayer(Identifier id) { + videoManager.closePlayer(id); + videoPlayers.remove(id); + playedOnce.remove(id); + } + public static void stop(Identifier id) { + videoManager.getOrCreate(id).getControlsInterface().stop(); + } + public static void play(Identifier id, String url) throws MalformedURLException { + videoManager.getOrCreate(id).getMediaInterface().play(url); + } + public static boolean hasMedia(Identifier id) { + return videoManager.getOrCreate(id).getMediaInterface().hasMedia(); + } + public static void setRepeat(Identifier id, boolean value) { + videoManager.getOrCreate(id).getControlsInterface().setRepeat(value); + } + public static long getTime(Identifier id) { + return videoManager.getOrCreate(id).getControlsInterface().getTime(); + } + public static void setTime(Identifier id, long value) { + videoManager.getOrCreate(id).getControlsInterface().setTime(value); + } + public static Identifier getTexture(Identifier id) { + return videoManager.getOrCreate(id).getTexture(); + } +} diff --git a/src/main/resources/assets/picturesign/lang/de_de.json b/src/main/resources/assets/picturesign/lang/de_de.json index fb1c063..5fdd0bf 100755 --- a/src/main/resources/assets/picturesign/lang/de_de.json +++ b/src/main/resources/assets/picturesign/lang/de_de.json @@ -13,6 +13,11 @@ "picturesign.midnightconfig.safeMode.tooltip":"Lädt nur Bilder von vertrauten Seiten", "picturesign.midnightconfig.ebeWarning":"§cWenn du die Mod 'Enhanced Block Entities' benutzt, stelle sicher,", "picturesign.midnightconfig.ebeWarning2":"§cdass du alles in Relation zu Schildern in der EBE Config deaktiviert hast!", + "picturesign.midnightconfig.safeProviders":"Sichere Anbieter", + "picturesign.midnightconfig.missingImageMode":"Darstellung fehlender Texturen", + "picturesign.midnightconfig.enum.MissingImageMode.BLACK":"Schwarz", + "picturesign.midnightconfig.enum.MissingImageMode.MISSING_TEXTURE":"Schwarz & Lila", + "picturesign.midnightconfig.enum.MissingImageMode.TRANSPARENT":"Transparent", "key.picturesign.copy_sign": "Text eines Schildes kopieren", "key.picturesign.edit_sign":"Schild bearbeiten" } \ No newline at end of file diff --git a/src/main/resources/assets/picturesign/lang/en_us.json b/src/main/resources/assets/picturesign/lang/en_us.json index bbd9600..71fbc67 100755 --- a/src/main/resources/assets/picturesign/lang/en_us.json +++ b/src/main/resources/assets/picturesign/lang/en_us.json @@ -14,6 +14,11 @@ "picturesign.midnightconfig.safeMode.tooltip":"Only load images from trusted providers", "picturesign.midnightconfig.ebeWarning":"§cIf you are using the mod 'Enhanced Block Entities'", "picturesign.midnightconfig.ebeWarning2":"§cmake sure to disable anything sign-related in it's config!", + "picturesign.midnightconfig.safeProviders":"Safe providers", + "picturesign.midnightconfig.missingImageMode":"Missing image mode", + "picturesign.midnightconfig.enum.MissingImageMode.BLACK":"Black", + "picturesign.midnightconfig.enum.MissingImageMode.MISSING_TEXTURE":"Black & Purple", + "picturesign.midnightconfig.enum.MissingImageMode.TRANSPARENT":"Transparent", "key.picturesign.copy_sign":"Copy Text from Sign", "key.picturesign.edit_sign":"Edit Sign", "key.categories.picturesign":"PictureSign"