From bedac71e3dba731cf4c18df2a15d05be8a4bb17f Mon Sep 17 00:00:00 2001 From: SquidDev Date: Sat, 23 Nov 2019 12:12:02 +0000 Subject: [PATCH] Add a fake network handler to the TurtleFakePlayer This should fix several issues (see #304, etc...). I'll try to get round to PRing this into Forge at some point, though on the other hand this is /super/ ugly. --- .../shared/turtle/core/TurtlePlayer.java | 88 ++++- .../shared/util/FakeNetHandler.java | 360 ++++++++++++++++++ 2 files changed, 446 insertions(+), 2 deletions(-) create mode 100644 src/main/java/dan200/computercraft/shared/util/FakeNetHandler.java 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 64edff54d..9c23e4f14 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java @@ -9,12 +9,20 @@ import com.mojang.authlib.GameProfile; import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.turtle.ITurtleAccess; +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.EntityClassification; import net.minecraft.entity.EntityType; +import net.minecraft.entity.passive.horse.AbstractHorseEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.item.ItemStack; +import net.minecraft.potion.EffectInstance; +import net.minecraft.tileentity.SignTileEntity; import net.minecraft.util.Direction; +import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.server.ServerWorld; @@ -22,6 +30,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.OptionalInt; import java.util.UUID; public final class TurtlePlayer extends FakePlayer @@ -40,6 +49,7 @@ public final class TurtlePlayer extends FakePlayer private TurtlePlayer( ITurtleAccess turtle ) { super( (ServerWorld) turtle.getWorld(), getProfile( turtle.getOwningPlayer() ) ); + this.connection = new FakeNetHandler( this ); setState( turtle ); } @@ -50,6 +60,13 @@ private static GameProfile getProfile( @Nullable GameProfile profile ) private void setState( ITurtleAccess turtle ) { + if( openContainer != null ) + { + ComputerCraft.log.warn( "Turtle has open container ({})", openContainer ); + openContainer.onContainerClosed( this ); + openContainer = null; + } + BlockPos position = turtle.getPosition(); posX = position.getX() + 0.5; posY = position.getY() + 0.5; @@ -126,6 +143,73 @@ public Vec3d getPositionVector() return new Vec3d( posX, posY, posZ ); } - // TODO: Work out what needs stubbing again. - // Or just replace the network. + //region Code which depends on the connection + @Nonnull + @Override + public OptionalInt openContainer( @Nullable INamedContainerProvider prover ) + { + return OptionalInt.empty(); + } + + @Override + public void sendEnterCombat() + { + } + + @Override + public void sendEndCombat() + { + } + + @Override + public boolean startRiding( @Nonnull Entity entityIn, boolean force ) + { + return false; + } + + @Override + public void stopRiding() + { + } + + @Override + public void openSignEditor( SignTileEntity signTile ) + { + } + + @Override + public void openHorseInventory( AbstractHorseEntity horse, IInventory inventory ) + { + } + + @Override + public void openBook( ItemStack stack, @Nonnull Hand hand ) + { + } + + @Override + public void closeScreen() + { + } + + @Override + public void updateHeldItem() + { + } + + @Override + protected void onNewPotionEffect( EffectInstance id ) + { + } + + @Override + protected void onChangedPotionEffect( EffectInstance id, boolean apply ) + { + } + + @Override + protected void onFinishedPotionEffect( EffectInstance effect ) + { + } + //endregion } diff --git a/src/main/java/dan200/computercraft/shared/util/FakeNetHandler.java b/src/main/java/dan200/computercraft/shared/util/FakeNetHandler.java new file mode 100644 index 000000000..9d2c504b9 --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/util/FakeNetHandler.java @@ -0,0 +1,360 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2019. 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; +import javax.crypto.SecretKey; + +public class FakeNetHandler extends ServerPlayNetHandler +{ + public FakeNetHandler( @Nonnull FakePlayer player ) + { + super( player.getServerWorld().getServer(), new FakeNetworkManager(), player ); + } + + @Override + public void tick() + { + } + + @Override + public void disconnect( @Nonnull ITextComponent reason ) + { + } + + @Override + public void onDisconnect( ITextComponent reason ) + { + } + + @Override + public void sendPacket( @Nonnull IPacket packet ) + { + } + + @Override + public void sendPacket( @Nonnull IPacket packet, @Nullable GenericFutureListener> whenSent ) + { + } + + @Override + public void processInput( CInputPacket packet ) + { + } + + @Override + public void processVehicleMove( CMoveVehiclePacket packet ) + { + } + + @Override + public void processConfirmTeleport( CConfirmTeleportPacket packet ) + { + } + + @Override + public void handleRecipeBookUpdate( CRecipeInfoPacket packet ) + { + } + + @Override + public void handleSeenAdvancements( CSeenAdvancementsPacket packet ) + { + } + + @Override + public void processTabComplete( CTabCompletePacket packet ) + { + } + + @Override + public void processUpdateCommandBlock( @Nonnull CUpdateCommandBlockPacket packet ) + { + } + + @Override + public void processUpdateCommandMinecart( @Nonnull CUpdateMinecartCommandBlockPacket packet ) + { + } + + @Override + public void processPickItem( CPickItemPacket packet ) + { + } + + @Override + public void processRenameItem( @Nonnull CRenameItemPacket packet ) + { + } + + @Override + public void processUpdateBeacon( @Nonnull CUpdateBeaconPacket packet ) + { + } + + @Override + public void processUpdateStructureBlock( @Nonnull CUpdateStructureBlockPacket packet ) + { + } + + @Override + public void func_217262_a( @Nonnull CUpdateJigsawBlockPacket packet ) + { + } + + @Override + public void processSelectTrade( CSelectTradePacket packet ) + { + } + + @Override + public void processEditBook( CEditBookPacket packet ) + { + } + + @Override + public void processNBTQueryEntity( @Nonnull CQueryEntityNBTPacket packet ) + { + } + + @Override + public void processNBTQueryBlockEntity( @Nonnull CQueryTileEntityNBTPacket packet ) + { + } + + @Override + public void processPlayer( CPlayerPacket packet ) + { + } + + @Override + public void processPlayerDigging( CPlayerDiggingPacket packet ) + { + } + + @Override + public void processTryUseItemOnBlock( CPlayerTryUseItemOnBlockPacket packet ) + { + } + + @Override + public void processTryUseItem( CPlayerTryUseItemPacket packet ) + { + } + + @Override + public void handleSpectate( @Nonnull CSpectatePacket packet ) + { + } + + @Override + public void handleResourcePackStatus( CResourcePackStatusPacket packet ) + { + } + + @Override + public void processSteerBoat( @Nonnull CSteerBoatPacket packet ) + { + } + + @Override + public void processHeldItemChange( CHeldItemChangePacket packet ) + { + } + + @Override + public void processChatMessage( @Nonnull CChatMessagePacket packet ) + { + } + + @Override + public void handleAnimation( CAnimateHandPacket packet ) + { + } + + @Override + public void processEntityAction( CEntityActionPacket packet ) + { + } + + @Override + public void processUseEntity( CUseEntityPacket packet ) + { + } + + @Override + public void processClientStatus( CClientStatusPacket packet ) + { + } + + @Override + public void processCloseWindow( @Nonnull CCloseWindowPacket packet ) + { + } + + @Override + public void processClickWindow( CClickWindowPacket packet ) + { + } + + @Override + public void processPlaceRecipe( @Nonnull CPlaceRecipePacket packet ) + { + } + + @Override + public void processEnchantItem( CEnchantItemPacket packet ) + { + } + + @Override + public void processCreativeInventoryAction( @Nonnull CCreativeInventoryActionPacket packet ) + { + } + + @Override + public void processConfirmTransaction( CConfirmTransactionPacket packet ) + { + } + + @Override + public void processUpdateSign( CUpdateSignPacket packet ) + { + } + + @Override + public void processKeepAlive( @Nonnull CKeepAlivePacket packet ) + { + } + + @Override + public void processPlayerAbilities( CPlayerAbilitiesPacket packet ) + { + } + + @Override + public void processClientSettings( @Nonnull CClientSettingsPacket packet ) + { + } + + @Override + public void processCustomPayload( CCustomPayloadPacket packet ) + { + } + + @Override + public void func_217263_a( @Nonnull CSetDifficultyPacket packet ) + { + } + + @Override + public void func_217261_a( @Nonnull CLockDifficultyPacket packet ) + { + } + + private static class FakeNetworkManager extends NetworkManager + { + private INetHandler handler; + private ITextComponent closeReason; + + FakeNetworkManager() + { + super( PacketDirection.CLIENTBOUND ); + } + + @Override + public void channelActive( ChannelHandlerContext context ) + { + } + + @Override + public void setConnectionState( @Nonnull ProtocolType state ) + { + } + + @Override + public void channelInactive( ChannelHandlerContext context ) + { + } + + @Override + public void exceptionCaught( ChannelHandlerContext context, @Nonnull Throwable err ) + { + } + + @Override + protected void channelRead0( ChannelHandlerContext context, @Nonnull IPacket packet ) + { + } + + @Override + public void setNetHandler( INetHandler handler ) + { + this.handler = handler; + } + + @Override + public void sendPacket( @Nonnull IPacket packet ) + { + } + + @Override + public void sendPacket( @Nonnull IPacket packet, @Nullable GenericFutureListener> whenSent ) + { + } + + @Override + public void tick() + { + } + + @Override + public void closeChannel( @Nonnull ITextComponent message ) + { + this.closeReason = message; + } + + @Override + public void enableEncryption( SecretKey key ) + { + } + + @Nonnull + @Override + public INetHandler getNetHandler() + { + return handler; + } + + @Nullable + @Override + public ITextComponent getExitMessage() + { + return closeReason; + } + + @Override + public void disableAutoRead() + { + } + + @Override + public void setCompressionThreshold( int threshold ) + { + } + } +}