mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-06-10 18:44:12 +00:00
Split transmit into two separate methods
This removes the interdimensional and range options from the packet and ensures they are provides them from the transmit* methods instead.
This commit is contained in:
parent
a328308f67
commit
d76ce22db7
@ -38,11 +38,21 @@ public interface IPacketNetwork
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Submit a packet for transmitting across the network. This will route the packet through the network, sending it
|
* Submit a packet for transmitting across the network. This will route the packet through the network, sending it
|
||||||
* to all reachable receivers.
|
* to all receivers within range (or any interdimensional ones).
|
||||||
*
|
*
|
||||||
* @param packet The packet to send.
|
* @param packet The packet to send.
|
||||||
* @see IPacketReceiver#receiveDifferentDimension(Packet)
|
* @see #transmitInterdimensional(Packet)
|
||||||
* @see IPacketReceiver#receiveSameDimension(Packet, double)
|
* @see IPacketReceiver#receiveSameDimension(Packet, double)
|
||||||
*/
|
*/
|
||||||
void transmit( @Nonnull Packet packet );
|
void transmitSameDimension( @Nonnull Packet packet, double range );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Submit a packet for transmitting across the network. This will route the packet through the network, sending it
|
||||||
|
* to all receivers across all dimensions.
|
||||||
|
*
|
||||||
|
* @param packet The packet to send.
|
||||||
|
* @see #transmitSameDimension(Packet, double)
|
||||||
|
* @see IPacketReceiver#receiveDifferentDimension(Packet)
|
||||||
|
*/
|
||||||
|
void transmitInterdimensional( @Nonnull Packet packet );
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ public interface IPacketReceiver
|
|||||||
* @return The maximum distance this device can send and receive messages.
|
* @return The maximum distance this device can send and receive messages.
|
||||||
* @see #isInterdimensional()
|
* @see #isInterdimensional()
|
||||||
* @see #receiveSameDimension(Packet packet, double)
|
* @see #receiveSameDimension(Packet packet, double)
|
||||||
* @see Packet#getRange()
|
* @see IPacketNetwork#transmitInterdimensional(Packet)
|
||||||
*/
|
*/
|
||||||
double getRange();
|
double getRange();
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ public interface IPacketReceiver
|
|||||||
* @return Whether this receiver receives packets from other dimensions.
|
* @return Whether this receiver receives packets from other dimensions.
|
||||||
* @see #getRange()
|
* @see #getRange()
|
||||||
* @see #receiveDifferentDimension(Packet)
|
* @see #receiveDifferentDimension(Packet)
|
||||||
* @see Packet#isInterdimensional()
|
* @see IPacketNetwork#transmitInterdimensional(Packet)
|
||||||
*/
|
*/
|
||||||
boolean isInterdimensional();
|
boolean isInterdimensional();
|
||||||
|
|
||||||
@ -64,7 +64,9 @@ public interface IPacketReceiver
|
|||||||
* if so, queue the appropriate modem event.
|
* if so, queue the appropriate modem event.
|
||||||
* @param distance The distance this packet has travelled from the source.
|
* @param distance The distance this packet has travelled from the source.
|
||||||
* @see Packet
|
* @see Packet
|
||||||
* @see IPacketNetwork#transmit(Packet)
|
* @see #getRange()
|
||||||
|
* @see IPacketNetwork#transmitSameDimension(Packet, double)
|
||||||
|
* @see IPacketNetwork#transmitInterdimensional(Packet)
|
||||||
*/
|
*/
|
||||||
void receiveSameDimension( @Nonnull Packet packet, double distance );
|
void receiveSameDimension( @Nonnull Packet packet, double distance );
|
||||||
|
|
||||||
@ -74,7 +76,8 @@ public interface IPacketReceiver
|
|||||||
* @param packet The packet to receive. Generally you should check that you are listening on the given channel and,
|
* @param packet The packet to receive. Generally you should check that you are listening on the given channel and,
|
||||||
* if so, queue the appropriate modem event.
|
* if so, queue the appropriate modem event.
|
||||||
* @see Packet
|
* @see Packet
|
||||||
* @see IPacketNetwork#transmit(Packet)
|
* @see IPacketNetwork#transmitInterdimensional(Packet)
|
||||||
|
* @see IPacketNetwork#transmitSameDimension(Packet, double)
|
||||||
* @see #isInterdimensional()
|
* @see #isInterdimensional()
|
||||||
*/
|
*/
|
||||||
void receiveDifferentDimension( @Nonnull Packet packet );
|
void receiveDifferentDimension( @Nonnull Packet packet );
|
||||||
|
@ -14,7 +14,8 @@ import javax.annotation.Nullable;
|
|||||||
* Represents a packet which may be sent across a {@link IPacketNetwork}.
|
* Represents a packet which may be sent across a {@link IPacketNetwork}.
|
||||||
*
|
*
|
||||||
* @see IPacketSender
|
* @see IPacketSender
|
||||||
* @see IPacketNetwork#transmit(Packet)
|
* @see IPacketNetwork#transmitSameDimension(Packet, double)
|
||||||
|
* @see IPacketNetwork#transmitInterdimensional(Packet)
|
||||||
* @see IPacketReceiver#receiveDifferentDimension(Packet)
|
* @see IPacketReceiver#receiveDifferentDimension(Packet)
|
||||||
* @see IPacketReceiver#receiveSameDimension(Packet, double)
|
* @see IPacketReceiver#receiveSameDimension(Packet, double)
|
||||||
*/
|
*/
|
||||||
@ -24,8 +25,6 @@ public class Packet
|
|||||||
private final int m_replyChannel;
|
private final int m_replyChannel;
|
||||||
private final Object m_payload;
|
private final Object m_payload;
|
||||||
|
|
||||||
private final double m_range;
|
|
||||||
private final boolean m_interdimensional;
|
|
||||||
private final IPacketSender m_sender;
|
private final IPacketSender m_sender;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,15 +37,13 @@ public class Packet
|
|||||||
* event or returning from a peripheral call.
|
* event or returning from a peripheral call.
|
||||||
* @param sender The object which sent this packet.
|
* @param sender The object which sent this packet.
|
||||||
*/
|
*/
|
||||||
public Packet( int channel, int replyChannel, @Nullable Object payload, double range, boolean interdimensional, @Nonnull IPacketSender sender )
|
public Packet( int channel, int replyChannel, @Nullable Object payload, @Nonnull IPacketSender sender )
|
||||||
{
|
{
|
||||||
Preconditions.checkNotNull( sender, "sender cannot be null" );
|
Preconditions.checkNotNull( sender, "sender cannot be null" );
|
||||||
|
|
||||||
m_channel = channel;
|
m_channel = channel;
|
||||||
m_replyChannel = replyChannel;
|
m_replyChannel = replyChannel;
|
||||||
m_payload = payload;
|
m_payload = payload;
|
||||||
m_range = range;
|
|
||||||
m_interdimensional = interdimensional;
|
|
||||||
m_sender = sender;
|
m_sender = sender;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,32 +80,6 @@ public class Packet
|
|||||||
return m_payload;
|
return m_payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the minimum distance this packet will travel.
|
|
||||||
*
|
|
||||||
* Packets may still travel further if there is a more sensitive receiver available.
|
|
||||||
*
|
|
||||||
* @return The distance this packet will travel.
|
|
||||||
* @see IPacketReceiver#getRange()
|
|
||||||
*/
|
|
||||||
public double getRange()
|
|
||||||
{
|
|
||||||
return m_range;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether this packet will travel across dimensions.
|
|
||||||
*
|
|
||||||
* Packets may still be received if there is a more sensitive receiver available.
|
|
||||||
*
|
|
||||||
* @return If this packet will travel across dimensions.
|
|
||||||
* @see IPacketReceiver#isInterdimensional()
|
|
||||||
*/
|
|
||||||
public boolean isInterdimensional()
|
|
||||||
{
|
|
||||||
return m_interdimensional;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The object which sent this message.
|
* The object which sent this message.
|
||||||
*
|
*
|
||||||
@ -130,8 +101,6 @@ public class Packet
|
|||||||
|
|
||||||
if( m_channel != packet.m_channel ) return false;
|
if( m_channel != packet.m_channel ) return false;
|
||||||
if( m_replyChannel != packet.m_replyChannel ) return false;
|
if( m_replyChannel != packet.m_replyChannel ) return false;
|
||||||
if( Double.compare( packet.m_range, m_range ) != 0 ) return false;
|
|
||||||
if( m_interdimensional != packet.m_interdimensional ) return false;
|
|
||||||
if( m_payload != null ? !m_payload.equals( packet.m_payload ) : packet.m_payload != null ) return false;
|
if( m_payload != null ? !m_payload.equals( packet.m_payload ) : packet.m_payload != null ) return false;
|
||||||
return m_sender.equals( packet.m_sender );
|
return m_sender.equals( packet.m_sender );
|
||||||
}
|
}
|
||||||
@ -143,9 +112,6 @@ public class Packet
|
|||||||
result = m_channel;
|
result = m_channel;
|
||||||
result = 31 * result + m_replyChannel;
|
result = 31 * result + m_replyChannel;
|
||||||
result = 31 * result + (m_payload != null ? m_payload.hashCode() : 0);
|
result = 31 * result + (m_payload != null ? m_payload.hashCode() : 0);
|
||||||
long temp = Double.doubleToLongBits( m_range );
|
|
||||||
result = 31 * result + (int) (temp ^ (temp >>> 32));
|
|
||||||
result = 31 * result + (m_interdimensional ? 1 : 0);
|
|
||||||
result = 31 * result + m_sender.hashCode();
|
result = 31 * result + m_sender.hashCode();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -244,7 +244,15 @@ public abstract class ModemPeripheral
|
|||||||
Vec3d position = getPosition();
|
Vec3d position = getPosition();
|
||||||
if( world != null && position != null && m_network != null)
|
if( world != null && position != null && m_network != null)
|
||||||
{
|
{
|
||||||
m_network.transmit( new Packet( channel, replyChannel, payload, getRange(), isInterdimensional(), this ) );
|
Packet packet = new Packet( channel, replyChannel, payload, this );
|
||||||
|
if( isInterdimensional() )
|
||||||
|
{
|
||||||
|
m_network.transmitInterdimensional( packet );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_network.transmitSameDimension( packet, getRange() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -239,7 +239,7 @@ public class TileCable extends TileModemBase
|
|||||||
// Members
|
// Members
|
||||||
|
|
||||||
private final Set<IPacketReceiver> m_receivers;
|
private final Set<IPacketReceiver> m_receivers;
|
||||||
private final Queue<Packet> m_transmitQueue;
|
private final Queue<PacketWrapper> m_transmitQueue;
|
||||||
|
|
||||||
private boolean m_peripheralAccessAllowed;
|
private boolean m_peripheralAccessAllowed;
|
||||||
private int m_attachedPeripheralID;
|
private int m_attachedPeripheralID;
|
||||||
@ -254,7 +254,7 @@ public class TileCable extends TileModemBase
|
|||||||
public TileCable()
|
public TileCable()
|
||||||
{
|
{
|
||||||
m_receivers = new HashSet<IPacketReceiver>();
|
m_receivers = new HashSet<IPacketReceiver>();
|
||||||
m_transmitQueue = new LinkedList<Packet>();
|
m_transmitQueue = new LinkedList<PacketWrapper>();
|
||||||
|
|
||||||
m_peripheralAccessAllowed = false;
|
m_peripheralAccessAllowed = false;
|
||||||
m_attachedPeripheralID = -1;
|
m_attachedPeripheralID = -1;
|
||||||
@ -569,7 +569,7 @@ public class TileCable extends TileModemBase
|
|||||||
{
|
{
|
||||||
while( m_transmitQueue.peek() != null )
|
while( m_transmitQueue.peek() != null )
|
||||||
{
|
{
|
||||||
Packet p = m_transmitQueue.remove();
|
PacketWrapper p = m_transmitQueue.remove();
|
||||||
if( p != null )
|
if( p != null )
|
||||||
{
|
{
|
||||||
dispatchPacket( p );
|
dispatchPacket( p );
|
||||||
@ -600,11 +600,20 @@ public class TileCable extends TileModemBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void transmit( @Nonnull Packet packet )
|
public void transmitSameDimension( @Nonnull Packet packet, double range )
|
||||||
{
|
{
|
||||||
synchronized( m_transmitQueue )
|
synchronized( m_transmitQueue )
|
||||||
{
|
{
|
||||||
m_transmitQueue.offer( packet );
|
m_transmitQueue.offer( new PacketWrapper( packet, range ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void transmitInterdimensional( @Nonnull Packet packet )
|
||||||
|
{
|
||||||
|
synchronized( m_transmitQueue )
|
||||||
|
{
|
||||||
|
m_transmitQueue.offer( new PacketWrapper( packet, Double.MAX_VALUE ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -715,12 +724,27 @@ public class TileCable extends TileModemBase
|
|||||||
|
|
||||||
// Packet sending
|
// Packet sending
|
||||||
|
|
||||||
private void dispatchPacket( final Packet packet )
|
private static class PacketWrapper
|
||||||
|
{
|
||||||
|
final Packet m_packet;
|
||||||
|
final double m_range;
|
||||||
|
|
||||||
|
private PacketWrapper( Packet m_packet, double m_range )
|
||||||
|
{
|
||||||
|
this.m_packet = m_packet;
|
||||||
|
this.m_range = m_range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void dispatchPacket( final PacketWrapper packet )
|
||||||
{
|
{
|
||||||
searchNetwork( new ICableVisitor() {
|
searchNetwork( new ICableVisitor() {
|
||||||
public void visit( TileCable modem, int distance )
|
public void visit( TileCable modem, int distance )
|
||||||
{
|
{
|
||||||
modem.receivePacket( packet, distance );
|
if( distance <= packet.m_range)
|
||||||
|
{
|
||||||
|
modem.receivePacket( packet.m_packet, distance );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
@ -56,30 +56,40 @@ public class WirelessNetwork implements IPacketNetwork
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void transmit( @Nonnull Packet packet )
|
public synchronized void transmitSameDimension( @Nonnull Packet packet, double range )
|
||||||
|
{
|
||||||
|
Preconditions.checkNotNull( packet, "packet cannot be null" );
|
||||||
|
for( IPacketReceiver device : m_receivers )
|
||||||
|
{
|
||||||
|
tryTransmit( device, packet, range, false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void transmitInterdimensional( @Nonnull Packet packet )
|
||||||
{
|
{
|
||||||
Preconditions.checkNotNull( packet, "packet cannot be null" );
|
Preconditions.checkNotNull( packet, "packet cannot be null" );
|
||||||
for (IPacketReceiver device : m_receivers)
|
for (IPacketReceiver device : m_receivers)
|
||||||
{
|
{
|
||||||
tryTransmit( device, packet );
|
tryTransmit( device, packet, 0, true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tryTransmit( IPacketReceiver receiver, Packet packet )
|
private void tryTransmit( IPacketReceiver receiver, Packet packet, double range, boolean interdimensional )
|
||||||
{
|
{
|
||||||
IPacketSender sender = packet.getSender();
|
IPacketSender sender = packet.getSender();
|
||||||
if( receiver.getWorld() == sender.getWorld() )
|
if( receiver.getWorld() == sender.getWorld() )
|
||||||
{
|
{
|
||||||
double receiveRange = Math.max( packet.getRange(), receiver.getRange() ); // Ensure range is symmetrical
|
double receiveRange = Math.max( range, receiver.getRange() ); // Ensure range is symmetrical
|
||||||
double distanceSq = receiver.getPosition().squareDistanceTo( sender.getPosition() );
|
double distanceSq = receiver.getPosition().squareDistanceTo( sender.getPosition() );
|
||||||
if( packet.isInterdimensional() || receiver.isInterdimensional() || distanceSq <= (receiveRange * receiveRange) )
|
if( interdimensional || receiver.isInterdimensional() || distanceSq <= (receiveRange * receiveRange) )
|
||||||
{
|
{
|
||||||
receiver.receiveSameDimension( packet, Math.sqrt( distanceSq ) );
|
receiver.receiveSameDimension( packet, Math.sqrt( distanceSq ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( packet.isInterdimensional() || receiver.isInterdimensional() )
|
if( interdimensional || receiver.isInterdimensional() )
|
||||||
{
|
{
|
||||||
receiver.receiveDifferentDimension( packet );
|
receiver.receiveDifferentDimension( packet );
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user