Skip to content

Commit

Permalink
Dedicated Server is broken, add fast scrolls to GUI
Browse files Browse the repository at this point in the history
Can't figure out where the packet ID desync happens
  • Loading branch information
IONayrus committed Feb 2, 2025
1 parent 1fd9898 commit 287b7bb
Show file tree
Hide file tree
Showing 15 changed files with 201 additions and 54 deletions.
33 changes: 8 additions & 25 deletions src/main/java/net/nayrus/noteblockmaster/NoteBlockMaster.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
16 changes: 12 additions & 4 deletions src/main/java/net/nayrus/noteblockmaster/block/TuningCore.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/net/nayrus/noteblockmaster/event/CommonEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,28 @@
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;
import net.nayrus.noteblockmaster.sound.SoundRegistry;
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();
Expand Down
11 changes: 8 additions & 3 deletions src/main/java/net/nayrus/noteblockmaster/item/ComposersNote.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -95,9 +97,12 @@ public static Tuple<Integer, Integer> subtickAndPauseOnBeat(int beat, float bpm)
@Override
public InteractionResultHolder<ItemStack> 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));
}
}
3 changes: 3 additions & 0 deletions src/main/java/net/nayrus/noteblockmaster/item/TunerItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -149,6 +151,7 @@ public InteractionResultHolder<ItemStack> 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));
Expand Down
45 changes: 45 additions & 0 deletions src/main/java/net/nayrus/noteblockmaster/network/NetworkUtil.java
Original file line number Diff line number Diff line change
@@ -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<ServerPlayer> players,
@Nullable Player except,
double x,
double y,
double z,
double radius,
ResourceKey<Level> 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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<ActionPing> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(NoteBlockMaster.MOD_ID, "actionping"));
Expand All @@ -32,6 +30,6 @@ public Type<ActionPing> 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)));
}
}
Original file line number Diff line number Diff line change
@@ -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<ScheduleCoreSound> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(NoteBlockMaster.MOD_ID, "schedulecoresound"));

@Override
public Type<ScheduleCoreSound> type() {
return TYPE;
}

public static final StreamCodec<RegistryFriendlyByteBuf, ScheduleCoreSound> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
}

Expand Down
Loading

0 comments on commit 287b7bb

Please sign in to comment.