mirror of
https://github.com/TeamMidnightDust/PictureSign.git
synced 2025-12-11 12:05:09 +01:00
Some more refinement
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
@@ -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");
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user