1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-06-25 22:53:22 +00:00

Some more minor cleanups

- Move SpeakerPeripheral's TileSpeaker functionality to a sub-class.
 - Use Vec3d instead of BlockPos for speaker's positions.
 - Use WorldUtil.dropItemStack to spawn in items.
 - Remove redundant lock on ModemPeripheral.
This commit is contained in:
SquidDev 2019-01-12 15:42:50 +00:00
parent ed69495b03
commit 77666d7399
8 changed files with 76 additions and 104 deletions

View File

@ -181,21 +181,19 @@ public Object[] callMethod( @Nonnull IComputerAccess computer, @Nonnull ILuaCont
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;

View File

@ -14,8 +14,8 @@
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 @@ private void ejectContents()
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 );
}
}
}

View File

@ -16,7 +16,7 @@
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 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 void update()
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 @@ private synchronized boolean playSound( ILuaContext context, String name, float
}
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;
} );

View File

@ -9,6 +9,11 @@
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 IPeripheral getPeripheral( EnumFacing side )
{
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);
}
}
}

View File

@ -12,7 +12,6 @@
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 void update( @Nonnull IPocketAccess access, @Nullable IPeripheral periphe
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 );

View File

@ -15,24 +15,18 @@
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 World getWorld()
@Override
public Vec3d getPosition()
{
return world != null ? position : null;
return position;
}
@Override

View File

@ -8,24 +8,17 @@
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 World getWorld()
}
@Override
public BlockPos getPos()
public Vec3d getPos()
{
return world != null ? position : null;
}

View File

@ -20,6 +20,7 @@
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 World getWorld()
}
@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);
}
}