diff --git a/doc/events/mouse_click.md b/doc/events/mouse_click.md
index 83d371260..ed4f2e3eb 100644
--- a/doc/events/mouse_click.md
+++ b/doc/events/mouse_click.md
@@ -19,8 +19,8 @@ numerical value depending on which button on your mouse was last pressed when th
Button code | Mouse button |
1 | Left button |
- 2 | Middle button |
- 3 | Right button |
+ 2 | Right button |
+ 3 | Middle button |
## Example
diff --git a/gradle.properties b/gradle.properties
index 03c16cd34..b6a70df95 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,7 +1,7 @@
org.gradle.jvmargs=-Xmx3G
# Mod properties
-mod_version=1.100.2
+mod_version=1.100.3
# Minecraft properties (update mods.toml when changing)
mc_version=1.17.1
diff --git a/src/main/java/dan200/computercraft/client/ClientRegistry.java b/src/main/java/dan200/computercraft/client/ClientRegistry.java
index 35e2c98b1..c17253bca 100644
--- a/src/main/java/dan200/computercraft/client/ClientRegistry.java
+++ b/src/main/java/dan200/computercraft/client/ClientRegistry.java
@@ -10,7 +10,6 @@ import dan200.computercraft.client.gui.*;
import dan200.computercraft.client.render.TileEntityMonitorRenderer;
import dan200.computercraft.client.render.TileEntityTurtleRenderer;
import dan200.computercraft.client.render.TurtleModelLoader;
-import dan200.computercraft.client.render.TurtlePlayerRenderer;
import dan200.computercraft.shared.Registry;
import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
@@ -30,7 +29,6 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.ColorHandlerEvent;
-import net.minecraftforge.client.event.EntityRenderersEvent;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.model.ModelLoaderRegistry;
@@ -122,12 +120,6 @@ public final class ClientRegistry
);
}
- @SubscribeEvent
- public static void registerEntityRenderers( EntityRenderersEvent.RegisterRenderers event )
- {
- event.registerEntityRenderer( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new );
- }
-
@SubscribeEvent
public static void setupClient( FMLClientSetupEvent event )
{
diff --git a/src/main/java/dan200/computercraft/shared/CommonHooks.java b/src/main/java/dan200/computercraft/shared/CommonHooks.java
index d8d79ac6b..2839e7287 100644
--- a/src/main/java/dan200/computercraft/shared/CommonHooks.java
+++ b/src/main/java/dan200/computercraft/shared/CommonHooks.java
@@ -21,6 +21,7 @@ import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.dedicated.DedicatedServer;
+import net.minecraft.world.entity.EntityType;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.level.storage.loot.BuiltInLootTables;
import net.minecraft.world.level.storage.loot.LootPool;
@@ -161,4 +162,14 @@ public final class CommonHooks
NetworkHandler.sendToPlayer( event.getPlayer(), packet );
}
}
+
+ @SubscribeEvent
+ public static void onMissingEntityMappingsEvent( RegistryEvent.MissingMappings> event )
+ {
+ ResourceLocation id = new ResourceLocation( ComputerCraft.MOD_ID, "turtle_player" );
+ for( RegistryEvent.MissingMappings.Mapping> mapping : event.getMappings( ComputerCraft.MOD_ID ) )
+ {
+ if( mapping.key.equals( id ) ) mapping.ignore();
+ }
+ }
}
diff --git a/src/main/java/dan200/computercraft/shared/Registry.java b/src/main/java/dan200/computercraft/shared/Registry.java
index 60b95dc0a..5ae9b8851 100644
--- a/src/main/java/dan200/computercraft/shared/Registry.java
+++ b/src/main/java/dan200/computercraft/shared/Registry.java
@@ -61,7 +61,6 @@ import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
import dan200.computercraft.shared.pocket.recipes.PocketComputerUpgradeRecipe;
import dan200.computercraft.shared.turtle.blocks.BlockTurtle;
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.items.ItemTurtle;
import dan200.computercraft.shared.turtle.recipes.TurtleRecipe;
@@ -73,8 +72,6 @@ import dan200.computercraft.shared.util.ImpostorRecipe;
import dan200.computercraft.shared.util.ImpostorShapelessRecipe;
import net.minecraft.core.cauldron.CauldronInteraction;
import net.minecraft.resources.ResourceLocation;
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTab;
@@ -285,18 +282,6 @@ public final class Registry
SERIALISERS.register( "wireless_modem_advanced", () -> PocketUpgradeSerialiser.simpleWithCustomItem( ( id, item ) -> new PocketModem( id, item, true ) ) );
}
- public static class ModEntities
- {
- static final DeferredRegister> ENTITIES = DeferredRegister.create( ForgeRegistries.ENTITIES, ComputerCraft.MOD_ID );
-
- public static final RegistryObject> TURTLE_PLAYER = ENTITIES.register( "turtle_player", () ->
- EntityType.Builder.createNothing( MobCategory.MISC )
- .noSave()
- .noSummon()
- .sized( 0, 0 )
- .build( ComputerCraft.MOD_ID + ":turtle_player" ) );
- }
-
public static class ModContainers
{
static final DeferredRegister> CONTAINERS = DeferredRegister.create( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID );
@@ -425,7 +410,6 @@ public final class Registry
ModItems.ITEMS.register( bus );
ModTurtleSerialisers.SERIALISERS.register( bus );
ModPocketUpgradeSerialisers.SERIALISERS.register( bus );
- ModEntities.ENTITIES.register( bus );
ModContainers.CONTAINERS.register( bus );
}
}
diff --git a/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java b/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java
index e953ef73a..dd83a9856 100644
--- a/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java
+++ b/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java
@@ -160,6 +160,7 @@ public class UploadFileMessage extends ComputerServerMessage
contents.position( currentOffset ).limit( currentOffset + canWrite );
slices.add( new FileSlice( fileId, currentOffset, contents.slice() ) );
currentOffset += canWrite;
+ remaining -= canWrite;
}
contents.position( 0 ).limit( capacity );
diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java
index 257d27600..0905b696c 100644
--- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java
+++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java
@@ -8,7 +8,6 @@ package dan200.computercraft.shared.turtle.core;
import com.mojang.authlib.GameProfile;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.turtle.ITurtleAccess;
-import dan200.computercraft.shared.Registry;
import dan200.computercraft.shared.util.DirectionUtil;
import dan200.computercraft.shared.util.InventoryUtil;
import dan200.computercraft.shared.util.WorldUtil;
@@ -22,7 +21,6 @@ import net.minecraft.world.MenuProvider;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityDimensions;
-import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.entity.animal.horse.AbstractHorse;
import net.minecraft.world.item.ItemStack;
@@ -197,13 +195,6 @@ public final class TurtlePlayer extends FakePlayer
getInventory().setChanged();
}
- @Nonnull
- @Override
- public EntityType> getType()
- {
- return Registry.ModEntities.TURTLE_PLAYER.get();
- }
-
@Override
public Vec3 position()
{
diff --git a/src/main/java/dan200/computercraft/shared/util/IDAssigner.java b/src/main/java/dan200/computercraft/shared/util/IDAssigner.java
index 87c556f51..fa5cecab8 100644
--- a/src/main/java/dan200/computercraft/shared/util/IDAssigner.java
+++ b/src/main/java/dan200/computercraft/shared/util/IDAssigner.java
@@ -45,21 +45,17 @@ public final class IDAssigner
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();
- if( currentServer == null ) return null;
-
- if( currentServer != ServerLifecycleHooks.getCurrentServer() ) return null;
- return currentServer;
+ return currentServer == null || currentServer != ServerLifecycleHooks.getCurrentServer();
}
public static synchronized int getNextId( String kind )
{
- MinecraftServer currentServer = getCachedServer();
- if( currentServer == null )
+ if( hasServerChanged() )
{
// The server has changed, refetch our ID map
server = new WeakReference<>( ServerLifecycleHooks.getCurrentServer() );
@@ -68,23 +64,22 @@ public final class IDAssigner
dir.mkdirs();
// Load our ID file from disk
+ Map newIds = null;
idFile = new File( dir, "ids.json" ).toPath();
if( Files.isRegularFile( idFile ) )
{
try( Reader reader = Files.newBufferedReader( idFile, StandardCharsets.UTF_8 ) )
{
- ids = GSON.fromJson( reader, ID_TOKEN );
+ newIds = GSON.fromJson( reader, ID_TOKEN );
}
catch( Exception e )
{
ComputerCraft.log.error( "Cannot load id file '" + idFile + "'", e );
- ids = new HashMap<>();
}
}
- else
- {
- ids = new HashMap<>();
- }
+
+ if( newIds == null ) newIds = new HashMap<>();
+ ids = newIds;
}
Integer existing = ids.get( kind );
diff --git a/src/main/resources/data/computercraft/advancements/recipes/turtle_normal.json b/src/main/resources/data/computercraft/advancements/recipes/turtle_normal.json
index 482be3e1c..b3c9e4982 100644
--- a/src/main/resources/data/computercraft/advancements/recipes/turtle_normal.json
+++ b/src/main/resources/data/computercraft/advancements/recipes/turtle_normal.json
@@ -1,7 +1,7 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
- "recipes": [ "computercraft:normal_turtle_normal" ]
+ "recipes": [ "computercraft:turtle_normal" ]
},
"criteria": {
"has_normal": {
diff --git a/src/main/resources/data/computercraft/lua/rom/help/changelog.md b/src/main/resources/data/computercraft/lua/rom/help/changelog.md
index 8f58dd7b3..b77563427 100644
--- a/src/main/resources/data/computercraft/lua/rom/help/changelog.md
+++ b/src/main/resources/data/computercraft/lua/rom/help/changelog.md
@@ -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
Several bug fixes:
diff --git a/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md b/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md
index bbd0e76f2..ce9e428f4 100644
--- a/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md
+++ b/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md
@@ -1,7 +1,9 @@
-New features in CC: Tweaked 1.100.2
+New features in CC: Tweaked 1.100.3
Several bug fixes:
-* Fix wired modems swapping the modem/peripheral block state.
-* Remove debugging logging line from `turtle.attack`.
+* 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.
Type "help changelog" to see the full version history.