diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/common/gui/MovingStorageContainerMenu.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/common/gui/MovingStorageContainerMenu.java index 603ef44..1352306 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/common/gui/MovingStorageContainerMenu.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/common/gui/MovingStorageContainerMenu.java @@ -136,12 +136,6 @@ public boolean stillValid(Player player) { return getStorageEntity().map(se -> player.distanceToSqr(se.position()) <= 64.0D).orElse(false); //TODO if packing is allowed check if not packed here } - /* TODO base on storage wrapper in stack - public float getSlotFillPercentage(int slot) { - return storageBlockEntity.getSlotFillPercentage(slot); - } -*/ - @Override protected void sendStorageSettingsToClient() { if (player.level().isClientSide) { diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/crafting/MovingStorageFromStorageRecipe.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/crafting/MovingStorageFromStorageRecipe.java index 74b3921..bf48321 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/crafting/MovingStorageFromStorageRecipe.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/crafting/MovingStorageFromStorageRecipe.java @@ -47,7 +47,7 @@ private Optional getStorage(CraftingInput inv) { @Override public ItemStack assemble(CraftingInput input, HolderLookup.Provider registries) { ItemStack movingStorageItem = super.assemble(input, registries); - getStorage(input).ifPresent(storage -> StorageMinecartItem.setStorage(storage, movingStorageItem)); + getStorage(input).ifPresent(storage -> StorageMinecartItem.setStorageItem(storage, movingStorageItem)); return movingStorageItem; } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/EntityStorageHolder.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/EntityStorageHolder.java index d3bc01a..6d5a17e 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/EntityStorageHolder.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/EntityStorageHolder.java @@ -106,7 +106,7 @@ public void updateStorageWrapper() { setStorageItem(storageItem); } - storageWrapper = MovingStorageWrapper.fromStack(storageItem, this::onContentsChanged, this::onStackChanged, entity.level()); + storageWrapper = MovingStorageWrapper.fromStack(storageItem, this::onContentsChanged, this::onStackChanged); } public IStorageWrapper getStorageWrapper() { diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/MovingStorageData.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/MovingStorageData.java index 27f53b2..9a0d161 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/MovingStorageData.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/MovingStorageData.java @@ -90,6 +90,11 @@ public CompoundTag getContents() { return movingStorageContents; } + public void setContents(CompoundTag contents) { + movingStorageContents = contents; + setDirty(); + } + public boolean removeUpdatedStorageSettingsFlag(UUID backpackUuid) { return updatedStorageSettingsFlags.remove(backpackUuid); } diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/MovingStorageWrapper.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/MovingStorageWrapper.java index f55cd95..c1cd11e 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/MovingStorageWrapper.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/entity/MovingStorageWrapper.java @@ -8,7 +8,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.CustomData; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.p3pp3rf1y.sophisticatedcore.api.IStorageWrapper; import net.p3pp3rf1y.sophisticatedcore.common.gui.SortBy; @@ -59,7 +58,7 @@ public class MovingStorageWrapper implements IStorageWrapper { private final Map, Consumer> upgradeDefaultsHandlers = new HashMap<>(); - private MovingStorageWrapper(ItemStack storageStack, Runnable onContentsChanged, Runnable onStackChanged, Level level) { + private MovingStorageWrapper(ItemStack storageStack, Runnable onContentsChanged, Runnable onStackChanged) { this.storageStack = storageStack; contentsChangeHandler = onContentsChanged; stackChangeHandler = onStackChanged; @@ -75,8 +74,8 @@ private static int getNumberOfDisplayItems(ItemStack stack) { return stack.getItem() instanceof BarrelBlockItem ? 4 : 1; } - public static MovingStorageWrapper fromStack(ItemStack stack, Runnable onContentsChanged, Runnable onStackChanged, Level level) { - MovingStorageWrapper movingStorageWrapper = StorageWrapperRepository.getStorageWrapper(stack, MovingStorageWrapper.class, s -> new MovingStorageWrapper(s, onContentsChanged, onStackChanged, level)); + public static MovingStorageWrapper fromStack(ItemStack stack, Runnable onContentsChanged, Runnable onStackChanged) { + MovingStorageWrapper movingStorageWrapper = StorageWrapperRepository.getStorageWrapper(stack, MovingStorageWrapper.class, s -> new MovingStorageWrapper(s, onContentsChanged, onStackChanged)); UUID uuid = stack.get(ModCoreDataComponents.STORAGE_UUID); if (uuid != null) { movingStorageWrapper.setContentsUuid(uuid); //setting here because client side the uuid isn't in contentsnbt before this data is synced from server and it would create a new one otherwise @@ -159,11 +158,7 @@ public ITrackedContentsItemHandler getInventoryForInputOutput() { public SettingsHandler getSettingsHandler() { if (settingsHandler == null) { if (getContentsUuid().isPresent()) { - CompoundTag contentsNbt = getContentsNbt(); - if (!contentsNbt.contains(SETTINGS_TAG)) { - contentsNbt.put(SETTINGS_TAG, new CompoundTag()); - } - settingsHandler = new StorageSettingsHandler(contentsNbt.getCompound(SETTINGS_TAG), contentsChangeHandler, this::getInventoryHandler, () -> renderInfo) { + settingsHandler = new StorageSettingsHandler(getSettingsNbt(), contentsChangeHandler, this::getInventoryHandler, () -> renderInfo) { @Override protected int getNumberOfDisplayItems() { return MovingStorageWrapper.getNumberOfDisplayItems(storageStack); @@ -228,8 +223,26 @@ public Optional getContentsUuid() { return Optional.ofNullable(storageStack.get(ModCoreDataComponents.STORAGE_UUID)); } + private CompoundTag getSettingsNbt() { + UUID storageId = getContentsUuid().orElseGet(this::getNewUuid); + MovingStorageData storageData = MovingStorageData.get(storageId); + CompoundTag baseContentsNbt = storageData.getContents(); + if (!baseContentsNbt.contains(SETTINGS_TAG)) { + baseContentsNbt.put(SETTINGS_TAG, new CompoundTag()); + storageData.setContents(baseContentsNbt); + } + return baseContentsNbt.getCompound(SETTINGS_TAG); + } + private CompoundTag getContentsNbt() { - return MovingStorageData.get(getContentsUuid().orElseGet(this::getNewUuid)).getContents(); + UUID storageId = getContentsUuid().orElseGet(this::getNewUuid); + MovingStorageData storageData = MovingStorageData.get(storageId); + CompoundTag baseContentsNbt = storageData.getContents(); + if (!baseContentsNbt.contains(StorageWrapper.CONTENTS_TAG)) { + baseContentsNbt.put(StorageWrapper.CONTENTS_TAG, new CompoundTag()); + storageData.setContents(baseContentsNbt); + } + return baseContentsNbt.getCompound(StorageWrapper.CONTENTS_TAG); } @Override diff --git a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/item/StorageMinecartItem.java b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/item/StorageMinecartItem.java index 5e39023..e3940d0 100644 --- a/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/item/StorageMinecartItem.java +++ b/src/main/java/net/p3pp3rf1y/sophisticatedstorageinmotion/item/StorageMinecartItem.java @@ -1,6 +1,7 @@ package net.p3pp3rf1y.sophisticatedstorageinmotion.item; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; @@ -9,6 +10,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BaseRailBlock; @@ -17,16 +19,18 @@ import net.minecraft.world.level.block.state.properties.WoodType; import net.minecraft.world.level.gameevent.GameEvent; import net.p3pp3rf1y.sophisticatedcore.Config; +import net.p3pp3rf1y.sophisticatedcore.init.ModCoreDataComponents; import net.p3pp3rf1y.sophisticatedcore.util.ItemBase; import net.p3pp3rf1y.sophisticatedcore.util.SimpleItemContent; import net.p3pp3rf1y.sophisticatedstorage.block.ITintableBlockItem; +import net.p3pp3rf1y.sophisticatedstorage.block.ItemContentsStorage; +import net.p3pp3rf1y.sophisticatedstorage.block.StorageBlockEntity; +import net.p3pp3rf1y.sophisticatedstorage.block.StorageWrapper; import net.p3pp3rf1y.sophisticatedstorage.init.ModBlocks; -import net.p3pp3rf1y.sophisticatedstorage.item.BarrelBlockItem; -import net.p3pp3rf1y.sophisticatedstorage.item.StorageBlockItem; -import net.p3pp3rf1y.sophisticatedstorage.item.WoodStorageBlockItem; +import net.p3pp3rf1y.sophisticatedstorage.item.*; +import net.p3pp3rf1y.sophisticatedstorageinmotion.entity.MovingStorageData; import net.p3pp3rf1y.sophisticatedstorageinmotion.entity.StorageMinecart; import net.p3pp3rf1y.sophisticatedstorageinmotion.init.ModDataComponents; -import net.p3pp3rf1y.sophisticatedstorageinmotion.init.ModItems; import java.util.Optional; import java.util.function.Consumer; @@ -40,6 +44,30 @@ public static ItemStack getStorageItem(ItemStack stack) { return stack.getOrDefault(ModDataComponents.STORAGE_ITEM, SimpleItemContent.EMPTY).copy(); } + @Override + public void onCraftedPostProcess(ItemStack stack, Level level) { + super.onCraftedPostProcess(stack, level); + if (level.isClientSide()) { + return; + } + ItemStack storageItem = getStorageItem(stack); + if (storageItem.getItem() instanceof ShulkerBoxItem) { + StackStorageWrapper shulkerStorageWrapper = StackStorageWrapper.fromStack(level.registryAccess(), storageItem); + shulkerStorageWrapper.getContentsUuid().ifPresent(id -> { + ItemContentsStorage itemContentsStorage = ItemContentsStorage.get(); + CompoundTag contentsNbt = itemContentsStorage.getOrCreateStorageContents(id).getCompound(StorageBlockEntity.STORAGE_WRAPPER_TAG); + CompoundTag migratedContentsNbt = new CompoundTag(); + migratedContentsNbt.put(StorageWrapper.CONTENTS_TAG, contentsNbt.getCompound(StorageWrapper.CONTENTS_TAG)); + migratedContentsNbt.put(StorageWrapper.SETTINGS_TAG, contentsNbt.getCompound(StorageWrapper.SETTINGS_TAG)); + MovingStorageData.get(id).setContents(migratedContentsNbt); + storageItem.set(ModCoreDataComponents.RENDER_INFO_TAG, CustomData.of(contentsNbt.getCompound(StorageWrapper.RENDER_INFO_TAG))); + setStorageItem(storageItem, stack); + itemContentsStorage.removeStorageContents(id); + }); + setStorageItem(storageItem, stack); + } + } + @Override public void addCreativeTabItems(Consumer itemConsumer) { if (Config.COMMON.enabledItems.isItemEnabled(this)) { @@ -59,14 +87,14 @@ public void addCreativeTabItems(Consumer itemConsumer) { } - private static ItemStack createWithStorage(ItemStack storageStack) { - ItemStack stack = new ItemStack(ModItems.STORAGE_MINECART.get()); - setStorage(storageStack, stack); + private ItemStack createWithStorage(ItemStack storageStack) { + ItemStack stack = new ItemStack(this); + setStorageItem(storageStack, stack); return stack; } - public static void setStorage(ItemStack storageStack, ItemStack stack) { - stack.set(ModDataComponents.STORAGE_ITEM, SimpleItemContent.copyOf(storageStack)); + public static void setStorageItem(ItemStack storageItem, ItemStack movingStorageItem) { + movingStorageItem.set(ModDataComponents.STORAGE_ITEM, SimpleItemContent.copyOf(storageItem)); } @Override