From 705cdbe33c73bc514d08c55b4a44c1a93bb6e6a0 Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 25 Feb 2025 11:27:05 +0800 Subject: [PATCH 1/4] Update to 1.21.1 and improve packet data handling --- build.gradle | 12 +- gradle.properties | 10 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../NGoedix/videoplayer/VideoPlayer.java | 5 +- .../NGoedix/videoplayer/block/ModBlocks.java | 9 +- .../videoplayer/block/custom/RadioBlock.java | 3 +- .../videoplayer/block/custom/TVBlock.java | 9 +- .../block/entity/ModBlockEntities.java | 4 +- .../block/entity/custom/RadioBlockEntity.java | 9 +- .../block/entity/custom/TVBlockEntity.java | 19 +-- .../entity/custom/VideoPlayerBlockEntity.java | 14 +- .../videoplayer/client/ClientHandler.java | 21 +-- .../videoplayer/client/gui/RadioScreen.java | 12 +- .../videoplayer/client/gui/TVVideoScreen.java | 43 +++--- .../videoplayer/client/gui/VideoScreen.java | 43 +++--- .../client/gui/components/CustomSlider.java | 17 ++- .../client/gui/components/ScrollingList.java | 19 +-- .../gui/components/ScrollingStringList.java | 4 +- .../client/render/TVBlockRenderer.java | 16 +-- .../videoplayer/network/PacketHandler.java | 129 ++++++------------ .../network/packet/FrameVideoMessage.java | 40 ++++-- .../packet/OpenRadioManagerScreenMessage.java | 39 ++++-- .../packet/OpenVideoManagerScreenMessage.java | 43 ++++-- .../network/packet/RadioMessage.java | 36 +++-- .../network/packet/RadioUpdateMessage.java | 67 ++++++--- .../packet/SendCustomVideoMessage.java | 41 ------ .../network/packet/SendMusicMessage.java | 31 ----- .../network/packet/SendVideoMessage.java | 33 ----- .../packet/StartCustomVideoMessage.java | 81 +++++++++++ .../network/packet/StartMusicMessage.java | 34 +++++ .../network/packet/StartVideoMessage.java | 49 +++++++ .../packet/StopCustomVideoMessage.java | 30 ++++ .../network/packet/StopMusicMessage.java | 30 ++++ .../network/packet/StopVideoMessage.java | 30 ++++ .../network/packet/VideoUpdateMessage.java | 68 +++++++-- .../NGoedix/videoplayer/util/ByteUtil.java | 7 + .../NGoedix/videoplayer/util/TryCore.java | 57 ++++++++ .../videoplayer/util/cache/TextureCache.java | 13 +- .../util/displayers/ImageDisplayer.java | 4 +- .../util/displayers/VideoDisplayer.java | 33 ++--- .../util/displayers/VideoScreenDisplay.java | 8 +- src/main/resources/fabric.mod.json | 4 +- 42 files changed, 733 insertions(+), 445 deletions(-) delete mode 100644 src/main/java/com/github/NGoedix/videoplayer/network/packet/SendCustomVideoMessage.java delete mode 100644 src/main/java/com/github/NGoedix/videoplayer/network/packet/SendMusicMessage.java delete mode 100644 src/main/java/com/github/NGoedix/videoplayer/network/packet/SendVideoMessage.java create mode 100644 src/main/java/com/github/NGoedix/videoplayer/network/packet/StartCustomVideoMessage.java create mode 100644 src/main/java/com/github/NGoedix/videoplayer/network/packet/StartMusicMessage.java create mode 100644 src/main/java/com/github/NGoedix/videoplayer/network/packet/StartVideoMessage.java create mode 100644 src/main/java/com/github/NGoedix/videoplayer/network/packet/StopCustomVideoMessage.java create mode 100644 src/main/java/com/github/NGoedix/videoplayer/network/packet/StopMusicMessage.java create mode 100644 src/main/java/com/github/NGoedix/videoplayer/network/packet/StopVideoMessage.java create mode 100644 src/main/java/com/github/NGoedix/videoplayer/util/ByteUtil.java create mode 100644 src/main/java/com/github/NGoedix/videoplayer/util/TryCore.java diff --git a/build.gradle b/build.gradle index 800a43d..14e6e02 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'idea' - id 'fabric-loom' version '1.6-SNAPSHOT' + id 'fabric-loom' version '1.9-SNAPSHOT' } version = project.mod_version @@ -39,7 +39,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - implementation 'com.github.WaterMediaTeam.watermedia:build:2.0.69' + implementation 'com.github.WaterMediaTeam:watermedia:2.1.19' } @@ -56,15 +56,15 @@ processResources { } tasks.withType(JavaCompile).configureEach { - // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. - it.options.release = 17 + // Minecraft 1.21 (1.20.6) upwards uses Java 21. + it.options.release = 21 } java { withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } jar { diff --git a/gradle.properties b/gradle.properties index af1b20c..5483cc6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,16 +3,16 @@ org.gradle.jvmargs=-Xmx1G org.gradle.parallel=true # Fabric Properties -minecraft_version=1.20.1 +minecraft_version=1.21.1 mappings_channel=parchment -mappings_version=2023.09.03 -loader_version=0.16.0 +mappings_version=2024.11.17 +loader_version=0.16.10 # Mod Properties mod_version = 3.0.5 modid = videoplayer maven_group = com.github.ngoedix -archives_base_name = VideoPlayer-3.0.5-FABRIC-1.20.X +archives_base_name = VideoPlayer-3.0.5-FABRIC-1.21.X # Dependencies -fabric_version=0.92.1+1.20.1 \ No newline at end of file +fabric_version=0.115.0+1.21.1 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 509c4a2..18362b7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/github/NGoedix/videoplayer/VideoPlayer.java b/src/main/java/com/github/NGoedix/videoplayer/VideoPlayer.java index eb4dcc3..5fe951f 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/VideoPlayer.java +++ b/src/main/java/com/github/NGoedix/videoplayer/VideoPlayer.java @@ -19,7 +19,7 @@ public class VideoPlayer implements ModInitializer { - public static final CreativeModeTab VIDEO_PLAYER_TAB = Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, new ResourceLocation("tab"), FabricItemGroup.builder().title(Component.translatable("itemGroup.videoplayer.items")) + public static final CreativeModeTab VIDEO_PLAYER_TAB = Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "tab"), FabricItemGroup.builder().title(Component.translatable("itemGroup.videoplayer.items")) .icon(() -> new ItemStack(ModBlocks.TV_BLOCK)).displayItems((displayContext, entries) -> { entries.accept(new ItemStack(ModBlocks.TV_BLOCK)); entries.accept(new ItemStack(ModBlocks.RADIO_BLOCK)); @@ -31,8 +31,9 @@ public void onInitialize() { ModBlocks.registerModBlocks(); ModBlockEntities.registerAllBlockEntities(); - ArgumentTypeRegistry.registerArgumentType(new ResourceLocation(Reference.MOD_ID, "symbol_string"), SymbolStringArgumentType.class, new SymbolStringArgumentSerializer()); + ArgumentTypeRegistry.registerArgumentType(ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "symbol_string"), SymbolStringArgumentType.class, new SymbolStringArgumentSerializer()); + PacketHandler.registerPackets(); PacketHandler.registerC2SPackets(); CommandRegistrationCallback.EVENT.register(PlayVideoCommand::register); diff --git a/src/main/java/com/github/NGoedix/videoplayer/block/ModBlocks.java b/src/main/java/com/github/NGoedix/videoplayer/block/ModBlocks.java index 645bb84..ce9c002 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/block/ModBlocks.java +++ b/src/main/java/com/github/NGoedix/videoplayer/block/ModBlocks.java @@ -4,7 +4,6 @@ import com.github.NGoedix.videoplayer.VideoPlayer; import com.github.NGoedix.videoplayer.block.custom.RadioBlock; import com.github.NGoedix.videoplayer.block.custom.TVBlock; -import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; @@ -30,7 +29,7 @@ public class ModBlocks { VideoPlayer.VIDEO_PLAYER_TAB); private static Block registerBlockWithoutBlockItem(String name, Block block, CreativeModeTab group) { - return Registry.register(BuiltInRegistries.BLOCK, new ResourceLocation(Reference.MOD_ID, name), block); + return Registry.register(BuiltInRegistries.BLOCK, ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, name), block); } private static ToIntFunction litBlockEmission(int pLightValue) { @@ -39,12 +38,12 @@ private static ToIntFunction litBlockEmission(int pLightValue) { private static Block registerBlock(String name, Block block, CreativeModeTab group) { registerBlockItem(name, block, group); - return Registry.register(BuiltInRegistries.BLOCK, new ResourceLocation(Reference.MOD_ID, name), block); + return Registry.register(BuiltInRegistries.BLOCK, ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, name), block); } private static Item registerBlockItem(String name, Block block, CreativeModeTab group) { - return Registry.register(BuiltInRegistries.ITEM, new ResourceLocation(Reference.MOD_ID, name), - new BlockItem(block, new FabricItemSettings())); + return Registry.register(BuiltInRegistries.ITEM, ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, name), + new BlockItem(block, new Item.Properties())); } public static void registerModBlocks() { diff --git a/src/main/java/com/github/NGoedix/videoplayer/block/custom/RadioBlock.java b/src/main/java/com/github/NGoedix/videoplayer/block/custom/RadioBlock.java index 179baf2..25b2b7d 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/block/custom/RadioBlock.java +++ b/src/main/java/com/github/NGoedix/videoplayer/block/custom/RadioBlock.java @@ -4,7 +4,6 @@ import com.github.NGoedix.videoplayer.block.entity.custom.VideoPlayerBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.BlockPlaceContext; @@ -67,7 +66,7 @@ public boolean isPossibleToRespawnInThis(BlockState state) { } @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + protected InteractionResult useWithoutItem(BlockState state, Level pLevel, BlockPos pPos, Player pPlayer, BlockHitResult hitResult) { BlockEntity blockEntity = pLevel.getBlockEntity(pPos); if (!pLevel.isClientSide) { if (blockEntity instanceof RadioBlockEntity radioBlockEntity) { diff --git a/src/main/java/com/github/NGoedix/videoplayer/block/custom/TVBlock.java b/src/main/java/com/github/NGoedix/videoplayer/block/custom/TVBlock.java index bf557a5..e98036a 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/block/custom/TVBlock.java +++ b/src/main/java/com/github/NGoedix/videoplayer/block/custom/TVBlock.java @@ -5,16 +5,18 @@ import com.github.NGoedix.videoplayer.util.math.geo.Facing; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; @@ -22,9 +24,6 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import org.jetbrains.annotations.Nullable; public class TVBlock extends Block implements EntityBlock { @@ -86,7 +85,7 @@ public boolean useShapeForLightOcclusion(BlockState state) { } @Override - public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hitResult) { BlockEntity blockEntity = world.getBlockEntity(pos); if (!world.isClientSide) { if (blockEntity instanceof TVBlockEntity tvBlockEntity) { diff --git a/src/main/java/com/github/NGoedix/videoplayer/block/entity/ModBlockEntities.java b/src/main/java/com/github/NGoedix/videoplayer/block/entity/ModBlockEntities.java index d04353e..9831726 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/block/entity/ModBlockEntities.java +++ b/src/main/java/com/github/NGoedix/videoplayer/block/entity/ModBlockEntities.java @@ -16,12 +16,12 @@ public class ModBlockEntities { public static void registerAllBlockEntities() { TV_BLOCK_ENTITY = Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, - new ResourceLocation(Reference.MOD_ID, "tv_block_entity"), + ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "tv_block_entity"), FabricBlockEntityTypeBuilder.create(TVBlockEntity::new, ModBlocks.TV_BLOCK).build(null)); RADIO_BLOCK_ENTITY = Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, - new ResourceLocation(Reference.MOD_ID, "radio_block_entity"), + ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "radio_block_entity"), FabricBlockEntityTypeBuilder.create(TVBlockEntity::new, ModBlocks.RADIO_BLOCK).build(null)); } diff --git a/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/RadioBlockEntity.java b/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/RadioBlockEntity.java index 2097272..b1090ae 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/RadioBlockEntity.java +++ b/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/RadioBlockEntity.java @@ -3,6 +3,7 @@ import com.github.NGoedix.videoplayer.block.entity.ModBlockEntities; import com.github.NGoedix.videoplayer.network.PacketHandler; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; @@ -48,14 +49,14 @@ public void setBeingUsed(UUID player) { } @Override - protected void saveAdditional(CompoundTag pTag) { - super.saveAdditional(pTag); + protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider provider) { + super.saveAdditional(pTag, provider); pTag.putUUID("beingUsed", playerUsing == null ? new UUID(0, 0) : playerUsing); } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + public void loadAdditional(CompoundTag pTag, HolderLookup.Provider provider) { + super.loadAdditional(pTag, provider); loadFromNBT(pTag); } diff --git a/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/TVBlockEntity.java b/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/TVBlockEntity.java index a8f007c..7d29f42 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/TVBlockEntity.java +++ b/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/TVBlockEntity.java @@ -3,27 +3,20 @@ import com.github.NGoedix.videoplayer.block.custom.TVBlock; import com.github.NGoedix.videoplayer.block.entity.ModBlockEntities; import com.github.NGoedix.videoplayer.network.PacketHandler; -import com.github.NGoedix.videoplayer.util.cache.TextureCache; -import com.github.NGoedix.videoplayer.util.displayers.IDisplay; import com.github.NGoedix.videoplayer.util.math.geo.AlignedBox; import com.github.NGoedix.videoplayer.util.math.geo.Axis; import com.github.NGoedix.videoplayer.util.math.geo.Facing; -import com.github.NGoedix.videoplayer.util.math.geo.Vec3d; -import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import java.util.UUID; -import static net.fabricmc.api.EnvType.CLIENT; - public class TVBlockEntity extends VideoPlayerBlockEntity { private UUID playerUsing; @@ -60,14 +53,14 @@ public void setBeingUsed(UUID player) { } @Override - protected void saveAdditional(CompoundTag nbt) { - super.saveAdditional(nbt); + protected void saveAdditional(CompoundTag nbt, HolderLookup.Provider provider) { + super.saveAdditional(nbt, provider); nbt.putUUID("beingUsed", playerUsing == null ? new UUID(0, 0) : playerUsing); } @Override - public void load(CompoundTag nbt) { - super.load(nbt); + public void loadAdditional(CompoundTag nbt, HolderLookup.Provider provider) { + super.loadAdditional(nbt, provider); loadFromNBT(nbt); } diff --git a/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/VideoPlayerBlockEntity.java b/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/VideoPlayerBlockEntity.java index cd2f003..26beb8b 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/VideoPlayerBlockEntity.java +++ b/src/main/java/com/github/NGoedix/videoplayer/block/entity/custom/VideoPlayerBlockEntity.java @@ -7,8 +7,8 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.Connection; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; @@ -116,8 +116,8 @@ public Packet getUpdatePacket() { } @Override - public CompoundTag getUpdateTag() { - return this.saveWithFullMetadata(); + public CompoundTag getUpdateTag(HolderLookup.Provider registries) { + return this.saveWithFullMetadata(registries); } @Override @@ -131,8 +131,8 @@ public boolean isClient() { } @Override - protected void saveAdditional(CompoundTag pTag) { - super.saveAdditional(pTag); + protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider registries) { + super.saveAdditional(pTag, registries); pTag.putString("url", url == null ? "" : url); pTag.putBoolean("playing", playing); @@ -141,8 +141,8 @@ protected void saveAdditional(CompoundTag pTag) { } @Override - public void load(CompoundTag pTag) { - super.load(pTag); + public void loadAdditional(CompoundTag pTag, HolderLookup.Provider registries) { + super.loadAdditional(pTag, registries); loadFromNBTInternal(pTag); loadFromNBT(pTag); diff --git a/src/main/java/com/github/NGoedix/videoplayer/client/ClientHandler.java b/src/main/java/com/github/NGoedix/videoplayer/client/ClientHandler.java index 2a0c7eb..bf909ed 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/client/ClientHandler.java +++ b/src/main/java/com/github/NGoedix/videoplayer/client/ClientHandler.java @@ -1,5 +1,6 @@ package com.github.NGoedix.videoplayer.client; +import com.github.NGoedix.videoplayer.Reference; import com.github.NGoedix.videoplayer.VideoPlayerUtils; import com.github.NGoedix.videoplayer.block.entity.ModBlockEntities; import com.github.NGoedix.videoplayer.block.entity.custom.RadioBlockEntity; @@ -9,12 +10,7 @@ import com.github.NGoedix.videoplayer.client.gui.VideoScreen; import com.github.NGoedix.videoplayer.client.render.TVBlockRenderer; import com.github.NGoedix.videoplayer.network.PacketHandler; -import com.github.NGoedix.videoplayer.Reference; import com.github.NGoedix.videoplayer.util.RadioStreams; -import me.srrapero720.watermedia.api.image.ImageAPI; -import me.srrapero720.watermedia.api.image.ImageRenderer; -import me.srrapero720.watermedia.api.player.SyncMusicPlayer; -import me.srrapero720.watermedia.core.tools.JarTool; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -22,7 +18,12 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; +import org.watermedia.api.image.ImageAPI; +import org.watermedia.api.image.ImageRenderer; +import org.watermedia.api.player.videolan.MusicPlayer; +import org.watermedia.core.tools.JarTool; +import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -47,7 +48,7 @@ public class ClientHandler implements ClientModInitializer { @Environment(EnvType.CLIENT) public static ImageRenderer step5Image() { return IMG_STEP5; } - private static final List musicPlayers = new ArrayList<>(); + private static final List musicPlayers = new ArrayList<>(); @Override public void onInitializeClient() { @@ -103,7 +104,7 @@ public static void stopVideoIfExists(Minecraft client) { public static void playMusic(Minecraft client, String url, int volume) { client.execute(() -> { // Until any callback in SyncMusicPlayer I will check if the music is playing when added other music player - for (SyncMusicPlayer musicPlayer : musicPlayers) { + for (MusicPlayer musicPlayer : musicPlayers) { if (musicPlayer.isPlaying()) { musicPlayer.stop(); musicPlayer.release(); @@ -112,16 +113,16 @@ public static void playMusic(Minecraft client, String url, int volume) { } // Add the new player - SyncMusicPlayer musicPlayer = new SyncMusicPlayer(); + MusicPlayer musicPlayer = new MusicPlayer(); musicPlayers.add(musicPlayer); musicPlayer.setVolume(volume); - musicPlayer.start(url); + musicPlayer.start(URI.create(url)); }); } public static void stopMusicIfPlaying(Minecraft client) { client.execute(() -> { - for (SyncMusicPlayer musicPlayer : musicPlayers) { + for (MusicPlayer musicPlayer : musicPlayers) { if (musicPlayer.isPlaying()) { musicPlayer.stop(); musicPlayer.release(); diff --git a/src/main/java/com/github/NGoedix/videoplayer/client/gui/RadioScreen.java b/src/main/java/com/github/NGoedix/videoplayer/client/gui/RadioScreen.java index 92ec99b..d69268d 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/client/gui/RadioScreen.java +++ b/src/main/java/com/github/NGoedix/videoplayer/client/gui/RadioScreen.java @@ -24,13 +24,13 @@ public class RadioScreen extends Screen { // Textures - private static final ResourceLocation TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/background.png"); + private static final ResourceLocation TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/background.png"); - private static final ResourceLocation PLAY_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/play_button.png"); - private static final ResourceLocation PLAY_HOVER_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/play_button_hover.png"); + private static final ResourceLocation PLAY_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/play_button.png"); + private static final ResourceLocation PLAY_HOVER_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/play_button_hover.png"); - private static final ResourceLocation PAUSE_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/pause_button.png"); - private static final ResourceLocation PAUSE_HOVER_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/pause_button_hover.png"); + private static final ResourceLocation PAUSE_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/pause_button.png"); + private static final ResourceLocation PAUSE_HOVER_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/pause_button_hover.png"); private ScrollingStringList countryList, stationList; private EditBox urlField; @@ -233,7 +233,7 @@ private String getStationUrlFromStation(String stationUrl) { @Override public void render(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { if (!ready) ready = true; - renderBackground(pGuiGraphics); + renderBackground(pGuiGraphics, pMouseX, pMouseY, pPartialTick); RenderSystem.clearColor(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem._setShaderTexture(0, TEXTURE); diff --git a/src/main/java/com/github/NGoedix/videoplayer/client/gui/TVVideoScreen.java b/src/main/java/com/github/NGoedix/videoplayer/client/gui/TVVideoScreen.java index 0ffb02f..d95859d 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/client/gui/TVVideoScreen.java +++ b/src/main/java/com/github/NGoedix/videoplayer/client/gui/TVVideoScreen.java @@ -9,10 +9,6 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import me.srrapero720.watermedia.api.image.ImageAPI; -import me.srrapero720.watermedia.api.image.ImageRenderer; -import me.srrapero720.watermedia.api.math.MathAPI; -import me.srrapero720.watermedia.api.player.SyncVideoPlayer; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.Screen; @@ -22,21 +18,25 @@ import net.minecraft.world.level.block.entity.BlockEntity; import org.joml.Matrix4f; import org.lwjgl.opengl.GL11; +import org.watermedia.api.image.ImageAPI; +import org.watermedia.api.image.ImageRenderer; +import org.watermedia.api.math.MathAPI; +import org.watermedia.api.player.videolan.VideoPlayer; import java.awt.*; public class TVVideoScreen extends Screen { - private static final ResourceLocation TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/background.png"); + private static final ResourceLocation TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/background.png"); - private static final ResourceLocation PLAY_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/play_button.png"); - private static final ResourceLocation PLAY_HOVER_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/play_button_hover.png"); + private static final ResourceLocation PLAY_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/play_button.png"); + private static final ResourceLocation PLAY_HOVER_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/play_button_hover.png"); - private static final ResourceLocation PAUSE_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/pause_button.png"); - private static final ResourceLocation PAUSE_HOVER_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/pause_button_hover.png"); + private static final ResourceLocation PAUSE_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/pause_button.png"); + private static final ResourceLocation PAUSE_HOVER_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/pause_button_hover.png"); - private static final ResourceLocation STOP_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/stop_button.png"); - private static final ResourceLocation STOP_HOVER_BUTTON_TEXTURE = new ResourceLocation(Reference.MOD_ID, "textures/gui/stop_button_hover.png"); + private static final ResourceLocation STOP_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/stop_button.png"); + private static final ResourceLocation STOP_HOVER_BUTTON_TEXTURE = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "textures/gui/stop_button_hover.png"); private ImageButtonHoverable playButton; private ImageButtonHoverable pauseButton; @@ -154,7 +154,7 @@ protected void init() { timeSlider.setOnSlideListener(value -> { if (be.requestDisplay() == null) return; if (be.requestDisplay() instanceof VideoDisplayer) { - SyncVideoPlayer player = (SyncVideoPlayer) ((VideoDisplayer) be.requestDisplay()).player; + VideoPlayer player = (VideoPlayer) ((VideoDisplayer) be.requestDisplay()).player; if (player.isReady() && !player.isLive()) { player.seekTo((int) ((value / 100D) * player.getDuration())); } @@ -163,7 +163,7 @@ protected void init() { }); if (be.requestDisplay() != null && be.requestDisplay() instanceof VideoDisplayer) { - SyncVideoPlayer player = (SyncVideoPlayer) ((VideoDisplayer) be.requestDisplay()).player; + VideoPlayer player = (VideoPlayer) ((VideoDisplayer) be.requestDisplay()).player; timeSlider.setValue((double) player.getTime() / player.getDuration()); } @@ -181,7 +181,7 @@ protected void init() { @Override public void render(GuiGraphics context, int pMouseX, int pMouseY, float pPartialTick) { - renderBackground(context); + renderBackground(context, pMouseX, pMouseY, pPartialTick); RenderSystem.clearColor(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem.setShaderTexture(0, TEXTURE); context.blit(TEXTURE, leftPos, topPos, 320, 320, 0, 0, imageWidth, imageHeight, imageWidth, imageHeight); @@ -198,7 +198,7 @@ public void render(GuiGraphics context, int pMouseX, int pMouseY, float pPartial String actualTimeFormatted = "00:00"; if (be.requestDisplay() instanceof VideoDisplayer) { - SyncVideoPlayer player = (SyncVideoPlayer) ((VideoDisplayer) be.requestDisplay()).player; + VideoPlayer player = (VideoPlayer) ((VideoDisplayer) be.requestDisplay()).player; if (player != null && player.isReady()) { timeSlider.setActive(!player.isLive()); @@ -304,15 +304,14 @@ private void drawTexture(GuiGraphics guiGraphics, int texture, int x, int y, int RenderSystem.setShaderTexture(0, texture); Matrix4f matrix4f = guiGraphics.pose().last().pose(); - BufferBuilder bufferBuilder = Tesselator.getInstance().getBuilder(); - bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + BufferBuilder bufferBuilder = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - bufferBuilder.vertex(matrix4f, x, y + height, 0).uv(uMin, vMax).endVertex(); // Bottom-left - bufferBuilder.vertex(matrix4f, x + width, y + height, 0).uv(uMax, vMax).endVertex(); // Bottom-right - bufferBuilder.vertex(matrix4f, x + width, y, 0).uv(uMax, vMin).endVertex(); // Top-right - bufferBuilder.vertex(matrix4f, x, y, 0).uv(uMin, vMin).endVertex(); // Top-left + bufferBuilder.addVertex(matrix4f, x, y + height, 0).setUv(uMin, vMax); // Bottom-left + bufferBuilder.addVertex(matrix4f, x + width, y + height, 0).setUv(uMax, vMax); // Bottom-right + bufferBuilder.addVertex(matrix4f, x + width, y, 0).setUv(uMax, vMin); // Top-right + bufferBuilder.addVertex(matrix4f, x, y, 0).setUv(uMin, vMin); // Top-left - BufferUploader.drawWithShader(bufferBuilder.end()); + BufferUploader.drawWithShader(bufferBuilder.buildOrThrow()); RenderSystem.disableBlend(); } diff --git a/src/main/java/com/github/NGoedix/videoplayer/client/gui/VideoScreen.java b/src/main/java/com/github/NGoedix/videoplayer/client/gui/VideoScreen.java index 98b4668..87fbb9b 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/client/gui/VideoScreen.java +++ b/src/main/java/com/github/NGoedix/videoplayer/client/gui/VideoScreen.java @@ -1,16 +1,11 @@ package com.github.NGoedix.videoplayer.client.gui; -import com.github.NGoedix.videoplayer.VideoPlayer; import com.github.NGoedix.videoplayer.Reference; import com.github.NGoedix.videoplayer.client.ClientHandler; import com.github.NGoedix.videoplayer.util.math.VideoMathUtil; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import me.srrapero720.watermedia.api.image.ImageAPI; -import me.srrapero720.watermedia.api.image.ImageRenderer; -import me.srrapero720.watermedia.api.math.MathAPI; -import me.srrapero720.watermedia.api.player.SyncVideoPlayer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -21,8 +16,13 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; +import org.watermedia.api.image.ImageAPI; +import org.watermedia.api.image.ImageRenderer; +import org.watermedia.api.math.MathAPI; +import org.watermedia.api.player.videolan.VideoPlayer; import java.awt.*; +import java.net.URI; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -55,7 +55,7 @@ public class VideoScreen extends AbstractContainerScreen private int optionOutSecs; // TOOLS - private final SyncVideoPlayer player; + private final VideoPlayer player; // VIDEO INFO int videoTexture = -1; @@ -71,6 +71,8 @@ public VideoScreen(String url, int volume, boolean controlBlocked, boolean canSk public VideoScreen(String url, int volume, boolean controlBlocked, boolean canSkip, boolean fadeIn) { super(new DummyContainer(), Objects.requireNonNull(Minecraft.getInstance().player).getInventory(), Component.literal("")); + URI uri = URI.create(url); + Minecraft minecraft = Minecraft.getInstance(); Minecraft.getInstance().getSoundManager().pause(); @@ -82,15 +84,15 @@ public VideoScreen(String url, int volume, boolean controlBlocked, boolean canSk this.optionOutMode = -1; this.optionOutSecs = -1; - this.player = new SyncVideoPlayer(null, minecraft); + this.player = new VideoPlayer(null, minecraft); Reference.LOGGER.info("Playing video (" + (!controlBlocked ? "not" : "") + "blocked) (" + url + " with volume: " + (int) (Minecraft.getInstance().options.getSoundSourceVolume(SoundSource.MASTER) * volume)); player.setVolume((int) (Minecraft.getInstance().options.getSoundSourceVolume(SoundSource.MASTER) * volume)); if (!fadeIn) { started = true; - player.start(url); + player.start(uri); } else { - player.startPaused(url); + player.startPaused(uri); } } @@ -100,7 +102,7 @@ protected void renderLabels(@NotNull GuiGraphics pPoseguiGraphics, int pMouseX, @Override protected void renderBg(@NotNull GuiGraphics guiGraphics, float pPartialTick, int pMouseX, int pMouseY) { if (started && !closing) { - videoTexture = player.getGlTexture(); + videoTexture = player.preRender(); } // Handle easing for fade-in @@ -163,14 +165,14 @@ protected void renderBg(@NotNull GuiGraphics guiGraphics, float pPartialTick, in // DEBUG RENDERING if (FabricLoader.getInstance().isDevelopmentEnvironment()) { - draw(guiGraphics, String.format("State: %s", player.getRawPlayerState().name()), getHeightCenter(-12)); + draw(guiGraphics, String.format("State: %s", player.getStateName()), getHeightCenter(-12)); draw(guiGraphics, String.format("Time: %s (%s) / %s (%s)", FORMAT.format(new Date(player.getTime())), player.getTime(), FORMAT.format(new Date(player.getDuration())), player.getDuration()), getHeightCenter(0)); draw(guiGraphics, String.format("Media Duration: %s (%s)", FORMAT.format(new Date(player.getMediaInfoDuration())), player.getMediaInfoDuration()), getHeightCenter(12)); } } private void renderTexture(GuiGraphics guiGraphics, int texture) { - if (player.getDimensions() == null) return; // Checking if video available + if (player.dimension() == null) return; // Checking if video available RenderSystem.enableBlend(); guiGraphics.fill(0, 0, width, height, MathAPI.argb(255, 0, 0, 0)); @@ -180,7 +182,7 @@ private void renderTexture(GuiGraphics guiGraphics, int texture) { RenderSystem.setShaderTexture(0, texture); // Get video dimensions - Dimension videoDimensions = player.getDimensions(); + Dimension videoDimensions = player.dimension(); double videoWidth = videoDimensions.getWidth(); double videoHeight = videoDimensions.getHeight(); @@ -241,15 +243,14 @@ private void drawTexture(GuiGraphics guiGraphics, int texture, int x, int y, int RenderSystem.setShaderTexture(0, texture); Matrix4f matrix4f = guiGraphics.pose().last().pose(); - BufferBuilder bufferBuilder = Tesselator.getInstance().getBuilder(); - bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + BufferBuilder bufferBuilder = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - bufferBuilder.vertex(matrix4f, x, y + height, 0).uv(uMin, vMax).endVertex(); // Bottom-left - bufferBuilder.vertex(matrix4f, x + width, y + height, 0).uv(uMax, vMax).endVertex(); // Bottom-right - bufferBuilder.vertex(matrix4f, x + width, y, 0).uv(uMax, vMin).endVertex(); // Top-right - bufferBuilder.vertex(matrix4f, x, y, 0).uv(uMin, vMin).endVertex(); // Top-left + bufferBuilder.addVertex(matrix4f, x, y + height, 0).setUv(uMin, vMax); // Bottom-left + bufferBuilder.addVertex(matrix4f, x + width, y + height, 0).setUv(uMax, vMax); // Bottom-right + bufferBuilder.addVertex(matrix4f, x + width, y, 0).setUv(uMax, vMin); // Top-right + bufferBuilder.addVertex(matrix4f, x, y, 0).setUv(uMin, vMin); // Top-left - BufferUploader.drawWithShader(bufferBuilder.end()); + BufferUploader.drawWithShader(bufferBuilder.buildOrThrow()); RenderSystem.disableBlend(); } @@ -263,7 +264,7 @@ private double applyEasing(int mode, double start, double end, double t) { } private void draw(GuiGraphics guiGraphics, String text, int height) { - guiGraphics.drawString(Minecraft.getInstance().font, text, 5, height, 0xffffff); + guiGraphics.drawCenteredString(Minecraft.getInstance().font, text, 155, height, -1); } @Override diff --git a/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/CustomSlider.java b/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/CustomSlider.java index f9d09ec..43318b6 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/CustomSlider.java +++ b/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/CustomSlider.java @@ -6,9 +6,14 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractSliderButton; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; public class CustomSlider extends AbstractSliderButton { + private static final ResourceLocation SLIDER_SPRITE = ResourceLocation.withDefaultNamespace("widget/slider"); + private static final ResourceLocation HIGHLIGHTED_SPRITE = ResourceLocation.withDefaultNamespace("widget/slider_highlighted"); + private static final ResourceLocation SLIDER_HANDLE_SPRITE = ResourceLocation.withDefaultNamespace("widget/slider_handle"); + private static final ResourceLocation SLIDER_HANDLE_HIGHLIGHTED_SPRITE = ResourceLocation.withDefaultNamespace("widget/slider_handle_highlighted"); public interface OnSlide { void onSlide(double value); @@ -49,13 +54,12 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa Minecraft minecraft = Minecraft.getInstance(); Font fontrenderer = minecraft.font; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha); - RenderSystem._setShaderTexture(0, WIDGETS_LOCATION); int i = 0; RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.enableDepthTest(); - guiGraphics.blit(WIDGETS_LOCATION, this.getX(), this.getY(), this.width / 2, this.height, 0, 46 + i * 20, this.width / 2, 20, 256, 256); - guiGraphics.blit(WIDGETS_LOCATION, this.getX() + this.width / 2, this.getY(), this.width / 2, this.height,200 - this.width / 2f, 46 + i * 20, this.width / 2, 20, 256, 256); + guiGraphics.blitSprite(SLIDER_SPRITE, this.getX(), this.getY(), this.width / 2, this.height); + guiGraphics.blitSprite(SLIDER_SPRITE, this.getX() + this.width / 2, this.getY(), this.width / 2, this.height); if (progressBar) { RenderSystem.setShaderColor(0.0F, 1.0F, 0.0F, 0.2F); @@ -69,12 +73,13 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa } protected void renderBg(GuiGraphics guiGraphics, Minecraft pMinecraft, int pMouseX, int pMouseY) { - RenderSystem._setShaderTexture(0, WIDGETS_LOCATION); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); int i = (this.isHovered ? 2 : 1) * 20; - guiGraphics.blit(WIDGETS_LOCATION, this.getX() + (int)(this.value * (double)(this.width - 8)), this.getY(),4, height, 0, 46 + i, 4, 20, 256, 256); - guiGraphics.blit(WIDGETS_LOCATION, this.getX() + (int)(this.value * (double)(this.width - 8)) + 4, this.getY(), 4, height, 196, 46 + i, 4, 20, 256, 256); + var texture = this.isHovered ? SLIDER_HANDLE_HIGHLIGHTED_SPRITE : SLIDER_HANDLE_SPRITE; + + guiGraphics.blitSprite(texture, this.getX() + (int) (this.value * (double) (this.width - 8)), this.getY(), 4, height); + guiGraphics.blitSprite(texture, this.getX() + (int) (this.value * (double) (this.width - 8)) + 4, this.getY(), 4, height); } @Override diff --git a/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/ScrollingList.java b/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/ScrollingList.java index 07d68c9..1391389 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/ScrollingList.java +++ b/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/ScrollingList.java @@ -9,18 +9,17 @@ public class ScrollingList> extends AbstractSelectionList { public ScrollingList(int x, int y, int width, int height, int slotHeightIn) { - super(Minecraft.getInstance(), width, height, y - (height / 2), (y - (height / 2)) + height, slotHeightIn); - this.setLeftPos(x - (width / 2)); - this.setRenderBackground(false); - this.setRenderTopAndBottom(false); // removes background + super(Minecraft.getInstance(), width, height, y - (height / 2), slotHeightIn); + this.setX(x - (width / 2)); + this.setRenderHeader(false, 0); } @Override - public void render(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { + public void renderWidget(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { double scale = Minecraft.getInstance().getWindow().getGuiScale(); GL11.glEnable(GL11.GL_SCISSOR_TEST); - GL11.glScissor((int)(this.x0 * scale), (int)(Minecraft.getInstance().getWindow().getHeight() - ((this.y0 + this.height) * scale)), + GL11.glScissor((int)(this.getX() * scale), (int)(Minecraft.getInstance().getWindow().getHeight() - ((this.getY() + this.height) * scale)), (int)(this.width * scale), (int)(this.height * scale)); super.render(pGuiGraphics, pMouseX, pMouseY, pPartialTick); @@ -28,13 +27,17 @@ public void render(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPa GL11.glDisable(GL11.GL_SCISSOR_TEST); } + @Override + protected void renderListBackground(GuiGraphics guiGraphics) { + } + @Override // @mcp: getScrollbarPosition = getScrollbarPosition protected int getScrollbarPosition() { - return (this.x0 + this.width) - 6; + return (this.getX() + this.width) - 6; } @Override - public void updateNarration(NarrationElementOutput p_169152_) { + protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { } } diff --git a/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/ScrollingStringList.java b/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/ScrollingStringList.java index 42ac18d..94a822c 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/ScrollingStringList.java +++ b/src/main/java/com/github/NGoedix/videoplayer/client/gui/components/ScrollingStringList.java @@ -52,9 +52,9 @@ public void updateEntries(List texts) { } @Override - protected void renderBackground(GuiGraphics pGuiGraphics) { + protected void renderListBackground(GuiGraphics pGuiGraphics) { // Render background of the list - super.renderBackground(pGuiGraphics); + super.renderListBackground(pGuiGraphics); // Render background of the slots int i = this.getRowLeft(); diff --git a/src/main/java/com/github/NGoedix/videoplayer/client/render/TVBlockRenderer.java b/src/main/java/com/github/NGoedix/videoplayer/client/render/TVBlockRenderer.java index af2e6b9..630e4bb 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/client/render/TVBlockRenderer.java +++ b/src/main/java/com/github/NGoedix/videoplayer/client/render/TVBlockRenderer.java @@ -1,6 +1,5 @@ package com.github.NGoedix.videoplayer.client.render; -import com.github.NGoedix.videoplayer.util.math.geo.BoxCorner; import com.github.NGoedix.videoplayer.block.custom.TVBlock; import com.github.NGoedix.videoplayer.block.entity.custom.TVBlockEntity; import com.github.NGoedix.videoplayer.util.displayers.IDisplay; @@ -8,7 +7,6 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import me.srrapero720.watermedia.api.image.ImageAPI; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; @@ -18,9 +16,9 @@ import net.minecraft.core.Vec3i; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; -import org.joml.Matrix3f; import org.joml.Matrix4f; import org.lwjgl.opengl.GL11; +import org.watermedia.api.image.ImageAPI; import java.awt.*; @@ -166,16 +164,14 @@ private void renderTexture(TVBlockEntity frame, IDisplay display, int texture, P RenderSystem.setShader(GameRenderer::getPositionTexColorShader); Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder builder = tesselator.getBuilder(); - builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + BufferBuilder builder = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); Matrix4f mat = pose.last().pose(); - Matrix3f mat3f = pose.last().normal(); Vec3i normal = face.facing.normal; for (BoxCorner corner : face.corners) - builder.vertex(mat, box.get(corner.x), box.get(corner.y), box.get(corner.z)) - .uv(corner.isFacing(face.getTexU()) ? 1 : 0, corner.isFacing(face.getTexV()) ? 1 : 0).color(-1) - .normal(mat3f, normal.getX(), normal.getY(), normal.getZ()).endVertex(); - tesselator.end(); + builder.addVertex(mat, box.get(corner.x), box.get(corner.y), box.get(corner.z)) + .setUv(corner.isFacing(face.getTexU()) ? 1 : 0, corner.isFacing(face.getTexV()) ? 1 : 0).setColor(-1) + .setNormal(pose.last(), normal.getX(), normal.getY(), normal.getZ()); + BufferUploader.drawWithShader(builder.buildOrThrow()); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); pose.popPose(); diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/PacketHandler.java b/src/main/java/com/github/NGoedix/videoplayer/network/PacketHandler.java index 76b8556..daf4b0c 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/network/PacketHandler.java +++ b/src/main/java/com/github/NGoedix/videoplayer/network/PacketHandler.java @@ -2,138 +2,95 @@ import com.github.NGoedix.videoplayer.network.packet.*; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.fabric.api.networking.v1.PlayerLookup; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.chunk.LevelChunk; public class PacketHandler { + public static void registerPackets() { + PayloadTypeRegistry.playC2S().register(VideoUpdateMessage.TYPE, VideoUpdateMessage.CODEC); + PayloadTypeRegistry.playC2S().register(RadioUpdateMessage.TYPE, RadioUpdateMessage.CODEC); + + PayloadTypeRegistry.playS2C().register(FrameVideoMessage.TYPE, FrameVideoMessage.CODEC); + PayloadTypeRegistry.playS2C().register(OpenVideoManagerScreenMessage.TYPE, OpenVideoManagerScreenMessage.CODEC); + PayloadTypeRegistry.playS2C().register(OpenRadioManagerScreenMessage.TYPE, OpenRadioManagerScreenMessage.CODEC); + PayloadTypeRegistry.playS2C().register(StartVideoMessage.TYPE, StartVideoMessage.CODEC); + PayloadTypeRegistry.playS2C().register(StopVideoMessage.TYPE, StopVideoMessage.CODEC); + PayloadTypeRegistry.playS2C().register(StartCustomVideoMessage.TYPE, StartCustomVideoMessage.CODEC); + PayloadTypeRegistry.playS2C().register(StopCustomVideoMessage.TYPE, StopCustomVideoMessage.CODEC); + PayloadTypeRegistry.playS2C().register(StartMusicMessage.TYPE, StartMusicMessage.CODEC); + PayloadTypeRegistry.playS2C().register(StopMusicMessage.TYPE, StopMusicMessage.CODEC); + } public static void registerC2SPackets() { - ServerPlayNetworking.registerGlobalReceiver(VideoUpdateMessage.ID, VideoUpdateMessage::receive); - ServerPlayNetworking.registerGlobalReceiver(RadioUpdateMessage.ID, RadioUpdateMessage::receive); + ServerPlayNetworking.registerGlobalReceiver(VideoUpdateMessage.TYPE, VideoUpdateMessage::handle); + ServerPlayNetworking.registerGlobalReceiver(RadioUpdateMessage.TYPE, RadioUpdateMessage::handle); } public static void registerS2CPackets() { - ClientPlayNetworking.registerGlobalReceiver(FrameVideoMessage.ID, FrameVideoMessage::receive); - ClientPlayNetworking.registerGlobalReceiver(OpenVideoManagerScreenMessage.ID, OpenVideoManagerScreenMessage::receive); - ClientPlayNetworking.registerGlobalReceiver(OpenRadioManagerScreenMessage.ID, OpenRadioManagerScreenMessage::receive); - ClientPlayNetworking.registerGlobalReceiver(SendVideoMessage.ID, SendVideoMessage::receive); - ClientPlayNetworking.registerGlobalReceiver(SendCustomVideoMessage.ID, SendCustomVideoMessage::receive); - ClientPlayNetworking.registerGlobalReceiver(SendMusicMessage.ID, SendMusicMessage::receive); + ClientPlayNetworking.registerGlobalReceiver(FrameVideoMessage.TYPE, FrameVideoMessage::handle); + ClientPlayNetworking.registerGlobalReceiver(OpenVideoManagerScreenMessage.TYPE, OpenVideoManagerScreenMessage::handle); + ClientPlayNetworking.registerGlobalReceiver(OpenRadioManagerScreenMessage.TYPE, OpenRadioManagerScreenMessage::handle); + ClientPlayNetworking.registerGlobalReceiver(StartVideoMessage.TYPE, StartVideoMessage::handle); + ClientPlayNetworking.registerGlobalReceiver(StartCustomVideoMessage.TYPE, StartCustomVideoMessage::handle); + ClientPlayNetworking.registerGlobalReceiver(StartMusicMessage.TYPE, StartMusicMessage::handle); + ClientPlayNetworking.registerGlobalReceiver(StopVideoMessage.TYPE, StopVideoMessage::handle); + ClientPlayNetworking.registerGlobalReceiver(StopCustomVideoMessage.TYPE, StopCustomVideoMessage::handle); + ClientPlayNetworking.registerGlobalReceiver(StopMusicMessage.TYPE, StopMusicMessage::handle); } // SEND MESSAGES S2C public static void sendS2CSendVideoStart(ServerPlayer player, String url, int volume, boolean controlBlocked, boolean canSkip) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeEnum(SendVideoMessage.VideoMessageType.START); - buf.writeUtf(url); - buf.writeInt(volume); - buf.writeBoolean(controlBlocked); - buf.writeBoolean(canSkip); - ServerPlayNetworking.send(player, SendVideoMessage.ID, buf); + ServerPlayNetworking.send(player, new StartVideoMessage(url, volume, controlBlocked, canSkip)); } public static void sendS2CSendVideoStop(ServerPlayer player) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeEnum(SendVideoMessage.VideoMessageType.STOP); - ServerPlayNetworking.send(player, SendVideoMessage.ID, buf); + ServerPlayNetworking.send(player, StopVideoMessage.INSTANCE); } public static void sendS2CSendMusicStart(ServerPlayer player, String url, int volume) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeEnum(SendMusicMessage.MusicMessageType.START); - buf.writeUtf(url); - buf.writeInt(volume); - ServerPlayNetworking.send(player, SendMusicMessage.ID, buf); + ServerPlayNetworking.send(player, new StartMusicMessage(url, volume)); } public static void sendS2CSendMusicStop(ServerPlayer player) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeEnum(SendMusicMessage.MusicMessageType.STOP); - ServerPlayNetworking.send(player, SendMusicMessage.ID, buf); + ServerPlayNetworking.send(player, StopMusicMessage.INSTANCE); } public static void sendS2CSendVideoStart(ServerPlayer player, String url, int volume, boolean controlBlocked, boolean canSkip, int mode, int position, int optionInMode, int optionInSecs, int optionOutMode, int optionOutSecs) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeEnum(SendCustomVideoMessage.VideoMessageType.START); - buf.writeUtf(url); - buf.writeInt(volume); - buf.writeBoolean(controlBlocked); - buf.writeBoolean(canSkip); - buf.writeInt(mode); - buf.writeInt(position); - buf.writeInt(optionInMode); - buf.writeInt(optionInSecs); - buf.writeInt(optionOutMode); - buf.writeInt(optionOutSecs); - ServerPlayNetworking.send(player, SendCustomVideoMessage.ID, buf); + ServerPlayNetworking.send(player, new StartCustomVideoMessage( + url, volume, controlBlocked, canSkip, + mode, position, optionInMode, optionInSecs, + optionOutMode, optionOutSecs + )); } public static void sendS2COpenVideoManagerScreen(ServerPlayer player, BlockPos pos, String url, int volume, int tick, boolean isPlaying) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeBlockPos(pos); - buf.writeUtf(url); - buf.writeInt(volume); - buf.writeInt(tick); - buf.writeBoolean(isPlaying); - ServerPlayNetworking.send(player, OpenVideoManagerScreenMessage.ID, buf); + ServerPlayNetworking.send(player, new OpenVideoManagerScreenMessage(pos, url, volume, tick, isPlaying)); } public static void sendS2COpenRadioManagerScreen(ServerPlayer player, BlockPos pos, String url, int volume, boolean isPlaying) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeBlockPos(pos); - buf.writeUtf(url); - buf.writeInt(volume); - buf.writeBoolean(isPlaying); - ServerPlayNetworking.send(player, OpenRadioManagerScreenMessage.ID, buf); + ServerPlayNetworking.send(player, new OpenRadioManagerScreenMessage(pos, url, volume, isPlaying)); } public static void sendS2CFrameVideoMessage(LevelChunk chunk, String url, BlockPos pos, boolean playing, int tick) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeUtf(url); - buf.writeBlockPos(pos); - buf.writeBoolean(playing); - buf.writeInt(tick); - for (ServerPlayer player : PlayerLookup.tracking((ServerLevel) chunk.getLevel(), chunk.getPos())) - ServerPlayNetworking.send(player, FrameVideoMessage.ID, buf); + ServerPlayNetworking.send(player, new FrameVideoMessage(url, pos, playing, tick)); } public static void sendS2CRadioMessage(LevelChunk chunk, String url, BlockPos pos, boolean playing) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeUtf(url); - buf.writeBlockPos(pos); - buf.writeBoolean(playing); - for (ServerPlayer player : PlayerLookup.tracking((ServerLevel) chunk.getLevel(), chunk.getPos())) - ServerPlayNetworking.send(player, RadioMessage.ID, buf); + ServerPlayNetworking.send(player, new RadioMessage(url, pos, playing)); } public static void sendC2SVideoUpdateMessage(BlockPos pos, String url, int volume, int tick, boolean isPlaying, boolean stopped, boolean exit) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeBlockPos(pos); - buf.writeUtf(url); - buf.writeInt(volume); - buf.writeInt(tick); - buf.writeBoolean(isPlaying); - buf.writeBoolean(stopped); - buf.writeBoolean(exit); - ClientPlayNetworking.send(VideoUpdateMessage.ID, buf); + ClientPlayNetworking.send(new VideoUpdateMessage(pos, url, volume, tick, isPlaying, stopped, exit)); } public static void sendC2SRadioUpdateMessage(BlockPos pos, String url, int volume, int tick, boolean isPlaying, boolean exit) { - FriendlyByteBuf buf = PacketByteBufs.create(); - buf.writeBlockPos(pos); - buf.writeUtf(url); - buf.writeInt(volume); - buf.writeInt(tick); - buf.writeBoolean(isPlaying); - buf.writeBoolean(exit); - ClientPlayNetworking.send(RadioUpdateMessage.ID, buf); + ClientPlayNetworking.send(new RadioUpdateMessage(pos, url, volume, tick, isPlaying, exit)); } } diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/FrameVideoMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/FrameVideoMessage.java index a0659b8..f0583b4 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/network/packet/FrameVideoMessage.java +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/FrameVideoMessage.java @@ -2,23 +2,37 @@ import com.github.NGoedix.videoplayer.Reference; import com.github.NGoedix.videoplayer.client.ClientHandler; -import net.fabricmc.fabric.api.networking.v1.PacketSender; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; -public class FrameVideoMessage { +public record FrameVideoMessage( + String url, BlockPos pos, boolean playing, int tick +) implements CustomPacketPayload { + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, FrameVideoMessage::url, + BlockPos.STREAM_CODEC, FrameVideoMessage::pos, + ByteBufCodecs.BOOL, FrameVideoMessage::playing, + ByteBufCodecs.VAR_INT, FrameVideoMessage::tick, + FrameVideoMessage::new + ); - public static final ResourceLocation ID = new ResourceLocation(Reference.MOD_ID, "frame_video"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "frame_video"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender sender) { - String url = buf.readUtf(); - BlockPos pos = buf.readBlockPos(); - boolean playing = buf.readBoolean(); - int tick = buf.readInt(); + @Override + public Type type() { + return TYPE; + } - ClientHandler.manageVideo(client, url, pos, playing, tick); + @Environment(EnvType.CLIENT) + public static void handle(FrameVideoMessage message, ClientPlayNetworking.Context ctx) { + ClientHandler.manageVideo(ctx.client(), message.url(), message.pos(), message.playing(), message.tick()); } } diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/OpenRadioManagerScreenMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/OpenRadioManagerScreenMessage.java index 011e0bc..ccc9f12 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/network/packet/OpenRadioManagerScreenMessage.java +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/OpenRadioManagerScreenMessage.java @@ -2,23 +2,38 @@ import com.github.NGoedix.videoplayer.Reference; import com.github.NGoedix.videoplayer.client.ClientHandler; -import net.fabricmc.fabric.api.networking.v1.PacketSender; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -public class OpenRadioManagerScreenMessage { +public record OpenRadioManagerScreenMessage( + BlockPos pos, String url, + int volume, boolean isPlaying +) implements CustomPacketPayload { + public static final StreamCodec CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, OpenRadioManagerScreenMessage::pos, + ByteBufCodecs.STRING_UTF8, OpenRadioManagerScreenMessage::url, + ByteBufCodecs.VAR_INT, OpenRadioManagerScreenMessage::volume, + ByteBufCodecs.BOOL, OpenRadioManagerScreenMessage::isPlaying, + OpenRadioManagerScreenMessage::new + ); - public static final ResourceLocation ID = new ResourceLocation(Reference.MOD_ID, "open_radio_manager"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "open_radio_manager"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender sender) { - BlockPos pos = buf.readBlockPos(); - String url = buf.readUtf(); - int volume = buf.readInt(); - boolean isPlaying = buf.readBoolean(); + @Override + public Type type() { + return TYPE; + } - ClientHandler.openRadioGUI(client, pos, url, volume, isPlaying); + @Environment(EnvType.CLIENT) + public static void handle(OpenRadioManagerScreenMessage message, ClientPlayNetworking.Context ctx) { + ClientHandler.openRadioGUI(ctx.client(), message.pos(), message.url(), message.volume(), message.isPlaying()); } } diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/OpenVideoManagerScreenMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/OpenVideoManagerScreenMessage.java index 28dc014..e36ee5c 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/network/packet/OpenVideoManagerScreenMessage.java +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/OpenVideoManagerScreenMessage.java @@ -2,24 +2,39 @@ import com.github.NGoedix.videoplayer.Reference; import com.github.NGoedix.videoplayer.client.ClientHandler; -import net.fabricmc.fabric.api.networking.v1.PacketSender; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; -public class OpenVideoManagerScreenMessage { +public record OpenVideoManagerScreenMessage( + BlockPos pos, String url, + int volume, int tick, boolean isPlaying +) implements CustomPacketPayload { + public static final StreamCodec CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, OpenVideoManagerScreenMessage::pos, + ByteBufCodecs.STRING_UTF8, OpenVideoManagerScreenMessage::url, + ByteBufCodecs.VAR_INT, OpenVideoManagerScreenMessage::volume, + ByteBufCodecs.VAR_INT, OpenVideoManagerScreenMessage::tick, + ByteBufCodecs.BOOL, OpenVideoManagerScreenMessage::isPlaying, + OpenVideoManagerScreenMessage::new + ); - public static final ResourceLocation ID = new ResourceLocation(Reference.MOD_ID, "open_video_manager"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "open_video_manager"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender sender) { - BlockPos pos = buf.readBlockPos(); - String url = buf.readUtf(); - int volume = buf.readInt(); - int tick = buf.readInt(); - boolean isPlaying = buf.readBoolean(); + @Override + public Type type() { + return TYPE; + } - ClientHandler.openVideoGUI(client, pos, url, volume, tick, isPlaying); + @Environment(EnvType.CLIENT) + public static void handle(OpenVideoManagerScreenMessage message, ClientPlayNetworking.Context ctx) { + ClientHandler.openVideoGUI(ctx.client(), message.pos(), message.url(), message.volume(), message.tick(), message.isPlaying()); } } diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/RadioMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/RadioMessage.java index 998c605..388d302 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/network/packet/RadioMessage.java +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/RadioMessage.java @@ -2,22 +2,36 @@ import com.github.NGoedix.videoplayer.Reference; import com.github.NGoedix.videoplayer.client.ClientHandler; -import net.fabricmc.fabric.api.networking.v1.PacketSender; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -public class RadioMessage { +public record RadioMessage( + String url, BlockPos pos, boolean playing +) implements CustomPacketPayload { + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, RadioMessage::url, + BlockPos.STREAM_CODEC, RadioMessage::pos, + ByteBufCodecs.BOOL, RadioMessage::playing, + RadioMessage::new + ); - public static final ResourceLocation ID = new ResourceLocation(Reference.MOD_ID, "radio"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "radio"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender sender) { - String url = buf.readUtf(); - BlockPos pos = buf.readBlockPos(); - boolean playing = buf.readBoolean(); + @Override + public Type type() { + return TYPE; + } - ClientHandler.manageRadio(client, url, pos, playing); + @Environment(EnvType.CLIENT) + public static void handle(RadioMessage message, ClientPlayNetworking.Context ctx) { + ClientHandler.manageRadio(ctx.client(), message.url(), message.pos(), message.playing()); } } diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/RadioUpdateMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/RadioUpdateMessage.java index f21377d..3f227ad 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/network/packet/RadioUpdateMessage.java +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/RadioUpdateMessage.java @@ -2,40 +2,63 @@ import com.github.NGoedix.videoplayer.Reference; import com.github.NGoedix.videoplayer.block.entity.custom.RadioBlockEntity; -import net.fabricmc.fabric.api.networking.v1.PacketSender; +import com.github.NGoedix.videoplayer.util.ByteUtil; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; import java.util.UUID; -public class RadioUpdateMessage { +public record RadioUpdateMessage( + BlockPos pos, String url, + int volume, int tick, + byte flags +) implements CustomPacketPayload { + public static final StreamCodec CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, RadioUpdateMessage::pos, + ByteBufCodecs.STRING_UTF8, RadioUpdateMessage::url, + ByteBufCodecs.VAR_INT, RadioUpdateMessage::volume, + ByteBufCodecs.VAR_INT, RadioUpdateMessage::tick, + ByteBufCodecs.BYTE, RadioUpdateMessage::flags, + RadioUpdateMessage::new + ); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "update_radio"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); - public static final ResourceLocation ID = new ResourceLocation(Reference.MOD_ID, "update_radio"); + public RadioUpdateMessage(BlockPos pos, String url, int volume, int tick, boolean isPlaying, boolean shouldExit) { + this(pos, url, volume, tick, (byte) (ByteUtil.setBitAndShift(isPlaying, 1) | ByteUtil.setBitAndShift(shouldExit, 0))); + } + + public boolean isPlaying() { + return ((flags >> 1) & 1) != 0; + } - public static void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender) { - BlockPos blockPos = buf.readBlockPos(); - String url = buf.readUtf(); - int volume = buf.readInt(); - int tick = buf.readInt(); - boolean isPlaying = buf.readBoolean(); - boolean exit = buf.readBoolean(); + public boolean shouldExit() { + return (flags & 1) != 0; + } + + @Override + public Type type() { + return TYPE; + } - server.execute(() -> { - if (player.level().getBlockEntity(blockPos) instanceof RadioBlockEntity radioBlockEntity) { - if (exit) + public static void handle(RadioUpdateMessage message, ServerPlayNetworking.Context ctx) { + ctx.server().execute(() -> { + if (ctx.player().level().getBlockEntity(message.pos()) instanceof RadioBlockEntity radioBlockEntity) { + if (message.shouldExit()) radioBlockEntity.setBeingUsed(new UUID(0, 0)); else { - radioBlockEntity.setUrl(url); + radioBlockEntity.setUrl(message.url()); - if (tick != -1) - radioBlockEntity.setTick(tick); + if (message.tick() != -1) + radioBlockEntity.setTick(message.tick()); - radioBlockEntity.setVolume(volume); - radioBlockEntity.setPlaying(isPlaying); + radioBlockEntity.setVolume(message.volume()); + radioBlockEntity.setPlaying(message.isPlaying()); radioBlockEntity.notifyPlayer(); } diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/SendCustomVideoMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/SendCustomVideoMessage.java deleted file mode 100644 index c0ff176..0000000 --- a/src/main/java/com/github/NGoedix/videoplayer/network/packet/SendCustomVideoMessage.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.github.NGoedix.videoplayer.network.packet; - -import com.github.NGoedix.videoplayer.Reference; -import com.github.NGoedix.videoplayer.client.ClientHandler; -import net.fabricmc.fabric.api.networking.v1.PacketSender; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; - -public class SendCustomVideoMessage { - - public static final ResourceLocation ID = new ResourceLocation(Reference.MOD_ID, "send_custom_video"); - - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buffer, PacketSender sender) { - VideoMessageType type = buffer.readEnum(VideoMessageType.class); - - if (type == VideoMessageType.START) { - String url = buffer.readUtf(); - int volume = buffer.readInt(); - boolean isControlBlocked = buffer.readBoolean(); - boolean canSkip = buffer.readBoolean(); - int mode = buffer.readInt(); - int position = buffer.readInt(); - int optionInMode = buffer.readInt(); - int optionInSecs = buffer.readInt(); - int optionOutMode = buffer.readInt(); - int optionOutSecs = buffer.readInt(); - - if (mode == 0) ClientHandler.openVideo(client, url, volume, isControlBlocked, canSkip, optionInMode, optionInSecs, optionOutMode, optionOutSecs); - - } else if (type == VideoMessageType.STOP) { - ClientHandler.stopVideoIfExists(client); - } - } - - public enum VideoMessageType { - START, - STOP - } -} diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/SendMusicMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/SendMusicMessage.java deleted file mode 100644 index e13d41b..0000000 --- a/src/main/java/com/github/NGoedix/videoplayer/network/packet/SendMusicMessage.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.github.NGoedix.videoplayer.network.packet; - -import com.github.NGoedix.videoplayer.Reference; -import com.github.NGoedix.videoplayer.client.ClientHandler; -import net.fabricmc.fabric.api.networking.v1.PacketSender; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; - -public class SendMusicMessage { - - public static final ResourceLocation ID = new ResourceLocation(Reference.MOD_ID, "send_video"); - - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buffer, PacketSender sender) { - MusicMessageType type = buffer.readEnum(MusicMessageType.class); - if (type == MusicMessageType.START) { - String url = buffer.readUtf(); - int volume = buffer.readInt(); - - ClientHandler.playMusic(client, url, volume); - } else if (type == MusicMessageType.STOP) { - ClientHandler.stopMusicIfPlaying(client); - } - } - - public enum MusicMessageType { - START, - STOP - } -} diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/SendVideoMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/SendVideoMessage.java deleted file mode 100644 index 9242111..0000000 --- a/src/main/java/com/github/NGoedix/videoplayer/network/packet/SendVideoMessage.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.github.NGoedix.videoplayer.network.packet; - -import com.github.NGoedix.videoplayer.Reference; -import com.github.NGoedix.videoplayer.client.ClientHandler; -import net.fabricmc.fabric.api.networking.v1.PacketSender; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; - -public class SendVideoMessage { - - public static final ResourceLocation ID = new ResourceLocation(Reference.MOD_ID, "send_video"); - - public static void receive(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buffer, PacketSender sender) { - VideoMessageType type = buffer.readEnum(VideoMessageType.class); - if (type == VideoMessageType.START) { - String url = buffer.readUtf(); - int volume = buffer.readInt(); - boolean isControlBlocked = buffer.readBoolean(); - boolean canSkip = buffer.readBoolean(); - - ClientHandler.openVideo(client, url, volume, isControlBlocked, canSkip); - } else if (type == VideoMessageType.STOP) { - ClientHandler.stopVideoIfExists(client); - } - } - - public enum VideoMessageType { - START, - STOP - } -} diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/StartCustomVideoMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StartCustomVideoMessage.java new file mode 100644 index 0000000..4eccc33 --- /dev/null +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StartCustomVideoMessage.java @@ -0,0 +1,81 @@ +package com.github.NGoedix.videoplayer.network.packet; + +import com.github.NGoedix.videoplayer.Reference; +import com.github.NGoedix.videoplayer.client.ClientHandler; +import com.github.NGoedix.videoplayer.util.ByteUtil; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record StartCustomVideoMessage( + String url, int volume, byte flags, + long modeAndPosition, long optionsIn, long optionsOut +) implements CustomPacketPayload { + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "start_custom_video"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, StartCustomVideoMessage::url, + ByteBufCodecs.VAR_INT, StartCustomVideoMessage::volume, + ByteBufCodecs.BYTE, StartCustomVideoMessage::flags, + ByteBufCodecs.VAR_LONG, StartCustomVideoMessage::modeAndPosition, + ByteBufCodecs.VAR_LONG, StartCustomVideoMessage::optionsIn, + ByteBufCodecs.VAR_LONG, StartCustomVideoMessage::optionsOut, + StartCustomVideoMessage::new + ); + + @Override + public Type type() { + return TYPE; + } + + @Environment(EnvType.CLIENT) + public static void handle(StartCustomVideoMessage message, ClientPlayNetworking.Context ctx) { + if (message.mode() == 0) + ClientHandler.openVideo(ctx.client(), message.url(), message.volume(), message.isControlBlocked(), message.canSkip(), message.optionInMode(), message.optionInSecs(), message.optionOutMode(), message.optionOutSecs()); + } + + public StartCustomVideoMessage(String url, int volume, boolean isControlBlocked, boolean canSkip, int mode, int position, int optionsInMode, int optionsInSecs, int optionsOutMode, int optionsOutSecs) { + this(url, volume, (byte) (ByteUtil.setBitAndShift(isControlBlocked, 1) | ByteUtil.setBitAndShift(canSkip, 0)), + (((long) mode << 31) | position), + (((long) optionsInMode << 31) | optionsInSecs), + (((long) optionsOutMode << 31) | optionsOutSecs) + ); + } + + public boolean isControlBlocked() { + return ((this.flags >> 1) & 1) != 0; + } + + public boolean canSkip() { + return (this.flags & 1) != 0; + } + + public int mode() { + return (int) ((this.modeAndPosition >> 31) & Integer.MAX_VALUE); + } + + public int position() { + return (int) (this.modeAndPosition & Integer.MAX_VALUE); + } + + public int optionInMode() { + return (int) ((this.optionsIn >> 31) & Integer.MAX_VALUE); + } + + public int optionInSecs() { + return (int) ((this.optionsIn) & Integer.MAX_VALUE); + } + + public int optionOutMode() { + return (int) ((this.optionsOut >> 31) & Integer.MAX_VALUE); + } + + public int optionOutSecs() { + return (int) ((this.optionsOut) & Integer.MAX_VALUE); + } +} diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/StartMusicMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StartMusicMessage.java new file mode 100644 index 0000000..e75ecb3 --- /dev/null +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StartMusicMessage.java @@ -0,0 +1,34 @@ +package com.github.NGoedix.videoplayer.network.packet; + +import com.github.NGoedix.videoplayer.Reference; +import com.github.NGoedix.videoplayer.client.ClientHandler; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record StartMusicMessage( + String url, int volume +) implements CustomPacketPayload { + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "start_music"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, StartMusicMessage::url, + ByteBufCodecs.VAR_INT, StartMusicMessage::volume, + StartMusicMessage::new + ); + + @Override + public Type type() { + return TYPE; + } + + @Environment(EnvType.CLIENT) + public static void handle(StartMusicMessage message, ClientPlayNetworking.Context ctx) { + ClientHandler.playMusic(ctx.client(), message.url(), message.volume()); + } +} diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/StartVideoMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StartVideoMessage.java new file mode 100644 index 0000000..2668199 --- /dev/null +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StartVideoMessage.java @@ -0,0 +1,49 @@ +package com.github.NGoedix.videoplayer.network.packet; + +import com.github.NGoedix.videoplayer.Reference; +import com.github.NGoedix.videoplayer.client.ClientHandler; +import com.github.NGoedix.videoplayer.util.ByteUtil; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record StartVideoMessage( + String url, int volume, + byte flags +) implements CustomPacketPayload { + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, StartVideoMessage::url, + ByteBufCodecs.VAR_INT, StartVideoMessage::volume, + ByteBufCodecs.BYTE, StartVideoMessage::flags, + StartVideoMessage::new + ); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "start_video"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + + public StartVideoMessage(String url, int volume, boolean isControlBlocked, boolean canSkip) { + this(url, volume, (byte) (ByteUtil.setBitAndShift(isControlBlocked, 1) | ByteUtil.setBitAndShift(canSkip, 0))); + } + + public boolean isControlBlocked() { + return ((this.flags() >> 1) & 1) != 0; + } + + public boolean canSkip() { + return (this.flags() & 1) != 0; + } + + @Override + public Type type() { + return TYPE; + } + + @Environment(EnvType.CLIENT) + public static void handle(StartVideoMessage message, ClientPlayNetworking.Context ctx) { + ClientHandler.openVideo(ctx.client(), message.url(), message.volume(), message.isControlBlocked(), message.canSkip()); + } +} diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/StopCustomVideoMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StopCustomVideoMessage.java new file mode 100644 index 0000000..75e5c2c --- /dev/null +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StopCustomVideoMessage.java @@ -0,0 +1,30 @@ +package com.github.NGoedix.videoplayer.network.packet; + +import com.github.NGoedix.videoplayer.Reference; +import com.github.NGoedix.videoplayer.client.ClientHandler; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public class StopCustomVideoMessage implements CustomPacketPayload { + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "stop_custom_video"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StopCustomVideoMessage INSTANCE = new StopCustomVideoMessage(); + public static final StreamCodec CODEC = StreamCodec.unit(INSTANCE); + + private StopCustomVideoMessage() {} + + @Override + public Type type() { + return TYPE; + } + + @Environment(EnvType.CLIENT) + public static void handle(StopCustomVideoMessage message, ClientPlayNetworking.Context ctx) { + ClientHandler.stopVideoIfExists(ctx.client()); + } +} diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/StopMusicMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StopMusicMessage.java new file mode 100644 index 0000000..e6dff6d --- /dev/null +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StopMusicMessage.java @@ -0,0 +1,30 @@ +package com.github.NGoedix.videoplayer.network.packet; + +import com.github.NGoedix.videoplayer.Reference; +import com.github.NGoedix.videoplayer.client.ClientHandler; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public class StopMusicMessage implements CustomPacketPayload { + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "stop_music"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StopMusicMessage INSTANCE = new StopMusicMessage(); + public static final StreamCodec CODEC = StreamCodec.unit(INSTANCE); + + private StopMusicMessage() {} + + @Override + public Type type() { + return TYPE; + } + + @Environment(EnvType.CLIENT) + public static void handle(StopMusicMessage message, ClientPlayNetworking.Context ctx) { + ClientHandler.stopMusicIfPlaying(ctx.client()); + } +} diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/StopVideoMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StopVideoMessage.java new file mode 100644 index 0000000..1a84412 --- /dev/null +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/StopVideoMessage.java @@ -0,0 +1,30 @@ +package com.github.NGoedix.videoplayer.network.packet; + +import com.github.NGoedix.videoplayer.Reference; +import com.github.NGoedix.videoplayer.client.ClientHandler; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public class StopVideoMessage implements CustomPacketPayload { + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "stop_video"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StopVideoMessage INSTANCE = new StopVideoMessage(); + public static final StreamCodec CODEC = StreamCodec.unit(INSTANCE); + + private StopVideoMessage() {} + + @Override + public Type type() { + return TYPE; + } + + @Environment(EnvType.CLIENT) + public static void handle(StopVideoMessage message, ClientPlayNetworking.Context ctx) { + ClientHandler.stopVideoIfExists(ctx.client()); + } +} diff --git a/src/main/java/com/github/NGoedix/videoplayer/network/packet/VideoUpdateMessage.java b/src/main/java/com/github/NGoedix/videoplayer/network/packet/VideoUpdateMessage.java index 27647b7..aec6a23 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/network/packet/VideoUpdateMessage.java +++ b/src/main/java/com/github/NGoedix/videoplayer/network/packet/VideoUpdateMessage.java @@ -2,28 +2,66 @@ import com.github.NGoedix.videoplayer.Reference; import com.github.NGoedix.videoplayer.block.entity.custom.TVBlockEntity; -import net.fabricmc.fabric.api.networking.v1.PacketSender; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; +import com.github.NGoedix.videoplayer.util.ByteUtil; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import java.util.UUID; -public class VideoUpdateMessage { +public record VideoUpdateMessage( + BlockPos pos, String url, int volume, int tick, + byte flags +) implements CustomPacketPayload { + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(Reference.MOD_ID, "update_video"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ID); + public static final StreamCodec CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, VideoUpdateMessage::pos, + ByteBufCodecs.STRING_UTF8, VideoUpdateMessage::url, + ByteBufCodecs.VAR_INT, VideoUpdateMessage::volume, + ByteBufCodecs.VAR_INT, VideoUpdateMessage::tick, + ByteBufCodecs.BYTE, VideoUpdateMessage::flags, + VideoUpdateMessage::new + ); - public static final ResourceLocation ID = new ResourceLocation(Reference.MOD_ID, "update_video"); + public VideoUpdateMessage(BlockPos pos, String url, int volume, int tick, boolean isPlaying, boolean isStopped, boolean shouldExit) { + this(pos, url, volume, tick, + (byte) (ByteUtil.setBitAndShift(isPlaying, 2) | ByteUtil.setBitAndShift(isStopped, 1) | ByteUtil.setBitAndShift(shouldExit, 0)) + ); + } + + public boolean isPlaying() { + return ((flags >> 2) & 1) != 0; + } + + public boolean isStopped() { + return ((flags >> 1) & 1) != 0; + } + + public boolean shouldExit() { + return (flags & 1) != 0; + } + + @Override + public Type type() { + return TYPE; + } + + public static void handle(VideoUpdateMessage message, ServerPlayNetworking.Context ctx) { + var server = ctx.server(); + var player = ctx.player(); - public static void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender) { - BlockPos pos = buf.readBlockPos(); - String url = buf.readUtf(); - int volume = buf.readInt(); - int tick = buf.readInt(); - boolean isPlaying = buf.readBoolean(); - boolean stopped = buf.readBoolean(); - boolean exit = buf.readBoolean(); + var pos = message.pos(); + var url = message.url(); + var volume = message.volume(); + var tick = message.tick(); + var isPlaying = message.isPlaying(); + var stopped = message.isStopped(); + var exit = message.shouldExit(); server.execute(() -> { if (player.level().getBlockEntity(pos) instanceof TVBlockEntity) { diff --git a/src/main/java/com/github/NGoedix/videoplayer/util/ByteUtil.java b/src/main/java/com/github/NGoedix/videoplayer/util/ByteUtil.java new file mode 100644 index 0000000..38b2143 --- /dev/null +++ b/src/main/java/com/github/NGoedix/videoplayer/util/ByteUtil.java @@ -0,0 +1,7 @@ +package com.github.NGoedix.videoplayer.util; + +public class ByteUtil { + public static byte setBitAndShift(boolean value, int shift) { + return (byte) ((value ? 1 : 0) << shift); + } +} diff --git a/src/main/java/com/github/NGoedix/videoplayer/util/TryCore.java b/src/main/java/com/github/NGoedix/videoplayer/util/TryCore.java new file mode 100644 index 0000000..bce5a0d --- /dev/null +++ b/src/main/java/com/github/NGoedix/videoplayer/util/TryCore.java @@ -0,0 +1,57 @@ +package com.github.NGoedix.videoplayer.util; + +public class TryCore { + public static T withReturn(ActionWithReturn runnable, T defaultVar) { + return withReturn(runnable, null, defaultVar); + } + + public static T withReturn(ActionWithReturn runnable, CatchSimple catchSimple, T defaultVar) { + return withReturn(runnable, catchSimple, null, defaultVar); + } + + public static T withReturn(ActionWithReturn runnable, CatchSimple catchSimple, ActionFinal finallyRunnable, T defaultVar) { + T returned = defaultVar; + try { + return returned = runnable.run(defaultVar); + } catch (Exception exception) { + if (catchSimple != null) catchSimple.run(exception); + return defaultVar; + } finally { + if (finallyRunnable != null) finallyRunnable.run(returned); + } + } + + public static void simple(ActionSimple runnable) { + try { + runnable.run(); + } catch (Exception ignored) {} + } + + public static void simple(ActionSimple runnable, CatchSimple catchSimple) { + try { + runnable.run(); + } catch (Exception e) { + catchSimple.run(e); + } + } + + public interface ActionWithReturn { + T run(T defaultVar) throws Exception; + } + + public interface ActionFinal { + void run(T returnedVar); + } + + public interface ActionSimple { + void run() throws Exception; + } + + public interface CatchSimple { + void run(Exception e); + } + + public interface FinallySimple { + void run(); + } +} diff --git a/src/main/java/com/github/NGoedix/videoplayer/util/cache/TextureCache.java b/src/main/java/com/github/NGoedix/videoplayer/util/cache/TextureCache.java index ae2504b..2b8c97e 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/util/cache/TextureCache.java +++ b/src/main/java/com/github/NGoedix/videoplayer/util/cache/TextureCache.java @@ -4,11 +4,12 @@ import com.github.NGoedix.videoplayer.util.displayers.ImageDisplayer; import com.github.NGoedix.videoplayer.util.displayers.VideoDisplayer; import com.github.NGoedix.videoplayer.util.math.geo.Vec3d; -import me.srrapero720.watermedia.api.image.ImageFetch; -import me.srrapero720.watermedia.api.image.ImageRenderer; import net.minecraft.client.Minecraft; import net.minecraft.sounds.SoundSource; +import org.watermedia.api.image.ImageFetch; +import org.watermedia.api.image.ImageRenderer; +import java.net.URI; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -117,12 +118,12 @@ public void remove() { private static final class FramePictureFetcher extends ImageFetch { public FramePictureFetcher(TextureCache cache, String originalURL) { - super(originalURL); + super(URI.create(originalURL)); - setOnSuccessCallback(imageRenderer -> Minecraft.getInstance().executeBlocking(() -> cache.process(imageRenderer))); + setSuccessCallback((imageRenderer, isCache) -> Minecraft.getInstance().executeBlocking(() -> cache.process(imageRenderer))); - setOnFailedCallback(e -> Minecraft.getInstance().executeBlocking(() -> { - if (e instanceof NoPictureException) { + setErrorCallback((e, isVideo) -> Minecraft.getInstance().executeBlocking(() -> { + if (isVideo) { cache.processVideo(); return; } diff --git a/src/main/java/com/github/NGoedix/videoplayer/util/displayers/ImageDisplayer.java b/src/main/java/com/github/NGoedix/videoplayer/util/displayers/ImageDisplayer.java index 8561c3e..fe94bdc 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/util/displayers/ImageDisplayer.java +++ b/src/main/java/com/github/NGoedix/videoplayer/util/displayers/ImageDisplayer.java @@ -1,7 +1,7 @@ package com.github.NGoedix.videoplayer.util.displayers; -import me.srrapero720.watermedia.api.image.ImageRenderer; import net.minecraft.client.Minecraft; +import org.watermedia.api.image.ImageRenderer; import java.awt.*; @@ -33,7 +33,7 @@ public boolean isPlaying() { @Override public int prepare(String url, boolean playing, boolean loop, int tick) { this.url = url; - long time = tick * 50L + (playing ? (long) (Minecraft.getInstance().isPaused() ? 1.0F : Minecraft.getInstance().getFrameTime() * 50) : 0); + long time = tick * 50L + (playing ? (long) (Minecraft.getInstance().isPaused() ? 1.0F : Minecraft.getInstance().getTimer().getGameTimeDeltaPartialTick(true) * 50) : 0); long duration = picture.duration; if (duration > 0 && time > duration && loop) time %= duration; return picture.texture(time); diff --git a/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoDisplayer.java b/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoDisplayer.java index 2ba9c29..0672292 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoDisplayer.java +++ b/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoDisplayer.java @@ -1,16 +1,17 @@ package com.github.NGoedix.videoplayer.util.displayers; +import com.github.NGoedix.videoplayer.util.TryCore; import com.github.NGoedix.videoplayer.util.cache.TextureCache; import com.github.NGoedix.videoplayer.util.math.VideoMathUtil; import com.github.NGoedix.videoplayer.util.math.geo.Vec3d; -import me.lib720.watermod.safety.TryCore; -import me.srrapero720.watermedia.api.math.MathAPI; -import me.srrapero720.watermedia.api.player.SyncBasePlayer; -import me.srrapero720.watermedia.api.player.SyncMusicPlayer; -import me.srrapero720.watermedia.api.player.SyncVideoPlayer; import net.minecraft.client.Minecraft; +import org.watermedia.api.math.MathAPI; +import org.watermedia.api.player.videolan.BasePlayer; +import org.watermedia.api.player.videolan.MusicPlayer; +import org.watermedia.api.player.videolan.VideoPlayer; import java.awt.*; +import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -55,7 +56,7 @@ public static IDisplay createVideoDisplay(Vec3d pos, String url, float volume, f }, cache.ready() ? (IDisplay) new ImageDisplayer(cache.getPicture()) : null); } - public SyncBasePlayer player; + public BasePlayer player; private final Vec3d pos; private String url; @@ -68,13 +69,13 @@ public VideoDisplayer(Vec3d pos, String url, float volume, float minDistance, fl if (!url.isEmpty()) { if (isOnlyMusic) { - player = new SyncMusicPlayer(); + player = new MusicPlayer(); } else { - player = new SyncVideoPlayer(null, Minecraft.getInstance()); + player = new VideoPlayer(null, Minecraft.getInstance()); } adjustVolume(volume, minDistance, maxDistance); player.setRepeatMode(loop); - player.start(url); + player.start(URI.create(url)); } } @@ -87,7 +88,7 @@ private void adjustVolume(float volume, float minDistance, float maxDistance) { private int calculateVolume(float volume, float minDistance, float maxDistance) { if (player == null) return 0; Minecraft mc = Minecraft.getInstance(); - float distance = (float) pos.distance(Objects.requireNonNull(Minecraft.getInstance().player).getPosition(mc.isPaused() ? 1.0F : mc.getFrameTime())); + float distance = (float) pos.distance(Objects.requireNonNull(Minecraft.getInstance().player).getPosition(mc.isPaused() ? 1.0F : mc.getTimer().getGameTimeDeltaPartialTick(true))); volume = VideoMathUtil.calculateVolume(volume, distance, minDistance, maxDistance); return (int) volume; } @@ -157,16 +158,16 @@ public int maxTick() { public int prepare(String url, boolean playing, boolean loop, int tick) { if (player == null) return -1; this.url = url; - if (player instanceof SyncVideoPlayer) - return ((SyncVideoPlayer) player).getGlTexture(); + if (player instanceof VideoPlayer) + return ((VideoPlayer) player).texture(); return 0; } @Override public int getRenderTexture() { - if (player instanceof SyncVideoPlayer) - return ((SyncVideoPlayer) player).getGlTexture(); + if (player instanceof VideoPlayer) + return ((VideoPlayer) player).texture(); return 0; } @@ -211,8 +212,8 @@ public void resume(int tick) { @Override public Dimension getDimensions() { if (player == null) return null; - if (player instanceof SyncVideoPlayer) - return ((SyncVideoPlayer) player).getDimensions(); + if (player instanceof VideoPlayer) + return ((VideoPlayer) player).dimension(); return null; } diff --git a/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoScreenDisplay.java b/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoScreenDisplay.java index cbe5813..0b91ff4 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoScreenDisplay.java +++ b/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoScreenDisplay.java @@ -1,11 +1,11 @@ package com.github.NGoedix.videoplayer.util.displayers; -import me.srrapero720.watermedia.api.player.SyncVideoPlayer; import net.minecraft.client.Minecraft; +import org.watermedia.api.player.videolan.VideoPlayer; public class VideoScreenDisplay { - private final SyncVideoPlayer player; + private final VideoPlayer player; private final String url; private final int volume; private final int position; @@ -15,7 +15,7 @@ public class VideoScreenDisplay { private final int optionOutSecs; public VideoScreenDisplay(String url, int volume, int position, int optionInMode, int optionInSecs, int optionOutMode, int optionOutSecs) { - player = new SyncVideoPlayer(null, Minecraft.getInstance()); + player = new VideoPlayer(null, Minecraft.getInstance()); this.url = url; this.volume = volume; this.position = position; @@ -33,7 +33,7 @@ public int getPosition() { return position; } - public SyncVideoPlayer getPlayer() { + public VideoPlayer getPlayer() { return player; } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 74a9936..26ddff0 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -30,8 +30,8 @@ "depends": { "fabricloader": ">=0.14.17", - "minecraft": "~1.20", - "java": ">=17", + "minecraft": "~1.21", + "java": ">=21", "watermedia": "*" }, "suggests": { From 02a2083fbb510ff898609ed92ab98fcd6992b673 Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 25 Feb 2025 11:28:56 +0800 Subject: [PATCH 2/4] Fix TV rendering --- .../NGoedix/videoplayer/util/displayers/VideoDisplayer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoDisplayer.java b/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoDisplayer.java index 0672292..f5364b0 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoDisplayer.java +++ b/src/main/java/com/github/NGoedix/videoplayer/util/displayers/VideoDisplayer.java @@ -159,7 +159,7 @@ public int prepare(String url, boolean playing, boolean loop, int tick) { if (player == null) return -1; this.url = url; if (player instanceof VideoPlayer) - return ((VideoPlayer) player).texture(); + return ((VideoPlayer) player).preRender(); return 0; } @@ -167,7 +167,7 @@ public int prepare(String url, boolean playing, boolean loop, int tick) { @Override public int getRenderTexture() { if (player instanceof VideoPlayer) - return ((VideoPlayer) player).texture(); + return ((VideoPlayer) player).preRender(); return 0; } From 2318776a2d3fa296a2e21fb8a81727989db410c9 Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 25 Feb 2025 11:29:55 +0800 Subject: [PATCH 3/4] Add version constraint with WaterMedia --- src/main/resources/fabric.mod.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 26ddff0..f1d13da 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -32,7 +32,7 @@ "fabricloader": ">=0.14.17", "minecraft": "~1.21", "java": ">=21", - "watermedia": "*" + "watermedia": ">=2.1.0" }, "suggests": { "another-mod": "*" From d9696e5bc7dc8788c1b9555b67ca746928da5d8a Mon Sep 17 00:00:00 2001 From: Naz Date: Sat, 23 Aug 2025 13:08:20 +0800 Subject: [PATCH 4/4] Handle relative local paths --- .../NGoedix/videoplayer/client/gui/VideoScreen.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/NGoedix/videoplayer/client/gui/VideoScreen.java b/src/main/java/com/github/NGoedix/videoplayer/client/gui/VideoScreen.java index 87fbb9b..f32d463 100644 --- a/src/main/java/com/github/NGoedix/videoplayer/client/gui/VideoScreen.java +++ b/src/main/java/com/github/NGoedix/videoplayer/client/gui/VideoScreen.java @@ -22,7 +22,9 @@ import org.watermedia.api.player.videolan.VideoPlayer; import java.awt.*; +import java.io.File; import java.net.URI; +import java.nio.file.Path; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -71,7 +73,12 @@ public VideoScreen(String url, int volume, boolean controlBlocked, boolean canSk public VideoScreen(String url, int volume, boolean controlBlocked, boolean canSkip, boolean fadeIn) { super(new DummyContainer(), Objects.requireNonNull(Minecraft.getInstance().player).getInventory(), Component.literal("")); - URI uri = URI.create(url); + URI uri; + if (url.startsWith("local://")) { + uri = Path.of(url.replaceFirst("local://", "")).toAbsolutePath().toUri(); + } else { + uri = URI.create(url); + } Minecraft minecraft = Minecraft.getInstance(); Minecraft.getInstance().getSoundManager().pause();