mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-11-04 15:43:00 +00:00 
			
		
		
		
	Minor cleanup of pocket computer upgrades
- General improvements of the docs. - Move all ItemStack code to the ItemPocketComputer class - Make PocketAPI execute on the server thread, rather than the computer thread
This commit is contained in:
		@@ -15,25 +15,25 @@ import java.util.Map;
 | 
			
		||||
public interface IPocketAccess
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the holding entity of this item
 | 
			
		||||
     * Gets the entity holding this item.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The holding entity, may be {@code null}.
 | 
			
		||||
     * @return The holding entity. This may be {@code null}.
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    Entity getEntity();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the colour of the modem light.
 | 
			
		||||
     * Get the colour of the pocket computer's light.
 | 
			
		||||
     *
 | 
			
		||||
     * See {@link #setLight(int)} for the values this may return.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The colour of the modem light.
 | 
			
		||||
     * @return The colour of the pocket computer's light.
 | 
			
		||||
     * @see #setLight(int)
 | 
			
		||||
     */
 | 
			
		||||
    int getLight();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the colour of the modem light. Use {@link 0} to turn it off.
 | 
			
		||||
     * Set the colour of the pocket computer's light. Use {@link 0} to turn it off.
 | 
			
		||||
     *
 | 
			
		||||
     * Colours take the form of an integer between 0 and 15, using the opposite order to those in
 | 
			
		||||
     * {@link <a href="http://www.computercraft.info/wiki/Colors_(API)#Colors">The colors API</a>}  - so 0 being black,
 | 
			
		||||
@@ -45,31 +45,32 @@ public interface IPocketAccess
 | 
			
		||||
    void setLight( int value );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the upgrade specific NBT
 | 
			
		||||
     * Get the upgrade-specific NBT.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The upgrade's NBT
 | 
			
		||||
     * This is persisted between computer reboots and chunk loads.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The upgrade's NBT.
 | 
			
		||||
     * @see #updateUpgradeNBTData()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    NBTTagCompound getUpgradeNBTData();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Mark the upgrade specific NBT as dirty
 | 
			
		||||
     * Mark the upgrade-specific NBT as dirty.
 | 
			
		||||
     *
 | 
			
		||||
     * @see #getUpgradeNBTData()
 | 
			
		||||
     */
 | 
			
		||||
    void updateUpgradeNBTData();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Remove the current peripheral and create a new one. You
 | 
			
		||||
     * may wish to do this if the methods available change.
 | 
			
		||||
     * Remove the current peripheral and create a new one. You may wish to do this if the methods available change.
 | 
			
		||||
     */
 | 
			
		||||
    void invalidatePeripheral();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a list of all upgrades for the pocket computer
 | 
			
		||||
     * Get a list of all upgrades for the pocket computer.
 | 
			
		||||
     *
 | 
			
		||||
     * @return A collection of all upgrade names
 | 
			
		||||
     * @return A collection of all upgrade names.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Map<ResourceLocation, IPeripheral> getUpgrades();
 | 
			
		||||
 
 | 
			
		||||
@@ -2,9 +2,7 @@ package dan200.computercraft.api.pocket;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.ComputerCraftAPI;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleAccess;
 | 
			
		||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import dan200.computercraft.api.turtle.TurtleSide;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
@@ -14,18 +12,20 @@ import javax.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Additional peripherals for pocket computers.
 | 
			
		||||
 * <p>
 | 
			
		||||
 *
 | 
			
		||||
 * This is similar to {@link dan200.computercraft.api.turtle.ITurtleUpgrade}.
 | 
			
		||||
 */
 | 
			
		||||
public interface IPocketUpgrade
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a unique identifier representing this type of turtle upgrade. eg: "computercraft:wireless_modem" or "my_mod:my_upgrade".
 | 
			
		||||
     * You should use a unique resource domain to ensure this upgrade is uniquely identified.
 | 
			
		||||
     * The peripheral will fail registration if an already used ID is specified.
 | 
			
		||||
     * Gets a unique identifier representing this type of turtle upgrade. eg: "computercraft:wireless_modem" or
 | 
			
		||||
     * "my_mod:my_upgrade".
 | 
			
		||||
     *
 | 
			
		||||
     * @return The id
 | 
			
		||||
     * You should use a unique resource domain to ensure this upgrade is uniquely identified. The upgrade will fail
 | 
			
		||||
     * registration if an already used ID is specified.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The upgrade's id.
 | 
			
		||||
     * @see IPocketUpgrade#getUpgradeID()
 | 
			
		||||
     * @see ComputerCraftAPI#registerPocketUpgrade(IPocketUpgrade)
 | 
			
		||||
     */
 | 
			
		||||
@@ -33,54 +33,59 @@ public interface IPocketUpgrade
 | 
			
		||||
    ResourceLocation getUpgradeID();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a String to describe this type of turtle in turtle item names.
 | 
			
		||||
     * An example of built-in adjectives is "Wireless".
 | 
			
		||||
     * Return an unlocalised string to describe the type of pocket computer this upgrade provides.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The unlocalised adjective
 | 
			
		||||
     * An example of a built-in adjectives is "Wireless" - this is converted to "Wireless Pocket Computer".
 | 
			
		||||
     *
 | 
			
		||||
     * @return The unlocalised adjective.
 | 
			
		||||
     * @see ITurtleUpgrade#getUnlocalisedAdjective()
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    String getUnlocalisedAdjective();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return an item stack representing the type of item that a turtle must be crafted
 | 
			
		||||
     * with to create a turtle which holds this upgrade. This item stack is also used
 | 
			
		||||
     * to determine the upgrade given by turtle.equip()
 | 
			
		||||
     * Return an item stack representing the type of item that a pocket computer must be crafted with to create a
 | 
			
		||||
     * pocket computer which holds this upgrade. This item stack is also used to determine the upgrade given by
 | 
			
		||||
     * {@code pocket.equip()}/{@code pocket.unequip()}.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The item stack used for crafting. This can be {@code null} if crafting is disabled.
 | 
			
		||||
     * @see ITurtleUpgrade#getCraftingItem()
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    ItemStack getCraftingItem();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a peripheral for the pocket computer.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * The peripheral created will be stored for the lifetime of the upgrade, will have update() called
 | 
			
		||||
     * once-per-tick, and will be attached, detached and have methods called in the same manner as a Computer peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * @param access The access object for the pocket item stack
 | 
			
		||||
     * The peripheral created will be stored for the lifetime of the upgrade, will be passed an argument to
 | 
			
		||||
     * {@link #update(IPocketAccess, IPeripheral)} and will be attached, detached and have methods called in the same
 | 
			
		||||
     * manner as an ordinary peripheral.
 | 
			
		||||
     *
 | 
			
		||||
     * @param access The access object for the pocket item stack.
 | 
			
		||||
     * @return The newly created peripheral.
 | 
			
		||||
     * @see ITurtleUpgrade#createPeripheral(ITurtleAccess, TurtleSide)
 | 
			
		||||
     * @see #update(IPocketAccess, IPeripheral)
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    IPeripheral createPeripheral( @Nonnull IPocketAccess access );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when the pocket computer item stack updates
 | 
			
		||||
     * Called when the pocket computer item stack updates.
 | 
			
		||||
     *
 | 
			
		||||
     * @param access     The access object for the pocket item stack
 | 
			
		||||
     * @param peripheral The peripheral for this upgrade
 | 
			
		||||
     * @param access     The access object for the pocket item stack.
 | 
			
		||||
     * @param peripheral The peripheral for this upgrade.
 | 
			
		||||
     * @see #createPeripheral(IPocketAccess)
 | 
			
		||||
     */
 | 
			
		||||
    void update( @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when the pocket computer is right clicked on something
 | 
			
		||||
     * Called when the pocket computer is right clicked.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world      The world the computer is in
 | 
			
		||||
     * @param access     The access object for the pocket item stack
 | 
			
		||||
     * @param peripheral The peripheral for this upgrade
 | 
			
		||||
     * @return {@code true} to stop the gui from opening, otherwise false.
 | 
			
		||||
     * @param world      The world the computer is in.
 | 
			
		||||
     * @param access     The access object for the pocket item stack.
 | 
			
		||||
     * @param peripheral The peripheral for this upgrade.
 | 
			
		||||
     * @return {@code true} to stop the GUI from opening, otherwise false. You should always provide some code path
 | 
			
		||||
     * which returns {@code false}, such as requiring the player to be sneaking - otherwise they will be unable to
 | 
			
		||||
     * access the GUI.
 | 
			
		||||
     * @see #createPeripheral(IPocketAccess)
 | 
			
		||||
     */
 | 
			
		||||
    boolean onRightClick( @Nonnull World world, @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,11 +8,11 @@ package dan200.computercraft.shared.pocket.apis;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaContext;
 | 
			
		||||
import dan200.computercraft.api.lua.ILuaTask;
 | 
			
		||||
import dan200.computercraft.api.lua.LuaException;
 | 
			
		||||
import dan200.computercraft.api.pocket.IPocketUpgrade;
 | 
			
		||||
import dan200.computercraft.core.apis.ILuaAPI;
 | 
			
		||||
import dan200.computercraft.shared.pocket.core.PocketServerComputer;
 | 
			
		||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
 | 
			
		||||
import dan200.computercraft.shared.util.InventoryUtil;
 | 
			
		||||
import dan200.computercraft.shared.util.WorldUtil;
 | 
			
		||||
import net.minecraft.entity.player.EntityPlayer;
 | 
			
		||||
@@ -61,84 +61,91 @@ public class PocketAPI implements ILuaAPI
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object[] callMethod( ILuaContext context, int method, Object[] arguments ) throws LuaException
 | 
			
		||||
    public Object[] callMethod( ILuaContext context, int method, Object[] arguments ) throws LuaException, InterruptedException
 | 
			
		||||
    {
 | 
			
		||||
        switch( method )
 | 
			
		||||
        {
 | 
			
		||||
            case 0:
 | 
			
		||||
            {
 | 
			
		||||
                // equipBack
 | 
			
		||||
                if( !(m_computer.getEntity() instanceof EntityPlayer) )
 | 
			
		||||
                return context.executeMainThreadTask( new ILuaTask()
 | 
			
		||||
                {
 | 
			
		||||
                    throw new LuaException( "Cannot find player" );
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                ItemStack pocketStack = m_computer.getStack();
 | 
			
		||||
                EntityPlayer player = (EntityPlayer) m_computer.getEntity();
 | 
			
		||||
                InventoryPlayer inventory = player.inventory;
 | 
			
		||||
 | 
			
		||||
                IPocketUpgrade previousUpgrade = m_computer.getUpgrade();
 | 
			
		||||
 | 
			
		||||
                // Attempt to find the upgrade, starting in the main segment, and then looking in the opposite
 | 
			
		||||
                // one. We start from the position the item is currently in and loop round to the start.
 | 
			
		||||
                IPocketUpgrade newUpgrade = findUpgrade( inventory.mainInventory, inventory.currentItem, previousUpgrade );
 | 
			
		||||
                if( newUpgrade == null ) newUpgrade = findUpgrade( inventory.offHandInventory, 0, previousUpgrade );
 | 
			
		||||
                if( newUpgrade == null ) throw new LuaException( "Cannot find a valid upgrade" );
 | 
			
		||||
 | 
			
		||||
                // Remove the current upgrade
 | 
			
		||||
                if( previousUpgrade != null )
 | 
			
		||||
                {
 | 
			
		||||
                    ItemStack stack = previousUpgrade.getCraftingItem();
 | 
			
		||||
                    if( stack != null )
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public Object[] execute() throws LuaException
 | 
			
		||||
                    {
 | 
			
		||||
                        stack = InventoryUtil.storeItems( stack, inventory, 0, 36, inventory.currentItem );
 | 
			
		||||
                        if( stack != null )
 | 
			
		||||
                        if( !(m_computer.getEntity() instanceof EntityPlayer) )
 | 
			
		||||
                        {
 | 
			
		||||
                            WorldUtil.dropItemStack( stack, player.worldObj, player.posX, player.posY, player.posZ );
 | 
			
		||||
                            throw new LuaException( "Cannot find player" );
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        EntityPlayer player = (EntityPlayer) m_computer.getEntity();
 | 
			
		||||
                        InventoryPlayer inventory = player.inventory;
 | 
			
		||||
 | 
			
		||||
                        IPocketUpgrade previousUpgrade = m_computer.getUpgrade();
 | 
			
		||||
 | 
			
		||||
                        // Attempt to find the upgrade, starting in the main segment, and then looking in the opposite
 | 
			
		||||
                        // one. We start from the position the item is currently in and loop round to the start.
 | 
			
		||||
                        IPocketUpgrade newUpgrade = findUpgrade( inventory.mainInventory, inventory.currentItem, previousUpgrade );
 | 
			
		||||
                        if( newUpgrade == null )
 | 
			
		||||
                        {
 | 
			
		||||
                            newUpgrade = findUpgrade( inventory.offHandInventory, 0, previousUpgrade );
 | 
			
		||||
                        }
 | 
			
		||||
                        if( newUpgrade == null ) throw new LuaException( "Cannot find a valid upgrade" );
 | 
			
		||||
 | 
			
		||||
                        // Remove the current upgrade
 | 
			
		||||
                        if( previousUpgrade != null )
 | 
			
		||||
                        {
 | 
			
		||||
                            ItemStack stack = previousUpgrade.getCraftingItem();
 | 
			
		||||
                            if( stack != null )
 | 
			
		||||
                            {
 | 
			
		||||
                                stack = InventoryUtil.storeItems( stack, inventory, 0, 36, inventory.currentItem );
 | 
			
		||||
                                if( stack != null )
 | 
			
		||||
                                {
 | 
			
		||||
                                    WorldUtil.dropItemStack( stack, player.worldObj, player.posX, player.posY, player.posZ );
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        // Set the new upgrade
 | 
			
		||||
                        m_computer.setUpgrade( newUpgrade );
 | 
			
		||||
 | 
			
		||||
                        return null;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Set the new upgrade
 | 
			
		||||
                ItemPocketComputer.setUpgrade( pocketStack, newUpgrade );
 | 
			
		||||
                m_computer.setUpgrade( newUpgrade );
 | 
			
		||||
 | 
			
		||||
                inventory.markDirty();
 | 
			
		||||
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
                } );
 | 
			
		||||
 | 
			
		||||
            case 1:
 | 
			
		||||
            {
 | 
			
		||||
                // unequipBack
 | 
			
		||||
                if( !(m_computer.getEntity() instanceof EntityPlayer) )
 | 
			
		||||
                return context.executeMainThreadTask( new ILuaTask()
 | 
			
		||||
                {
 | 
			
		||||
                    throw new LuaException( "Cannot find player" );
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                ItemStack pocketStack = m_computer.getStack();
 | 
			
		||||
                EntityPlayer player = (EntityPlayer) m_computer.getEntity();
 | 
			
		||||
                InventoryPlayer inventory = player.inventory;
 | 
			
		||||
 | 
			
		||||
                IPocketUpgrade previousUpgrade = m_computer.getUpgrade();
 | 
			
		||||
 | 
			
		||||
                if( previousUpgrade == null ) throw new LuaException( "Nothing to unequip" );
 | 
			
		||||
 | 
			
		||||
                ItemPocketComputer.setUpgrade( pocketStack, null );
 | 
			
		||||
                m_computer.setUpgrade( null );
 | 
			
		||||
 | 
			
		||||
                ItemStack stack = previousUpgrade.getCraftingItem();
 | 
			
		||||
                if( stack != null )
 | 
			
		||||
                {
 | 
			
		||||
                    stack = InventoryUtil.storeItems( stack, inventory, 0, 36, inventory.currentItem );
 | 
			
		||||
                    if( stack != null )
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public Object[] execute() throws LuaException
 | 
			
		||||
                    {
 | 
			
		||||
                        WorldUtil.dropItemStack( stack, player.worldObj, player.posX, player.posY, player.posZ );
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                        if( !(m_computer.getEntity() instanceof EntityPlayer) )
 | 
			
		||||
                        {
 | 
			
		||||
                            throw new LuaException( "Cannot find player" );
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
                        EntityPlayer player = (EntityPlayer) m_computer.getEntity();
 | 
			
		||||
                        InventoryPlayer inventory = player.inventory;
 | 
			
		||||
 | 
			
		||||
                        IPocketUpgrade previousUpgrade = m_computer.getUpgrade();
 | 
			
		||||
 | 
			
		||||
                        if( previousUpgrade == null ) throw new LuaException( "Nothing to unequip" );
 | 
			
		||||
 | 
			
		||||
                        m_computer.setUpgrade( null );
 | 
			
		||||
 | 
			
		||||
                        ItemStack stack = previousUpgrade.getCraftingItem();
 | 
			
		||||
                        if( stack != null )
 | 
			
		||||
                        {
 | 
			
		||||
                            stack = InventoryUtil.storeItems( stack, inventory, 0, 36, inventory.currentItem );
 | 
			
		||||
                            if( stack != null )
 | 
			
		||||
                            {
 | 
			
		||||
                                WorldUtil.dropItemStack( stack, player.worldObj, player.posX, player.posY, player.posZ );
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        return null;
 | 
			
		||||
                    }
 | 
			
		||||
                } );
 | 
			
		||||
            default:
 | 
			
		||||
                return null;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,6 @@ import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.Constants;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
@@ -26,10 +25,9 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces
 | 
			
		||||
    private Entity m_entity;
 | 
			
		||||
    private ItemStack m_stack;
 | 
			
		||||
 | 
			
		||||
    public PocketServerComputer( World world, int computerID, String label, int instanceID, ComputerFamily family, ItemStack stack, Entity entity )
 | 
			
		||||
    public PocketServerComputer( World world, int computerID, String label, int instanceID, ComputerFamily family )
 | 
			
		||||
    {
 | 
			
		||||
        super( world, computerID, label, instanceID, family, ComputerCraft.terminalWidth_pocketComputer, ComputerCraft.terminalHeight_pocketComputer );
 | 
			
		||||
        update( entity, stack );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
@@ -63,30 +61,7 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces
 | 
			
		||||
    @Override
 | 
			
		||||
    public NBTTagCompound getUpgradeNBTData()
 | 
			
		||||
    {
 | 
			
		||||
        NBTTagCompound tag;
 | 
			
		||||
        if( m_stack.hasTagCompound() )
 | 
			
		||||
        {
 | 
			
		||||
            tag = m_stack.getTagCompound();
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            tag = new NBTTagCompound();
 | 
			
		||||
            m_stack.setTagCompound( tag );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( tag.hasKey( "upgrade_info", Constants.NBT.TAG_COMPOUND ) )
 | 
			
		||||
        {
 | 
			
		||||
            return tag.getCompoundTag( "upgrade_info" );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            NBTTagCompound sub = new NBTTagCompound();
 | 
			
		||||
 | 
			
		||||
            tag.setTag( "upgrade_info", sub );
 | 
			
		||||
            updateUpgradeNBTData();
 | 
			
		||||
 | 
			
		||||
            return sub;
 | 
			
		||||
        }
 | 
			
		||||
        return ComputerCraft.Items.pocketComputer.getUpgradeInfo( m_stack );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -120,39 +95,47 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ItemStack getStack()
 | 
			
		||||
    {
 | 
			
		||||
        return m_stack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public IPocketUpgrade getUpgrade()
 | 
			
		||||
    {
 | 
			
		||||
        return m_upgrade;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void update( Entity entity, ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        if( m_entity != null ) setPosition( entity.getPosition() );
 | 
			
		||||
        m_entity = entity;
 | 
			
		||||
        m_stack = stack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public synchronized void setUpgrade( IPocketUpgrade upgrade )
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the upgrade for this pocket computer, also updating the item stack.
 | 
			
		||||
     *
 | 
			
		||||
     * Note this method is not thread safe - it must be called from the server thread.
 | 
			
		||||
     *
 | 
			
		||||
     * @param upgrade The new upgrade to set it to, may be {@code null}.
 | 
			
		||||
     */
 | 
			
		||||
    public void setUpgrade( IPocketUpgrade upgrade )
 | 
			
		||||
    {
 | 
			
		||||
        if( this.m_upgrade == upgrade ) return;
 | 
			
		||||
 | 
			
		||||
        // Clear the old upgrade NBT
 | 
			
		||||
        if( m_stack.hasTagCompound() )
 | 
			
		||||
        synchronized (this)
 | 
			
		||||
        {
 | 
			
		||||
            NBTTagCompound tag = m_stack.getTagCompound();
 | 
			
		||||
            if( tag.hasKey( "upgrade_info", 10 ) )
 | 
			
		||||
            {
 | 
			
		||||
                tag.removeTag( "upgrade_info" );
 | 
			
		||||
                updateUpgradeNBTData();
 | 
			
		||||
            }
 | 
			
		||||
            ComputerCraft.Items.pocketComputer.setUpgrade( m_stack, upgrade );
 | 
			
		||||
            if( m_entity instanceof EntityPlayer ) ((EntityPlayer) m_entity).inventory.markDirty();
 | 
			
		||||
 | 
			
		||||
            this.m_upgrade = upgrade;
 | 
			
		||||
            invalidatePeripheral();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public synchronized void updateValues( Entity entity, ItemStack stack, IPocketUpgrade upgrade )
 | 
			
		||||
    {
 | 
			
		||||
        if( entity != null )
 | 
			
		||||
        {
 | 
			
		||||
            setWorld( entity.getEntityWorld() );
 | 
			
		||||
            setPosition( entity.getPosition() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.m_upgrade = upgrade;
 | 
			
		||||
        invalidatePeripheral();
 | 
			
		||||
        m_entity = entity;
 | 
			
		||||
        m_stack = stack;
 | 
			
		||||
 | 
			
		||||
        if( this.m_upgrade != upgrade )
 | 
			
		||||
        {
 | 
			
		||||
            this.m_upgrade = upgrade;
 | 
			
		||||
            invalidatePeripheral();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -104,10 +104,12 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia
 | 
			
		||||
            PocketServerComputer computer = createServerComputer( world, inventory, entity, stack );
 | 
			
		||||
            if( computer != null )
 | 
			
		||||
            {
 | 
			
		||||
                IPocketUpgrade upgrade = getUpgrade( stack );
 | 
			
		||||
 | 
			
		||||
                // Ping computer
 | 
			
		||||
                computer.keepAlive();
 | 
			
		||||
                computer.setWorld( world );
 | 
			
		||||
                computer.update( entity, stack );
 | 
			
		||||
                computer.updateValues( entity, stack, upgrade );
 | 
			
		||||
 | 
			
		||||
                // Sync ID
 | 
			
		||||
                int id = computer.getID();
 | 
			
		||||
@@ -131,8 +133,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Update modem
 | 
			
		||||
                IPocketUpgrade upgrade = getUpgrade( stack );
 | 
			
		||||
                // Update pocket upgrade
 | 
			
		||||
                if( upgrade != null )
 | 
			
		||||
                {
 | 
			
		||||
                    upgrade.update( computer, computer.getPeripheral( 2 ) );
 | 
			
		||||
@@ -165,6 +166,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia
 | 
			
		||||
                IPocketUpgrade upgrade = getUpgrade( stack );
 | 
			
		||||
                if( upgrade != null )
 | 
			
		||||
                {
 | 
			
		||||
                    computer.updateValues( player, stack, upgrade );
 | 
			
		||||
                    stop = upgrade.onRightClick( world, computer, computer.getPeripheral( 2 ) );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -258,12 +260,10 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia
 | 
			
		||||
                computerID,
 | 
			
		||||
                getLabel( stack ),
 | 
			
		||||
                instanceID,
 | 
			
		||||
                getFamily( stack ),
 | 
			
		||||
                stack,
 | 
			
		||||
                entity
 | 
			
		||||
                getFamily( stack )
 | 
			
		||||
            );
 | 
			
		||||
            computer.updateValues( entity, stack, getUpgrade( stack ) );
 | 
			
		||||
            computer.addAPI( new PocketAPI( computer ) );
 | 
			
		||||
            computer.setUpgrade( getUpgrade( stack ) );
 | 
			
		||||
            ComputerCraft.serverComputerRegistry.add( instanceID, computer );
 | 
			
		||||
            if( inventory != null )
 | 
			
		||||
            {
 | 
			
		||||
@@ -461,7 +461,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IPocketUpgrade getUpgrade( ItemStack stack )
 | 
			
		||||
    public IPocketUpgrade getUpgrade( ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        NBTTagCompound compound = stack.getTagCompound();
 | 
			
		||||
        if( compound != null )
 | 
			
		||||
@@ -484,7 +484,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void setUpgrade( ItemStack stack, IPocketUpgrade upgrade )
 | 
			
		||||
    public void setUpgrade( ItemStack stack, IPocketUpgrade upgrade )
 | 
			
		||||
    {
 | 
			
		||||
        NBTTagCompound compound = stack.getTagCompound();
 | 
			
		||||
        if( compound == null ) stack.setTagCompound( compound = new NBTTagCompound() );
 | 
			
		||||
@@ -500,4 +500,25 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia
 | 
			
		||||
 | 
			
		||||
        compound.removeTag( "upgrade_info" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NBTTagCompound getUpgradeInfo( ItemStack stack )
 | 
			
		||||
    {
 | 
			
		||||
        NBTTagCompound tag = stack.getTagCompound();
 | 
			
		||||
        if( tag == null )
 | 
			
		||||
        {
 | 
			
		||||
            tag = new NBTTagCompound();
 | 
			
		||||
            stack.setTagCompound( tag );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( tag.hasKey( "upgrade_info", Constants.NBT.TAG_COMPOUND ) )
 | 
			
		||||
        {
 | 
			
		||||
            return tag.getCompoundTag( "upgrade_info" );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            NBTTagCompound sub = new NBTTagCompound();
 | 
			
		||||
            tag.setTag( "upgrade_info", sub );
 | 
			
		||||
            return sub;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user