1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-12-15 12:40:30 +00:00

Merge branch 'mc-1.15.x' into mc-1.16.x

This commit is contained in:
SquidDev 2020-07-18 10:34:29 +01:00
commit 4efde2b294
8 changed files with 62 additions and 33 deletions

View File

@ -16,15 +16,10 @@ import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer;
import dan200.computercraft.shared.pocket.peripherals.PocketModem; import dan200.computercraft.shared.pocket.peripherals.PocketModem;
import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker; import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
import dan200.computercraft.shared.turtle.upgrades.*; import dan200.computercraft.shared.turtle.upgrades.*;
import net.minecraft.resources.IResourceManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.server.ServerLifecycleHooks;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
@ -82,6 +77,7 @@ public final class ComputerCraft
public static int modemHighAltitudeRangeDuringStorm = 384; public static int modemHighAltitudeRangeDuringStorm = 384;
public static int maxNotesPerTick = 8; public static int maxNotesPerTick = 8;
public static MonitorRenderer monitorRenderer = MonitorRenderer.BEST; public static MonitorRenderer monitorRenderer = MonitorRenderer.BEST;
public static double monitorDistanceSq = 4096;
public static long monitorBandwidth = 1_000_000; public static long monitorBandwidth = 1_000_000;
public static boolean turtlesNeedFuel = true; public static boolean turtlesNeedFuel = true;
@ -138,17 +134,4 @@ public final class ComputerCraft
Config.setup(); Config.setup();
Registry.setup(); Registry.setup();
} }
public static InputStream getResourceFile( String domain, String subPath )
{
IResourceManager manager = ServerLifecycleHooks.getCurrentServer().getDataPackRegistries().func_240970_h_();
try
{
return manager.getResource( new ResourceLocation( domain, subPath ) ).getInputStream();
}
catch( IOException ignored )
{
return null;
}
}
} }

View File

@ -27,6 +27,7 @@ import dan200.computercraft.shared.wired.WiredNode;
import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IReloadableResourceManager;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -36,6 +37,8 @@ import net.minecraftforge.fml.server.ServerLifecycleHooks;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import static dan200.computercraft.shared.Capabilities.CAPABILITY_WIRED_ELEMENT; import static dan200.computercraft.shared.Capabilities.CAPABILITY_WIRED_ELEMENT;
@ -49,6 +52,19 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
{ {
} }
public static InputStream getResourceFile( String domain, String subPath )
{
IReloadableResourceManager manager = (IReloadableResourceManager) ServerLifecycleHooks.getCurrentServer().getDataPackRegistries().func_240970_h_();
try
{
return manager.getResource( new ResourceLocation( domain, subPath ) ).getInputStream();
}
catch( IOException ignored )
{
return null;
}
}
@Nonnull @Nonnull
@Override @Override
public String getInstalledVersion() public String getInstalledVersion()

View File

@ -15,8 +15,7 @@ import javax.annotation.Nullable;
* The interface that defines a peripheral. * The interface that defines a peripheral.
* *
* In order to expose a peripheral for your block or tile entity, you may either attach a {@link Capability}, or * In order to expose a peripheral for your block or tile entity, you may either attach a {@link Capability}, or
* register a {@link IPeripheralProvider}. It is <em>not</em> recommended to implement {@link IPeripheral} directly on * register a {@link IPeripheralProvider}. This <em>cannot</em> be implemented {@link IPeripheral} directly on the tile.
* the tile.
* *
* Peripherals should provide a series of methods to the user, either using {@link LuaFunction} or by implementing * Peripherals should provide a series of methods to the user, either using {@link LuaFunction} or by implementing
* {@link IDynamicPeripheral}. * {@link IDynamicPeripheral}.

View File

