1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-12-13 03:30:29 +00:00

Merge pull request #451 from SquidDev-CC/ComputerCraft/hotfix/disk-drive-stop

Use custom packet to play records, instead of using block events
This commit is contained in:
SquidDev 2017-11-14 21:30:52 +00:00
commit 09da119f27
8 changed files with 46 additions and 77 deletions

View File

@ -533,6 +533,11 @@ public class ComputerCraft
networkEventChannel.sendToServer( encode( packet ) );
}
public static void sendToAllAround( ComputerCraftPacket packet, NetworkRegistry.TargetPoint point )
{
networkEventChannel.sendToAllAround( encode( packet ), point );
}
public static void handlePacket( ComputerCraftPacket packet, EntityPlayer player )
{
proxy.handlePacket( packet, player );

View File

@ -51,7 +51,6 @@ import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
@ -314,17 +313,6 @@ public class ComputerCraftProxyClient extends ComputerCraftProxyCommon
}
}
@Override
public void playRecord( SoundEvent record, String recordInfo, World world, BlockPos pos )
{
Minecraft mc = FMLClientHandler.instance().getClient();
world.playRecord( pos, record );
if( record != null )
{
mc.ingameGUI.setRecordPlayingMessage( recordInfo );
}
}
@Override
public Object getDiskDriveGUI( InventoryPlayer inventory, TileDiskDrive drive )
{
@ -385,6 +373,7 @@ public class ComputerCraftProxyClient extends ComputerCraftProxyCommon
case ComputerCraftPacket.ComputerChanged:
case ComputerCraftPacket.ComputerTerminalChanged:
case ComputerCraftPacket.ComputerDeleted:
case ComputerCraftPacket.PlayRecord:
{
// Packet from Server to Client
IThreadListener listener = Minecraft.getMinecraft();
@ -437,6 +426,22 @@ public class ComputerCraftProxyClient extends ComputerCraftProxyCommon
}
break;
}
case ComputerCraftPacket.PlayRecord:
{
BlockPos pos = new BlockPos( packet.m_dataInt[ 0 ], packet.m_dataInt[ 1 ], packet.m_dataInt[ 2 ] );
Minecraft mc = Minecraft.getMinecraft();
if( packet.m_dataInt.length > 3 )
{
SoundEvent sound = SoundEvent.REGISTRY.getObjectById( packet.m_dataInt[ 3 ] );
mc.world.playRecord( pos, sound );
mc.ingameGUI.setRecordPlayingMessage( packet.m_dataString[ 0 ] );
}
else
{
mc.world.playRecord( pos, null );
}
}
}
}

View File

@ -6,7 +6,9 @@
package dan200.computercraft.server.proxy;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.computer.blocks.TileComputer;
import dan200.computercraft.shared.network.ComputerCraftPacket;
import dan200.computercraft.shared.peripheral.diskdrive.TileDiskDrive;
import dan200.computercraft.shared.peripheral.printer.TilePrinter;
import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon;
@ -64,11 +66,6 @@ public class ComputerCraftProxyServer extends ComputerCraftProxyCommon
{
return null;
}
@Override
public void playRecord( SoundEvent record, String recordInfo, World world, BlockPos pos )
{
}
@Override
public Object getDiskDriveGUI( InventoryPlayer inventory, TileDiskDrive drive )

View File

@ -337,22 +337,6 @@ public abstract class BlockGeneric extends Block implements
return 0;
}
@Override
@Deprecated
public boolean eventReceived( IBlockState state, World world, BlockPos pos, int eventID, int eventParameter )
{
if( world.isRemote )
{
TileEntity tile = world.getTileEntity( pos );
if( tile != null && tile instanceof TileGeneric )
{
TileGeneric generic = (TileGeneric)tile;
generic.onBlockEvent( eventID, eventParameter );
}
}
return true;
}
@Nonnull
@Override
public final TileEntity createTileEntity( @Nonnull World world, @Nonnull IBlockState state )

View File

