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 {
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 {

View File

@@ -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();

View File

@@ -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<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;
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();
}
}

View File

@@ -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()));
}
}

View File

@@ -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<Identifier> videoPlayers = new ArrayList<>();
List<BlockPos> 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<String> 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();

View File

@@ -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);

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 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

View File

@@ -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<Map<String, String>>(){}.getType();
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 (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");

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.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"
}

View File

@@ -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"