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