1.5 -> 1.6 migration: storage disks. #1816

This commit is contained in:
raoulvdberge
2018-06-14 20:16:17 +02:00
parent e8f97d5006
commit 992f3d6981
11 changed files with 249 additions and 17 deletions

View File

@@ -18,6 +18,7 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskManager;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskRegistry;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskSync;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IOneSixMigrationHelper;
import com.raoulvdberge.refinedstorage.api.util.IQuantityFormatter;
import com.raoulvdberge.refinedstorage.api.util.IStackList;
import net.minecraft.entity.player.EntityPlayer;
@@ -148,6 +149,7 @@ public interface IRSAPI {
* @param capacity the capacity
* @return a storage disk
*/
@Nonnull
IStorageDisk<ItemStack> createDefaultItemDisk(World world, int capacity);
/**
@@ -155,8 +157,15 @@ public interface IRSAPI {
* @param capacity the capacity in mB
* @return a fluid storage disk
*/
@Nonnull
IStorageDisk<FluidStack> createDefaultFluidDisk(World world, int capacity);
/**
* @return the 1.6.x migration helper
*/
@Nonnull
IOneSixMigrationHelper getOneSixMigrationHelper();
/**
* Opens a wireless grid for the given player.
*

View File

@@ -15,12 +15,24 @@ public interface IStorageDiskProvider {
*/
UUID getId(ItemStack disk);
/**
* @param disk the disk
* @param id the id to set
*/
void setId(ItemStack disk, UUID id);
/**
* @param disk the disk
* @return true if the given disk has an id set, false otherwise
*/
boolean isValid(ItemStack disk);
/**
* @param disk the disk
* @return the capacity of the given disk
*/
int getCapacity(ItemStack disk);
/**
* @return the storage type
*/

View File

@@ -0,0 +1,39 @@
package com.raoulvdberge.refinedstorage.api.util;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.items.IItemHandlerModifiable;
import java.util.UUID;
/**
* A helper for the changes in 1.6.
*/
public interface IOneSixMigrationHelper {
/**
* Migrates this disk over to the new 1.6 format *IF POSSIBLE*.
* The given disk item needs to implement {@link com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider}!
* This will call {@link com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider#setId(ItemStack, UUID)} on the disk, so make sure
* a call to this method clears previous 1.5 and lower data, or this method will keep migrating constantly!
* <p>
* This will *ONLY* work with disks that were made using the IStorageDiskBehavior 1.5 API.
* If you were using another method, you'll have to implement the migration code yourself.
*
* @param world the world
* @param disk the disk to attempt to migrate
* @return true if it migrated, false otherwise
*/
boolean migrateDisk(World world, ItemStack disk);
/**
* Migrates an entire inventory.
* Loops over every slot in the inventory and calls {@link #migrateDisk(World, ItemStack)}.
* All the docs from {@link #migrateDisk(World, ItemStack)} apply here as well!
* Don't forget to mark your tile dirty if this call returns true!
*
* @param world the world
* @param handler the inventory
* @return true if it migrated something in the inventory, false otherwise
*/
boolean migrateDiskInventory(World world, IItemHandlerModifiable handler);
}

View File

@@ -22,6 +22,7 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskManager;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskRegistry;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskSync;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IOneSixMigrationHelper;
import com.raoulvdberge.refinedstorage.api.util.IQuantityFormatter;
import com.raoulvdberge.refinedstorage.api.util.IStackList;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementList;
@@ -35,10 +36,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriter
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRegistry;
import com.raoulvdberge.refinedstorage.apiimpl.solderer.SoldererRegistry;
import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.*;
import com.raoulvdberge.refinedstorage.apiimpl.util.Comparer;
import com.raoulvdberge.refinedstorage.apiimpl.util.QuantityFormatter;
import com.raoulvdberge.refinedstorage.apiimpl.util.StackListFluid;
import com.raoulvdberge.refinedstorage.apiimpl.util.StackListItem;
import com.raoulvdberge.refinedstorage.apiimpl.util.*;
import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
@@ -72,6 +70,7 @@ public class API implements IRSAPI {
private IWirelessGridRegistry gridRegistry = new WirelessGridRegistry();
private IStorageDiskRegistry storageDiskRegistry = new StorageDiskRegistry();
private IStorageDiskSync storageDiskSync = new StorageDiskSync();
private IOneSixMigrationHelper oneSixMigrationHelper = new OneSixMigrationHelper();
public static IRSAPI instance() {
return INSTANCE;
@@ -228,15 +227,22 @@ public class API implements IRSAPI {
}
@Override
@Nonnull
public IStorageDisk<ItemStack> createDefaultItemDisk(World world, int capacity) {
return new StorageDiskItem(world, capacity);
}
@Override
@Nonnull
public IStorageDisk<FluidStack> createDefaultFluidDisk(World world, int capacity) {
return new StorageDiskFluid(world, capacity);
}
@Override
public IOneSixMigrationHelper getOneSixMigrationHelper() {
return oneSixMigrationHelper;
}
@Override
public void openWirelessGrid(EntityPlayer player, EnumHand hand, int networkDimension, int id) {
player.openGui(RS.INSTANCE, RSGui.WIRELESS_GRID, player.getEntityWorld(), hand.ordinal(), networkDimension, id);

View File

@@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheFluid;
@@ -147,6 +148,10 @@ public class NetworkNodeDiskDrive extends NetworkNode implements IGuiStorage, IS
super.read(tag);
StackUtils.readItems(disks, 0, tag);
if (API.instance().getOneSixMigrationHelper().migrateDiskInventory(world, disks)) {
markDirty();
}
}
@Override

View File

@@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.api.storage.AccessType;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.NetworkNodeDiskDrive;
import com.raoulvdberge.refinedstorage.inventory.*;
@@ -460,6 +461,14 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab
StackUtils.readItems(upgrades, 3, tag);
StackUtils.readItems(inputDisks, 4, tag);
StackUtils.readItems(outputDisks, 5, tag);
if (API.instance().getOneSixMigrationHelper().migrateDiskInventory(world, inputDisks)) {
markDirty();
}
if (API.instance().getOneSixMigrationHelper().migrateDiskInventory(world, outputDisks)) {
markDirty();
}
}
@Override

View File

@@ -0,0 +1,115 @@
package com.raoulvdberge.refinedstorage.apiimpl.util;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider;
import com.raoulvdberge.refinedstorage.api.util.IOneSixMigrationHelper;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.IItemHandlerModifiable;
import java.util.UUID;
public class OneSixMigrationHelper implements IOneSixMigrationHelper {
// 1.5.x NBT keys
private static final String NBT_ITEMS = "Items";
private static final String NBT_ITEM_TYPE = "Type";
private static final String NBT_ITEM_QUANTITY = "Quantity";
private static final String NBT_ITEM_DAMAGE = "Damage";
private static final String NBT_ITEM_NBT = "NBT";
private static final String NBT_ITEM_CAPS = "Caps";
private static final String NBT_FLUIDS = "Fluids";
@Override
public boolean migrateDisk(World world, ItemStack disk) {
IStorageDiskProvider provider = (IStorageDiskProvider) disk.getItem();
switch (provider.getType()) {
case ITEM:
if (disk.hasTagCompound() && disk.getTagCompound().hasKey(NBT_ITEMS)) {
UUID id = UUID.randomUUID();
IStorageDisk<ItemStack> newDisk = API.instance().createDefaultItemDisk(world, provider.getCapacity(disk));
NBTTagList list = (NBTTagList) disk.getTagCompound().getTag(NBT_ITEMS);
for (int i = 0; i < list.tagCount(); ++i) {
NBTTagCompound tag = list.getCompoundTagAt(i);
ItemStack stack = new ItemStack(
Item.getItemById(tag.getInteger(NBT_ITEM_TYPE)),
tag.getInteger(NBT_ITEM_QUANTITY),
tag.getInteger(NBT_ITEM_DAMAGE),
tag.hasKey(NBT_ITEM_CAPS) ? tag.getCompoundTag(NBT_ITEM_CAPS) : null
);
stack.setTagCompound(tag.hasKey(NBT_ITEM_NBT) ? tag.getCompoundTag(NBT_ITEM_NBT) : null);
if (!stack.isEmpty()) {
newDisk.insert(stack, stack.getCount(), false);
}
}
API.instance().getStorageDiskManager(world).set(id, newDisk);
API.instance().getStorageDiskManager(world).markForSaving();
provider.setId(disk, id);
return true;
}
break;
case FLUID:
if (disk.hasTagCompound() && disk.getTagCompound().hasKey(NBT_FLUIDS)) {
UUID id = UUID.randomUUID();
IStorageDisk<FluidStack> newDisk = API.instance().createDefaultFluidDisk(world, provider.getCapacity(disk));
NBTTagList list = (NBTTagList) disk.getTagCompound().getTag(NBT_FLUIDS);
for (int i = 0; i < list.tagCount(); ++i) {
FluidStack stack = FluidStack.loadFluidStackFromNBT(list.getCompoundTagAt(i));
if (stack != null) {
newDisk.insert(stack, stack.amount, false);
}
}
API.instance().getStorageDiskManager(world).set(id, newDisk);
API.instance().getStorageDiskManager(world).markForSaving();
provider.setId(disk, id);
return true;
}
break;
}
return false;
}
@Override
public boolean migrateDiskInventory(World world, IItemHandlerModifiable handler) {
boolean migrated = false;
for (int i = 0; i < handler.getSlots(); ++i) {
ItemStack disk = handler.getStackInSlot(i);
if (!disk.isEmpty() && disk.getItem() instanceof IStorageDiskProvider) {
if (migrateDisk(world, disk)) {
handler.setStackInSlot(i, disk); // Trigger a onContentsChanged
migrated = true;
}
}
}
return migrated;
}
}

View File

@@ -57,14 +57,19 @@ public class ItemFluidStorageDisk extends ItemBase implements IStorageDiskProvid
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected) {
super.onUpdate(stack, world, entity, slot, selected);
if (!world.isRemote && !stack.hasTagCompound()) {
UUID id = UUID.randomUUID();
if (!world.isRemote) {
if (!isValid(stack)) {
API.instance().getOneSixMigrationHelper().migrateDisk(world, stack);
}
stack.setTagCompound(new NBTTagCompound());
stack.getTagCompound().setUniqueId(NBT_ID, id);
if (!stack.hasTagCompound()) {
UUID id = UUID.randomUUID();
API.instance().getStorageDiskManager(world).set(id, API.instance().createDefaultFluidDisk(world, FluidStorageType.getById(stack.getItemDamage()).getCapacity()));
API.instance().getStorageDiskManager(world).markForSaving();
API.instance().getStorageDiskManager(world).set(id, API.instance().createDefaultFluidDisk(world, getCapacity(stack)));
API.instance().getStorageDiskManager(world).markForSaving();
setId(stack, id);
}
}
}
@@ -126,11 +131,22 @@ public class ItemFluidStorageDisk extends ItemBase implements IStorageDiskProvid
return disk.getTagCompound().getUniqueId(NBT_ID);
}
@Override
public void setId(ItemStack disk, UUID id) {
disk.setTagCompound(new NBTTagCompound());
disk.getTagCompound().setUniqueId(NBT_ID, id);
}
@Override
public boolean isValid(ItemStack disk) {
return disk.hasTagCompound() && disk.getTagCompound().hasUniqueId(NBT_ID);
}
@Override
public int getCapacity(ItemStack disk) {
return FluidStorageType.getById(disk.getItemDamage()).getCapacity();
}
@Override
public StorageDiskType getType() {
return StorageDiskType.FLUID;

View File

@@ -57,14 +57,19 @@ public class ItemStorageDisk extends ItemBase implements IStorageDiskProvider {
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected) {
super.onUpdate(stack, world, entity, slot, selected);
if (!world.isRemote && !stack.hasTagCompound()) {
UUID id = UUID.randomUUID();
if (!world.isRemote) {
if (!isValid(stack)) {
API.instance().getOneSixMigrationHelper().migrateDisk(world, stack);
}
stack.setTagCompound(new NBTTagCompound());
stack.getTagCompound().setUniqueId(NBT_ID, id);
if (!stack.hasTagCompound()) {
UUID id = UUID.randomUUID();
API.instance().getStorageDiskManager(world).set(id, API.instance().createDefaultItemDisk(world, ItemStorageType.getById(stack.getItemDamage()).getCapacity()));
API.instance().getStorageDiskManager(world).markForSaving();
API.instance().getStorageDiskManager(world).set(id, API.instance().createDefaultItemDisk(world, getCapacity(stack)));
API.instance().getStorageDiskManager(world).markForSaving();
setId(stack, id);
}
}
}
@@ -126,11 +131,22 @@ public class ItemStorageDisk extends ItemBase implements IStorageDiskProvider {
return disk.getTagCompound().getUniqueId(NBT_ID);
}
@Override
public void setId(ItemStack disk, UUID id) {
disk.setTagCompound(new NBTTagCompound());
disk.getTagCompound().setUniqueId(NBT_ID, id);
}
@Override
public boolean isValid(ItemStack disk) {
return disk.hasTagCompound() && disk.getTagCompound().hasUniqueId(NBT_ID);
}
@Override
public int getCapacity(ItemStack disk) {
return ItemStorageType.getById(disk.getItemDamage()).getCapacity();
}
@Override
public StorageDiskType getType() {
return StorageDiskType.ITEM;

View File

@@ -6,7 +6,7 @@ import net.minecraft.util.EnumFacing;
public class DirectionHandlerTile implements IDirectionHandler {
public static final String NBT_DIRECTION = "Direction";
private EnumFacing direction;
private EnumFacing direction = EnumFacing.NORTH;
@Override
public void setDirection(EnumFacing direction) {

View File

@@ -134,6 +134,11 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
if (player != null) {
StackUtils.readItems(disk, 4, stack.getTagCompound());
if (!player.getEntityWorld().isRemote) {
API.instance().getOneSixMigrationHelper().migrateDiskInventory(player.getEntityWorld(), disk);
}
StackUtils.readItems(filter, 0, stack.getTagCompound());
drainEnergy(RS.INSTANCE.config.portableGridOpenUsage);