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;
|
||||
|
||||
import com.igrium.videolib.VideoLib;
|
||||
import eu.midnightdust.picturesign.config.PictureSignConfig;
|
||||
import eu.midnightdust.picturesign.render.PictureSignRenderer;
|
||||
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.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;
|
||||
import net.minecraft.util.hit.HitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
@@ -17,8 +23,6 @@ import org.lwjgl.glfw.GLFW;
|
||||
public class PictureSignClient implements ClientModInitializer {
|
||||
public static Logger LOGGER = LogManager.getLogger("PictureSign");
|
||||
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",
|
||||
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories.picturesign");
|
||||
@Override
|
||||
@@ -26,6 +30,12 @@ public class PictureSignClient implements ClientModInitializer {
|
||||
PictureSignConfig.init("picturesign", PictureSignConfig.class);
|
||||
|
||||
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 -> {
|
||||
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;
|
||||
|
||||
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.VideoPlayer;
|
||||
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.minecraft.block.Blocks;
|
||||
import net.minecraft.block.entity.SignBlockEntity;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.render.*;
|
||||
import net.minecraft.client.texture.TextureManager;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.state.property.Properties;
|
||||
import net.minecraft.util.Identifier;
|
||||
@@ -31,6 +27,7 @@ import java.util.List;
|
||||
|
||||
public class PictureSignRenderer {
|
||||
VideoManager videoManager = VideoLib.getInstance().getVideoManager();
|
||||
public static List<Identifier> videoPlayers = new ArrayList<>();
|
||||
List<BlockPos> playedOnce = new ArrayList<>();
|
||||
|
||||
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)) {
|
||||
videoPlayer = videoManager.getOrCreate(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ()));
|
||||
videoPlayers.add(videoPlayer.getId());
|
||||
try {
|
||||
if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) {
|
||||
if (!videoPlayer.getMediaInterface().hasMedia())
|
||||
if (!videoPlayer.getMediaInterface().hasMedia()) {
|
||||
videoPlayer.getMediaInterface().play(url);
|
||||
videoPlayer.getControlsInterface().setRepeat(true);
|
||||
}
|
||||
}
|
||||
else if (!videoPlayer.getMediaInterface().hasMedia() && !playedOnce.contains(pos))
|
||||
videoPlayer.getMediaInterface().play(url);
|
||||
@@ -152,12 +152,13 @@ public class PictureSignRenderer {
|
||||
}
|
||||
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)
|
||||
//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 texture = new Identifier("picturesign", "textures/black.png");
|
||||
}
|
||||
else return;
|
||||
RenderSystem.setShaderTexture(0, new Identifier("picturesign", "textures/black.png"));
|
||||
RenderSystem.setShaderTexture(0, texture);
|
||||
|
||||
if (PictureSignConfig.translucency) RenderSystem.enableBlend();
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
{
|
||||
"required": true,
|
||||
"package": "eu.midnightdust.picturesign.mixin",
|
||||
"compatibilityLevel": "JAVA_16",
|
||||
"compatibilityLevel": "JAVA_17",
|
||||
"client": [
|
||||
"MixinSignBlockEntityRenderer",
|
||||
"MixinSignEditScreen"
|
||||
"MixinSignEditScreen",
|
||||
"MixinSignBlockEntity"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
|
||||
Reference in New Issue
Block a user