1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-11-04 23:53:01 +00:00

Compare commits

...

9 Commits

Author SHA1 Message Date
Jonathan Coates
bcc7dd6991 Fix typo in Javadoc 2022-03-02 12:54:59 +00:00
Jonathan Coates
bd36185662 Bump version
Holding off until Forge releases for 1.18.2
2022-02-28 15:35:16 +00:00
Jonathan Coates
045c4fc88c Merge pull request #1027 from Toad-Dev/issue-1026
Fix large file uploads producing oversized packets.
2022-02-28 11:06:59 +00:00
Jonathan Coates
e0fcc425c6 Prevent id map being null when file is empty
Fixes #1030
2022-02-28 11:01:04 +00:00
Jonathan Coates
e01895d719 Remove turtle_player EntityType
This was added in the 1.13 update and I'm still not sure why. Other mods
seem to get away without it, so I think it's fine to remove.

Also remove the fake net manager, as that's part of Forge nowadays.

Fixes #1044.
2022-02-28 10:34:41 +00:00
Jonathan Coates
87b38f4249 Fix incorrect recipe name in turtle advancement 2022-02-28 10:32:33 +00:00
Toad-Dev
60d1d1bb18 Fix large file uploads producing oversized packets.
- Fixes #1026
- The remaining bytes counter wasn't being decremented, so the code that
  splits off smaller packets was unreachable. Thus all file slices were
  being put into a single UploadFileMessage packet.
2022-01-23 22:31:27 -08:00
Jonathan Coates
cdf8b77ffd Merge pull request #1017 from Possseidon/patch-1
Fix table with mouse button codes in documentation.
2022-01-20 12:40:09 +00:00
Possseidon
e2ce52fe81 Fix table with mouse button codes.
Codes for right and middle mouse buttons were swapped.
2022-01-19 17:39:19 +01:00
13 changed files with 40 additions and 405 deletions

View File

@@ -19,8 +19,8 @@ numerical value depending on which button on your mouse was last pressed when th
<!-- Our markdown parser doesn't work on tables!? Guess I'll have to roll my own soonish :/. --> <!-- Our markdown parser doesn't work on tables!? Guess I'll have to roll my own soonish :/. -->
<tr><th>Button code</th><th>Mouse button</th></tr> <tr><th>Button code</th><th>Mouse button</th></tr>
<tr><td align="right">1</td><td>Left button</td></tr> <tr><td align="right">1</td><td>Left button</td></tr>
<tr><td align="right">2</td><td>Middle button</td></tr> <tr><td align="right">2</td><td>Right button</td></tr>
<tr><td align="right">3</td><td>Right button</td></tr> <tr><td align="right">3</td><td>Middle button</td></tr>
</table> </table>
## Example ## Example

View File

@@ -1,5 +1,5 @@
# Mod properties # Mod properties
mod_version=1.100.2 mod_version=1.100.3
# Minecraft properties (update mods.toml when changing) # Minecraft properties (update mods.toml when changing)
mc_version=1.16.5 mc_version=1.16.5

View File

