diff --git a/src/main/java/dan200/computercraft/api/turtle/event/FakePlayer.java b/src/main/java/dan200/computercraft/api/turtle/event/FakePlayer.java index 4d59a8404..927439bf4 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/FakePlayer.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/FakePlayer.java @@ -7,9 +7,47 @@ package dan200.computercraft.api.turtle.event; import com.mojang.authlib.GameProfile; +import io.netty.channel.ChannelHandlerContext; +import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.GenericFutureListener; +import net.minecraft.block.entity.CommandBlockBlockEntity; +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.command.arguments.EntityAnchorArgumentType; +import net.minecraft.container.Container; +import net.minecraft.container.NameableContainerProvider; +import net.minecraft.entity.Entity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.passive.HorseBaseEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.NetworkSide; +import net.minecraft.network.NetworkState; +import net.minecraft.network.Packet; +import net.minecraft.recipe.Recipe; +import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerInteractionManager; +import net.minecraft.server.network.packet.RequestCommandCompletionsC2SPacket; +import net.minecraft.server.network.packet.VehicleMoveC2SPacket; import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.text.ChatMessageType; +import net.minecraft.text.TextComponent; +import net.minecraft.util.DefaultedList; +import net.minecraft.util.Hand; +import net.minecraft.util.math.Vec3d; +import net.minecraft.village.TraderOfferList; +import net.minecraft.world.GameMode; +import net.minecraft.world.chunk.ChunkPos; +import net.minecraft.world.dimension.DimensionType; + +import javax.annotation.Nullable; +import javax.crypto.SecretKey; +import java.util.Collection; +import java.util.OptionalInt; /** * A wrapper for {@link ServerPlayerEntity} which denotes a "fake" player. @@ -22,5 +60,227 @@ public class FakePlayer extends ServerPlayerEntity public FakePlayer( ServerWorld world, GameProfile gameProfile ) { super( world.getServer(), world, gameProfile, new ServerPlayerInteractionManager( world ) ); + networkHandler = new FakeNetHandler( this ); + } + + // region Direct networkHandler access + @Override + public void method_6000() { } + + @Override + public void method_6044() { } + + @Override + public void tick() { } + + @Override + public void method_14226() { } + + @Override + public void onDeath( DamageSource damage ) { } + + @Nullable + @Override + public Entity changeDimension( DimensionType dimension ) + { + return this; + } + + @Override + public void wakeUp( boolean resetTimer, boolean notify, boolean setSpawn ) { } + + @Override + public boolean startRiding( Entity entity, boolean flag ) + { + return false; + } + + @Override + public void stopRiding() { } + + @Override + public void openEditSignScreen( SignBlockEntity tile ) { } + + @Override + public OptionalInt openContainer( @Nullable NameableContainerProvider container ) + { + return OptionalInt.empty(); + } + + @Override + public void sendTradeOffers( int id, TraderOfferList list, int level, int experience, boolean levelled ) { } + + @Override + public void openHorseInventory( HorseBaseEntity horse, Inventory inventory ) { } + + @Override + public void openEditBookScreen( ItemStack stack, Hand hand ) { } + + @Override + public void openCommandBlockScreen( CommandBlockBlockEntity block ) { } + + @Override + public void onContainerSlotUpdate( Container container, int slot, ItemStack stack ) { } + + @Override + public void onContainerRegistered( Container container, DefaultedList defaultedList ) { } + + @Override + public void onContainerPropertyUpdate( Container container, int key, int value ) { } + + @Override + public void closeContainer() { } + + @Override + public void method_14241() { } + + @Override + public void addChatMessage( TextComponent textComponent, boolean status ) { } + + @Override + protected void method_6040() { } + + @Override + public void lookAt( EntityAnchorArgumentType.EntityAnchor anchor, Vec3d vec3d ) { } + + @Override + public void method_14222( EntityAnchorArgumentType.EntityAnchor self, Entity entity, EntityAnchorArgumentType.EntityAnchor target ) { } + + @Override + protected void method_6020( StatusEffectInstance statusEffectInstance ) { } + + @Override + protected void method_6009( StatusEffectInstance statusEffectInstance, boolean particles ) { } + + @Override + protected void method_6129( StatusEffectInstance statusEffectInstance ) { } + + @Override + public void requestTeleport( double x, double y, double z ) { } + + @Override + public void setGameMode( GameMode gameMode ) { } + + @Override + public void sendChatMessage( TextComponent textComponent, ChatMessageType chatMessageType ) { } + + @Override + public String getServerBrand() + { + return "[Fake Player]"; + } + + @Override + public void method_14255( String url, String hash ) { } + + @Override + public void onStoppedTracking( Entity entity ) { } + + @Override + public void setCameraEntity( Entity entity ) { } + + @Override + public void teleport( ServerWorld serverWorld, double x, double y, double z, float pitch, float yaw ) { } + + @Override + public void sendInitialChunkPackets( ChunkPos chunkPos, Packet packet, Packet packet2 ) { } + + @Override + public void sendUnloadChunkPacket( ChunkPos chunkPos ) { } + + @Override + public void playSound( SoundEvent soundEvent, SoundCategory soundCategory, float volume, float pitch ) { } + // endregion + + // Indirect + @Override + public int lockRecipes( Collection> recipes ) + { + return 0; + } + + @Override + public int unlockRecipes( Collection> recipes ) + { + return 0; + } + // + + private static class FakeNetHandler extends ServerPlayNetworkHandler + { + FakeNetHandler( ServerPlayerEntity player ) + { + super( player.server, new FakeConnection(), player ); + } + + @Override + public void disconnect( TextComponent message ) { } + + @Override + public void onRequestCommandCompletions( RequestCommandCompletionsC2SPacket packet ) { } + + @Override + public void sendPacket( Packet packet, @Nullable GenericFutureListener> listener ) { } + + @Override + public void onVehicleMove( VehicleMoveC2SPacket move ) { } + } + + private static class FakeConnection extends ClientConnection + { + FakeConnection() + { + super( NetworkSide.SERVER ); + } + + @Override + public void channelActive( ChannelHandlerContext active ) + { + } + + @Override + public void setState( NetworkState state ) + { + } + + @Override + public void disconnect( TextComponent message ) + { + } + + @Override + public void exceptionCaught( ChannelHandlerContext context, Throwable err ) + { + } + + @Override + protected void method_10770( ChannelHandlerContext context, Packet packet ) + { + } + + @Override + public void tick() + { + } + + @Override + public void setupEncryption( SecretKey key ) + { + } + + @Override + public void disableAutoRead() + { + } + + @Override + public void setMinCompressedSize( int size ) + { + } + + @Override + public void send( Packet packet, @Nullable GenericFutureListener> listener ) + { + } } } 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 d57373b78..aa64430d7 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java @@ -7,28 +7,16 @@ package dan200.computercraft.shared.turtle.core; import com.mojang.authlib.GameProfile; -import com.mojang.datafixers.util.Either; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.event.FakePlayer; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.ItemStorage; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.command.arguments.EntityAnchorArgumentType; -import net.minecraft.container.Container; -import net.minecraft.entity.Entity; -import net.minecraft.entity.passive.HorseBaseEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.TextComponent; -import net.minecraft.util.DefaultedList; -import net.minecraft.util.Void; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -122,87 +110,4 @@ public final class TurtlePlayer extends FakePlayer inventory.markDirty(); return results; } - - @Override - public void method_6000() - { - } - - @Override - public void method_6044() - { - } - - @Override - @Nullable - public Entity changeDimension( DimensionType dimensionType ) - { - return null; - } - - @Nonnull - @Override - public Either trySleep( @Nonnull BlockPos bedLocation ) - { - return Either.left( PlayerEntity.SleepFailureReason.INVALID_ATTEMPT ); - } - - @Override - public boolean startRiding( Entity entity, boolean bool ) - { - return false; - } - - @Override - public void stopRiding() - { - } - - @Override - public void openHorseInventory( HorseBaseEntity entity, Inventory inventory ) - { - } - - @Override - public void onContainerRegistered( Container container, DefaultedList defaultedList ) - { - } - - @Override - public void onContainerPropertyUpdate( Container container, int i, int j ) - { - } - - - @Override - public void closeContainer() - { - } - - @Override - public void onContainerSlotUpdate( Container container, int i, ItemStack itemStack ) - { - } - - @Override - public void method_14241() - { - } - - @Override - public void addChatMessage( TextComponent textComponent, boolean bool ) - { - } - - @Override - protected void method_6040() - { - } - - @Override - public void lookAt( EntityAnchorArgumentType.EntityAnchor anchor, Vec3d pos ) - { - } - - // TODO: Finish this off. }