1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-10-26 11:27:38 +00:00

Merge branch 'master' into mc-1.13.x

This commit is contained in:
SquidDev
2019-04-09 11:11:12 +01:00
29 changed files with 410 additions and 236 deletions

View File

@@ -6,7 +6,6 @@
package dan200.computercraft.shared;
import com.google.common.base.Preconditions;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider;
@@ -16,6 +15,7 @@ import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
public final class BundledRedstone
@@ -26,7 +26,7 @@ public final class BundledRedstone
public static synchronized void register( @Nonnull IBundledRedstoneProvider provider )
{
Preconditions.checkNotNull( provider, "provider cannot be null" );
Objects.requireNonNull( provider, "provider cannot be null" );
providers.add( provider );
}

View File

@@ -11,8 +11,8 @@ import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.apis.IAPIEnvironment;
import dan200.computercraft.core.computer.Computer;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.core.tracking.ComputerTracker;
import dan200.computercraft.core.tracking.Tracking;
import dan200.computercraft.core.tracking.TrackingContext;
@@ -118,12 +118,12 @@ public final class CommandComputerCraft
table.row( header( "Position" ), linkPosition( context.getSource(), computer ) );
table.row( header( "Family" ), text( computer.getFamily().toString() ) );
for( int i = 0; i < 6; i++ )
for( ComputerSide side : ComputerSide.values() )
{
IPeripheral peripheral = computer.getPeripheral( i );
IPeripheral peripheral = computer.getPeripheral( side );
if( peripheral != null )
{
table.row( header( "Peripheral " + IAPIEnvironment.SIDE_NAMES[i] ), text( peripheral.getType() ) );
table.row( header( "Peripheral " + side.getName() ), text( peripheral.getType() ) );
}
}

View File

@@ -16,7 +16,7 @@ public final class Exceptions
public static final DynamicCommandExceptionType COMPUTER_ARG_NONE = translated1( "argument.computercraft.computer.no_matching" );
public static final Dynamic2CommandExceptionType COMPUTER_ARG_MANY = translated2( "argument.computercraft.computer.many_matching" );
public static final DynamicCommandExceptionType TRACKING_FIELD_ARG_NONE = translated1( "argument.computercraft.tacking_field.no_field" );
public static final DynamicCommandExceptionType TRACKING_FIELD_ARG_NONE = translated1( "argument.computercraft.tracking_field.no_field" );
static final SimpleCommandExceptionType NOT_TRACKING_EXCEPTION = translated( "commands.computercraft.track.stop.not_enabled" );
static final SimpleCommandExceptionType NO_TIMINGS_EXCEPTION = translated( "commands.computercraft.track.dump.no_timings" );

View File

@@ -6,6 +6,7 @@
package dan200.computercraft.shared.computer.blocks;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.shared.common.BlockGeneric;
import dan200.computercraft.shared.common.IBundledRedstoneBlock;
import dan200.computercraft.shared.computer.core.ComputerFamily;
@@ -65,9 +66,8 @@ public abstract class BlockComputerBase<T extends TileComputerBase> extends Bloc
ServerComputer computer = computerEntity.getServerComputer();
if( computer == null ) return 0;
EnumFacing localSide = computerEntity.remapToLocalSide( incomingSide.getOpposite() );
return computerEntity.isRedstoneBlockedOnSide( localSide ) ? 0 :
computer.getRedstoneOutput( localSide.getIndex() );
ComputerSide localSide = computerEntity.remapToLocalSide( incomingSide.getOpposite() );
return computerEntity.isRedstoneBlockedOnSide( localSide ) ? 0 : computer.getRedstoneOutput( localSide );
}
@Nonnull
@@ -105,9 +105,8 @@ public abstract class BlockComputerBase<T extends TileComputerBase> extends Bloc
ServerComputer computer = computerEntity.getServerComputer();
if( computer == null ) return 0;
EnumFacing localSide = computerEntity.remapToLocalSide( side );
return computerEntity.isRedstoneBlockedOnSide( localSide ) ? 0 :
computer.getBundledRedstoneOutput( localSide.getIndex() );
ComputerSide localSide = computerEntity.remapToLocalSide( side );
return computerEntity.isRedstoneBlockedOnSide( localSide ) ? 0 : computer.getBundledRedstoneOutput( localSide );
}
@Nonnull

