1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-11-02 22:53:15 +00:00

Compare commits

...

11 Commits

Author SHA1 Message Date
Jonathan Coates
2c64186965 Bump version to 1.100.4 2022-03-23 08:36:09 +00:00
Jonathan Coates
31ba17d085 Don't wait for the chunk to be loaded when checking for monitors
There's a couple of alternative ways to solve this. Ideally we'd send
our network messages at the same time as MC does
(ChunkManager.playerLoadedChunk), but this'd require a mixin.

Instead we just rely on the fact that if the chunk isn't loaded,
monitors won't have done anything and so we don't need to send their
contents!

Fixes #1047, probably doesn't cause any regressions. I've not seen any
issues on 1.16, but I also hadn't before so ¯\_(ツ)_/¯.
2022-03-18 19:59:02 +00:00
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
14 changed files with 45 additions and 407 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 :/. -->
<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">2</td><td>Middle button</td></tr>
<tr><td align="right">3</td><td>Right button</td></tr>
<tr><td align="right">2</td><td>Right button</td></tr>
<tr><td align="right">3</td><td>Middle button</td></tr>
</table>
## Example

View File

@@ -1,5 +1,5 @@
# Mod properties
mod_version=1.100.2
mod_version=1.100.4
# Minecraft properties (update mods.toml when changing)
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.
* @see IPeripheral

View File

@@ -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;
@@ -33,7 +32,6 @@ import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.Mod;
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_ADVANCED.get(), TileEntityTurtleRenderer::new );
RenderingRegistry.registerEntityRenderingHandler( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new );
registerItemProperty( "state",
( stack, world, player ) -> ItemPocketComputer.getState( stack ).ordinal(),
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.ServerComputer;
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
import net.minecraft.entity.EntityType;
import net.minecraft.inventory.container.Container;
import net.minecraft.loot.ConstantRange;
import net.minecraft.loot.LootPool;
@@ -24,10 +25,7 @@ import net.minecraft.loot.TableLootEntry;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.AddReloadListenerEvent;
import net.minecraftforge.event.LootTableLoadEvent;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.*;
import net.minecraftforge.event.entity.player.PlayerContainerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
@@ -146,4 +144,14 @@ public final class CommonHooks
{
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.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;
@@ -70,8 +69,6 @@ import dan200.computercraft.shared.util.*;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
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.item.*;
import net.minecraft.item.crafting.IRecipeSerializer;
@@ -296,18 +293,6 @@ public final class Registry
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
{
static final DeferredRegister<ContainerType<?>> CONTAINERS = DeferredRegister.create( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID );
@@ -418,7 +403,6 @@ public final class Registry
ModBlocks.BLOCKS.register( bus );
ModTiles.TILES.register( bus );
ModItems.ITEMS.register( bus );
ModEntities.ENTITIES.register( bus );
ModContainers.CONTAINERS.register( bus );
}
}

View File

@@ -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 );

View File

@@ -15,7 +15,6 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.ChunkStatus;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.world.ChunkWatchEvent;
@@ -47,8 +46,10 @@ public final class MonitorWatcher
@SubscribeEvent
public static void onWatch( ChunkWatchEvent.Watch event )
{
// Get the current chunk if it has been loaded. This is safe as, if the chunk hasn't been loaded yet, then the
// monitor will have no contents, and so we won't need to send an update anyway.
ChunkPos chunkPos = event.getPos();
Chunk chunk = (Chunk) event.getWorld().getChunk( chunkPos.x, chunkPos.z, ChunkStatus.FULL, false );
Chunk chunk = event.getWorld().getChunkSource().getChunkNow( chunkPos.x, chunkPos.z );
if( chunk == null ) return;
for( TileEntity te : chunk.getBlockEntities().values() )

View File

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

View File

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

View File

@@ -1,3 +1,16 @@
# New features in CC: Tweaked 1.100.4
Several bug fixes:
* Fix the monitor watching blocking the main thread when chunks are slow to load.
# 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:

View File

@@ -1,7 +1,6 @@
New features in CC: Tweaked 1.100.2
New features in CC: Tweaked 1.100.4
Several bug fixes:
* Fix wired modems swapping the modem/peripheral block state.
* Remove debugging logging line from `turtle.attack`.
* Fix the monitor watching blocking the main thread when chunks are slow to load.
Type "help changelog" to see the full version history.