diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java index 3e092a67f..169fcfb4e 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java @@ -181,21 +181,19 @@ public abstract class ModemPeripheral implements IPeripheral, IPacketSender, IPa int channel = parseChannel( arguments, 0 ); int replyChannel = parseChannel( arguments, 1 ); Object payload = arguments.length > 2 ? arguments[2] : null; - synchronized( this ) + World world = getWorld(); + Vec3d position = getPosition(); + IPacketNetwork network = m_network; + if( world != null && position != null && network != null ) { - World world = getWorld(); - Vec3d position = getPosition(); - if( world != null && position != null && m_network != null ) + Packet packet = new Packet( channel, replyChannel, payload, this ); + if( isInterdimensional() ) { - Packet packet = new Packet( channel, replyChannel, payload, this ); - if( isInterdimensional() ) - { - m_network.transmitInterdimensional( packet ); - } - else - { - m_network.transmitSameDimension( packet, getRange() ); - } + network.transmitInterdimensional( packet ); + } + else + { + network.transmitSameDimension( packet, getRange() ); } } return null; diff --git a/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java b/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java index dd77bd55f..2984d8ff0 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java @@ -14,8 +14,8 @@ import dan200.computercraft.shared.peripheral.PeripheralType; import dan200.computercraft.shared.peripheral.common.TilePeripheralBase; import dan200.computercraft.shared.util.DefaultSidedInventory; import dan200.computercraft.shared.util.InventoryUtil; +import dan200.computercraft.shared.util.WorldUtil; import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -521,11 +521,7 @@ public class TilePrinter extends TilePeripheralBase implements DefaultSidedInven double x = pos.getX() + 0.5; double y = pos.getY() + 0.75; double z = pos.getZ() + 0.5; - EntityItem entityitem = new EntityItem( getWorld(), x, y, z, stack ); - entityitem.motionX = getWorld().rand.nextFloat() * 0.2 - 0.1; - entityitem.motionY = getWorld().rand.nextFloat() * 0.2 - 0.1; - entityitem.motionZ = getWorld().rand.nextFloat() * 0.2 - 0.1; - getWorld().spawnEntity( entityitem ); + WorldUtil.dropItemStack( stack, getWorld(), x, y, z ); } } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java index 9a0a46783..f7dcc4455 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java @@ -16,7 +16,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import javax.annotation.Nonnull; @@ -25,25 +25,11 @@ import java.util.concurrent.atomic.AtomicInteger; import static dan200.computercraft.core.apis.ArgumentHelper.getString; import static dan200.computercraft.core.apis.ArgumentHelper.optReal; -public class SpeakerPeripheral implements IPeripheral +public abstract class SpeakerPeripheral implements IPeripheral { - private final TileSpeaker m_speaker; - private long m_clock; - private long m_lastPlayTime; - private final AtomicInteger m_notesThisTick; - - public SpeakerPeripheral() - { - this( null ); - } - - SpeakerPeripheral( TileSpeaker speaker ) - { - m_clock = 0; - m_lastPlayTime = 0; - m_notesThisTick = new AtomicInteger(); - m_speaker = speaker; - } + private long m_clock = 0; + private long m_lastPlayTime = 0; + private final AtomicInteger m_notesThisTick = new AtomicInteger(); public void update() { @@ -51,31 +37,15 @@ public class SpeakerPeripheral implements IPeripheral m_notesThisTick.set( 0 ); } - public World getWorld() - { - return m_speaker.getWorld(); - } + public abstract World getWorld(); - public BlockPos getPos() - { - return m_speaker.getPos(); - } + public abstract Vec3d getPos(); public boolean madeSound( long ticks ) { return m_clock - m_lastPlayTime <= ticks; } - /* IPeripheral implementation */ - - @Override - public boolean equals( IPeripheral other ) - { - if( other == this ) return true; - if( !(other instanceof SpeakerPeripheral) ) return false; - return m_speaker == ((SpeakerPeripheral) other).m_speaker; - } - @Nonnull @Override public String getType() @@ -155,17 +125,16 @@ public class SpeakerPeripheral implements IPeripheral } World world = getWorld(); - BlockPos pos = getPos(); + Vec3d pos = getPos(); context.issueMainThreadTask( () -> { MinecraftServer server = world.getMinecraftServer(); if( server == null ) return null; - double x = pos.getX() + 0.5, y = pos.getY() + 0.5, z = pos.getZ() + 0.5; float adjVolume = Math.min( volume, 3.0f ); server.getPlayerList().sendToAllNearExcept( - null, x, y, z, adjVolume > 1.0f ? 16 * adjVolume : 16.0, world.provider.getDimension(), - new SPacketCustomSound( name, SoundCategory.RECORDS, x, y, z, adjVolume, pitch ) + null, pos.x, pos.y, pos.z, adjVolume > 1.0f ? 16 * adjVolume : 16.0, world.provider.getDimension(), + new SPacketCustomSound( name, SoundCategory.RECORDS, pos.x, pos.y, pos.z, adjVolume, pitch ) ); return null; } ); diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java index d41dbb444..f16f99d44 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java @@ -9,6 +9,11 @@ package dan200.computercraft.shared.peripheral.speaker; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.peripheral.common.TilePeripheralBase; import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +import javax.annotation.Nullable; public class TileSpeaker extends TilePeripheralBase { @@ -21,7 +26,7 @@ public class TileSpeaker extends TilePeripheralBase public TileSpeaker() { super(); - m_peripheral = new SpeakerPeripheral( this ); + m_peripheral = new Peripheral( this ); } @Override @@ -37,4 +42,33 @@ public class TileSpeaker extends TilePeripheralBase { return m_peripheral; } + + private static class Peripheral extends SpeakerPeripheral + { + private final TileSpeaker speaker; + + private Peripheral( TileSpeaker speaker ) + { + this.speaker = speaker; + } + + @Override + public World getWorld() + { + return speaker.getWorld(); + } + + @Override + public Vec3d getPos() + { + BlockPos pos = speaker.getPos(); + return new Vec3d( pos.getX(), pos.getY(), pos.getZ() ); + } + + @Override + public boolean equals( @Nullable IPeripheral other ) + { + return this == other || (other instanceof Peripheral && speaker == ((Peripheral) other).speaker); + } + } } diff --git a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java index d31a2e7e1..264747746 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java +++ b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java @@ -12,7 +12,6 @@ import dan200.computercraft.shared.peripheral.PeripheralType; import dan200.computercraft.shared.peripheral.common.PeripheralItemFactory; import dan200.computercraft.shared.peripheral.modem.ModemState; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.ResourceLocation; import javax.annotation.Nonnull; @@ -54,15 +53,8 @@ public class PocketModem extends AbstractPocketUpgrade Entity entity = access.getEntity(); PocketModemPeripheral modem = (PocketModemPeripheral) peripheral; - if( entity instanceof EntityLivingBase ) - { - EntityLivingBase player = (EntityLivingBase) entity; - modem.setLocation( entity.getEntityWorld(), player.posX, player.posY + player.getEyeHeight(), player.posZ ); - } - else if( entity != null ) - { - modem.setLocation( entity.getEntityWorld(), entity.posX, entity.posY, entity.posZ ); - } + + if( entity != null ) modem.setLocation( entity.getEntityWorld(), entity.getPositionEyes( 1 ) ); ModemState state = modem.getModemState(); if( state.pollChanged() ) access.setLight( state.isOpen() ? 0xBA0000 : -1 ); diff --git a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java index 6748e3664..f34f31bc8 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java @@ -15,24 +15,18 @@ import javax.annotation.Nonnull; public class PocketModemPeripheral extends WirelessModemPeripheral { - private World world; - private Vec3d position; + private World world = null; + private Vec3d position = Vec3d.ZERO; public PocketModemPeripheral( boolean advanced ) { super( new ModemState(), advanced ); - world = null; - position = new Vec3d( 0.0, 0.0, 0.0 ); } - public void setLocation( World world, double x, double y, double z ) + void setLocation( World world, Vec3d position ) { - position = new Vec3d( x, y, z ); - if( this.world != world ) - { - this.world = world; - switchNetwork(); - } + this.position = position; + this.world = world; } @Nonnull @@ -46,7 +40,7 @@ public class PocketModemPeripheral extends WirelessModemPeripheral @Override public Vec3d getPosition() { - return world != null ? position : null; + return position; } @Override diff --git a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java index bdd25641c..624a74afc 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java @@ -8,24 +8,17 @@ package dan200.computercraft.shared.pocket.peripherals; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral; -import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; public class PocketSpeakerPeripheral extends SpeakerPeripheral { - private World world; - private BlockPos position; - - PocketSpeakerPeripheral() - { - super(); - world = null; - position = BlockPos.ORIGIN; - } + private World world = null; + private Vec3d position = Vec3d.ZERO; void setLocation( World world, double x, double y, double z ) { - position = new BlockPos( x, y, z ); + position = new Vec3d( x, y, z ); this.world = world; } @@ -36,7 +29,7 @@ public class PocketSpeakerPeripheral extends SpeakerPeripheral } @Override - public BlockPos getPos() + public Vec3d getPos() { return world != null ? position : null; } diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java index d03344996..1c23c58b2 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java @@ -20,6 +20,7 @@ import net.minecraft.client.renderer.block.model.ModelManager; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -47,21 +48,16 @@ public class TurtleSpeaker extends AbstractTurtleUpgrade } @Override - public BlockPos getPos() + public Vec3d getPos() { - return turtle.getPosition(); + BlockPos pos = turtle.getPosition(); + return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); } @Override public boolean equals( IPeripheral other ) { - if( other instanceof Peripheral ) - { - Peripheral otherPeripheral = (Peripheral) other; - return otherPeripheral.turtle == turtle; - } - - return false; + return this == other || (other instanceof Peripheral && turtle == ((Peripheral) other).turtle); } }