View File

@@ -7,6 +7,7 @@
package dan200.computercraft.shared.computer.blocks;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.core.ComputerState;
import dan200.computercraft.shared.computer.core.ServerComputer;
@@ -95,8 +96,12 @@ public class TileComputer extends TileComputerBase
}
@Override
protected EnumFacing remapLocalSide( EnumFacing localSide )
protected ComputerSide remapLocalSide( ComputerSide localSide )
{
return localSide.getAxis() == EnumFacing.Axis.X ? localSide.getOpposite() : localSide;
// For legacy reasons, computers invert the meaning of "left" and "right". A computer's front is facing
// towards you, but a turtle's front is facing the other way.
if( localSide == ComputerSide.RIGHT ) return ComputerSide.LEFT;
if( localSide == ComputerSide.LEFT ) return ComputerSide.RIGHT;
return localSide;
}
}

View File

@@ -9,6 +9,7 @@ package dan200.computercraft.shared.computer.blocks;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.shared.BundledRedstone;
import dan200.computercraft.shared.Peripherals;
import dan200.computercraft.shared.common.TileGeneric;
@@ -198,24 +199,24 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
m_on = m_startOn = nbt.getBoolean( NBT_ON );
}
protected boolean isPeripheralBlockedOnSide( EnumFacing localSide )
protected boolean isPeripheralBlockedOnSide( ComputerSide localSide )
{
return false;
}
protected boolean isRedstoneBlockedOnSide( EnumFacing localSide )
protected boolean isRedstoneBlockedOnSide( ComputerSide localSide )
{
return false;
}
protected abstract EnumFacing getDirection();
protected EnumFacing remapToLocalSide( EnumFacing globalSide )
protected ComputerSide remapToLocalSide( EnumFacing globalSide )
{
return remapLocalSide( DirectionUtil.toLocal( getDirection(), globalSide ) );
}
protected EnumFacing remapLocalSide( EnumFacing localSide )
protected ComputerSide remapLocalSide( ComputerSide localSide )
{
return localSide;
}
@@ -223,15 +224,15 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
private void updateSideInput( ServerComputer computer, EnumFacing dir, BlockPos offset )
{
EnumFacing offsetSide = dir.getOpposite();
EnumFacing localDir = remapToLocalSide( dir );
ComputerSide localDir = remapToLocalSide( dir );
if( !isRedstoneBlockedOnSide( localDir ) )
{
computer.setRedstoneInput( localDir.getIndex(), getWorld().getRedstonePower( offset, dir ) );
computer.setBundledRedstoneInput( localDir.getIndex(), BundledRedstone.getOutput( getWorld(), offset, offsetSide ) );
computer.setRedstoneInput( localDir, getWorld().getRedstonePower( offset, dir ) );
computer.setBundledRedstoneInput( localDir, BundledRedstone.getOutput( getWorld(), offset, offsetSide ) );
}
if( !isPeripheralBlockedOnSide( localDir ) )
{
computer.setPeripheral( localDir.getIndex(), Peripherals.getPeripheral( getWorld(), offset, offsetSide ) );
computer.setPeripheral( localDir, Peripherals.getPeripheral( getWorld(), offset, offsetSide ) );
}
}
@@ -257,7 +258,6 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
ServerComputer computer = getServerComputer();
if( computer == null ) return;
// Find the appropriate side and update.
BlockPos pos = computer.getPosition();
for( EnumFacing dir : DirectionUtil.FACINGS )
{
@@ -268,6 +268,9 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
break;
}
}
// If the position is not any adjacent one, update all inputs.
updateInput();
}
public void updateOutput()

View File

