Some more refinement

This commit is contained in:
Motschen
2023-01-04 17:05:56 +01:00
parent d19f537c83
commit 358340b2cc
12 changed files with 156 additions and 98 deletions

View File

@@ -1,10 +1,10 @@
plugins { plugins {
id 'fabric-loom' version '0.11-SNAPSHOT' id 'fabric-loom' version '1.0-SNAPSHOT'
id 'maven-publish' id 'maven-publish'
} }
sourceCompatibility = JavaVersion.VERSION_16 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_16 targetCompatibility = JavaVersion.VERSION_17
archivesBaseName = project.archives_base_name archivesBaseName = project.archives_base_name
version = project.mod_version version = project.mod_version
@@ -59,7 +59,7 @@ tasks.withType(JavaCompile).configureEach {
it.options.encoding = "UTF-8" it.options.encoding = "UTF-8"
// Minecraft 1.17 (21w19a) upwards uses Java 16. // Minecraft 1.17 (21w19a) upwards uses Java 16.
it.options.release = 16 it.options.release = 17
} }
java { java {

View File

@@ -1,17 +1,14 @@
package eu.midnightdust.picturesign; 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.config.PictureSignConfig;
import eu.midnightdust.picturesign.render.PictureSignRenderer; import eu.midnightdust.picturesign.util.VideoHandler;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientBlockEntityEvents; 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.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; 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.ClientLoginConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.client.gui.screen.ingame.SignEditScreen;
import net.minecraft.client.option.KeyBinding; import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil; import net.minecraft.client.util.InputUtil;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -23,33 +20,34 @@ import org.lwjgl.glfw.GLFW;
public class PictureSignClient implements ClientModInitializer { public class PictureSignClient implements ClientModInitializer {
public static Logger LOGGER = LogManager.getLogger("PictureSign"); public static Logger LOGGER = LogManager.getLogger("PictureSign");
public static String MOD_ID = "picturesign";
public static String[] clipboard = new String[4]; public static String[] clipboard = new String[4];
public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key.picturesign.copy_sign", public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key."+MOD_ID+".copy_sign",
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories.picturesign"); InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories."+MOD_ID);
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
PictureSignConfig.init("picturesign", PictureSignConfig.class); PictureSignConfig.init(MOD_ID, PictureSignConfig.class);
KeyBindingHelper.registerKeyBinding(BINDING_COPY_SIGN); KeyBindingHelper.registerKeyBinding(BINDING_COPY_SIGN);
ClientLoginConnectionEvents.DISCONNECT.register((handler, client) -> { ClientLoginConnectionEvents.DISCONNECT.register((handler, client) -> {
PictureSignRenderer.videoPlayers.forEach(id -> { if (PlatformFunctions.isModLoaded("videolib")) {
VideoLib.getInstance().getVideoManager().closePlayer(id); VideoHandler.videoPlayers.forEach(VideoHandler::closePlayer);
PictureSignRenderer.videoPlayers.remove(id); VideoHandler.playedOnce.clear();
}); }
}); });
ClientBlockEntityEvents.BLOCK_ENTITY_UNLOAD.register((blockEntity, world) -> { ClientBlockEntityEvents.BLOCK_ENTITY_UNLOAD.register((blockEntity, world) -> {
BlockPos pos = blockEntity.getPos(); if (PlatformFunctions.isModLoaded("videolib")) {
VideoLib.getInstance().getVideoManager().closePlayer(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ())); BlockPos pos = blockEntity.getPos();
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);
}
}); });
ClientTickEvents.END_CLIENT_TICK.register(client -> { ClientTickEvents.END_CLIENT_TICK.register(client -> {
if (!PictureSignClient.BINDING_COPY_SIGN.isPressed()) return; if (!PictureSignClient.BINDING_COPY_SIGN.isPressed()) return;
PictureSignClient.BINDING_COPY_SIGN.setPressed(false); 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.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) { if (client.world.getBlockEntity(new BlockPos(client.crosshairTarget.getPos())) instanceof SignBlockEntity sign) {
SignBlockEntity sign = (SignBlockEntity) client.world.getBlockEntity(new BlockPos(client.crosshairTarget.getPos()));
clipboard[0] = sign.getTextOnRow(0, false).getString(); clipboard[0] = sign.getTextOnRow(0, false).getString();
clipboard[1] = sign.getTextOnRow(1, false).getString(); clipboard[1] = sign.getTextOnRow(1, false).getString();
clipboard[2] = sign.getTextOnRow(2, false).getString(); clipboard[2] = sign.getTextOnRow(2, false).getString();

View File

@@ -1,17 +1,26 @@
package eu.midnightdust.picturesign.config; package eu.midnightdust.picturesign.config;
import com.google.common.collect.Lists;
import eu.midnightdust.lib.config.MidnightConfig; import eu.midnightdust.lib.config.MidnightConfig;
import java.util.List;
public class PictureSignConfig extends MidnightConfig { public class PictureSignConfig extends MidnightConfig {
@Entry public static boolean enabled = true; @Entry public static boolean enabled = true;
@Entry public static boolean enableVideoSigns = true; @Entry public static boolean enableVideoSigns = true;
@Entry public static boolean translucency = false; @Entry public static boolean translucency = false;
@Entry public static boolean helperUi = true; @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 public static boolean debug = false;
@Entry(min = 1, max = 10) public static int maxThreads = 4; @Entry(min = 1, max = 10) public static int maxThreads = 4;
@Entry(min = 0, max = 4096) public static int signRenderDistance = 64; @Entry(min = 0, max = 4096) public static int signRenderDistance = 64;
@Entry public static boolean safeMode = true; @Entry public static boolean safeMode = true;
@Comment public static Comment ebeWarning; @Comment public static Comment ebeWarning;
@Comment public static Comment ebeWarning2; @Comment public static Comment ebeWarning2;
@Entry public static List<String> 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
}
} }

View File

@@ -1,7 +1,6 @@
package eu.midnightdust.picturesign.mixin; package eu.midnightdust.picturesign.mixin;
import com.igrium.videolib.VideoLib; import eu.midnightdust.picturesign.util.VideoHandler;
import eu.midnightdust.picturesign.render.PictureSignRenderer;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType; 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.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID;
@Mixin(value = SignBlockEntity.class, priority = 1100) @Mixin(value = SignBlockEntity.class, priority = 1100)
public abstract class MixinSignBlockEntity extends BlockEntity { public abstract class MixinSignBlockEntity extends BlockEntity {
public MixinSignBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) { public MixinSignBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
@@ -20,8 +21,8 @@ public abstract class MixinSignBlockEntity extends BlockEntity {
@Override @Override
@Unique @Unique
public void markRemoved() { public void markRemoved() {
VideoLib.getInstance().getVideoManager().closePlayer(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ())); Identifier videoId = new Identifier(MOD_ID, pos.getX() + "_" + pos.getY() + "_" + pos.getZ());
PictureSignRenderer.videoPlayers.remove(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ())); VideoHandler.closePlayer(videoId);
super.markRemoved(); super.markRemoved();
} }
} }

View File

@@ -18,11 +18,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Objects; import java.util.Objects;
import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID;
@Mixin(SignEditScreen.class) @Mixin(SignEditScreen.class)
public abstract class MixinSignEditScreen extends Screen { 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 PICTURESIGN_ICON_TEXTURE = new Identifier(MOD_ID,"textures/gui/picturesign_button.png");
private static final Identifier CLIPBOARD_ICON_TEXTURE = new Identifier("picturesign","textures/gui/clipboard_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("picturesign","textures/gui/trashbin_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 SignBlockEntity sign;
@Shadow @Final private String[] text; @Shadow @Final private String[] text;
@@ -39,18 +41,18 @@ public abstract class MixinSignEditScreen extends Screen {
text[i] = PictureSignClient.clipboard[i]; text[i] = PictureSignClient.clipboard[i];
sign.setTextOnRow(i, Text.of(text[i])); sign.setTextOnRow(i, Text.of(text[i]));
} }
}, Text.of(""))); }, Text.empty()));
if (PictureSignConfig.helperUi) if (PictureSignConfig.helperUi)
this.addDrawableChild(new TexturedOverlayButtonWidget(this.width - 62, this.height - 40, 20, 20, 0, 0, 20, TRASHBIN_ICON_TEXTURE, 32, 64, (buttonWidget) -> { 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++) { for (int i = 0; i < 4; i++) {
text[i] = ""; text[i] = "";
sign.setTextOnRow(i, Text.empty()); sign.setTextOnRow(i, Text.empty());
} }
}, Text.of(""))); }, Text.empty()));
if (PictureSignConfig.helperUi) if (PictureSignConfig.helperUi)
this.addDrawableChild(new TexturedOverlayButtonWidget(this.width - 40, this.height - 40, 20, 20, 0, 0, 20, PICTURESIGN_ICON_TEXTURE, 32, 64, (buttonWidget) -> { this.addDrawableChild(new TexturedOverlayButtonWidget(this.width - 40, this.height - 40, 20, 20, 0, 0, 20, PICTURESIGN_ICON_TEXTURE, 32, 64, (buttonWidget) -> {
sign.setEditable(true); sign.setEditable(true);
Objects.requireNonNull(client).setScreen(new PictureSignHelperScreen(this.sign,false)); Objects.requireNonNull(client).setScreen(new PictureSignHelperScreen(this.sign,false));
}, Text.of(""))); }, Text.empty()));
} }
} }

