From 287b7bbe561ee35d78346d297df2e953c13b5779 Mon Sep 17 00:00:00 2001 From: Nayrus Date: Sun, 2 Feb 2025 13:16:44 +0100 Subject: [PATCH] Dedicated Server is broken, add fast scrolls to GUI Can't figure out where the packet ID desync happens --- .../noteblockmaster/NoteBlockMaster.java | 33 ++++--------- .../block/AdvancedNoteBlock.java | 2 + .../noteblockmaster/block/TuningCore.java | 16 +++++-- .../noteblockmaster/event/CommonEvents.java | 11 +++++ .../noteblockmaster/item/ComposersNote.java | 11 +++-- .../noteblockmaster/item/TunerItem.java | 3 ++ .../noteblockmaster/network/NetworkUtil.java | 45 ++++++++++++++++++ .../network/PacketHandler.java | 26 +++++++--- .../network/payload/ActionPing.java | 4 +- .../network/payload/ScheduleCoreSound.java | 44 +++++++++++++++++ .../screen/NoteTunerScreen.java | 3 +- .../screen/TempoTunerScreen.java | 3 +- .../noteblockmaster/setup/Registry.java | 4 ++ .../sound/SubTickScheduler.java | 47 +++++++++++++++---- .../noteblockmaster/utils/KeyBindings.java | 3 ++ 15 files changed, 201 insertions(+), 54 deletions(-) create mode 100644 src/main/java/net/nayrus/noteblockmaster/network/NetworkUtil.java create mode 100644 src/main/java/net/nayrus/noteblockmaster/network/payload/ScheduleCoreSound.java diff --git a/src/main/java/net/nayrus/noteblockmaster/NoteBlockMaster.java b/src/main/java/net/nayrus/noteblockmaster/NoteBlockMaster.java index c3b2bf6..64bfceb 100644 --- a/src/main/java/net/nayrus/noteblockmaster/NoteBlockMaster.java +++ b/src/main/java/net/nayrus/noteblockmaster/NoteBlockMaster.java @@ -4,31 +4,25 @@ import net.minecraft.core.registries.Registries; import net.minecraft.world.item.crafting.RecipeSerializer; import net.nayrus.noteblockmaster.block.AdvancedNoteBlock; -import net.nayrus.noteblockmaster.block.TuningCore; -import net.nayrus.noteblockmaster.command.BPMInfoCommand; -import net.nayrus.noteblockmaster.command.MainCommand; import net.nayrus.noteblockmaster.datagen.recipes.TunerRecipeSerializer; import net.nayrus.noteblockmaster.event.ClientEvents; import net.nayrus.noteblockmaster.event.CommonEvents; import net.nayrus.noteblockmaster.event.ServerEvents; import net.nayrus.noteblockmaster.network.PacketHandler; +import net.nayrus.noteblockmaster.setup.Registry; import net.nayrus.noteblockmaster.setup.config.ClientConfig; import net.nayrus.noteblockmaster.setup.config.StartupConfig; -import net.nayrus.noteblockmaster.setup.Registry; import net.nayrus.noteblockmaster.sound.SoundRegistry; import net.nayrus.noteblockmaster.utils.KeyBindings; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import net.neoforged.neoforge.server.command.ConfigCommand; import org.slf4j.Logger; @Mod(NoteBlockMaster.MOD_ID) @@ -45,32 +39,21 @@ public NoteBlockMaster(IEventBus modEventBus, ModContainer modContainer) { modContainer.registerConfig(ModConfig.Type.STARTUP, StartupConfig.START_UP); modContainer.registerConfig(ModConfig.Type.CLIENT, ClientConfig.CLIENT); - SoundRegistry.SOUND_EVENTS.register(modEventBus); - TuningCore.loadSustainProperty(); - - modEventBus.addListener(AdvancedNoteBlock::loadPropertiesFromConfig); - NeoForge.EVENT_BUS.register(this); - - Registry.register(modEventBus); - modEventBus.addListener(Registry::registerClientExtensions); - modEventBus.addListener(Registry::registerParticles); - RECIPE_SERIALIZERS.register(modEventBus); - modEventBus.addListener(PacketHandler::registerNetwork); - modEventBus.addListener(KeyBindings::registerBindings); if(FMLEnvironment.dist == Dist.CLIENT){ NeoForge.EVENT_BUS.register(ClientEvents.class); + modEventBus.addListener(Registry::registerClientExtensions); + modEventBus.addListener(Registry::registerParticles); + modEventBus.addListener(KeyBindings::registerBindings); }else{ NeoForge.EVENT_BUS.register(ServerEvents.class); } NeoForge.EVENT_BUS.register(CommonEvents.class); - } + SoundRegistry.SOUND_EVENTS.register(modEventBus); - @SubscribeEvent - public void onCommandRegister(RegisterCommandsEvent event){ - new BPMInfoCommand(event.getDispatcher()); - MainCommand.mainCommand(event.getDispatcher()); - ConfigCommand.register(event.getDispatcher()); + modEventBus.addListener(AdvancedNoteBlock::loadPropertiesFromConfig); + Registry.register(modEventBus); + RECIPE_SERIALIZERS.register(modEventBus); } } diff --git a/src/main/java/net/nayrus/noteblockmaster/block/AdvancedNoteBlock.java b/src/main/java/net/nayrus/noteblockmaster/block/AdvancedNoteBlock.java index 76a39ac..6da24c5 100644 --- a/src/main/java/net/nayrus/noteblockmaster/block/AdvancedNoteBlock.java +++ b/src/main/java/net/nayrus/noteblockmaster/block/AdvancedNoteBlock.java @@ -78,6 +78,8 @@ public static void loadPropertiesFromConfig(final NewRegistryEvent ignoredEvent) NOTE = IntegerProperty.create("note", MIN_NOTE_VAL, MAX_NOTE_VAL); TOTAL_NOTES = MAX_NOTE_VAL - MIN_NOTE_VAL; + + TuningCore.loadSustainProperty(); } private BlockState setInstrument(LevelAccessor level, BlockPos pos, BlockState state) { diff --git a/src/main/java/net/nayrus/noteblockmaster/block/TuningCore.java b/src/main/java/net/nayrus/noteblockmaster/block/TuningCore.java index bdbb093..d5ac950 100644 --- a/src/main/java/net/nayrus/noteblockmaster/block/TuningCore.java +++ b/src/main/java/net/nayrus/noteblockmaster/block/TuningCore.java @@ -39,6 +39,8 @@ import net.nayrus.noteblockmaster.setup.Registry; import net.nayrus.noteblockmaster.utils.FinalTuple; import net.nayrus.noteblockmaster.utils.Utils; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.common.util.DeferredSoundType; import java.util.ArrayList; @@ -205,17 +207,23 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev } if(!(stack.is(NBMTags.Items.TUNERS) || (stack.is(NBMTags.Items.CORES)))) return super.useItemOn(stack, state, level, pos, player, hand, hitResult); BlockState anb = level.getBlockState(pos.below()); + if(!anb.is(Registry.ADVANCED_NOTEBLOCK)){ if(!level.isClientSide()) level.scheduleTick(pos, state.getBlock(), 0); return ItemInteractionResult.SUCCESS; } - if(level.isClientSide()){ - Minecraft.getInstance().setScreen(new CoreScreen(state, pos, anb.getValue(AdvancedNoteBlock.INSTRUMENT), - AdvancedNoteBlock.getPitchFromNote(AdvancedNoteBlock.getNoteValue(anb)))); - } + + if(level.isClientSide()) openCoreScreen(state, anb, pos); + return ItemInteractionResult.SUCCESS; } + @OnlyIn(Dist.CLIENT) + public static void openCoreScreen(BlockState state, BlockState anb, BlockPos pos){ + Minecraft.getInstance().setScreen(new CoreScreen(state, pos, anb.getValue(AdvancedNoteBlock.INSTRUMENT), + AdvancedNoteBlock.getPitchFromNote(AdvancedNoteBlock.getNoteValue(anb)))); + } + protected void removeOneCore(BlockState state, Level level, BlockPos pos, Player player, boolean sustainFirst){ if(level.isClientSide()) return; boolean sus = isSustaining(state) && sustainFirst; diff --git a/src/main/java/net/nayrus/noteblockmaster/event/CommonEvents.java b/src/main/java/net/nayrus/noteblockmaster/event/CommonEvents.java index 19bf756..8100296 100644 --- a/src/main/java/net/nayrus/noteblockmaster/event/CommonEvents.java +++ b/src/main/java/net/nayrus/noteblockmaster/event/CommonEvents.java @@ -16,6 +16,8 @@ import net.minecraft.world.level.block.RepeaterBlock; import net.minecraft.world.level.block.state.BlockState; import net.nayrus.noteblockmaster.block.AdvancedNoteBlock; +import net.nayrus.noteblockmaster.command.BPMInfoCommand; +import net.nayrus.noteblockmaster.command.MainCommand; import net.nayrus.noteblockmaster.item.TunerItem; import net.nayrus.noteblockmaster.network.data.ComposeData; import net.nayrus.noteblockmaster.setup.Registry; @@ -23,10 +25,19 @@ import net.nayrus.noteblockmaster.utils.FinalTuple; import net.nayrus.noteblockmaster.utils.Utils; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.entity.player.UseItemOnBlockEvent; +import net.neoforged.neoforge.server.command.ConfigCommand; public class CommonEvents { + @SubscribeEvent + public static void onCommandRegister(RegisterCommandsEvent event){ + new BPMInfoCommand(event.getDispatcher()); + MainCommand.mainCommand(event.getDispatcher()); + ConfigCommand.register(event.getDispatcher()); + } + @SubscribeEvent public static void useItemOnBlockEvent(UseItemOnBlockEvent event){ UseOnContext context = event.getUseOnContext(); diff --git a/src/main/java/net/nayrus/noteblockmaster/item/ComposersNote.java b/src/main/java/net/nayrus/noteblockmaster/item/ComposersNote.java index 2f960d1..c220ceb 100644 --- a/src/main/java/net/nayrus/noteblockmaster/item/ComposersNote.java +++ b/src/main/java/net/nayrus/noteblockmaster/item/ComposersNote.java @@ -24,6 +24,8 @@ import net.nayrus.noteblockmaster.screen.ComposerScreen; import net.nayrus.noteblockmaster.setup.Registry; import net.nayrus.noteblockmaster.utils.Utils; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; public class ComposersNote extends Item { @@ -95,9 +97,12 @@ public static Tuple subtickAndPauseOnBeat(int beat, float bpm) @Override public InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { ItemStack item = player.getItemInHand(usedHand); - if(level.isClientSide()){ - Minecraft.getInstance().setScreen(new ComposerScreen(item)); - } + if(level.isClientSide()) openComposer(item); return new InteractionResultHolder<>(InteractionResult.SUCCESS, item); } + + @OnlyIn(Dist.CLIENT) + public static void openComposer(ItemStack item){ + Minecraft.getInstance().setScreen(new ComposerScreen(item)); + } } diff --git a/src/main/java/net/nayrus/noteblockmaster/item/TunerItem.java b/src/main/java/net/nayrus/noteblockmaster/item/TunerItem.java index 3353a72..bc234f9 100644 --- a/src/main/java/net/nayrus/noteblockmaster/item/TunerItem.java +++ b/src/main/java/net/nayrus/noteblockmaster/item/TunerItem.java @@ -23,6 +23,8 @@ import net.nayrus.noteblockmaster.screen.TempoTunerScreen; import net.nayrus.noteblockmaster.setup.Registry; import net.nayrus.noteblockmaster.utils.Utils; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; public class TunerItem extends Item { @@ -149,6 +151,7 @@ public InteractionResultHolder use(Level level, Player player, Intera return new InteractionResultHolder<>(InteractionResult.SUCCESS, itemstack); } + @OnlyIn(Dist.CLIENT) public static void openTunerGUI(ItemStack tuner, ItemStack second){ if(tuner.is(Registry.TEMPOTUNER)) Minecraft.getInstance().setScreen(new TempoTunerScreen(tuner, second)); diff --git a/src/main/java/net/nayrus/noteblockmaster/network/NetworkUtil.java b/src/main/java/net/nayrus/noteblockmaster/network/NetworkUtil.java new file mode 100644 index 0000000..6857d3d --- /dev/null +++ b/src/main/java/net/nayrus/noteblockmaster/network/NetworkUtil.java @@ -0,0 +1,45 @@ +package net.nayrus.noteblockmaster.network; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.nayrus.noteblockmaster.network.payload.ScheduleCoreSound; +import net.neoforged.neoforge.network.PacketDistributor; + +import javax.annotation.Nullable; +import java.util.List; + +public class NetworkUtil { + + public static void broadcastPayload( + List players, + @Nullable Player except, + double x, + double y, + double z, + double radius, + ResourceKey dimension, + CustomPacketPayload payload + ) { + for (ServerPlayer serverplayer : players) { + if (serverplayer != except && serverplayer.level().dimension() == dimension) { + double d0 = x - serverplayer.getX(); + double d1 = y - serverplayer.getY(); + double d2 = z - serverplayer.getZ(); + if (d0 * d0 + d1 * d1 + d2 * d2 < radius * radius) { + PacketDistributor.sendToPlayer(serverplayer, payload); + } + } + } + } + + public static void broadcastCoreSound(ServerLevel level, ScheduleCoreSound payload){ + BlockPos pos = payload.pos(); + broadcastPayload(level.players(), null, pos.getX(), pos.getY(), pos.getZ(), 64, level.dimension(), payload); + } + +} diff --git a/src/main/java/net/nayrus/noteblockmaster/network/PacketHandler.java b/src/main/java/net/nayrus/noteblockmaster/network/PacketHandler.java index 7723ceb..0c0ab07 100644 --- a/src/main/java/net/nayrus/noteblockmaster/network/PacketHandler.java +++ b/src/main/java/net/nayrus/noteblockmaster/network/PacketHandler.java @@ -12,14 +12,13 @@ import net.nayrus.noteblockmaster.item.TunerItem; import net.nayrus.noteblockmaster.network.data.ComposeData; import net.nayrus.noteblockmaster.network.data.TunerData; -import net.nayrus.noteblockmaster.network.payload.ActionPing; -import net.nayrus.noteblockmaster.network.payload.ConfigCheck; -import net.nayrus.noteblockmaster.network.payload.CoreUpdate; -import net.nayrus.noteblockmaster.network.payload.TickSchedule; +import net.nayrus.noteblockmaster.network.payload.*; import net.nayrus.noteblockmaster.render.ANBInfoRender; +import net.nayrus.noteblockmaster.setup.Registry; import net.nayrus.noteblockmaster.setup.config.ClientConfig; import net.nayrus.noteblockmaster.setup.config.StartupConfig; -import net.nayrus.noteblockmaster.setup.Registry; +import net.nayrus.noteblockmaster.sound.AdvancedInstrument; +import net.nayrus.noteblockmaster.sound.SubTickScheduler; import net.nayrus.noteblockmaster.utils.FinalTuple; import net.nayrus.noteblockmaster.utils.Utils; import net.neoforged.bus.api.SubscribeEvent; @@ -36,6 +35,7 @@ public static void registerNetwork(final RegisterPayloadHandlersEvent event){ reg.playToClient(ConfigCheck.TYPE, ConfigCheck.STREAM_CODEC, PacketHandler::handleStartUpSync); reg.playToClient(ActionPing.TYPE, ActionPing.STREAM_CODEC, PacketHandler::handleActionPing); + reg.playToClient(ScheduleCoreSound.TYPE, ScheduleCoreSound.STREAM_CODEC, PacketHandler::handleScheduleCoreSound); reg.playToServer(TunerData.TYPE, TunerData.TUNER_STREAM_CODEC, PacketHandler::handleTunerData); reg.playToServer(ComposeData.TYPE, ComposeData.STREAM_CODEC, PacketHandler::handleComposeData); @@ -86,6 +86,18 @@ private static void handleActionPing(final ActionPing packet, final IPayloadCont } } + private static void handleScheduleCoreSound(final ScheduleCoreSound sound, final IPayloadContext context){ + int data = sound.data(); + int sustainIndex = data & 0xFF; // Extract 8 bits (0-7) + int noteVal = (data >> 8) & 0xFF; // Extract 8 bits (8-15) + int instrumentOrdinal = (data >> 16) & 0xFF; // Extract 8 bits (16-23) + boolean noDecay = ((data >> 24) & 1) == 1; // Extract 1 bit (24) + int delay = (data >> 25) & 0x1F; // Extract 5 bits (25-29) + + AdvancedInstrument instrument = AdvancedInstrument.values()[instrumentOrdinal]; + SubTickScheduler.delayedCoredNoteBlockEvent(sound.pos(), sustainIndex, noteVal, sound.volume(), instrument, noDecay, delay); + } + private static void handleTunerData(final TunerData data, final IPayloadContext context){ Player player = context.player(); FinalTuple.ItemStackTuple items = FinalTuple.getHeldItems(player); @@ -102,13 +114,13 @@ private static void handleComposeData(final ComposeData data, final IPayloadCont stack.set(Registry.COMPOSE_DATA, data); } - public static void handleTickSchedule(final TickSchedule tickSchedule, final IPayloadContext context) { + private static void handleTickSchedule(final TickSchedule tickSchedule, final IPayloadContext context) { ServerLevel level = (ServerLevel) context.player().level(); BlockPos pos = tickSchedule.pos(); Utils.scheduleTick(level, pos, level.getBlockState(pos).getBlock(), tickSchedule.delay()); } - public static void handleCoreUpdate(final CoreUpdate coreUpdate, final IPayloadContext context) { + private static void handleCoreUpdate(final CoreUpdate coreUpdate, final IPayloadContext context) { Level level = context.player().level(); BlockPos pos = coreUpdate.pos(); level.setBlockAndUpdate(pos, level.getBlockState(pos) diff --git a/src/main/java/net/nayrus/noteblockmaster/network/payload/ActionPing.java b/src/main/java/net/nayrus/noteblockmaster/network/payload/ActionPing.java index cb45823..b02968a 100644 --- a/src/main/java/net/nayrus/noteblockmaster/network/payload/ActionPing.java +++ b/src/main/java/net/nayrus/noteblockmaster/network/payload/ActionPing.java @@ -9,8 +9,6 @@ import net.nayrus.noteblockmaster.NoteBlockMaster; import net.neoforged.neoforge.network.PacketDistributor; -import java.util.Objects; - public record ActionPing(byte action) implements CustomPacketPayload { public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(NoteBlockMaster.MOD_ID, "actionping")); @@ -32,6 +30,6 @@ public Type type() { ); public static void sendActionPing(ServerPlayer player, Action action){ - PacketDistributor.sendToPlayer(Objects.requireNonNull(player), new ActionPing(ActionPing.toByte(action))); + PacketDistributor.sendToPlayer(player, new ActionPing(ActionPing.toByte(action))); } } diff --git a/src/main/java/net/nayrus/noteblockmaster/network/payload/ScheduleCoreSound.java b/src/main/java/net/nayrus/noteblockmaster/network/payload/ScheduleCoreSound.java new file mode 100644 index 0000000..3989b90 --- /dev/null +++ b/src/main/java/net/nayrus/noteblockmaster/network/payload/ScheduleCoreSound.java @@ -0,0 +1,44 @@ +package net.nayrus.noteblockmaster.network.payload; + +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 net.nayrus.noteblockmaster.NoteBlockMaster; +import net.nayrus.noteblockmaster.sound.AdvancedInstrument; + +public record ScheduleCoreSound(BlockPos pos, float volume, int data) implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(NoteBlockMaster.MOD_ID, "schedulecoresound")); + + @Override + public Type type() { + return TYPE; + } + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, ScheduleCoreSound::pos, + ByteBufCodecs.FLOAT, ScheduleCoreSound::volume, + ByteBufCodecs.INT, ScheduleCoreSound::data, + ScheduleCoreSound::new + ); + + public static ScheduleCoreSound of( + BlockPos pos, + int sustainIndex, // 8 Bit + int noteVal, // 8 Bit + float volume, + AdvancedInstrument instrument, // 5 Bit + boolean noDecay, // 1 Bit + int delay // 5 Bit + ){ + int data = (sustainIndex & 0xFF) + | ((noteVal & 0xFF) << 8) + | ((instrument.ordinal() & 0x1F) << 16) + | ((noDecay ? 1 : 0) << 24) + | ((delay & 0x1F) << 25); + return new ScheduleCoreSound(pos, volume, data); + } +} diff --git a/src/main/java/net/nayrus/noteblockmaster/screen/NoteTunerScreen.java b/src/main/java/net/nayrus/noteblockmaster/screen/NoteTunerScreen.java index 22a0628..cc56c6c 100644 --- a/src/main/java/net/nayrus/noteblockmaster/screen/NoteTunerScreen.java +++ b/src/main/java/net/nayrus/noteblockmaster/screen/NoteTunerScreen.java @@ -81,7 +81,6 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { || op.keyDown.matches(keyCode, scanCode) || op.keyRight.matches(keyCode, scanCode) || op.keyLeft.matches(keyCode, scanCode) - || op.keyShift.matches(keyCode, scanCode) || op.keyJump.matches(keyCode, scanCode)) && !(Utils.isIntInRange(keyCode, 'A', 'G') && setmode)) this.onClose(); @@ -91,7 +90,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { @Override public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { if(this.slider.isMouseOver(mouseX, mouseY) || this.input.isMouseOver(mouseX, mouseY)) - changeValue((int)(this.value + scrollY)); + changeValue((int)(this.value + scrollY * (hasShiftDown() ? 2 : 1))); return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); } diff --git a/src/main/java/net/nayrus/noteblockmaster/screen/TempoTunerScreen.java b/src/main/java/net/nayrus/noteblockmaster/screen/TempoTunerScreen.java index ed8136c..0757e31 100644 --- a/src/main/java/net/nayrus/noteblockmaster/screen/TempoTunerScreen.java +++ b/src/main/java/net/nayrus/noteblockmaster/screen/TempoTunerScreen.java @@ -67,7 +67,6 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { || op.keyDown.matches(keyCode, scanCode) || op.keyRight.matches(keyCode, scanCode) || op.keyLeft.matches(keyCode, scanCode) - || op.keyShift.matches(keyCode, scanCode) || op.keyJump.matches(keyCode, scanCode)) this.onClose(); return super.keyPressed(keyCode, scanCode, modifiers); @@ -81,7 +80,7 @@ public void onPress(Button button) { @Override public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { if(this.slider.isMouseOver(mouseX, mouseY) || this.input.isMouseOver(mouseX, mouseY)) - changeValue((int)(this.value + scrollY)); + changeValue((int)(this.value + scrollY * (hasShiftDown() ? 2 : 1))); return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); } diff --git a/src/main/java/net/nayrus/noteblockmaster/setup/Registry.java b/src/main/java/net/nayrus/noteblockmaster/setup/Registry.java index 52d5f62..e182f8f 100644 --- a/src/main/java/net/nayrus/noteblockmaster/setup/Registry.java +++ b/src/main/java/net/nayrus/noteblockmaster/setup/Registry.java @@ -25,6 +25,8 @@ import net.nayrus.noteblockmaster.render.item.SpinningCoreRender; import net.nayrus.noteblockmaster.render.particle.SustainedNoteParticle; import net.nayrus.noteblockmaster.render.particle.SustainedNoteType; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; @@ -83,11 +85,13 @@ public static void register(IEventBus eventBus) { .build()); } + @OnlyIn(Dist.CLIENT) public static void registerClientExtensions(RegisterClientExtensionsEvent event) { event.registerItem(new SpinningCoreRender.Extension(), VOLUME, SUSTAIN); event.registerItem(new CoreBaseRender.Extension(), CORE); } + @OnlyIn(Dist.CLIENT) public static void registerParticles(RegisterParticleProvidersEvent event) { if(!(Minecraft.getInstance().particleEngine instanceof ISpriteAccessor vanillaSprites)) return; diff --git a/src/main/java/net/nayrus/noteblockmaster/sound/SubTickScheduler.java b/src/main/java/net/nayrus/noteblockmaster/sound/SubTickScheduler.java index b21ab58..2c84df2 100644 --- a/src/main/java/net/nayrus/noteblockmaster/sound/SubTickScheduler.java +++ b/src/main/java/net/nayrus/noteblockmaster/sound/SubTickScheduler.java @@ -4,12 +4,15 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.nayrus.noteblockmaster.block.AdvancedNoteBlock; import net.nayrus.noteblockmaster.block.TuningCore; +import net.nayrus.noteblockmaster.network.NetworkUtil; +import net.nayrus.noteblockmaster.network.payload.ScheduleCoreSound; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; @@ -24,6 +27,7 @@ public class SubTickScheduler { public static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new SubtickThread()); public static HashMap SUSTAINED_SOUNDS = new HashMap<>(); + public static final RandomSource RANDOM = RandomSource.create(); public static void delayedNoteBlockEvent(BlockState state, Level level, BlockPos pos, AdvancedInstrument instrument, float volume){ executor.schedule(() -> { @@ -43,17 +47,44 @@ public static void delayedNoteBlockEvent(BlockState state, Level level, BlockPos } public static void delayedCoredNoteBlockEvent(BlockState anb, BlockState core, Level level, BlockPos pos, AdvancedInstrument instrument){ - if(level.isClientSide()) { - int tuningIndex = TuningCore.getSustain(core); - CoreSound instance = new CoreSound( - instrument.getSustainedEvent(tuningIndex), SoundSource.RECORDS, (TuningCore.getVolume(core) / 20.0F), AdvancedNoteBlock.getNoteValue(anb), - RandomSource.create(level.getRandom().nextLong()), pos, instrument.getSustainTime(tuningIndex), TuningCore.isMixing(core)); - - executor.schedule(()-> playSustainingSound(instance), - (long) anb.getValue(AdvancedNoteBlock.SUBTICK) * AdvancedNoteBlock.SUBTICK_LENGTH, TimeUnit.MILLISECONDS); + if(!(level instanceof ServerLevel serverLevel)) { + delayedCoredNoteBlockEvent( + pos, + TuningCore.getSustain(core), + AdvancedNoteBlock.getNoteValue(anb), + (TuningCore.getVolume(core) / 20.0F), + instrument, TuningCore.isMixing(core), + anb.getValue(AdvancedNoteBlock.SUBTICK)); + }else{ + NetworkUtil.broadcastCoreSound(serverLevel, ScheduleCoreSound.of( + pos, + TuningCore.getSustain(core), + AdvancedNoteBlock.getNoteValue(anb), + (TuningCore.getVolume(core) / 20.0F), + instrument, TuningCore.isMixing(core), + anb.getValue(AdvancedNoteBlock.SUBTICK))); } } + @OnlyIn(Dist.CLIENT) + public static void delayedCoredNoteBlockEvent( + BlockPos pos, + int sustainIndex, + int noteVal, + float volume, + AdvancedInstrument instrument, + boolean noDecay, + int delay + ){ + CoreSound instance = new CoreSound( + instrument.getSustainedEvent(sustainIndex), SoundSource.RECORDS, volume, noteVal, + RandomSource.create(RANDOM.nextLong()), pos, instrument.getSustainTime(sustainIndex), noDecay); + + executor.schedule(()-> playSustainingSound(instance), + (long) delay * AdvancedNoteBlock.SUBTICK_LENGTH, TimeUnit.MILLISECONDS); + } + + @OnlyIn(Dist.CLIENT) public static void playSustainingSound(CoreSound sound) { playbackStop(sound.getImmutablePos()); Minecraft.getInstance().getSoundManager().play(sound); diff --git a/src/main/java/net/nayrus/noteblockmaster/utils/KeyBindings.java b/src/main/java/net/nayrus/noteblockmaster/utils/KeyBindings.java index bdd61f7..c34b3cb 100644 --- a/src/main/java/net/nayrus/noteblockmaster/utils/KeyBindings.java +++ b/src/main/java/net/nayrus/noteblockmaster/utils/KeyBindings.java @@ -2,6 +2,8 @@ import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.KeyMapping; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import net.neoforged.neoforge.client.settings.KeyConflictContext; @@ -18,6 +20,7 @@ public class KeyBindings { "key.categories.noteblockmaster.nbm" // Mapping will be in the new example category )); + @OnlyIn(Dist.CLIENT) @SubscribeEvent public static void registerBindings(RegisterKeyMappingsEvent event) { event.register(OPEN_OFFHAND_GUI.get());