@@ -14,6 +14,7 @@ import dan200.computercraft.api.lua.ILuaAPI;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.apis.IAPIEnvironment;
import dan200.computercraft.core.computer.Computer;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.core.computer.IComputerEnvironment;
import dan200.computercraft.shared.common.ServerTerminal;
import dan200.computercraft.shared.network.NetworkHandler;
@@ -261,22 +262,22 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput
m_computer.queueEvent( event, arguments );
}
public int getRedstoneOutput( int side )
public int getRedstoneOutput( ComputerSide side )
{
return m_computer.getEnvironment().getExternalRedstoneOutput( side );
}
public void setRedstoneInput( int side, int level )
public void setRedstoneInput( ComputerSide side, int level )
{
m_computer.getEnvironment().setRedstoneInput( side, level );
}
public int getBundledRedstoneOutput( int side )
public int getBundledRedstoneOutput( ComputerSide side )
{
return m_computer.getEnvironment().getExternalBundledRedstoneOutput( side );
}
public void setBundledRedstoneInput( int side, int combination )
public void setBundledRedstoneInput( ComputerSide side, int combination )
{
m_computer.getEnvironment().setBundledRedstoneInput( side, combination );
}
@@ -286,12 +287,12 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput
m_computer.addApi( api );
}
public void setPeripheral( int side, IPeripheral peripheral )
public void setPeripheral( ComputerSide side, IPeripheral peripheral )
{
m_computer.getEnvironment().setPeripheral( side, peripheral );
}
public IPeripheral getPeripheral( int side )
public IPeripheral getPeripheral( ComputerSide side )
{
return m_computer.getEnvironment().getPeripheral( side );
}

View File

@@ -10,6 +10,7 @@ import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.pocket.IPocketAccess;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.core.ServerComputer;
@@ -123,14 +124,14 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces
public void invalidatePeripheral()
{
IPeripheral peripheral = m_upgrade == null ? null : m_upgrade.createPeripheral( this );
setPeripheral( 2, peripheral );
setPeripheral( ComputerSide.BACK, peripheral );
}
@Nonnull
@Override
public Map<ResourceLocation, IPeripheral> getUpgrades()
{
return m_upgrade == null ? Collections.emptyMap() : Collections.singletonMap( m_upgrade.getUpgradeID(), getPeripheral( 2 ) );
return m_upgrade == null ? Collections.emptyMap() : Collections.singletonMap( m_upgrade.getUpgradeID(), getPeripheral( ComputerSide.BACK ) );
}
public IPocketUpgrade getUpgrade()

View File

@@ -12,6 +12,7 @@ import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.filesystem.IMount;
import dan200.computercraft.api.media.IMedia;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.shared.PocketUpgrades;
import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.core.ClientComputer;
@@ -120,7 +121,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
// Update pocket upgrade
if( upgrade != null )
{
upgrade.update( computer, computer.getPeripheral( 2 ) );
upgrade.update( computer, computer.getPeripheral( ComputerSide.BACK ) );
}
}
}
@@ -149,7 +150,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
if( upgrade != null )
{
computer.updateValues( player, stack, upgrade );
stop = upgrade.onRightClick( world, computer, computer.getPeripheral( 2 ) );
stop = upgrade.onRightClick( world, computer, computer.getPeripheral( ComputerSide.BACK ) );
}
}

View File