View File

@@ -1,20 +1,18 @@
package eu.midnightdust.picturesign.render; 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 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.PictureSignClient;
import eu.midnightdust.picturesign.config.PictureSignConfig; 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.fabricmc.loader.api.FabricLoader;
import net.irisshaders.iris.api.v0.IrisApi; import net.irisshaders.iris.api.v0.IrisApi;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.*; 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.client.util.math.MatrixStack;
import net.minecraft.state.property.Properties; import net.minecraft.state.property.Properties;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -22,14 +20,11 @@ import net.minecraft.util.math.*;
import net.minecraft.world.World; import net.minecraft.world.World;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Arrays; import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID;
import java.util.List;
public class PictureSignRenderer { public class PictureSignRenderer {
VideoManager videoManager = VideoLib.getInstance().getVideoManager(); private boolean isSafeUrl;
public static List<Identifier> videoPlayers = new ArrayList<>();
List<BlockPos> playedOnce = new ArrayList<>();
public void render(SignBlockEntity signBlockEntity, MatrixStack matrixStack, int light, int overlay) { public void render(SignBlockEntity signBlockEntity, MatrixStack matrixStack, int light, int overlay) {
String url = PictureURLUtils.getLink(signBlockEntity); String url = PictureURLUtils.getLink(signBlockEntity);
@@ -45,21 +40,25 @@ public class PictureSignRenderer {
if (!url.contains("://")) { if (!url.contains("://")) {
url = "https://" + url; url = "https://" + url;
} }
//if (!url.contains(".png") && !url.contains(".jpg") && !url.contains(".jpeg")) return; if (PictureSignType.isType(signBlockEntity, PictureSignType.PICTURE) && !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/") if (PictureSignConfig.safeMode) {
// && !url.startsWith("https://pictshare.net/") && !url.startsWith("https://iili.io/")) isSafeUrl = false;
// return; 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(); World world = signBlockEntity.getWorld();
BlockPos pos = signBlockEntity.getPos(); 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)) 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.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()).getBlock().equals(Blocks.REDSTONE_TORCH) || world.getBlockState(pos.up()).getBlock().equals(Blocks.REDSTONE_WALL_TORCH))
&& world.getBlockState(pos.up()).get(Properties.LIT).equals(false))) && world.getBlockState(pos.up()).get(Properties.LIT).equals(false)))
{ {
if (videoManager != null) VideoHandler.closePlayer(videoId);
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()));
PictureURLUtils.cachedJsonData.remove(url); PictureURLUtils.cachedJsonData.remove(url);
return; return;
} }
@@ -68,53 +67,48 @@ public class PictureSignRenderer {
if (!lastLine.matches("(.*\\d:.*\\d:.*\\d:.*\\d:.*\\d)")) return; if (!lastLine.matches("(.*\\d:.*\\d:.*\\d:.*\\d:.*\\d)")) return;
List<String> scale = Arrays.stream(lastLine.split(":")).toList(); String[] scale = lastLine.split(":");
float width = 0; float width = 0;
float height = 0; float height = 0;
float x = 0; float x = 0;
float y = 0; float y = 0;
float z = 0; float z = 0;
try { try {
width = Float.parseFloat(scale.get(0)); width = Float.parseFloat(scale[0]);
height = Float.parseFloat(scale.get(1)); height = Float.parseFloat(scale[1]);
x = Float.parseFloat(scale.get(2)); x = Float.parseFloat(scale[2]);
y = Float.parseFloat(scale.get(3)); y = Float.parseFloat(scale[3]);
z = Float.parseFloat(scale.get(4)); z = Float.parseFloat(scale[4]);
} }
catch (NumberFormatException ignored) {} catch (NumberFormatException ignored) {}
// Download the picture data // Download the picture data
PictureDownloader.PictureData data = null; PictureDownloader.PictureData data = null;
VideoPlayer videoPlayer = null;
if (PictureSignType.isType(signBlockEntity, PictureSignType.PICTURE)) { if (PictureSignType.isType(signBlockEntity, PictureSignType.PICTURE)) {
data = PictureDownloader.getInstance().getPicture(url); data = PictureDownloader.getInstance().getPicture(url);
if (data == null || data.identifier == null) { if (data == null || data.identifier == null) return;
return;
}
} }
else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { 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())); VideoHandler.videoPlayers.add(videoId);
videoPlayers.add(videoPlayer.getId());
try { try {
if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO) && !VideoHandler.hasMedia(videoId)) {
if (!videoPlayer.getMediaInterface().hasMedia()) { VideoHandler.play(videoId, url);
videoPlayer.getMediaInterface().play(url); VideoHandler.setRepeat(videoId, true);
videoPlayer.getControlsInterface().setRepeat(true);
}
} }
else if (!videoPlayer.getMediaInterface().hasMedia() && !playedOnce.contains(pos)) { else if (!VideoHandler.hasMedia(videoId) && !VideoHandler.playedOnce.contains(videoId)) {
videoPlayer.getMediaInterface().play(url); VideoHandler.play(videoId, url);
} }
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
PictureSignClient.LOGGER.error(e); PictureSignClient.LOGGER.error(e);
return; return;
} }
if (info != null && info.start() > 0 && videoPlayer.getControlsInterface().getTime() < info.start()) videoPlayer.getControlsInterface().setTime(info.start()); if (info != null && info.start() > 0 && VideoHandler.getTime(videoId) < info.start()) VideoHandler.setTime(videoId, info.start());
if (info != null && info.end() > 0 && videoPlayer.getControlsInterface().getTime() >= info.end() && !playedOnce.contains(pos)) videoPlayer.getControlsInterface().stop(); if (info != null && info.end() > 0 && VideoHandler.getTime(videoId) >= info.end() && !VideoHandler.playedOnce.contains(videoId)) VideoHandler.stop(videoId);
} }
else return; 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 xOffset = 0.0F;
float zOffset = 0.0F; float zOffset = 0.0F;
@@ -145,12 +139,9 @@ public class PictureSignRenderer {
} }
else return; else return;
Tessellator tessellator = Tessellator.getInstance(); Tessellator tessellator = Tessellator.getInstance();
BufferBuilder buffer = tessellator.getBuffer(); BufferBuilder buffer = tessellator.getBuffer();
int l; int l;
if (FabricLoader.getInstance().isModLoaded("iris") && IrisApi.getInstance().isShaderPackInUse()) { if (FabricLoader.getInstance().isModLoaded("iris") && IrisApi.getInstance().isShaderPackInUse()) {
RenderSystem.setShader(GameRenderer::getRenderTypeCutoutShader); RenderSystem.setShader(GameRenderer::getRenderTypeCutoutShader);
@@ -165,15 +156,14 @@ public class PictureSignRenderer {
assert data != null; assert data != null;
texture = data.identifier; texture = data.identifier;
} }
else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO))
assert videoPlayer != null; texture = VideoHandler.getTexture(videoId);
//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 return; 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); RenderSystem.setShaderTexture(0, texture);
if (PictureSignConfig.translucency) RenderSystem.enableBlend(); if (PictureSignConfig.translucency) RenderSystem.enableBlend();
@@ -182,7 +172,7 @@ public class PictureSignRenderer {
RenderSystem.depthMask(true); RenderSystem.depthMask(true);
matrixStack.push(); matrixStack.push();
matrixStack.translate(xOffset + x, 0.00F + y, zOffset + z); matrixStack.translate(xOffset + x, y, zOffset + z);
matrixStack.multiply(yRotation); matrixStack.multiply(yRotation);
Matrix4f matrix4f = matrixStack.peek().getPositionMatrix(); Matrix4f matrix4f = matrixStack.peek().getPositionMatrix();

View File

@@ -1,10 +1,8 @@
package eu.midnightdust.picturesign.screen; package eu.midnightdust.picturesign.screen;
import eu.midnightdust.lib.util.MidnightColorUtil;
import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget; import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget;
import eu.midnightdust.picturesign.PictureSignClient; import eu.midnightdust.picturesign.PictureSignClient;
import eu.midnightdust.picturesign.config.PictureSignConfig; import eu.midnightdust.picturesign.config.PictureSignConfig;
import eu.midnightdust.picturesign.util.PictureSignType;
import eu.midnightdust.picturesign.util.PictureURLUtils; import eu.midnightdust.picturesign.util.PictureURLUtils;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.SignBlock; import net.minecraft.block.SignBlock;
@@ -27,10 +25,12 @@ import net.minecraft.util.math.Matrix4f;
import java.util.Objects; import java.util.Objects;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID;
public class PictureSignHelperScreen extends Screen { public class PictureSignHelperScreen extends Screen {
private static final Identifier TEXTSIGN_ICON_TEXTURE = new Identifier("picturesign","textures/gui/textsign_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("picturesign","textures/gui/clipboard_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("picturesign","textures/gui/trashbin_button.png"); private static final Identifier TRASHBIN_ICON_TEXTURE = new Identifier(MOD_ID,"textures/gui/trashbin_button.png");
private final SignBlockEntity sign; private final SignBlockEntity sign;
private SignBlockEntityRenderer.SignModel model; private SignBlockEntityRenderer.SignModel model;
private String[] text; private String[] text;
@@ -43,6 +43,7 @@ public class PictureSignHelperScreen extends Screen {
} }
protected void init() { protected void init() {
super.init(); super.init();
if (this.client == null) return;
sign.setEditable(false); sign.setEditable(false);
text = IntStream.range(0, 4).mapToObj((row) -> text = IntStream.range(0, 4).mapToObj((row) ->
sign.getTextOnRow(row, false)).map(Text::getString).toArray(String[]::new); 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())); this.model = SignBlockEntityRenderer.createSignModel(this.client.getEntityModelLoader(), SignBlockEntityRenderer.getSignType(sign.getCachedState().getBlock()));
} }
public void removed() { public void removed() {
if (this.client == null) return;
ClientPlayNetworkHandler clientPlayNetworkHandler = this.client.getNetworkHandler(); ClientPlayNetworkHandler clientPlayNetworkHandler = this.client.getNetworkHandler();
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
sign.setTextOnRow(i, Text.of(text[i])); sign.setTextOnRow(i, Text.of(text[i]));
@@ -251,6 +253,7 @@ public class PictureSignHelperScreen extends Screen {
this.client.setScreen(null); this.client.setScreen(null);
} }
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
if (this.client == null) return;
DiffuseLighting.disableGuiDepthLighting(); DiffuseLighting.disableGuiDepthLighting();
this.renderBackground(matrices); 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); 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);

View File

@@ -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 eu.midnightdust.picturesign.config.PictureSignConfig;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImage;
@@ -13,6 +14,7 @@ import java.net.URL;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID;
import static java.util.concurrent.Executors.newFixedThreadPool; import static java.util.concurrent.Executors.newFixedThreadPool;
public class PictureDownloader { public class PictureDownloader {
@@ -65,7 +67,7 @@ public class PictureDownloader {
service.submit(() -> { service.submit(() -> {
try { try {
BufferedInputStream in = new BufferedInputStream(new URL(url).openStream()); BufferedInputStream in = new BufferedInputStream(new URL(url).openStream());
File file = File.createTempFile(".picturesign", "temp"); File file = File.createTempFile("."+MOD_ID, "temp");
file.deleteOnExit(); file.deleteOnExit();
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
@@ -89,7 +91,7 @@ public class PictureDownloader {
NativeImage nativeImage = NativeImage.read(inputStream); NativeImage nativeImage = NativeImage.read(inputStream);
NativeImageBackedTexture nativeImageBackedTexture = new NativeImageBackedTexture(nativeImage); NativeImageBackedTexture nativeImageBackedTexture = new NativeImageBackedTexture(nativeImage);
Identifier texture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture("picturesign/image", Identifier texture = MinecraftClient.getInstance().getTextureManager().registerDynamicTexture(MOD_ID+"/image",
nativeImageBackedTexture); nativeImageBackedTexture);
// Cache the downloaded picture // Cache the downloaded picture

View File

@@ -18,6 +18,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@SuppressWarnings("UnstableApiUsage")
public class PictureURLUtils { public class PictureURLUtils {
public static final Type STRING_TYPE = new TypeToken<Map<String, String>>(){}.getType(); public static final Type STRING_TYPE = new TypeToken<Map<String, String>>(){}.getType();
public static final Map<String, PictureInfo> cachedJsonData = new HashMap<>(); public static final Map<String, PictureInfo> cachedJsonData = new HashMap<>();
@@ -37,7 +38,8 @@ public class PictureURLUtils {
} }
if (PictureSignConfig.debug) PictureSignClient.LOGGER.info("JsonData: "+jsonData); if (PictureSignConfig.debug) PictureSignClient.LOGGER.info("JsonData: "+jsonData);
if (jsonData != null && !jsonData.isEmpty() && jsonData.containsKey("url")) { 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!"); PictureSignClient.LOGGER.info("URL successfully loaded from JSON!");
} else { } else {
PictureSignClient.LOGGER.warn("Unable to load url from JSON"); PictureSignClient.LOGGER.warn("Unable to load url from JSON");

View File

@@ -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<Identifier> videoPlayers = new ArrayList<>();
public static List<Identifier> 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();
}
}

View File

@@ -13,6 +13,11 @@
"picturesign.midnightconfig.safeMode.tooltip":"Lädt nur Bilder von vertrauten Seiten", "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.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.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.copy_sign": "Text eines Schildes kopieren",
"key.picturesign.edit_sign":"Schild bearbeiten" "key.picturesign.edit_sign":"Schild bearbeiten"
} }

View File

@@ -14,6 +14,11 @@
"picturesign.midnightconfig.safeMode.tooltip":"Only load images from trusted providers", "picturesign.midnightconfig.safeMode.tooltip":"Only load images from trusted providers",
"picturesign.midnightconfig.ebeWarning":"§cIf you are using the mod 'Enhanced Block Entities'", "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.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.copy_sign":"Copy Text from Sign",
"key.picturesign.edit_sign":"Edit Sign", "key.picturesign.edit_sign":"Edit Sign",
"key.categories.picturesign":"PictureSign" "key.categories.picturesign":"PictureSign"