@ -175,20 +175,6 @@ public abstract class TileGeneric extends TileEntity
{
}
public final void sendBlockEvent( int eventID )
{
sendBlockEvent( eventID, 0 );
}
public final void sendBlockEvent( int eventID, int eventParameter )
{
getWorld().addBlockEvent( getPos(), getWorld().getBlockState( getPos() ).getBlock(), eventID, eventParameter );
}
public void onBlockEvent( int eventID, int eventParameter )
{
}
@Override
public boolean shouldRefresh( World world, BlockPos pos, @Nonnull IBlockState oldState, @Nonnull IBlockState newState )
{

View File

@ -32,6 +32,7 @@ public class ComputerCraftPacket
public static final byte ComputerChanged = 7;
public static final byte ComputerTerminalChanged = 8;
public static final byte ComputerDeleted = 9;
public static final byte PlayRecord = 10;
// Packet class
public byte m_packetType;

View File

@ -46,11 +46,6 @@ import static net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABI
public class TileDiskDrive extends TilePeripheralBase
implements IInventory, ITickable
{
// Statics
private static final int BLOCKEVENT_PLAY_RECORD = 0;
private static final int BLOCKEVENT_STOP_RECORD = 1;
private static class MountInfo
{
public String mountPath;
@ -90,7 +85,7 @@ public class TileDiskDrive extends TilePeripheralBase
{
if( m_recordPlaying )
{
sendBlockEvent( BLOCKEVENT_STOP_RECORD );
stopRecord();
}
}
}
@ -188,7 +183,7 @@ public class TileDiskDrive extends TilePeripheralBase
// Music
synchronized( this )
{
if( m_recordPlaying != m_recordQueued || m_restartRecord )
if( !world.isRemote && m_recordPlaying != m_recordQueued || m_restartRecord )
{
m_restartRecord = false;
if( m_recordQueued )
@ -198,7 +193,7 @@ public class TileDiskDrive extends TilePeripheralBase
if( record != null )
{
m_recordPlaying = true;
sendBlockEvent( BLOCKEVENT_PLAY_RECORD );
playRecord();
}
else
{
@ -207,7 +202,7 @@ public class TileDiskDrive extends TilePeripheralBase
}
else
{
sendBlockEvent( BLOCKEVENT_STOP_RECORD );
stopRecord();
m_recordPlaying = false;
}
}
@ -306,7 +301,7 @@ public class TileDiskDrive extends TilePeripheralBase
// Stop music
if( m_recordPlaying )
{
sendBlockEvent( BLOCKEVENT_STOP_RECORD );
stopRecord();
m_recordPlaying = false;
m_recordQueued = false;
}
@ -658,25 +653,6 @@ public class TileDiskDrive extends TilePeripheralBase
}
}
@Override
public void onBlockEvent( int eventID, int eventParameter )
{
super.onBlockEvent( eventID, eventParameter );
switch( eventID )
{
case BLOCKEVENT_PLAY_RECORD:
{
playRecord();
break;
}
case BLOCKEVENT_STOP_RECORD:
{
stopRecord();
break;
}
}
}
@Override
public boolean shouldRefresh( World world, BlockPos pos, @Nonnull IBlockState oldState, @Nonnull IBlockState newState )
{

View File

@ -149,7 +149,22 @@ public abstract class ComputerCraftProxyCommon implements IComputerCraftProxy
}
@Override
public abstract void playRecord( SoundEvent record, String recordInfo, World world, BlockPos pos );
public void playRecord( SoundEvent record, String recordInfo, World world, BlockPos pos )
{
ComputerCraftPacket packet = new ComputerCraftPacket();
packet.m_packetType = ComputerCraftPacket.PlayRecord;
if( record != null )
{
packet.m_dataInt = new int[] { pos.getX(), pos.getY(), pos.getZ(), SoundEvent.REGISTRY.getIDForObject( record ) };
packet.m_dataString = new String[] { recordInfo };
}
else
{
packet.m_dataInt = new int[] { pos.getX(), pos.getY(), pos.getZ() };
}
ComputerCraft.sendToAllPlayers( packet );
}
@Override
public abstract Object getDiskDriveGUI( InventoryPlayer inventory, TileDiskDrive drive );