mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-09-29 23:40:46 +00:00
Switch from using INetwork to IPacketNetwork
This commit is contained in:
parent
e6ef1cfadd
commit
a328308f67
@ -11,6 +11,7 @@ import dan200.computercraft.api.filesystem.IMount;
|
|||||||
import dan200.computercraft.api.filesystem.IWritableMount;
|
import dan200.computercraft.api.filesystem.IWritableMount;
|
||||||
import dan200.computercraft.api.media.IMedia;
|
import dan200.computercraft.api.media.IMedia;
|
||||||
import dan200.computercraft.api.media.IMediaProvider;
|
import dan200.computercraft.api.media.IMediaProvider;
|
||||||
|
import dan200.computercraft.api.network.IPacketNetwork;
|
||||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
import dan200.computercraft.api.peripheral.IPeripheralProvider;
|
import dan200.computercraft.api.peripheral.IPeripheralProvider;
|
||||||
import dan200.computercraft.api.permissions.ITurtlePermissionProvider;
|
import dan200.computercraft.api.permissions.ITurtlePermissionProvider;
|
||||||
@ -702,6 +703,11 @@ public class ComputerCraft
|
|||||||
return upgrades;
|
return upgrades;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IPacketNetwork getWirelessNetwork()
|
||||||
|
{
|
||||||
|
return WirelessNetwork.getUniversal();
|
||||||
|
}
|
||||||
|
|
||||||
public static int createUniqueNumberedSaveDir( World world, String parentSubPath )
|
public static int createUniqueNumberedSaveDir( World world, String parentSubPath )
|
||||||
{
|
{
|
||||||
return IDAssigner.getNextIDFromDirectory(new File(getWorldDir(world), parentSubPath));
|
return IDAssigner.getNextIDFromDirectory(new File(getWorldDir(world), parentSubPath));
|
||||||
|
@ -10,6 +10,7 @@ import dan200.computercraft.api.filesystem.IMount;
|
|||||||
import dan200.computercraft.api.filesystem.IWritableMount;
|
import dan200.computercraft.api.filesystem.IWritableMount;
|
||||||
import dan200.computercraft.api.media.IMedia;
|
import dan200.computercraft.api.media.IMedia;
|
||||||
import dan200.computercraft.api.media.IMediaProvider;
|
import dan200.computercraft.api.media.IMediaProvider;
|
||||||
|
import dan200.computercraft.api.network.IPacketNetwork;
|
||||||
import dan200.computercraft.api.peripheral.IComputerAccess;
|
import dan200.computercraft.api.peripheral.IComputerAccess;
|
||||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
import dan200.computercraft.api.peripheral.IPeripheralProvider;
|
import dan200.computercraft.api.peripheral.IPeripheralProvider;
|
||||||
@ -289,6 +290,27 @@ public final class ComputerCraftAPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to get the game-wide wireless network.
|
||||||
|
*
|
||||||
|
* @return The global wireless network, or {@code null} if it could not be fetched.
|
||||||
|
*/
|
||||||
|
public static IPacketNetwork getWirelessNetwork()
|
||||||
|
{
|
||||||
|
findCC();
|
||||||
|
if( computerCraft_getWirelessNetwork != null )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return (IPacketNetwork) computerCraft_getWirelessNetwork.invoke( null );
|
||||||
|
} catch (Exception e) {
|
||||||
|
// It failed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
// The functions below here are private, and are used to interface with the non-API ComputerCraft classes.
|
// The functions below here are private, and are used to interface with the non-API ComputerCraft classes.
|
||||||
// Reflection is used here so you can develop your mod without decompiling ComputerCraft and including
|
// Reflection is used here so you can develop your mod without decompiling ComputerCraft and including
|
||||||
// it in your solution, and so your mod won't crash if ComputerCraft is installed.
|
// it in your solution, and so your mod won't crash if ComputerCraft is installed.
|
||||||
@ -330,6 +352,8 @@ public final class ComputerCraftAPI
|
|||||||
computerCraft_registerPocketUpgrade = findCCMethod( "registerPocketUpgrade", new Class<?>[] {
|
computerCraft_registerPocketUpgrade = findCCMethod( "registerPocketUpgrade", new Class<?>[] {
|
||||||
IPocketUpgrade.class
|
IPocketUpgrade.class
|
||||||
} );
|
} );
|
||||||
|
computerCraft_getWirelessNetwork = findCCMethod( "getWirelessNetwork", new Class<?>[] {
|
||||||
|
} );
|
||||||
} catch( Exception e ) {
|
} catch( Exception e ) {
|
||||||
System.out.println( "ComputerCraftAPI: ComputerCraft not found." );
|
System.out.println( "ComputerCraftAPI: ComputerCraft not found." );
|
||||||
} finally {
|
} finally {
|
||||||
@ -365,4 +389,5 @@ public final class ComputerCraftAPI
|
|||||||
private static Method computerCraft_registerMediaProvider = null;
|
private static Method computerCraft_registerMediaProvider = null;
|
||||||
private static Method computerCraft_registerPermissionProvider = null;
|
private static Method computerCraft_registerPermissionProvider = null;
|
||||||
private static Method computerCraft_registerPocketUpgrade = null;
|
private static Method computerCraft_registerPocketUpgrade = null;
|
||||||
|
private static Method computerCraft_getWirelessNetwork = null;
|
||||||
}
|
}
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ComputerCraft - http://www.computercraft.info
|
|
||||||
* Copyright Daniel Ratcliffe, 2011-2017. Do not distribute without permission.
|
|
||||||
* Send enquiries to dratcliffe@gmail.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
package dan200.computercraft.shared.peripheral.modem;
|
|
||||||
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
public interface INetwork
|
|
||||||
{
|
|
||||||
void addReceiver( IReceiver receiver );
|
|
||||||
void removeReceiver( IReceiver receiver );
|
|
||||||
void transmit( int channel, int replyChannel, Object payload, World world, Vec3d pos, double range, boolean interdimensional, Object senderObject );
|
|
||||||
boolean isWireless();
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of ComputerCraft - http://www.computercraft.info
|
|
||||||
* Copyright Daniel Ratcliffe, 2011-2017. Do not distribute without permission.
|
|
||||||
* Send enquiries to dratcliffe@gmail.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
package dan200.computercraft.shared.peripheral.modem;
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
public interface IReceiver
|
|
||||||
{
|
|
||||||
int getChannel();
|
|
||||||
World getWorld();
|
|
||||||
Vec3d getWorldPosition();
|
|
||||||
boolean isInterdimensional();
|
|
||||||
double getReceiveRange();
|
|
||||||
void receiveSameDimension( int replyChannel, Object payload, double distance, Object senderObject );
|
|
||||||
void receiveDifferentDimension( int replyChannel, Object payload, Object senderObject );
|
|
||||||
}
|
|
@ -8,83 +8,25 @@ package dan200.computercraft.shared.peripheral.modem;
|
|||||||
|
|
||||||
import dan200.computercraft.api.lua.ILuaContext;
|
import dan200.computercraft.api.lua.ILuaContext;
|
||||||
import dan200.computercraft.api.lua.LuaException;
|
import dan200.computercraft.api.lua.LuaException;
|
||||||
|
import dan200.computercraft.api.network.IPacketNetwork;
|
||||||
|
import dan200.computercraft.api.network.IPacketReceiver;
|
||||||
|
import dan200.computercraft.api.network.IPacketSender;
|
||||||
|
import dan200.computercraft.api.network.Packet;
|
||||||
import dan200.computercraft.api.peripheral.IComputerAccess;
|
import dan200.computercraft.api.peripheral.IComputerAccess;
|
||||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
|
import gnu.trove.set.TIntSet;
|
||||||
|
import gnu.trove.set.hash.TIntHashSet;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public abstract class ModemPeripheral
|
public abstract class ModemPeripheral
|
||||||
implements IPeripheral
|
implements IPeripheral, IPacketSender, IPacketReceiver
|
||||||
{
|
{
|
||||||
private static class SingleChannelReceiver implements IReceiver
|
private IPacketNetwork m_network;
|
||||||
{
|
|
||||||
private ModemPeripheral m_owner;
|
|
||||||
private int m_channel;
|
|
||||||
|
|
||||||
public SingleChannelReceiver( ModemPeripheral owner, int channel )
|
|
||||||
{
|
|
||||||
m_owner = owner;
|
|
||||||
m_channel = channel;
|
|
||||||
}
|
|
||||||
|
|
||||||
// IReceiver implementation
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getChannel()
|
|
||||||
{
|
|
||||||
return m_channel;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public World getWorld()
|
|
||||||
{
|
|
||||||
return m_owner.getWorld();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Vec3d getWorldPosition()
|
|
||||||
{
|
|
||||||
return m_owner.getWorldPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInterdimensional()
|
|
||||||
{
|
|
||||||
return m_owner.isInterdimensional();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getReceiveRange()
|
|
||||||
{
|
|
||||||
return m_owner.getReceiveRange();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void receiveSameDimension( int replyChannel, Object payload, double distance, Object senderObject )
|
|
||||||
{
|
|
||||||
if( senderObject != m_owner )
|
|
||||||
{
|
|
||||||
m_owner.receiveSameDimension( m_channel, replyChannel, payload, distance );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void receiveDifferentDimension( int replyChannel, Object payload, Object senderObject )
|
|
||||||
{
|
|
||||||
if( senderObject != m_owner )
|
|
||||||
{
|
|
||||||
m_owner.receiveDifferentDimension( m_channel, replyChannel, payload );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private INetwork m_network;
|
|
||||||
private IComputerAccess m_computer;
|
private IComputerAccess m_computer;
|
||||||
private final Map<Integer, IReceiver> m_channels;
|
private final TIntSet m_channels;
|
||||||
|
|
||||||
private boolean m_open;
|
private boolean m_open;
|
||||||
private boolean m_changed;
|
private boolean m_changed;
|
||||||
@ -93,23 +35,19 @@ public abstract class ModemPeripheral
|
|||||||
{
|
{
|
||||||
m_network = null;
|
m_network = null;
|
||||||
m_computer = null;
|
m_computer = null;
|
||||||
|
m_channels = new TIntHashSet();
|
||||||
m_channels = new HashMap<Integer, IReceiver>();
|
|
||||||
m_open = false;
|
m_open = false;
|
||||||
m_changed = true;
|
m_changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void setNetwork( INetwork network )
|
private synchronized void setNetwork( IPacketNetwork network )
|
||||||
{
|
{
|
||||||
if( m_network != network )
|
if( m_network != network )
|
||||||
{
|
{
|
||||||
// Leave old network
|
// Leave old network
|
||||||
if( m_network != null )
|
if( m_network != null )
|
||||||
{
|
{
|
||||||
for( IReceiver iReceiver : m_channels.values() )
|
m_network.removeReceiver( this );
|
||||||
{
|
|
||||||
m_network.removeReceiver( iReceiver );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set new network
|
// Set new network
|
||||||
@ -118,10 +56,7 @@ public abstract class ModemPeripheral
|
|||||||
// Join new network
|
// Join new network
|
||||||
if( m_network != null )
|
if( m_network != null )
|
||||||
{
|
{
|
||||||
for( IReceiver iReceiver : m_channels.values() )
|
m_network.addReceiver( this );
|
||||||
{
|
|
||||||
m_network.addReceiver( iReceiver );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,10 +66,6 @@ public abstract class ModemPeripheral
|
|||||||
setNetwork( getNetwork() );
|
setNetwork( getNetwork() );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract World getWorld();
|
|
||||||
|
|
||||||
protected abstract Vec3d getPosition();
|
|
||||||
|
|
||||||
public synchronized void destroy()
|
public synchronized void destroy()
|
||||||
{
|
{
|
||||||
setNetwork( null );
|
setNetwork( null );
|
||||||
@ -152,52 +83,44 @@ public abstract class ModemPeripheral
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract double getTransmitRange();
|
|
||||||
|
|
||||||
protected abstract boolean isInterdimensional();
|
|
||||||
|
|
||||||
public synchronized boolean isActive()
|
public synchronized boolean isActive()
|
||||||
{
|
{
|
||||||
return (m_computer != null) && m_open;
|
return (m_computer != null) && m_open;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized Vec3d getWorldPosition()
|
@Override
|
||||||
|
public void receiveSameDimension( @Nonnull Packet packet, double distance )
|
||||||
{
|
{
|
||||||
return getPosition();
|
if( packet.getSender() == this ) return;
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized double getReceiveRange()
|
|
||||||
{
|
|
||||||
return getTransmitRange();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void receiveSameDimension( int channel, int replyChannel, Object payload, double distance )
|
|
||||||
{
|
|
||||||
synchronized (m_channels)
|
synchronized (m_channels)
|
||||||
{
|
{
|
||||||
if( m_computer != null && m_channels.containsKey( channel ) )
|
if( m_computer != null && m_channels.contains( packet.getChannel() ) )
|
||||||
{
|
{
|
||||||
m_computer.queueEvent( "modem_message", new Object[] {
|
m_computer.queueEvent( "modem_message", new Object[] {
|
||||||
m_computer.getAttachmentName(), channel, replyChannel, payload, distance
|
m_computer.getAttachmentName(), packet.getChannel(), packet.getReplyChannel(), packet.getPayload(), distance
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void receiveDifferentDimension( int channel, int replyChannel, Object payload )
|
@Override
|
||||||
|
public void receiveDifferentDimension( @Nonnull Packet packet )
|
||||||
{
|
{
|
||||||
|
if( packet.getSender() == this ) return;
|
||||||
|
|
||||||
synchronized (m_channels)
|
synchronized (m_channels)
|
||||||
{
|
{
|
||||||
if( m_computer != null && m_channels.containsKey( channel ) )
|
if( m_computer != null && m_channels.contains( packet.getChannel() ) )
|
||||||
{
|
{
|
||||||
m_computer.queueEvent( "modem_message", new Object[] {
|
m_computer.queueEvent( "modem_message", new Object[] {
|
||||||
m_computer.getAttachmentName(), channel, replyChannel, payload
|
m_computer.getAttachmentName(), packet.getChannel(), packet.getReplyChannel(), packet.getPayload()
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract INetwork getNetwork();
|
protected abstract IPacketNetwork getNetwork();
|
||||||
|
|
||||||
// IPeripheral implementation
|
// IPeripheral implementation
|
||||||
|
|
||||||
@ -247,19 +170,14 @@ public abstract class ModemPeripheral
|
|||||||
int channel = parseChannel( arguments, 0 );
|
int channel = parseChannel( arguments, 0 );
|
||||||
synchronized( this )
|
synchronized( this )
|
||||||
{
|
{
|
||||||
if( !m_channels.containsKey( channel ) )
|
if( !m_channels.contains( channel ) )
|
||||||
{
|
{
|
||||||
if( m_channels.size() >= 128 )
|
if( m_channels.size() >= 128 )
|
||||||
{
|
{
|
||||||
throw new LuaException( "Too many open channels" );
|
throw new LuaException( "Too many open channels" );
|
||||||
}
|
}
|
||||||
|
|
||||||
IReceiver receiver = new SingleChannelReceiver( this, channel );
|
m_channels.add( channel );
|
||||||
m_channels.put( channel, receiver );
|
|
||||||
if( m_network != null )
|
|
||||||
{
|
|
||||||
m_network.addReceiver( receiver );
|
|
||||||
}
|
|
||||||
if( !m_open )
|
if( !m_open )
|
||||||
{
|
{
|
||||||
m_open = true;
|
m_open = true;
|
||||||
@ -275,7 +193,7 @@ public abstract class ModemPeripheral
|
|||||||
int channel = parseChannel( arguments, 0 );
|
int channel = parseChannel( arguments, 0 );
|
||||||
synchronized( this )
|
synchronized( this )
|
||||||
{
|
{
|
||||||
boolean open = m_channels.containsKey( channel );
|
boolean open = m_channels.contains( channel );
|
||||||
return new Object[] { open };
|
return new Object[] { open };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -285,15 +203,8 @@ public abstract class ModemPeripheral
|
|||||||
int channel = parseChannel( arguments, 0 );
|
int channel = parseChannel( arguments, 0 );
|
||||||
synchronized( this )
|
synchronized( this )
|
||||||
{
|
{
|
||||||
if( m_channels.containsKey( channel ) )
|
if( m_channels.remove( channel ) )
|
||||||
{
|
{
|
||||||
IReceiver receiver = m_channels.get( channel );
|
|
||||||
if( m_network != null )
|
|
||||||
{
|
|
||||||
m_network.removeReceiver( receiver );
|
|
||||||
}
|
|
||||||
m_channels.remove( channel );
|
|
||||||
|
|
||||||
if( m_channels.size() == 0 )
|
if( m_channels.size() == 0 )
|
||||||
{
|
{
|
||||||
m_open = false;
|
m_open = false;
|
||||||
@ -310,13 +221,6 @@ public abstract class ModemPeripheral
|
|||||||
{
|
{
|
||||||
if( m_channels.size() > 0 )
|
if( m_channels.size() > 0 )
|
||||||
{
|
{
|
||||||
if( m_network != null )
|
|
||||||
{
|
|
||||||
for( IReceiver iReceiver : m_channels.values() )
|
|
||||||
{
|
|
||||||
m_network.removeReceiver( iReceiver );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_channels.clear();
|
m_channels.clear();
|
||||||
|
|
||||||
if( m_open )
|
if( m_open )
|
||||||
@ -340,7 +244,7 @@ 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( channel, replyChannel, payload, world, position, getTransmitRange(), isInterdimensional(), this );
|
m_network.transmit( new Packet( channel, replyChannel, payload, getRange(), isInterdimensional(), this ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -377,10 +281,7 @@ public abstract class ModemPeripheral
|
|||||||
{
|
{
|
||||||
if( m_network != null )
|
if( m_network != null )
|
||||||
{
|
{
|
||||||
for( IReceiver iReceiver : m_channels.values() )
|
m_network.removeReceiver( this );
|
||||||
{
|
|
||||||
m_network.removeReceiver( iReceiver );
|
|
||||||
}
|
|
||||||
m_channels.clear();
|
m_channels.clear();
|
||||||
m_network = null;
|
m_network = null;
|
||||||
}
|
}
|
||||||
@ -394,11 +295,22 @@ public abstract class ModemPeripheral
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract boolean equals( IPeripheral other );
|
|
||||||
|
|
||||||
public IComputerAccess getComputer()
|
public IComputerAccess getComputer()
|
||||||
{
|
{
|
||||||
return m_computer;
|
return m_computer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public String getSenderID()
|
||||||
|
{
|
||||||
|
if( m_computer == null )
|
||||||
|
{
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return m_computer.getID() + "_" + m_computer.getAttachmentName();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@ import net.minecraft.util.EnumFacing;
|
|||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
public class TileAdvancedModem extends TileModemBase
|
public class TileAdvancedModem extends TileModemBase
|
||||||
{
|
{
|
||||||
// Statics
|
// Statics
|
||||||
@ -27,14 +29,16 @@ public class TileAdvancedModem extends TileModemBase
|
|||||||
m_entity = entity;
|
m_entity = entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public World getWorld()
|
public World getWorld()
|
||||||
{
|
{
|
||||||
return m_entity.getWorld();
|
return m_entity.getWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected Vec3d getPosition()
|
public Vec3d getPosition()
|
||||||
{
|
{
|
||||||
BlockPos pos = m_entity.getPos().offset( m_entity.getDirection() );
|
BlockPos pos = m_entity.getPos().offset( m_entity.getDirection() );
|
||||||
return new Vec3d( (double)pos.getX(), (double)pos.getY(), (double)pos.getZ() );
|
return new Vec3d( (double)pos.getX(), (double)pos.getY(), (double)pos.getZ() );
|
||||||
|
@ -12,6 +12,9 @@ import dan200.computercraft.api.filesystem.IMount;
|
|||||||
import dan200.computercraft.api.filesystem.IWritableMount;
|
import dan200.computercraft.api.filesystem.IWritableMount;
|
||||||
import dan200.computercraft.api.lua.ILuaContext;
|
import dan200.computercraft.api.lua.ILuaContext;
|
||||||
import dan200.computercraft.api.lua.LuaException;
|
import dan200.computercraft.api.lua.LuaException;
|
||||||
|
import dan200.computercraft.api.network.IPacketNetwork;
|
||||||
|
import dan200.computercraft.api.network.IPacketReceiver;
|
||||||
|
import dan200.computercraft.api.network.Packet;
|
||||||
import dan200.computercraft.api.peripheral.IComputerAccess;
|
import dan200.computercraft.api.peripheral.IComputerAccess;
|
||||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
import dan200.computercraft.shared.common.BlockGeneric;
|
import dan200.computercraft.shared.common.BlockGeneric;
|
||||||
@ -38,7 +41,7 @@ import java.io.File;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class TileCable extends TileModemBase
|
public class TileCable extends TileModemBase
|
||||||
implements INetwork
|
implements IPacketNetwork
|
||||||
{
|
{
|
||||||
private static final double MIN = 0.375;
|
private static final double MIN = 0.375;
|
||||||
private static final double MAX = 1 - MIN;
|
private static final double MAX = 1 - MIN;
|
||||||
@ -65,31 +68,33 @@ public class TileCable extends TileModemBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isInterdimensional()
|
public boolean isInterdimensional()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected double getTransmitRange()
|
public double getRange()
|
||||||
{
|
{
|
||||||
return 256.0;
|
return 256.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected INetwork getNetwork()
|
protected IPacketNetwork getNetwork()
|
||||||
{
|
{
|
||||||
return m_entity;
|
return m_entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected World getWorld()
|
public World getWorld()
|
||||||
{
|
{
|
||||||
return m_entity.getWorld();
|
return m_entity.getWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected Vec3d getPosition()
|
public Vec3d getPosition()
|
||||||
{
|
{
|
||||||
EnumFacing direction = m_entity.getDirection();
|
EnumFacing direction = m_entity.getDirection();
|
||||||
BlockPos pos = m_entity.getPos().offset( direction );
|
BlockPos pos = m_entity.getPos().offset( direction );
|
||||||
@ -233,7 +238,7 @@ public class TileCable extends TileModemBase
|
|||||||
|
|
||||||
// Members
|
// Members
|
||||||
|
|
||||||
private final Map<Integer, Set<IReceiver>> m_receivers;
|
private final Set<IPacketReceiver> m_receivers;
|
||||||
private final Queue<Packet> m_transmitQueue;
|
private final Queue<Packet> m_transmitQueue;
|
||||||
|
|
||||||
private boolean m_peripheralAccessAllowed;
|
private boolean m_peripheralAccessAllowed;
|
||||||
@ -248,7 +253,7 @@ public class TileCable extends TileModemBase
|
|||||||
|
|
||||||
public TileCable()
|
public TileCable()
|
||||||
{
|
{
|
||||||
m_receivers = new HashMap<Integer, Set<IReceiver>>();
|
m_receivers = new HashSet<IPacketReceiver>();
|
||||||
m_transmitQueue = new LinkedList<Packet>();
|
m_transmitQueue = new LinkedList<Packet>();
|
||||||
|
|
||||||
m_peripheralAccessAllowed = false;
|
m_peripheralAccessAllowed = false;
|
||||||
@ -574,49 +579,32 @@ public class TileCable extends TileModemBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// INetwork implementation
|
// IPacketNetwork implementation
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addReceiver( IReceiver receiver )
|
public void addReceiver( @Nonnull IPacketReceiver receiver )
|
||||||
{
|
{
|
||||||
synchronized( m_receivers )
|
synchronized( m_receivers )
|
||||||
{
|
{
|
||||||
int channel = receiver.getChannel();
|
m_receivers.add( receiver );
|
||||||
Set<IReceiver> receivers = m_receivers.get( channel );
|
|
||||||
if( receivers == null )
|
|
||||||
{
|
|
||||||
receivers = new HashSet<IReceiver>();
|
|
||||||
m_receivers.put( channel, receivers );
|
|
||||||
}
|
|
||||||
receivers.add( receiver );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeReceiver( IReceiver receiver )
|
public void removeReceiver( @Nonnull IPacketReceiver receiver )
|
||||||
{
|
{
|
||||||
synchronized( m_receivers )
|
synchronized( m_receivers )
|
||||||
{
|
{
|
||||||
int channel = receiver.getChannel();
|
m_receivers.remove( receiver );
|
||||||
Set<IReceiver> receivers = m_receivers.get( channel );
|
|
||||||
if( receivers != null )
|
|
||||||
{
|
|
||||||
receivers.remove( receiver );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void transmit( int channel, int replyChannel, Object payload, World world, Vec3d pos, double range, boolean interdimensional, Object senderObject )
|
public void transmit( @Nonnull Packet packet )
|
||||||
{
|
{
|
||||||
Packet p = new Packet();
|
|
||||||
p.channel = channel;
|
|
||||||
p.replyChannel = replyChannel;
|
|
||||||
p.payload = payload;
|
|
||||||
p.senderObject = senderObject;
|
|
||||||
synchronized( m_transmitQueue )
|
synchronized( m_transmitQueue )
|
||||||
{
|
{
|
||||||
m_transmitQueue.offer(p);
|
m_transmitQueue.offer( packet );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -727,14 +715,6 @@ public class TileCable extends TileModemBase
|
|||||||
|
|
||||||
// Packet sending
|
// Packet sending
|
||||||
|
|
||||||
private class Packet
|
|
||||||
{
|
|
||||||
public int channel;
|
|
||||||
public int replyChannel;
|
|
||||||
public Object payload;
|
|
||||||
public Object senderObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void dispatchPacket( final Packet packet )
|
private void dispatchPacket( final Packet packet )
|
||||||
{
|
{
|
||||||
searchNetwork( new ICableVisitor() {
|
searchNetwork( new ICableVisitor() {
|
||||||
@ -749,13 +729,9 @@ public class TileCable extends TileModemBase
|
|||||||
{
|
{
|
||||||
synchronized( m_receivers )
|
synchronized( m_receivers )
|
||||||
{
|
{
|
||||||
Set<IReceiver> receivers = m_receivers.get( packet.channel );
|
for (IPacketReceiver device : m_receivers)
|
||||||
if( receivers != null )
|
|
||||||
{
|
{
|
||||||
for( IReceiver receiver : receivers )
|
device.receiveSameDimension( packet, distanceTravelled );
|
||||||
{
|
|
||||||
receiver.receiveSameDimension( packet.replyChannel, packet.payload, (double) distanceTravelled, packet.senderObject );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,14 +33,16 @@ public class TileWirelessModem extends TileModemBase
|
|||||||
m_entity = entity;
|
m_entity = entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected World getWorld()
|
public World getWorld()
|
||||||
{
|
{
|
||||||
return m_entity.getWorld();
|
return m_entity.getWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected Vec3d getPosition()
|
public Vec3d getPosition()
|
||||||
{
|
{
|
||||||
BlockPos pos = m_entity.getPos().offset( m_entity.getDirection() );
|
BlockPos pos = m_entity.getPos().offset( m_entity.getDirection() );
|
||||||
return new Vec3d( (double)pos.getX(), (double)pos.getY(), (double)pos.getZ() );
|
return new Vec3d( (double)pos.getX(), (double)pos.getY(), (double)pos.getZ() );
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
package dan200.computercraft.shared.peripheral.modem;
|
package dan200.computercraft.shared.peripheral.modem;
|
||||||
|
|
||||||
import dan200.computercraft.ComputerCraft;
|
import dan200.computercraft.ComputerCraft;
|
||||||
|
import dan200.computercraft.api.network.IPacketNetwork;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
@ -20,13 +21,13 @@ public abstract class WirelessModemPeripheral extends ModemPeripheral
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isInterdimensional()
|
public boolean isInterdimensional()
|
||||||
{
|
{
|
||||||
return m_advanced;
|
return m_advanced;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected double getTransmitRange()
|
public double getRange()
|
||||||
{
|
{
|
||||||
if( m_advanced )
|
if( m_advanced )
|
||||||
{
|
{
|
||||||
@ -56,7 +57,7 @@ public abstract class WirelessModemPeripheral extends ModemPeripheral
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected INetwork getNetwork()
|
protected IPacketNetwork getNetwork()
|
||||||
{
|
{
|
||||||
return WirelessNetwork.getUniversal();
|
return WirelessNetwork.getUniversal();
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,17 @@
|
|||||||
|
|
||||||
package dan200.computercraft.shared.peripheral.modem;
|
package dan200.computercraft.shared.peripheral.modem;
|
||||||
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
import com.google.common.base.Preconditions;
|
||||||
import net.minecraft.world.World;
|
import dan200.computercraft.api.network.IPacketNetwork;
|
||||||
|
import dan200.computercraft.api.network.IPacketReceiver;
|
||||||
|
import dan200.computercraft.api.network.IPacketSender;
|
||||||
|
import dan200.computercraft.api.network.Packet;
|
||||||
|
|
||||||
import java.util.*;
|
import javax.annotation.Nonnull;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class WirelessNetwork implements INetwork
|
public class WirelessNetwork implements IPacketNetwork
|
||||||
{
|
{
|
||||||
private static WirelessNetwork s_universalNetwork = null;
|
private static WirelessNetwork s_universalNetwork = null;
|
||||||
|
|
||||||
@ -29,67 +34,54 @@ public class WirelessNetwork implements INetwork
|
|||||||
s_universalNetwork = null;
|
s_universalNetwork = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<Integer, Set<IReceiver>> m_receivers;
|
private final Set<IPacketReceiver> m_receivers;
|
||||||
|
|
||||||
private WirelessNetwork()
|
private WirelessNetwork()
|
||||||
{
|
{
|
||||||
m_receivers = new HashMap<Integer, Set<IReceiver>>();
|
m_receivers = new HashSet<IPacketReceiver>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void addReceiver( IReceiver receiver )
|
public synchronized void addReceiver( @Nonnull IPacketReceiver receiver )
|
||||||
{
|
{
|
||||||
int channel = receiver.getChannel();
|
Preconditions.checkNotNull( receiver, "device cannot be null" );
|
||||||
Set<IReceiver> receivers = m_receivers.get( channel );
|
m_receivers.add( receiver );
|
||||||
if( receivers == null )
|
|
||||||
{
|
|
||||||
receivers = new HashSet<IReceiver>();
|
|
||||||
m_receivers.put( channel, receivers );
|
|
||||||
}
|
|
||||||
receivers.add( receiver );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void removeReceiver( IReceiver receiver )
|
public synchronized void removeReceiver( @Nonnull IPacketReceiver receiver )
|
||||||
{
|
{
|
||||||
int channel = receiver.getChannel();
|
Preconditions.checkNotNull( receiver, "device cannot be null" );
|
||||||
Set<IReceiver> receivers = m_receivers.get( channel );
|
m_receivers.remove( receiver );
|
||||||
if( receivers != null )
|
|
||||||
{
|
|
||||||
receivers.remove( receiver );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void transmit( int channel, int replyChannel, Object payload, World world, Vec3d pos, double range, boolean interdimensional, Object senderObject )
|
public synchronized void transmit( @Nonnull Packet packet )
|
||||||
{
|
{
|
||||||
Set<IReceiver> receivers = m_receivers.get( channel );
|
Preconditions.checkNotNull( packet, "packet cannot be null" );
|
||||||
if( receivers != null )
|
for (IPacketReceiver device : m_receivers)
|
||||||
{
|
{
|
||||||
for( IReceiver receiver : receivers )
|
tryTransmit( device, packet );
|
||||||
{
|
|
||||||
tryTransmit( receiver, replyChannel, payload, world, pos, range, interdimensional, senderObject );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tryTransmit( IReceiver receiver, int replyChannel, Object payload, World world, Vec3d pos, double range, boolean interdimensional, Object senderObject )
|
private void tryTransmit( IPacketReceiver receiver, Packet packet )
|
||||||
{
|
{
|
||||||
if( receiver.getWorld() == world )
|
IPacketSender sender = packet.getSender();
|
||||||
|
if( receiver.getWorld() == sender.getWorld() )
|
||||||
{
|
{
|
||||||
Vec3d position = receiver.getWorldPosition();
|
double receiveRange = Math.max( packet.getRange(), receiver.getRange() ); // Ensure range is symmetrical
|
||||||
double receiveRange = Math.max( range, receiver.getReceiveRange() ); // Ensure range is symmetrical
|
double distanceSq = receiver.getPosition().squareDistanceTo( sender.getPosition() );
|
||||||
double distanceSq = position.squareDistanceTo( pos );
|
if( packet.isInterdimensional() || receiver.isInterdimensional() || distanceSq <= (receiveRange * receiveRange) )
|
||||||
if( interdimensional || receiver.isInterdimensional() || distanceSq <= ( receiveRange * receiveRange ) )
|
|
||||||
{
|
{
|
||||||
receiver.receiveSameDimension( replyChannel, payload, Math.sqrt( distanceSq ), senderObject );
|
receiver.receiveSameDimension( packet, Math.sqrt( distanceSq ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( interdimensional || receiver.isInterdimensional() )
|
if( packet.isInterdimensional() || receiver.isInterdimensional() )
|
||||||
{
|
{
|
||||||
receiver.receiveDifferentDimension( replyChannel, payload, senderObject );
|
receiver.receiveDifferentDimension( packet );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
||||||
|
* Copyright Daniel Ratcliffe, 2011-2017. Do not distribute without permission.
|
||||||
|
* Send enquiries to dratcliffe@gmail.com
|
||||||
|
*/
|
||||||
package dan200.computercraft.shared.pocket.peripherals;
|
package dan200.computercraft.shared.pocket.peripherals;
|
||||||
|
|
||||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
@ -5,11 +10,7 @@ import dan200.computercraft.shared.peripheral.modem.WirelessModemPeripheral;
|
|||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
/*
|
import javax.annotation.Nonnull;
|
||||||
* This file is part of ComputerCraft - http://www.computercraft.info
|
|
||||||
* Copyright Daniel Ratcliffe, 2011-2017. Do not distribute without permission.
|
|
||||||
* Send enquiries to dratcliffe@gmail.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class PocketModemPeripheral extends WirelessModemPeripheral
|
public class PocketModemPeripheral extends WirelessModemPeripheral
|
||||||
{
|
{
|
||||||
@ -33,14 +34,16 @@ public class PocketModemPeripheral extends WirelessModemPeripheral
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected World getWorld()
|
public World getWorld()
|
||||||
{
|
{
|
||||||
return m_world;
|
return m_world;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected Vec3d getPosition()
|
public Vec3d getPosition()
|
||||||
{
|
{
|
||||||
if( m_world != null )
|
if( m_world != null )
|
||||||
{
|
{
|
||||||
|
@ -42,14 +42,16 @@ public class TurtleModem implements ITurtleUpgrade
|
|||||||
m_turtle = turtle;
|
m_turtle = turtle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected World getWorld()
|
public World getWorld()
|
||||||
{
|
{
|
||||||
return m_turtle.getWorld();
|
return m_turtle.getWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
protected Vec3d getPosition()
|
public Vec3d getPosition()
|
||||||
{
|
{
|
||||||
BlockPos turtlePos = m_turtle.getPosition();
|
BlockPos turtlePos = m_turtle.getPosition();
|
||||||
return new Vec3d(
|
return new Vec3d(
|
||||||
|
Loading…
Reference in New Issue
Block a user