@@ -118,7 +118,7 @@ public final class ComputerCraftAPI
} }
/** /**
* rers a peripheral provider to convert blocks into {@link IPeripheral} implementations. * Registers a peripheral provider to convert blocks into {@link IPeripheral} implementations.
* *
* @param provider The peripheral provider to register. * @param provider The peripheral provider to register.
* @see IPeripheral * @see IPeripheral

View File

@@ -10,7 +10,6 @@ import dan200.computercraft.client.gui.*;
import dan200.computercraft.client.render.TileEntityMonitorRenderer; import dan200.computercraft.client.render.TileEntityMonitorRenderer;
import dan200.computercraft.client.render.TileEntityTurtleRenderer; import dan200.computercraft.client.render.TileEntityTurtleRenderer;
import dan200.computercraft.client.render.TurtleModelLoader; import dan200.computercraft.client.render.TurtleModelLoader;
import dan200.computercraft.client.render.TurtlePlayerRenderer;
import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.Registry;
import dan200.computercraft.shared.common.IColouredItem; import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
@@ -33,7 +32,6 @@ import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
@@ -140,8 +138,6 @@ public final class ClientRegistry
net.minecraftforge.fml.client.registry.ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.TURTLE_NORMAL.get(), TileEntityTurtleRenderer::new ); net.minecraftforge.fml.client.registry.ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.TURTLE_NORMAL.get(), TileEntityTurtleRenderer::new );
net.minecraftforge.fml.client.registry.ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.TURTLE_ADVANCED.get(), TileEntityTurtleRenderer::new ); net.minecraftforge.fml.client.registry.ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.TURTLE_ADVANCED.get(), TileEntityTurtleRenderer::new );
RenderingRegistry.registerEntityRenderingHandler( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new );
registerItemProperty( "state", registerItemProperty( "state",
( stack, world, player ) -> ItemPocketComputer.getState( stack ).ordinal(), ( stack, world, player ) -> ItemPocketComputer.getState( stack ).ordinal(),
Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED

View File

@@ -16,6 +16,7 @@ import dan200.computercraft.shared.computer.core.IComputer;
import dan200.computercraft.shared.computer.core.IContainerComputer; import dan200.computercraft.shared.computer.core.IContainerComputer;
import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.core.ServerComputer;
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
import net.minecraft.entity.EntityType;
import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Container;
import net.minecraft.loot.ConstantRange; import net.minecraft.loot.ConstantRange;
import net.minecraft.loot.LootPool; import net.minecraft.loot.LootPool;
@@ -24,10 +25,7 @@ import net.minecraft.loot.TableLootEntry;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.AddReloadListenerEvent; import net.minecraftforge.event.*;
import net.minecraftforge.event.LootTableLoadEvent;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.player.PlayerContainerEvent; import net.minecraftforge.event.entity.player.PlayerContainerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@@ -146,4 +144,14 @@ public final class CommonHooks
{ {
event.addListener( ResourceMount.RELOAD_LISTENER ); event.addListener( ResourceMount.RELOAD_LISTENER );
} }
@SubscribeEvent
public static void onMissingEntityMappingsEvent( RegistryEvent.MissingMappings<EntityType<?>> event )
{
ResourceLocation id = new ResourceLocation( ComputerCraft.MOD_ID, "turtle_player" );
for( RegistryEvent.MissingMappings.Mapping<EntityType<?>> mapping : event.getMappings( ComputerCraft.MOD_ID ) )
{
if( mapping.key.equals( id ) ) mapping.ignore();
}
}
} }

View File

@@ -60,7 +60,6 @@ import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
import dan200.computercraft.shared.pocket.recipes.PocketComputerUpgradeRecipe; import dan200.computercraft.shared.pocket.recipes.PocketComputerUpgradeRecipe;
import dan200.computercraft.shared.turtle.blocks.BlockTurtle; import dan200.computercraft.shared.turtle.blocks.BlockTurtle;
import dan200.computercraft.shared.turtle.blocks.TileTurtle; import dan200.computercraft.shared.turtle.blocks.TileTurtle;
import dan200.computercraft.shared.turtle.core.TurtlePlayer;
import dan200.computercraft.shared.turtle.inventory.ContainerTurtle; import dan200.computercraft.shared.turtle.inventory.ContainerTurtle;
import dan200.computercraft.shared.turtle.items.ItemTurtle; import dan200.computercraft.shared.turtle.items.ItemTurtle;
import dan200.computercraft.shared.turtle.recipes.TurtleRecipe; import dan200.computercraft.shared.turtle.recipes.TurtleRecipe;
@@ -70,8 +69,6 @@ import dan200.computercraft.shared.util.*;
import net.minecraft.block.AbstractBlock; import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.EntityType;
import net.minecraft.inventory.container.ContainerType; import net.minecraft.inventory.container.ContainerType;
import net.minecraft.item.*; import net.minecraft.item.*;
import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.IRecipeSerializer;
@@ -296,18 +293,6 @@ public final class Registry
ComputerCraftAPI.registerPocketUpgrade( ComputerCraft.PocketUpgrades.speaker = new PocketSpeaker() ); ComputerCraftAPI.registerPocketUpgrade( ComputerCraft.PocketUpgrades.speaker = new PocketSpeaker() );
} }
public static class ModEntities
{
static final DeferredRegister<EntityType<?>> ENTITIES = DeferredRegister.create( ForgeRegistries.ENTITIES, ComputerCraft.MOD_ID );
public static final RegistryObject<EntityType<TurtlePlayer>> TURTLE_PLAYER = ENTITIES.register( "turtle_player", () ->
EntityType.Builder.<TurtlePlayer>createNothing( EntityClassification.MISC )
.noSave()
.noSummon()
.sized( 0, 0 )
.build( ComputerCraft.MOD_ID + ":turtle_player" ) );
}
public static class ModContainers public static class ModContainers
{ {
static final DeferredRegister<ContainerType<?>> CONTAINERS = DeferredRegister.create( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID ); static final DeferredRegister<ContainerType<?>> CONTAINERS = DeferredRegister.create( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID );
@@ -418,7 +403,6 @@ public final class Registry
ModBlocks.BLOCKS.register( bus ); ModBlocks.BLOCKS.register( bus );
ModTiles.TILES.register( bus ); ModTiles.TILES.register( bus );
ModItems.ITEMS.register( bus ); ModItems.ITEMS.register( bus );
ModEntities.ENTITIES.register( bus );
ModContainers.CONTAINERS.register( bus ); ModContainers.CONTAINERS.register( bus );
} }
} }

View File

@@ -160,6 +160,7 @@ public class UploadFileMessage extends ComputerServerMessage
contents.position( currentOffset ).limit( currentOffset + canWrite ); contents.position( currentOffset ).limit( currentOffset + canWrite );
slices.add( new FileSlice( fileId, currentOffset, contents.slice() ) ); slices.add( new FileSlice( fileId, currentOffset, contents.slice() ) );
currentOffset += canWrite; currentOffset += canWrite;
remaining -= canWrite;
} }
contents.position( 0 ).limit( capacity ); contents.position( 0 ).limit( capacity );

View File

@@ -8,14 +8,11 @@ package dan200.computercraft.shared.turtle.core;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleAccess;
import dan200.computercraft.shared.Registry;
import dan200.computercraft.shared.util.DirectionUtil; import dan200.computercraft.shared.util.DirectionUtil;
import dan200.computercraft.shared.util.FakeNetHandler;
import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.InventoryUtil;
import dan200.computercraft.shared.util.WorldUtil; import dan200.computercraft.shared.util.WorldUtil;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntitySize; import net.minecraft.entity.EntitySize;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.Pose; import net.minecraft.entity.Pose;
import net.minecraft.entity.passive.horse.AbstractHorseEntity; import net.minecraft.entity.passive.horse.AbstractHorseEntity;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
@@ -54,7 +51,6 @@ public final class TurtlePlayer extends FakePlayer
GameProfile profile = turtle.getOwningPlayer(); GameProfile profile = turtle.getOwningPlayer();
TurtlePlayer player = new TurtlePlayer( world, getProfile( profile ) ); TurtlePlayer player = new TurtlePlayer( world, getProfile( profile ) );
player.connection = new FakeNetHandler( player );
player.setState( turtle ); player.setState( turtle );
if( profile != null && profile.getId() != null ) if( profile != null && profile.getId() != null )
@@ -203,13 +199,6 @@ public final class TurtlePlayer extends FakePlayer
inventory.setChanged(); inventory.setChanged();
} }
@Nonnull
@Override
public EntityType<?> getType()
{
return Registry.ModEntities.TURTLE_PLAYER.get();
}
@Override @Override
public Vector3d position() public Vector3d position()
{ {

View File

@@ -1,348 +0,0 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.util;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import net.minecraft.network.*;
import net.minecraft.network.play.ServerPlayNetHandler;
import net.minecraft.network.play.client.*;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.common.util.FakePlayer;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class FakeNetHandler extends ServerPlayNetHandler
{
public FakeNetHandler( @Nonnull FakePlayer player )
{
super( player.getLevel().getServer(), new FakeNetworkManager(), player );
}
@Override
public void tick()
{
}
@Override
public void disconnect( @Nonnull ITextComponent reason )
{
}
@Override
public void onDisconnect( @Nonnull ITextComponent reason )
{
}
@Override
public void send( @Nonnull IPacket<?> packet )
{
}
@Override
public void send( @Nonnull IPacket<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> whenSent )
{
}
@Override
public void handlePlayerInput( @Nonnull CInputPacket packet )
{
}
@Override
public void handleMoveVehicle( @Nonnull CMoveVehiclePacket packet )
{
}
@Override
public void handleAcceptTeleportPacket( @Nonnull CConfirmTeleportPacket packet )
{
}
@Override
public void handleSeenAdvancements( @Nonnull CSeenAdvancementsPacket packet )
{
}
@Override
public void handleCustomCommandSuggestions( @Nonnull CTabCompletePacket packet )
{
}
@Override
public void handleSetCommandBlock( @Nonnull CUpdateCommandBlockPacket packet )
{
}
@Override
public void handleSetCommandMinecart( @Nonnull CUpdateMinecartCommandBlockPacket packet )
{
}
@Override
public void handlePickItem( @Nonnull CPickItemPacket packet )
{
}
@Override
public void handleRenameItem( @Nonnull CRenameItemPacket packet )
{
}
@Override
public void handleSetBeaconPacket( @Nonnull CUpdateBeaconPacket packet )
{
}
@Override
public void handleSetStructureBlock( @Nonnull CUpdateStructureBlockPacket packet )
{
}
@Override
public void handleSetJigsawBlock( @Nonnull CUpdateJigsawBlockPacket packet )
{
}
@Override
public void handleSelectTrade( @Nonnull CSelectTradePacket packet )
{
}
@Override
public void handleEditBook( @Nonnull CEditBookPacket packet )
{
}
@Override
public void handleEntityTagQuery( @Nonnull CQueryEntityNBTPacket packet )
{
}
@Override
public void handleBlockEntityTagQuery( @Nonnull CQueryTileEntityNBTPacket packet )
{
}
@Override
public void handleMovePlayer( @Nonnull CPlayerPacket packet )
{
}
@Override
public void handlePlayerAction( @Nonnull CPlayerDiggingPacket packet )
{
}
@Override
public void handleUseItemOn( @Nonnull CPlayerTryUseItemOnBlockPacket packet )
{
}
@Override
public void handleUseItem( @Nonnull CPlayerTryUseItemPacket packet )
{
}
@Override
public void handleTeleportToEntityPacket( @Nonnull CSpectatePacket packet )
{
}
@Override
public void handleResourcePackResponse( @Nonnull CResourcePackStatusPacket packet )
{
}
@Override
public void handlePaddleBoat( @Nonnull CSteerBoatPacket packet )
{
}
@Override
public void handleSetCarriedItem( @Nonnull CHeldItemChangePacket packet )
{
}
@Override
public void handleChat( @Nonnull CChatMessagePacket packet )
{
}
@Override
public void handleAnimate( @Nonnull CAnimateHandPacket packet )
{
}
@Override
public void handlePlayerCommand( @Nonnull CEntityActionPacket packet )
{
}
@Override
public void handleInteract( @Nonnull CUseEntityPacket packet )
{
}
@Override
public void handleClientCommand( @Nonnull CClientStatusPacket packet )
{
}
@Override
public void handleContainerClose( @Nonnull CCloseWindowPacket packet )
{
}
@Override
public void handleContainerClick( @Nonnull CClickWindowPacket packet )
{
}
@Override
public void handlePlaceRecipe( @Nonnull CPlaceRecipePacket packet )
{
}
@Override
public void handleContainerButtonClick( @Nonnull CEnchantItemPacket packet )
{
}
@Override
public void handleSetCreativeModeSlot( @Nonnull CCreativeInventoryActionPacket packet )
{
}
@Override
public void handleContainerAck( @Nonnull CConfirmTransactionPacket packet )
{
}
@Override
public void handleSignUpdate( @Nonnull CUpdateSignPacket packet )
{
}
@Override
public void handleKeepAlive( @Nonnull CKeepAlivePacket packet )
{
}
@Override
public void handlePlayerAbilities( @Nonnull CPlayerAbilitiesPacket packet )
{
}
@Override
public void handleClientInformation( @Nonnull CClientSettingsPacket packet )
{
}
@Override
public void handleCustomPayload( @Nonnull CCustomPayloadPacket packet )
{
}
@Override
public void handleChangeDifficulty( @Nonnull CSetDifficultyPacket packet )
{
}
@Override
public void handleLockDifficulty( @Nonnull CLockDifficultyPacket packet )
{
}
private static class FakeNetworkManager extends NetworkManager
{
private INetHandler handler;
private ITextComponent closeReason;
FakeNetworkManager()
{
super( PacketDirection.CLIENTBOUND );
}
@Override
public void channelActive( @Nonnull ChannelHandlerContext context )
{
}
@Override
public void setProtocol( @Nonnull ProtocolType state )
{
}
@Override
public void channelInactive( @Nonnull ChannelHandlerContext context )
{
}
@Override
public void exceptionCaught( @Nonnull ChannelHandlerContext context, @Nonnull Throwable err )
{
}
@Override
protected void channelRead0( @Nonnull ChannelHandlerContext context, @Nonnull IPacket<?> packet )
{
}
@Override
public void setListener( @Nonnull INetHandler handler )
{
this.handler = handler;
}
@Override
public void send( @Nonnull IPacket<?> packet )
{
}
@Override
public void send( @Nonnull IPacket<?> packet, @Nullable GenericFutureListener<? extends Future<? super Void>> whenSent )
{
}
@Override
public void tick()
{
}
@Override
public void disconnect( @Nonnull ITextComponent message )
{
closeReason = message;
}
@Nonnull
@Override
public INetHandler getPacketListener()
{
return handler;
}
@Nullable
@Override
public ITextComponent getDisconnectedReason()
{
return closeReason;
}
@Override
public void setReadOnly()
{
}
@Override
public void setupCompression( int threshold )
{
}
}
}

View File

@@ -45,21 +45,17 @@ public final class IDAssigner
return ServerLifecycleHooks.getCurrentServer().getWorldPath( FOLDER ).toFile(); return ServerLifecycleHooks.getCurrentServer().getWorldPath( FOLDER ).toFile();
} }
private static MinecraftServer getCachedServer() private static boolean hasServerChanged()
{ {
if( server == null ) return null; if( server == null ) return true;
MinecraftServer currentServer = server.get(); MinecraftServer currentServer = server.get();
if( currentServer == null ) return null; return currentServer == null || currentServer != ServerLifecycleHooks.getCurrentServer();
if( currentServer != ServerLifecycleHooks.getCurrentServer() ) return null;
return currentServer;
} }
public static synchronized int getNextId( String kind ) public static synchronized int getNextId( String kind )
{ {
MinecraftServer currentServer = getCachedServer(); if( hasServerChanged() )
if( currentServer == null )
{ {
// The server has changed, refetch our ID map // The server has changed, refetch our ID map
server = new WeakReference<>( ServerLifecycleHooks.getCurrentServer() ); server = new WeakReference<>( ServerLifecycleHooks.getCurrentServer() );
@@ -68,23 +64,22 @@ public final class IDAssigner
dir.mkdirs(); dir.mkdirs();
// Load our ID file from disk // Load our ID file from disk
Map<String, Integer> newIds = null;
idFile = new File( dir, "ids.json" ).toPath(); idFile = new File( dir, "ids.json" ).toPath();
if( Files.isRegularFile( idFile ) ) if( Files.isRegularFile( idFile ) )
{ {
try( Reader reader = Files.newBufferedReader( idFile, StandardCharsets.UTF_8 ) ) try( Reader reader = Files.newBufferedReader( idFile, StandardCharsets.UTF_8 ) )
{ {
ids = GSON.fromJson( reader, ID_TOKEN ); newIds = GSON.fromJson( reader, ID_TOKEN );
} }
catch( Exception e ) catch( Exception e )
{ {
ComputerCraft.log.error( "Cannot load id file '" + idFile + "'", e ); ComputerCraft.log.error( "Cannot load id file '" + idFile + "'", e );
ids = new HashMap<>();
} }
} }
else
{ if( newIds == null ) newIds = new HashMap<>();
ids = new HashMap<>(); ids = newIds;
}
} }
Integer existing = ids.get( kind ); Integer existing = ids.get( kind );

View File

@@ -1,7 +1,7 @@
{ {
"parent": "minecraft:recipes/root", "parent": "minecraft:recipes/root",
"rewards": { "rewards": {
"recipes": [ "computercraft:normal_turtle_normal" ] "recipes": [ "computercraft:turtle_normal" ]
}, },
"criteria": { "criteria": {
"has_normal": { "has_normal": {

View File

@@ -1,3 +1,11 @@
# New features in CC: Tweaked 1.100.3
Several bug fixes:
* Fix client disconnect when uploading large files.
* Correctly handling empty computer ID file.
* Fix the normal turtle recipe not being unlocked.
* Remove turtle fake EntityType.
# New features in CC: Tweaked 1.100.2 # New features in CC: Tweaked 1.100.2
Several bug fixes: Several bug fixes:

View File

@@ -1,7 +1,9 @@
New features in CC: Tweaked 1.100.2 New features in CC: Tweaked 1.100.3
Several bug fixes: Several bug fixes:
* Fix wired modems swapping the modem/peripheral block state. * Fix client disconnect when uploading large files.
* Remove debugging logging line from `turtle.attack`. * Correctly handling empty computer ID file.
* Fix the normal turtle recipe not being unlocked.
* Remove turtle fake EntityType.
Type "help changelog" to see the full version history. Type "help changelog" to see the full version history.