@ -10,6 +10,7 @@ import dan200.computercraft.api.filesystem.IMount;
import dan200.computercraft.api.filesystem.IWritableMount; import dan200.computercraft.api.filesystem.IWritableMount;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.IOException; import java.io.IOException;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
@ -85,7 +86,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw new FileSystemException( e.getMessage() ); throw localExceptionOf( path, e );
} }
} }
@ -98,7 +99,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw localExceptionOf( e ); throw localExceptionOf( path, e );
} }
} }
@ -116,7 +117,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw localExceptionOf( e ); throw localExceptionOf( path, e );
} }
} }
@ -130,7 +131,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw localExceptionOf( e ); throw localExceptionOf( path, e );
} }
} }
@ -145,7 +146,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw localExceptionOf( e ); throw localExceptionOf( path, e );
} }
} }
@ -165,7 +166,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw localExceptionOf( e ); throw localExceptionOf( path, e );
} }
} }
@ -187,7 +188,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw localExceptionOf( e ); throw localExceptionOf( path, e );
} }
} }
@ -195,9 +196,9 @@ class MountWrapper
{ {
if( writableMount == null ) throw exceptionOf( path, "Access denied" ); if( writableMount == null ) throw exceptionOf( path, "Access denied" );
path = toLocal( path );
try try
{ {
path = toLocal( path );
if( mount.exists( path ) ) if( mount.exists( path ) )
{ {
writableMount.delete( path ); writableMount.delete( path );
@ -209,7 +210,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw localExceptionOf( e ); throw localExceptionOf( path, e );
} }
} }
@ -243,7 +244,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw localExceptionOf( e ); throw localExceptionOf( path, e );
} }
} }
@ -281,7 +282,7 @@ class MountWrapper
} }
catch( IOException e ) catch( IOException e )
{ {
throw localExceptionOf( e ); throw localExceptionOf( path, e );
} }
} }
@ -290,7 +291,7 @@ class MountWrapper
return FileSystem.toLocal( path, location ); return FileSystem.toLocal( path, location );
} }
private FileSystemException localExceptionOf( IOException e ) private FileSystemException localExceptionOf( @Nullable String localPath, @Nonnull IOException e )
{ {
if( !location.isEmpty() && e instanceof FileOperationException ) if( !location.isEmpty() && e instanceof FileOperationException )
{ {
@ -298,6 +299,14 @@ class MountWrapper
if( ex.getFilename() != null ) return localExceptionOf( ex.getFilename(), ex.getMessage() ); if( ex.getFilename() != null ) return localExceptionOf( ex.getFilename(), ex.getMessage() );
} }
if( e instanceof java.nio.file.FileSystemException )
{
// This error will contain the absolute path, leaking information about where MC is installed. We drop that,
// just taking the reason. We assume that the error refers to the input path.
String message = ((java.nio.file.FileSystemException) e).getReason().trim();
return localPath == null ? new FileSystemException( message ) : localExceptionOf( localPath, message );
}
return new FileSystemException( e.getMessage() ); return new FileSystemException( e.getMessage() );
} }

View File

@ -85,6 +85,7 @@ public final class Config
private static final ConfigValue<Boolean> genericPeripheral; private static final ConfigValue<Boolean> genericPeripheral;
private static final ConfigValue<MonitorRenderer> monitorRenderer; private static final ConfigValue<MonitorRenderer> monitorRenderer;
private static final ConfigValue<Integer> monitorDistance;
private static final ForgeConfigSpec serverSpec; private static final ForgeConfigSpec serverSpec;
private static final ForgeConfigSpec clientSpec; private static final ForgeConfigSpec clientSpec;
@ -311,6 +312,10 @@ public final class Config
.comment( "The renderer to use for monitors. Generally this should be kept at \"best\" - if " + .comment( "The renderer to use for monitors. Generally this should be kept at \"best\" - if " +
"monitors have performance issues, you may wish to experiment with alternative renderers." ) "monitors have performance issues, you may wish to experiment with alternative renderers." )
.defineEnum( "monitor_renderer", MonitorRenderer.BEST ); .defineEnum( "monitor_renderer", MonitorRenderer.BEST );
monitorDistance = clientBuilder
.comment( "The maximum distance monitors will render at. This defaults to the standard tile entity limit, " +
"but may be extended if you wish to build larger monitors." )
.defineInRange( "monitor_distance", 64, 16, 1024 );
clientSpec = clientBuilder.build(); clientSpec = clientBuilder.build();
} }
@ -379,6 +384,7 @@ public final class Config
// Client // Client
ComputerCraft.monitorRenderer = monitorRenderer.get(); ComputerCraft.monitorRenderer = monitorRenderer.get();
ComputerCraft.monitorDistanceSq = monitorDistance.get() * monitorDistance.get();
} }
@SubscribeEvent @SubscribeEvent

View File

@ -6,6 +6,7 @@
package dan200.computercraft.shared.computer.core; package dan200.computercraft.shared.computer.core;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.ComputerCraftAPIImpl;
import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.filesystem.IMount; import dan200.computercraft.api.filesystem.IMount;
import dan200.computercraft.api.filesystem.IWritableMount; import dan200.computercraft.api.filesystem.IWritableMount;
@ -333,7 +334,7 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput
@Override @Override
public InputStream createResourceFile( String domain, String subPath ) public InputStream createResourceFile( String domain, String subPath )
{ {
return ComputerCraft.getResourceFile( domain, subPath ); return ComputerCraftAPIImpl.getResourceFile( domain, subPath );
} }
@Override @Override

View File

@ -690,4 +690,10 @@ public class TileMonitor extends TileGeneric
return new AxisAlignedBB( pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1 ); return new AxisAlignedBB( pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1 );
} }
} }
@Override
public double getMaxRenderDistanceSquared()
{
return ComputerCraft.monitorDistanceSq;
}
} }

View File

@ -99,6 +99,15 @@ describe("The fs library", function()
handle.close() handle.close()
expect.error(handle.close):eq("attempt to use a closed file") expect.error(handle.close):eq("attempt to use a closed file")
end) end)
it("fails gracefully when opening 'CON' on Windows", function()
local ok, err = fs.open("test-files/con", "w")
if ok then fs.delete("test-files/con") return end
-- On my Windows/Java version the message appears to be "Incorrect function.". It may not be
-- consistent though, and honestly doesn't matter too much.
expect(err):str_match("^/test%-files/con: .*")
end)
end) end)
describe("writing in binary mode", function() describe("writing in binary mode", function()