mirror of
https://github.com/TeamMidnightDust/PictureSign.git
synced 2025-12-11 12:05:09 +01:00
Improve video support
This commit is contained in:
@@ -1,13 +1,19 @@
|
|||||||
package eu.midnightdust.picturesign;
|
package eu.midnightdust.picturesign;
|
||||||
|
|
||||||
|
import com.igrium.videolib.VideoLib;
|
||||||
import eu.midnightdust.picturesign.config.PictureSignConfig;
|
import eu.midnightdust.picturesign.config.PictureSignConfig;
|
||||||
|
import eu.midnightdust.picturesign.render.PictureSignRenderer;
|
||||||
import net.fabricmc.api.ClientModInitializer;
|
import net.fabricmc.api.ClientModInitializer;
|
||||||
|
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.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.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.hit.HitResult;
|
import net.minecraft.util.hit.HitResult;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
@@ -17,8 +23,6 @@ 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[] clipboard = new String[4];
|
public static String[] clipboard = new String[4];
|
||||||
public static final KeyBinding BINDING_EDIT_SIGN = new KeyBinding("key.picturesign.edit_sign",
|
|
||||||
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_C, "key.categories.picturesign");
|
|
||||||
public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key.picturesign.copy_sign",
|
public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key.picturesign.copy_sign",
|
||||||
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories.picturesign");
|
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories.picturesign");
|
||||||
@Override
|
@Override
|
||||||
@@ -26,6 +30,12 @@ public class PictureSignClient implements ClientModInitializer {
|
|||||||
PictureSignConfig.init("picturesign", PictureSignConfig.class);
|
PictureSignConfig.init("picturesign", PictureSignConfig.class);
|
||||||
|
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_COPY_SIGN);
|
KeyBindingHelper.registerKeyBinding(BINDING_COPY_SIGN);
|
||||||
|
ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> {
|
||||||
|
PictureSignRenderer.videoPlayers.forEach(id -> {
|
||||||
|
VideoLib.getInstance().getVideoManager().closePlayer(id);
|
||||||
|
PictureSignRenderer.videoPlayers.remove(id);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
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;
|
||||||
@@ -41,33 +51,5 @@ public class PictureSignClient implements ClientModInitializer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (PictureSignConfig.debug) {
|
|
||||||
KeyBindingHelper.registerKeyBinding(BINDING_EDIT_SIGN);
|
|
||||||
ClientTickEvents.END_CLIENT_TICK.register(client -> {
|
|
||||||
if (!PictureSignClient.BINDING_EDIT_SIGN.isPressed()) return;
|
|
||||||
PictureSignClient.BINDING_EDIT_SIGN.setPressed(false);
|
|
||||||
if (client.player == 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) {
|
|
||||||
BlockPos pos = new BlockPos(client.crosshairTarget.getPos());
|
|
||||||
SignBlockEntity sign = (SignBlockEntity) client.world.getBlockEntity(pos);
|
|
||||||
sign.setEditable(true);
|
|
||||||
sign.setEditor(client.player.getUuid());
|
|
||||||
sign.toUpdatePacket();
|
|
||||||
sign.markDirty();
|
|
||||||
client.world.updateListeners(pos, sign.getCachedState(), sign.getCachedState(), 3);
|
|
||||||
client.setScreen(new SignEditScreen(sign,false));
|
|
||||||
// clipboard[0] = sign.getTextOnRow(0, false).asString();
|
|
||||||
// clipboard[1] = sign.getTextOnRow(1, false).asString();
|
|
||||||
// clipboard[2] = sign.getTextOnRow(2, false).asString();
|
|
||||||
// clipboard[3] = sign.getTextOnRow(3, false).asString();
|
|
||||||
// Block signBlock = sign.getCachedState().getBlock();
|
|
||||||
// client.interactionManager.breakBlock(pos);
|
|
||||||
// client.player.setStackInHand(client.player.preferredHand, new ItemStack(signBlock.asItem()));
|
|
||||||
// client.interactionManager.interactBlock(client.player, client.world, client.player.preferredHand, new BlockHitResult(new Vec3d(pos.getX(), pos.getY(), pos.getZ()), Direction.DOWN, pos,false));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package eu.midnightdust.picturesign.mixin;
|
||||||
|
|
||||||
|
import com.igrium.videolib.VideoLib;
|
||||||
|
import eu.midnightdust.picturesign.render.PictureSignRenderer;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.block.entity.BlockEntity;
|
||||||
|
import net.minecraft.block.entity.BlockEntityType;
|
||||||
|
import net.minecraft.block.entity.SignBlockEntity;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
|
||||||
|
@Mixin(value = SignBlockEntity.class, priority = 1100)
|
||||||
|
public abstract class MixinSignBlockEntity extends BlockEntity {
|
||||||
|
public MixinSignBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||||
|
super(type, pos, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
@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()));
|
||||||
|
super.markRemoved();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package eu.midnightdust.picturesign.render;
|
package eu.midnightdust.picturesign.render;
|
||||||
|
|
||||||
import com.igrium.videolib.VideoLib;
|
import com.igrium.videolib.VideoLib;
|
||||||
import com.igrium.videolib.api.VideoHandle;
|
|
||||||
import com.igrium.videolib.api.VideoHandleFactory;
|
|
||||||
import com.igrium.videolib.api.VideoManager;
|
import com.igrium.videolib.api.VideoManager;
|
||||||
import com.igrium.videolib.api.VideoPlayer;
|
import com.igrium.videolib.api.VideoPlayer;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
@@ -15,9 +13,7 @@ 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.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;
|
||||||
@@ -31,6 +27,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class PictureSignRenderer {
|
public class PictureSignRenderer {
|
||||||
VideoManager videoManager = VideoLib.getInstance().getVideoManager();
|
VideoManager videoManager = VideoLib.getInstance().getVideoManager();
|
||||||
|
public static List<Identifier> videoPlayers = new ArrayList<>();
|
||||||
List<BlockPos> playedOnce = 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) {
|
||||||
@@ -85,10 +82,13 @@ public class PictureSignRenderer {
|
|||||||
}
|
}
|
||||||
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()));
|
videoPlayer = videoManager.getOrCreate(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ()));
|
||||||
|
videoPlayers.add(videoPlayer.getId());
|
||||||
try {
|
try {
|
||||||
if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) {
|
if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) {
|
||||||
if (!videoPlayer.getMediaInterface().hasMedia())
|
if (!videoPlayer.getMediaInterface().hasMedia()) {
|
||||||
videoPlayer.getMediaInterface().play(url);
|
videoPlayer.getMediaInterface().play(url);
|
||||||
|
videoPlayer.getControlsInterface().setRepeat(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (!videoPlayer.getMediaInterface().hasMedia() && !playedOnce.contains(pos))
|
else if (!videoPlayer.getMediaInterface().hasMedia() && !playedOnce.contains(pos))
|
||||||
videoPlayer.getMediaInterface().play(url);
|
videoPlayer.getMediaInterface().play(url);
|
||||||
@@ -152,12 +152,13 @@ public class PictureSignRenderer {
|
|||||||
}
|
}
|
||||||
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;
|
assert videoPlayer != null;
|
||||||
TextureManager textureManager = MinecraftClient.getInstance().getTextureManager();
|
//TextureManager textureManager = MinecraftClient.getInstance().getTextureManager();
|
||||||
if (videoPlayer.getTexture() != null && videoPlayer.getCodecInterface().getFrameRate() > 1 && textureManager.getTexture(videoPlayer.getTexture()) != null && textureManager.getTexture(videoPlayer.getTexture()).getGlId() != 0)
|
//if (videoPlayer.getTexture() != null && videoPlayer.getCodecInterface().getFrameRate() > 1 && textureManager.getTexture(videoPlayer.getTexture()) != null && textureManager.getTexture(videoPlayer.getTexture()).getGlId() != 0)
|
||||||
texture = videoPlayer.getTexture();
|
texture = videoPlayer.getTexture();
|
||||||
else texture = new Identifier("picturesign", "textures/black.png");
|
//else texture = new Identifier("picturesign", "textures/black.png");
|
||||||
}
|
}
|
||||||
else return;
|
else return;
|
||||||
|
RenderSystem.setShaderTexture(0, new Identifier("picturesign", "textures/black.png"));
|
||||||
RenderSystem.setShaderTexture(0, texture);
|
RenderSystem.setShaderTexture(0, texture);
|
||||||
|
|
||||||
if (PictureSignConfig.translucency) RenderSystem.enableBlend();
|
if (PictureSignConfig.translucency) RenderSystem.enableBlend();
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
{
|
{
|
||||||
"required": true,
|
"required": true,
|
||||||
"package": "eu.midnightdust.picturesign.mixin",
|
"package": "eu.midnightdust.picturesign.mixin",
|
||||||
"compatibilityLevel": "JAVA_16",
|
"compatibilityLevel": "JAVA_17",
|
||||||
"client": [
|
"client": [
|
||||||
"MixinSignBlockEntityRenderer",
|
"MixinSignBlockEntityRenderer",
|
||||||
"MixinSignEditScreen"
|
"MixinSignEditScreen",
|
||||||
|
"MixinSignBlockEntity"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
|
|||||||
Reference in New Issue
Block a user