Skip to content

Commit

Permalink
Make minecart crafting transfer over inventory / upgrades / settings …
Browse files Browse the repository at this point in the history
…/ render info from shulker boxes
  • Loading branch information
P3pp3rF1y committed Dec 25, 2024
1 parent c1d2cb7 commit 329c934
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ private Optional<ItemStack> 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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -59,7 +58,7 @@ public class MovingStorageWrapper implements IStorageWrapper {
private final Map<Class<? extends IUpgradeWrapper>, Consumer<? extends IUpgradeWrapper>> 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;
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -228,8 +223,26 @@ public Optional<UUID> 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
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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<ItemStack> itemConsumer) {
if (Config.COMMON.enabledItems.isItemEnabled(this)) {
Expand All @@ -59,14 +87,14 @@ public void addCreativeTabItems(Consumer<ItemStack> 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
Expand Down

0 comments on commit 329c934

Please sign in to comment.