1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-06-17 10:50:01 +00:00

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.
This commit is contained in:
SquidDev 2019-11-23 12:12:02 +00:00
parent ee4e42e730
commit bedac71e3d
2 changed files with 446 additions and 2 deletions

View File

@ -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
}

View File

@ -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<? extends Future<? super Void>> 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<? extends Future<? super Void>> 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 )
{
}
}
}