CC-Tweaked/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java

86 lines
2.3 KiB
Java

/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.network.client;
import dan200.computercraft.shared.network.NetworkMessage;
import net.minecraft.client.Minecraft;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.network.NetworkEvent;
import javax.annotation.Nonnull;
/**
* Starts or stops a record on the client, depending on if {@link #soundEvent} is {@code null}.
*
* Used by disk drives to play record items.
*
* @see dan200.computercraft.shared.peripheral.diskdrive.TileDiskDrive
*/
public class PlayRecordClientMessage implements NetworkMessage
{
private final BlockPos pos;
private final String name;
private final SoundEvent soundEvent;
public PlayRecordClientMessage( BlockPos pos, SoundEvent event, String name )
{
this.pos = pos;
this.name = name;
soundEvent = event;
}
public PlayRecordClientMessage( BlockPos pos )
{
this.pos = pos;
name = null;
soundEvent = null;
}
public PlayRecordClientMessage( PacketBuffer buf )
{
pos = buf.readBlockPos();
if( buf.readBoolean() )
{
name = buf.readUtf( Short.MAX_VALUE );
soundEvent = buf.readRegistryIdSafe( SoundEvent.class );
}
else
{
name = null;
soundEvent = null;
}
}
@Override
public void toBytes( @Nonnull PacketBuffer buf )
{
buf.writeBlockPos( pos );
if( soundEvent == null )
{
buf.writeBoolean( false );
}
else
{
buf.writeBoolean( true );
buf.writeUtf( name );
buf.writeRegistryId( soundEvent );
}
}
@Override
@OnlyIn( Dist.CLIENT )
public void handle( NetworkEvent.Context context )
{
Minecraft mc = Minecraft.getInstance();
mc.levelRenderer.playStreamingMusic( soundEvent, pos );
if( name != null ) mc.gui.setNowPlaying( name );
}
}