mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-31 05:33:00 +00:00 
			
		
		
		
	Merge pull request #518 from SquidDev-CC/ComputerCraft/feature/owner-tracking
Track which player "owns" a turtle
This commit is contained in:
		| @@ -6,6 +6,7 @@ | ||||
|  | ||||
| package dan200.computercraft.api.turtle; | ||||
|  | ||||
| import com.mojang.authlib.GameProfile; | ||||
| import dan200.computercraft.api.lua.ILuaContext; | ||||
| import dan200.computercraft.api.lua.LuaException; | ||||
| import dan200.computercraft.api.peripheral.IPeripheral; | ||||
| @@ -135,6 +136,14 @@ public interface ITurtleAccess | ||||
|      */ | ||||
|     int getColour(); | ||||
|  | ||||
|     /** | ||||
|      * Get the player who owns this turtle, namely whoever placed it. | ||||
|      * | ||||
|      * @return This turtle's owner. | ||||
|      */ | ||||
|     @Nonnull | ||||
|     GameProfile getOwningPlayer(); | ||||
|  | ||||
|     /** | ||||
|      * Get the inventory of this turtle | ||||
|      * | ||||
| @@ -148,7 +157,7 @@ public interface ITurtleAccess | ||||
|      * Get the inventory of this turtle as an {@link IItemHandlerModifiable}. | ||||
|      * | ||||
|      * @return This turtle's inventory | ||||
|      * @see #getInventory()  | ||||
|      * @see #getInventory() | ||||
|      * @see IItemHandlerModifiable | ||||
|      * @see net.minecraftforge.items.CapabilityItemHandler#ITEM_HANDLER_CAPABILITY | ||||
|      */ | ||||
|   | ||||
| @@ -17,11 +17,12 @@ import net.minecraft.block.state.BlockFaceShape; | ||||
| import net.minecraft.block.state.BlockStateContainer; | ||||
| import net.minecraft.block.state.IBlockState; | ||||
| import net.minecraft.entity.EntityLivingBase; | ||||
| import net.minecraft.entity.player.EntityPlayer; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraft.tileentity.TileEntity; | ||||
| import net.minecraft.util.EnumBlockRenderType; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.util.EnumFacing; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.world.IBlockAccess; | ||||
| import net.minecraft.world.World; | ||||
|  | ||||
| @@ -169,6 +170,10 @@ public class BlockTurtle extends BlockComputerBase | ||||
|         { | ||||
|             tile.setWorld( world ); // Not sure why this is necessary | ||||
|             tile.setPos( pos ); // Not sure why this is necessary | ||||
|             if( player instanceof EntityPlayer ) | ||||
|             { | ||||
|                 ((TileTurtle) tile).setOwningPlayer( ((EntityPlayer) player).getGameProfile() ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Set direction | ||||
|   | ||||
| @@ -6,6 +6,7 @@ | ||||
|  | ||||
| package dan200.computercraft.shared.turtle.blocks; | ||||
|  | ||||
| import com.mojang.authlib.GameProfile; | ||||
| import dan200.computercraft.ComputerCraft; | ||||
| import dan200.computercraft.api.turtle.ITurtleAccess; | ||||
| import dan200.computercraft.api.turtle.ITurtleUpgrade; | ||||
| @@ -468,6 +469,12 @@ public class TileTurtle extends TileComputerBase | ||||
|         return m_family; | ||||
|     } | ||||
|  | ||||
|     public void setOwningPlayer( GameProfile player ) | ||||
|     { | ||||
|         m_brain.setOwningPlayer( player ); | ||||
|         markDirty(); | ||||
|     } | ||||
|  | ||||
|     // IInventory | ||||
|  | ||||
|     @Override | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
| package dan200.computercraft.shared.turtle.core; | ||||
|  | ||||
| import com.google.common.base.Objects; | ||||
| import com.mojang.authlib.GameProfile; | ||||
| import dan200.computercraft.ComputerCraft; | ||||
| import dan200.computercraft.api.lua.ILuaContext; | ||||
| import dan200.computercraft.api.lua.LuaException; | ||||
| @@ -107,6 +108,7 @@ public class TurtleBrain implements ITurtleAccess | ||||
|  | ||||
|     private TileTurtle m_owner; | ||||
|     private ComputerProxy m_proxy; | ||||
|     private GameProfile m_owningPlayer; | ||||
|  | ||||
|     private LinkedList<TurtleCommandQueueEntry> m_commandQueue; | ||||
|     private int m_commandsIssued; | ||||
| @@ -233,6 +235,20 @@ public class TurtleBrain implements ITurtleAccess | ||||
|             m_fuelLevel = 0; | ||||
|         } | ||||
|  | ||||
|         // Read owner | ||||
|         if( nbttagcompound.hasKey( "owner", Constants.NBT.TAG_COMPOUND ) ) | ||||
|         { | ||||
|             NBTTagCompound owner = nbttagcompound.getCompoundTag( "owner" ); | ||||
|             m_owningPlayer = new GameProfile( | ||||
|                 new UUID( owner.getLong( "upper_id" ), owner.getLong( "lower_id" ) ), | ||||
|                 owner.getString( "name" ) | ||||
|             ); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             m_owningPlayer = null; | ||||
|         } | ||||
|  | ||||
|         // Read colour | ||||
|         m_colourHex = ColourUtils.getHexColour( nbttagcompound ); | ||||
|  | ||||
| @@ -320,6 +336,17 @@ public class TurtleBrain implements ITurtleAccess | ||||
|         nbttagcompound.setInteger( "selectedSlot", m_selectedSlot ); | ||||
|         nbttagcompound.setInteger( "fuelLevel", m_fuelLevel ); | ||||
|  | ||||
|         // Write owner | ||||
|         if( m_owningPlayer != null ) | ||||
|         { | ||||
|             NBTTagCompound owner = new NBTTagCompound(); | ||||
|             nbttagcompound.setTag( "owner", owner ); | ||||
|  | ||||
|             owner.setLong( "upper_id", m_owningPlayer.getId().getMostSignificantBits() ); | ||||
|             owner.setLong( "upper_id", m_owningPlayer.getId().getLeastSignificantBits() ); | ||||
|             owner.setString( "name", m_owningPlayer.getName() ); | ||||
|         } | ||||
|  | ||||
|         // Write upgrades | ||||
|         String leftUpgradeID = getUpgradeID( getUpgrade( TurtleSide.Left ) ); | ||||
|         if( leftUpgradeID != null ) | ||||
| @@ -837,6 +864,18 @@ public class TurtleBrain implements ITurtleAccess | ||||
|         return m_colourHex; | ||||
|     } | ||||
|  | ||||
|     public void setOwningPlayer( GameProfile profile ) | ||||
|     { | ||||
|         m_owningPlayer = profile; | ||||
|     } | ||||
|  | ||||
|     @Nonnull | ||||
|     @Override | ||||
|     public GameProfile getOwningPlayer() | ||||
|     { | ||||
|         return m_owningPlayer; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public ITurtleUpgrade getUpgrade( @Nonnull TurtleSide side ) | ||||
|     { | ||||
|   | ||||
| @@ -163,7 +163,7 @@ public class TurtlePlaceCommand implements ITurtleCommand | ||||
|  | ||||
|     public static TurtlePlayer createPlayer( ITurtleAccess turtle, BlockPos position, EnumFacing direction ) | ||||
|     { | ||||
|         TurtlePlayer turtlePlayer = new TurtlePlayer( (WorldServer)turtle.getWorld() ); | ||||
|         TurtlePlayer turtlePlayer = new TurtlePlayer( turtle ); | ||||
|         orientPlayer( turtle, turtlePlayer, position, direction ); | ||||
|         return turtlePlayer; | ||||
|     } | ||||
|   | ||||
| @@ -20,11 +20,12 @@ import net.minecraft.world.WorldServer; | ||||
| import net.minecraftforge.common.util.FakePlayer; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
| import javax.annotation.Nullable; | ||||
| import java.util.UUID; | ||||
|  | ||||
| public class TurtlePlayer extends FakePlayer | ||||
| { | ||||
|     private final static GameProfile s_profile = new GameProfile( | ||||
|     public final static GameProfile DEFAULT_PROFILE = new GameProfile( | ||||
|         UUID.fromString( "0d0c4ca0-4ff1-11e4-916c-0800200c9a66" ), | ||||
|         "ComputerCraft" | ||||
|     ); | ||||
| @@ -32,12 +33,25 @@ public class TurtlePlayer extends FakePlayer | ||||
|     @Deprecated | ||||
|     public TurtlePlayer( World world ) | ||||
|     { | ||||
|         this( (WorldServer) world ); | ||||
|         super( (WorldServer) world, DEFAULT_PROFILE ); | ||||
|     } | ||||
|      | ||||
|     public TurtlePlayer( ITurtleAccess turtle ) | ||||
|     { | ||||
|         super( (WorldServer) turtle.getWorld(), getProfile( turtle.getOwningPlayer() )); | ||||
|  | ||||
|         BlockPos position = turtle.getPosition(); | ||||
|         posX = position.getX() + 0.5; | ||||
|         posY = position.getY() + 0.5; | ||||
|         posZ = position.getZ() + 0.5; | ||||
|  | ||||
|         rotationYaw = turtle.getDirection().getHorizontalAngle(); | ||||
|         rotationPitch = 0.0f; | ||||
|     } | ||||
|  | ||||
|     public TurtlePlayer( WorldServer world ) | ||||
|     private static GameProfile getProfile( @Nullable GameProfile profile ) | ||||
|     { | ||||
|         super( world, s_profile ); | ||||
|         return profile != null && profile.isComplete() ? profile : DEFAULT_PROFILE; | ||||
|     } | ||||
|  | ||||
|     public void loadInventory( @Nonnull ItemStack currentStack ) | ||||
|   | ||||
| @@ -118,7 +118,7 @@ public class TurtleInventoryCrafting extends InventoryCrafting | ||||
|             } | ||||
|  | ||||
|             // Do post-pickup stuff | ||||
|             TurtlePlayer turtlePlayer = new TurtlePlayer( (WorldServer)world ); | ||||
|             TurtlePlayer turtlePlayer = new TurtlePlayer( m_turtle ); | ||||
|             result.onCrafting( world, turtlePlayer, numToCraft ); | ||||
|             results.add( result ); | ||||
|  | ||||
|   | ||||
| @@ -32,7 +32,6 @@ import net.minecraft.util.ResourceLocation; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.util.math.Vec3d; | ||||
| import net.minecraft.world.World; | ||||
| import net.minecraft.world.WorldServer; | ||||
| import net.minecraftforge.common.ForgeHooks; | ||||
| import net.minecraftforge.common.MinecraftForge; | ||||
| import net.minecraftforge.event.ForgeEventFactory; | ||||
| @@ -148,10 +147,11 @@ public class TurtleTool implements ITurtleUpgrade | ||||
|         return !block.isAir( state, world, pos ) && block != Blocks.BEDROCK && state.getBlockHardness( world, pos ) > -1.0F; | ||||
|     } | ||||
|      | ||||
|     protected boolean canHarvestBlock( World world, BlockPos pos ) | ||||
|     protected boolean canHarvestBlock( ITurtleAccess turtleAccess, BlockPos pos ) | ||||
|     { | ||||
|         World world = turtleAccess.getWorld(); | ||||
|         Block block = world.getBlockState( pos ).getBlock(); | ||||
|         TurtlePlayer turtlePlayer = new TurtlePlayer( (WorldServer)world ); | ||||
|         TurtlePlayer turtlePlayer = new TurtlePlayer( turtleAccess ); | ||||
|         turtlePlayer.loadInventory( m_item.copy() ); | ||||
|         return ForgeHooks.canHarvestBlock( block, turtlePlayer, world, pos ); | ||||
|     } | ||||
| @@ -267,7 +267,7 @@ public class TurtleTool implements ITurtleUpgrade | ||||
|             } | ||||
|  | ||||
|             // Consume the items the block drops | ||||
|             if( canHarvestBlock( world, newPosition ) ) | ||||
|             if( canHarvestBlock( turtle, newPosition ) ) | ||||
|             { | ||||
|                 List<ItemStack> items = getBlockDropped( world, newPosition, turtlePlayer ); | ||||
|                 if( items != null && items.size() > 0 ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 SquidDev
					SquidDev