diff --git a/common/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java b/common/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java index a92e0e0..2a25fe1 100755 --- a/common/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java +++ b/common/src/main/java/eu/midnightdust/picturesign/config/PictureSignConfig.java @@ -14,6 +14,7 @@ public class PictureSignConfig extends MidnightConfig { @Entry(category = general) public static boolean enabled = true; @Entry(category = general) public static boolean enableVideoSigns = true; + @Entry(min = 1, max = 1000, isSlider = true, category = general) public static int audioDistanceMultiplier = 10; @Entry(category = general) public static boolean translucency = false; @Entry(category = general) public static boolean fullBrightPicture = false; @Entry(category = general) public static boolean helperUi = true; @@ -24,8 +25,7 @@ public class PictureSignConfig extends MidnightConfig { @Entry(category = advanced) public static boolean safeMode = true; @Entry(category = advanced) public static List safeProviders = Lists.newArrayList("https://i.imgur.com/", "https://i.ibb.co/", "https://pictshare.net/", "https://iili.io/", "https://media1.tenor.com/"); @Entry(category = advanced) public static List safeGifProviders = Lists.newArrayList("https://i.imgur.com/", "https://media1.tenor.com/"); - @Entry(category = advanced) public static List safeMultimediaProviders = Lists.newArrayList("https://vimeo.com/", "https://yewtu.be/"); - @Entry(category = general) public static String invidiousInstance = "yt.oelrichsgarcia.de"; + @Entry(category = advanced) public static List safeMultimediaProviders = Lists.newArrayList("https://youtube.com/", "https://www.youtube.com/", "https://youtu.be/","https://vimeo.com/"); @Comment(category = general) public static Comment ebeWarning; @Entry(category = advanced) public static MissingImageMode missingImageMode = MissingImageMode.BLACK; @Entry(category = advanced) public static PictureShader pictureShader = PictureShader.PosColTexLight; diff --git a/common/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java b/common/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java index 9635d7b..6896751 100755 --- a/common/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java +++ b/common/src/main/java/eu/midnightdust/picturesign/render/PictureSignRenderer.java @@ -42,10 +42,22 @@ public class PictureSignRenderer { if (PictureSignConfig.safeMode) { isSafeUrl = false; String finalUrl = url; - PictureSignConfig.safeProviders.forEach(safe -> { - if (!isSafeUrl) isSafeUrl = finalUrl.startsWith(safe); - }); - if (!isSafeUrl && !url.startsWith("https://youtu.be/") && !url.startsWith("https://youtube.com/") && !url.startsWith("https://www.youtube.com/")) return; + if (type == PictureSignType.PICTURE) { + PictureSignConfig.safeProviders.forEach(safe -> { + if (!isSafeUrl) isSafeUrl = finalUrl.startsWith(safe); + }); + } + if (type == PictureSignType.GIF) { + PictureSignConfig.safeGifProviders.forEach(safe -> { + if (!isSafeUrl) isSafeUrl = finalUrl.startsWith(safe); + }); + } + else if (type.isVideo || type.isAudio) { + PictureSignConfig.safeMultimediaProviders.forEach(safe -> { + if (!isSafeUrl) isSafeUrl = finalUrl.startsWith(safe); + }); + } + if (!isSafeUrl) return; } if ((!PictureSignConfig.enableVideoSigns || !PictureSignClient.hasWaterMedia) && type != PictureSignType.PICTURE) return; if (url.startsWith("https://youtube.com/") || url.startsWith("https://www.youtube.com/watch?v=") || url.startsWith("https://youtu.be/")) { @@ -61,7 +73,7 @@ public class PictureSignRenderer { MediaHandler mediaHandler = null; GIFHandler gifHandler = null; if (PictureSignClient.hasWaterMedia) { - if (type.isVideo || type.isAudio) mediaHandler = MediaHandler.getOrCreate(videoId); + if (type.isVideo || type.isAudio) mediaHandler = MediaHandler.getOrCreate(videoId, pos); if (type == PictureSignType.GIF) gifHandler = GIFHandler.getOrCreate(videoId); } @@ -135,6 +147,7 @@ public class PictureSignRenderer { PictureSignClient.LOGGER.error(e); return; } + mediaHandler.setVolumeBasedOnDistance(); if (info != null && info.start() > 0 && mediaHandler.getTime() < info.start()) mediaHandler.setTime(info.start()); if (info != null && info.end() > 0 && mediaHandler.getTime() >= info.end() && !mediaHandler.playbackStarted) mediaHandler.stop(); } diff --git a/common/src/main/java/eu/midnightdust/picturesign/util/MediaHandler.java b/common/src/main/java/eu/midnightdust/picturesign/util/MediaHandler.java index dec0cef..f8db72a 100644 --- a/common/src/main/java/eu/midnightdust/picturesign/util/MediaHandler.java +++ b/common/src/main/java/eu/midnightdust/picturesign/util/MediaHandler.java @@ -8,29 +8,46 @@ import me.srrapero720.watermedia.api.url.UrlAPI; import net.minecraft.client.MinecraftClient; import net.minecraft.client.texture.TextureManager; import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; +import static eu.midnightdust.picturesign.PictureSignClient.client; import static eu.midnightdust.picturesign.PictureSignClient.id; public class MediaHandler { public static Map mediaPlayers = new HashMap<>(); public final Identifier id; + public final BlockPos pos; public boolean playbackStarted = false; public boolean isDeactivated; private SyncBasePlayer player; - private MediaHandler(Identifier id) { + private MediaHandler(Identifier id, BlockPos pos) { this.id = id; + this.pos = pos; mediaPlayers.put(id, this); } - public static MediaHandler getOrCreate(Identifier id) { + public static MediaHandler getOrCreate(Identifier id, BlockPos pos) { if (mediaPlayers.containsKey(id)) return mediaPlayers.get(id); - else return new MediaHandler(id); + else return new MediaHandler(id, pos); + } + public void setVolumeBasedOnDistance() { + if (client.player == null) return; + + Vec3d playerPos = client.player.getPos(); + double distance = this.pos.getSquaredDistance(playerPos) / PictureSignConfig.audioDistanceMultiplier; + this.setVolume((int) Math.clamp(100-distance, 0, 100)); + } + private void setVolume(int volume) { + player.setVolume(volume); } public void closePlayer() { diff --git a/common/src/main/resources/assets/picturesign/lang/en_us.json b/common/src/main/resources/assets/picturesign/lang/en_us.json index cb4ba90..be502d8 100755 --- a/common/src/main/resources/assets/picturesign/lang/en_us.json +++ b/common/src/main/resources/assets/picturesign/lang/en_us.json @@ -5,6 +5,7 @@ "picturesign.midnightconfig.enabled":"Enable Pictures", "picturesign.midnightconfig.enableVideoSigns":"Enable Videos", + "picturesign.midnightconfig.audioDistanceMultiplier":"Audio Distance Multiplier", "picturesign.midnightconfig.translucency":"Enable Translucency", "picturesign.midnightconfig.translucency.tooltip":"Translucency doesn't work too great on block entities\n(and therefore signs)", "picturesign.midnightconfig.fullBrightPicture":"Full-bright Pictures", @@ -17,7 +18,9 @@ "picturesign.midnightconfig.safeMode":"Safe mode", "picturesign.midnightconfig.safeMode.tooltip":"Only load images from trusted providers", "picturesign.midnightconfig.ebeWarning":"§cIf you are using the mod 'Enhanced Block Entities' make sure to disable anything sign-related in it's config!", - "picturesign.midnightconfig.safeProviders":"Safe providers", + "picturesign.midnightconfig.safeProviders":"Safe Image Providers", + "picturesign.midnightconfig.safeGifProviders":"Safe GIF Providers", + "picturesign.midnightconfig.safeMultimediaProviders":"Safe Multimedia Providers", "picturesign.midnightconfig.invidiousInstance":"Invidious Instance", "picturesign.midnightconfig.invidiousInstance.tooltip":"Select the Invidious instance that is being used to play YouTube videos. \nYou can find a list of them at\ndocs.invidious.io/instances/", "picturesign.midnightconfig.missingImageMode":"Missing image mode",