@@ -13,6 +13,7 @@ import dan200.computercraft.api.turtle.ITurtleAccess;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.shared.computer.blocks.ComputerPeripheral;
import dan200.computercraft.shared.computer.blocks.ComputerProxy;
import dan200.computercraft.shared.computer.blocks.TileComputerBase;
@@ -324,13 +325,13 @@ public class TileTurtle extends TileComputerBase implements ITurtleTile, Default
}
@Override
protected boolean isPeripheralBlockedOnSide( EnumFacing localSide )
protected boolean isPeripheralBlockedOnSide( ComputerSide localSide )
{
return hasPeripheralUpgradeOnSide( localSide );
}
@Override
protected boolean isRedstoneBlockedOnSide( EnumFacing localSide )
protected boolean isRedstoneBlockedOnSide( ComputerSide localSide )
{
return false;
}
@@ -568,15 +569,15 @@ public class TileTurtle extends TileComputerBase implements ITurtleTile, Default
// Privates
private boolean hasPeripheralUpgradeOnSide( EnumFacing side )
private boolean hasPeripheralUpgradeOnSide( ComputerSide side )
{
ITurtleUpgrade upgrade;
switch( side )
{
case WEST:
case RIGHT:
upgrade = getUpgrade( TurtleSide.Right );
break;
case EAST:
case LEFT:
upgrade = getUpgrade( TurtleSide.Left );
break;
default:

View File

@@ -13,6 +13,7 @@ import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.turtle.*;
import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.computer.blocks.ComputerProxy;
import dan200.computercraft.shared.computer.blocks.TileComputerBase;
@@ -730,15 +731,15 @@ public class TurtleBrain implements ITurtleAccess
: 0.0f;
}
private static int toDirection( TurtleSide side )
private static ComputerSide toDirection( TurtleSide side )
{
switch( side )
{
case Left:
return 5;
return ComputerSide.LEFT;
case Right:
default:
return 4;
return ComputerSide.RIGHT;
}
}

View File

@@ -6,6 +6,7 @@
package dan200.computercraft.shared.util;
import dan200.computercraft.core.computer.ComputerSide;
import net.minecraft.util.EnumFacing;
public final class DirectionUtil
@@ -14,28 +15,16 @@ public final class DirectionUtil
public static final EnumFacing[] FACINGS = EnumFacing.values();
public static EnumFacing toLocal( EnumFacing front, EnumFacing relative )
public static ComputerSide toLocal( EnumFacing front, EnumFacing dir )
{
if( relative.getAxis() == EnumFacing.Axis.Y ) return relative;
if( front.getAxis() == EnumFacing.Axis.Y ) front = EnumFacing.NORTH;
if( relative == front )
{
return EnumFacing.SOUTH;
}
else if( relative == front.getOpposite() )
{
return EnumFacing.NORTH;
}
else if( relative == front.rotateYCCW() )
{
return EnumFacing.EAST;
}
else
{
return EnumFacing.WEST;
}
if( dir == front ) return ComputerSide.FRONT;
if( dir == front.getOpposite() ) return ComputerSide.BACK;
if( dir == front.rotateYCCW() ) return ComputerSide.LEFT;
if( dir == front.rotateY() ) return ComputerSide.RIGHT;
if( dir == EnumFacing.UP ) return ComputerSide.TOP;
return ComputerSide.BOTTOM;
}
public static float toPitchAngle( EnumFacing dir )

View File

@@ -10,22 +10,20 @@ import net.minecraft.block.state.IBlockState;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.event.ForgeEventFactory;
import java.util.EnumSet;
public final class RedstoneUtil
{
public static void propagateRedstoneOutput( World world, BlockPos pos, EnumFacing side )
{
// Propagate ordinary output
// Propagate ordinary output. See BlockRedstoneDiode.notifyNeighbors
IBlockState block = world.getBlockState( pos );
if( ForgeEventFactory.onNeighborNotify( world, pos, block, EnumSet.of( side ), false ).isCanceled() ) return;
BlockPos neighbourPos = pos.offset( side );
IBlockState neighbour = world.getBlockState( neighbourPos );
if( !neighbour.isAir( world, pos ) )
{
world.neighborChanged( neighbourPos, block.getBlock(), pos );
if( neighbour.getBlock().isNormalCube( neighbour, world, neighbourPos ) )
{
world.notifyNeighborsOfStateExcept( neighbourPos, block.getBlock(), side.getOpposite() );
}
}
world.neighborChanged( neighbourPos, block.getBlock(), pos );
world.notifyNeighborsOfStateExcept( neighbourPos, block.getBlock(), side.getOpposite() );
}
}