Skip to content

Commit

Permalink
feat: ✨ Added infinity upgrade
Browse files Browse the repository at this point in the history
- makes all items in storage infinite
- only admins can put additional items in (and make them infinite that way) once the upgrade is put in upgrade slot
- only admins can break storage blocks with infinity upgrade
  • Loading branch information
P3pp3rF1y committed Jan 29, 2025
1 parent 9931945 commit e8ac055
Show file tree
Hide file tree
Showing 12 changed files with 123 additions and 64 deletions.
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ loader_version_range=[4,)
mod_id=sophisticatedstorage
mod_name=Sophisticated Storage
mod_license=GNU General Public License v3.0
mod_version=1.2.11
mod_version=1.3.0
mod_group_id=sophisticatedstorage
mod_authors=P3pp3rF1y, Ridanisaurus
mod_description=Fancy and functional storage containers.
Expand All @@ -35,7 +35,7 @@ jade_cf_file_id=5109393
chipped_cf_file_id=5506938
resourcefullib_cf_file_id=5483169
athena_cf_file_id=5431579
sc_version=[1.21.1-1.1.6,1.22)
sc_version=[1.21.1-1.2.0,1.22)
sb_version=[1.21,1.22)

# publish
Expand Down
Original file line number Diff line number Diff line change
@@ -1,66 +1,67 @@
{
"values": [
"sophisticatedstorage:advanced_pickup_upgrade",
"sophisticatedstorage:advanced_pump_upgrade",
"sophisticatedstorage:blasting_upgrade",
"sophisticatedstorage:auto_smoking_upgrade",
"sophisticatedstorage:auto_smelting_upgrade",
"sophisticatedstorage:smoking_upgrade",
"sophisticatedstorage:advanced_void_upgrade",
"sophisticatedstorage:stack_upgrade_tier_1_plus",
{
"id": "sophisticatedstorage:chipped/alchemy_bench_upgrade",
"required": false
},
"sophisticatedstorage:pump_upgrade",
"sophisticatedstorage:stack_upgrade_tier_4",
{
"id": "sophisticatedstorage:chipped/loom_table_upgrade",
"id": "sophisticatedstorage:chipped/carpenters_table_upgrade",
"required": false
},
"sophisticatedstorage:filter_upgrade",
"sophisticatedstorage:jukebox_upgrade",
"sophisticatedstorage:advanced_filter_upgrade",
"sophisticatedstorage:void_upgrade",
{
"id": "sophisticatedstorage:chipped/botanist_workbench_upgrade",
"id": "sophisticatedstorage:chipped/alchemy_bench_upgrade",
"required": false
},
"sophisticatedstorage:hopper_upgrade",
"sophisticatedstorage:stack_upgrade_tier_1",
"sophisticatedstorage:smelting_upgrade",
"sophisticatedstorage:auto_smoking_upgrade",
"sophisticatedstorage:magnet_upgrade",
"sophisticatedstorage:advanced_feeding_upgrade",
"sophisticatedstorage:feeding_upgrade",
{
"id": "sophisticatedstorage:chipped/mason_table_upgrade",
"required": false
},
"sophisticatedstorage:advanced_jukebox_upgrade",
"sophisticatedstorage:feeding_upgrade",
"sophisticatedstorage:xp_pump_upgrade",
"sophisticatedstorage:advanced_feeding_upgrade",
"sophisticatedstorage:void_upgrade",
"sophisticatedstorage:blasting_upgrade",
"sophisticatedstorage:compacting_upgrade",
"sophisticatedstorage:auto_blasting_upgrade",
"sophisticatedstorage:smoking_upgrade",
"sophisticatedstorage:advanced_magnet_upgrade",
"sophisticatedstorage:filter_upgrade",
"sophisticatedstorage:pickup_upgrade",
"sophisticatedstorage:stack_upgrade_tier_2",
"sophisticatedstorage:stack_upgrade_tier_3",
"sophisticatedstorage:stack_upgrade_tier_1_plus",
"sophisticatedstorage:advanced_pump_upgrade",
"sophisticatedstorage:pickup_upgrade",
{
"id": "sophisticatedstorage:chipped/loom_table_upgrade",
"required": false
},
"sophisticatedstorage:compression_upgrade",
{
"id": "sophisticatedstorage:chipped/glassblower_upgrade",
"required": false
},
"sophisticatedstorage:stonecutter_upgrade",
"sophisticatedstorage:advanced_hopper_upgrade",
"sophisticatedstorage:crafting_upgrade",
"sophisticatedstorage:jukebox_upgrade",
"sophisticatedstorage:stack_upgrade_tier_5",
"sophisticatedstorage:hopper_upgrade",
"sophisticatedstorage:advanced_compacting_upgrade",
"sophisticatedstorage:magnet_upgrade",
"sophisticatedstorage:compression_upgrade",
"sophisticatedstorage:advanced_hopper_upgrade",
{
"id": "sophisticatedstorage:chipped/tinkering_table_upgrade",
"id": "sophisticatedstorage:chipped/botanist_workbench_upgrade",
"required": false
},
"sophisticatedstorage:stack_upgrade_tier_4",
"sophisticatedstorage:auto_smelting_upgrade",
"sophisticatedstorage:pump_upgrade",
"sophisticatedstorage:advanced_filter_upgrade",
"sophisticatedstorage:stack_upgrade_tier_3",
"sophisticatedstorage:infinity_upgrade",
"sophisticatedstorage:auto_blasting_upgrade",
"sophisticatedstorage:smelting_upgrade",
{
"id": "sophisticatedstorage:chipped/carpenters_table_upgrade",
"id": "sophisticatedstorage:chipped/tinkering_table_upgrade",
"required": false
}
},
"sophisticatedstorage:compacting_upgrade",
"sophisticatedstorage:advanced_jukebox_upgrade",
"sophisticatedstorage:stonecutter_upgrade",
"sophisticatedstorage:advanced_magnet_upgrade",
"sophisticatedstorage:advanced_pickup_upgrade",
"sophisticatedstorage:advanced_compacting_upgrade",
"sophisticatedstorage:stack_upgrade_tier_5",
"sophisticatedstorage:xp_pump_upgrade"
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -165,15 +165,30 @@ public boolean depositItem(Player player, InteractionHand hand, ItemStack stackI
return depositFromAllOfPlayersInventory(player, slot, invHandler, stackInSlot, memorySettings);
}

ItemStack result = invHandler.insertItemOnlyToSlot(slot, stackInHand, true);
if (result.getCount() != stackInHand.getCount()) {
result = invHandler.insertItemOnlyToSlot(slot, stackInHand, false);
if (isLocked()) {
memorySettings.selectSlot(slot);
if (stackInSlot.isEmpty()) {
if (invHandler.isItemValid(slot, stackInHand, player)) {
int stackLimit = invHandler.getStackLimit(slot, stackInHand);
invHandler.setStackInSlot(slot, stackInHand.split(stackLimit));
if (isLocked()) {
memorySettings.selectSlot(slot);
}
if (stackInHand.isEmpty()) {
player.setItemInHand(hand, ItemStack.EMPTY);
}
return true;
}
} else {
ItemStack result = invHandler.insertItemOnlyToSlot(slot, stackInHand, true);
if (result.getCount() != stackInHand.getCount()) {
result = invHandler.insertItemOnlyToSlot(slot, stackInHand, false);
if (isLocked()) {
memorySettings.selectSlot(slot);
}
player.setItemInHand(hand, result);
return true;
}
player.setItemInHand(hand, result);
return true;
}

return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ protected StorageBlockEntity(BlockPos pos, BlockState state, BlockEntityType<? e
storageWrapper = new StorageWrapper(() -> this::setChanged, () -> WorldHelper.notifyBlockUpdate(this), () -> {
setChanged();
WorldHelper.notifyBlockUpdate(this);
}, this instanceof BarrelBlockEntity ? 4 : 1) {
}, this instanceof BarrelBlockEntity ? 4 : 1, this instanceof ICountDisplay || this instanceof IFillLevelDisplay) {

@Override
public Optional<UUID> getContentsUuid() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,12 @@ public abstract class StorageWrapper implements IStorageWrapper {
private final Map<Class<? extends IUpgradeWrapper>, Consumer<? extends IUpgradeWrapper>> upgradeDefaultsHandlers = new HashMap<>();

protected StorageWrapper(Supplier<Runnable> getSaveHandler, Runnable onSerializeRenderInfo, Runnable markContentsDirty) {
this(getSaveHandler, onSerializeRenderInfo, markContentsDirty, 1);
this(getSaveHandler, onSerializeRenderInfo, markContentsDirty, 1, false);
}

protected StorageWrapper(Supplier<Runnable> getSaveHandler, Runnable onSerializeRenderInfo, Runnable markContentsDirty, int numberOfDisplayItems) {
protected StorageWrapper(Supplier<Runnable> getSaveHandler, Runnable onSerializeRenderInfo, Runnable markContentsDirty, int numberOfDisplayItems, boolean showsCountsAndFillRatios) {
this.getSaveHandler = getSaveHandler;
renderInfo = new RenderInfo(getSaveHandler) {
renderInfo = new RenderInfo(getSaveHandler, showsCountsAndFillRatios) {
@Override
protected void serializeRenderInfo(CompoundTag renderInfo) {
renderInfoNbt = renderInfo;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import net.p3pp3rf1y.sophisticatedcore.renderdata.RenderInfo;
import net.p3pp3rf1y.sophisticatedcore.util.CountAbbreviator;
import net.p3pp3rf1y.sophisticatedstorage.SophisticatedStorage;
import net.p3pp3rf1y.sophisticatedstorage.block.*;
Expand All @@ -30,7 +31,8 @@ public class LimitedBarrelRenderer extends BarrelRenderer<LimitedBarrelBlockEnti
public static final Material FILL_INDICATORS_TEXTURE = new Material(InventoryMenu.BLOCK_ATLAS, SophisticatedStorage.getRL("block/fill_indicators"));
private static final float MULTIPLE_ITEMS_FONT_SCALE = 1 / 96f;
private static final float SINGLE_ITEM_FONT_SCALE = 1 / 48f;
private static final Style COUNT_DISPLAY_STYLE = Style.EMPTY.withFont(UNIFORM_FONT).withBold(true);
public static final Style INFINITE_COUNT_DISPLAY_STYLE = Style.EMPTY.withFont(UNIFORM_FONT);
private static final Style COUNT_DISPLAY_STYLE = INFINITE_COUNT_DISPLAY_STYLE.withBold(true);
private final DisplayItemRenderer displayItemRenderer = new DisplayItemRenderer(0.5, new Vec3(0, 0, -1 / 16D));
private final DisplayItemRenderer flatDisplayItemRenderer = new DisplayItemRenderer(0.5, Vec3.ZERO);

Expand Down Expand Up @@ -151,7 +153,9 @@ private void renderItemCounts(LimitedBarrelBlockEntity blockEntity, PoseStack po
}
poseStack.translate(0.5, -0.5, 0.5);

List<Integer> slotCounts = blockEntity.getStorageWrapper().getRenderInfo().getItemDisplayRenderInfo().getSlotCounts();
RenderInfo.ItemDisplayRenderInfo itemDisplayRenderInfo = blockEntity.getStorageWrapper().getRenderInfo().getItemDisplayRenderInfo();
List<Integer> slotCounts = itemDisplayRenderInfo.getSlotCounts();
List<Integer> infiniteSlots = itemDisplayRenderInfo.getInfiniteSlots();
if (slotCounts.isEmpty()) {
slotCounts = blockEntity.getSlotCounts();
}
Expand All @@ -166,13 +170,22 @@ private void renderItemCounts(LimitedBarrelBlockEntity blockEntity, PoseStack po
Vector3f frontOffset = DisplayItemRenderer.getDisplayItemIndexFrontOffset(displayItemIndex, slotCounts.size());

double xTranslation = -frontOffset.x();
float yTranslation = frontOffset.y() + countDisplayYOffset;
boolean isInfinite = infiniteSlots.contains(displayItemIndex);
float yTranslation = frontOffset.y() + (isInfinite ? countDisplayYOffset / 1.8f : countDisplayYOffset);
double zTranslation = 0.001 - (flatTop ? 0 : 0.75 / 16D);
poseStack.translate(xTranslation, yTranslation, zTranslation);

float scale = slotCounts.size() == 1 ? SINGLE_ITEM_FONT_SCALE : MULTIPLE_ITEMS_FONT_SCALE;
if (isInfinite) {
scale *= 2;
}
poseStack.scale(scale, -scale, scale);
MutableComponent countString = Component.literal(CountAbbreviator.abbreviate(count, slotCounts.size() == 1 ? 6 : 5)).withStyle(COUNT_DISPLAY_STYLE);
MutableComponent countString;
if (isInfinite) {
countString = Component.literal("∞").withStyle(INFINITE_COUNT_DISPLAY_STYLE);
} else {
countString = Component.literal(CountAbbreviator.abbreviate(count, slotCounts.size() == 1 ? 6 : 5)).withStyle(COUNT_DISPLAY_STYLE);
}
Font font = Minecraft.getInstance().font;
float countDisplayXOffset = -font.getSplitter().stringWidth(countString) / 2f;
poseStack.translate(countDisplayXOffset, 0, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,13 @@
import net.neoforged.neoforge.event.level.BlockEvent;
import net.neoforged.neoforge.event.tick.LevelTickEvent;
import net.neoforged.neoforge.network.PacketDistributor;
import net.p3pp3rf1y.sophisticatedbackpacks.backpack.BackpackBlock;
import net.p3pp3rf1y.sophisticatedbackpacks.backpack.BackpackBlockEntity;
import net.p3pp3rf1y.sophisticatedbackpacks.client.gui.SBPTranslationHelper;
import net.p3pp3rf1y.sophisticatedcore.inventory.InventoryHandler;
import net.p3pp3rf1y.sophisticatedcore.network.SyncPlayerSettingsPayload;
import net.p3pp3rf1y.sophisticatedcore.settings.SettingsManager;
import net.p3pp3rf1y.sophisticatedcore.upgrades.infinity.InfinityUpgradeItem;
import net.p3pp3rf1y.sophisticatedcore.util.InventoryHelper;
import net.p3pp3rf1y.sophisticatedcore.util.ItemBase;
import net.p3pp3rf1y.sophisticatedcore.util.WorldHelper;
Expand All @@ -46,7 +50,8 @@ public void registerHandlers() {
IEventBus eventBus = NeoForge.EVENT_BUS;
eventBus.addListener(this::onPlayerChangedDimension);
eventBus.addListener(this::onPlayerRespawn);
eventBus.addListener(this::onBlockBreak);
eventBus.addListener(this::handleTooManyDropsBreak);
eventBus.addListener(this::handleBreakBackpackWithInfinityUpgrade);
eventBus.addListener(this::onLimitedBarrelLeftClicked);
eventBus.addListener(this::onSneakItemBlockInteraction);
eventBus.addListener(this::onLevelTick);
Expand Down Expand Up @@ -116,7 +121,22 @@ private void onLevelTick(LevelTickEvent.Post event) {
}
}

private void onBlockBreak(BlockEvent.BreakEvent event) {
private void handleBreakBackpackWithInfinityUpgrade(BlockEvent.BreakEvent event) {
Player player = event.getPlayer();

if (player.hasPermissions(2) || !(event.getState().getBlock() instanceof StorageBlockBase)) {
return;
}

if (WorldHelper.getBlockEntity(event.getLevel(), event.getPos(), StorageBlockEntity.class)
.map(storageBlockEntity -> !storageBlockEntity.getStorageWrapper().getUpgradeHandler().getTypeWrappers(InfinityUpgradeItem.TYPE).isEmpty())
.orElse(false)) {
event.setCanceled(true);
player.displayClientMessage(StorageTranslationHelper.INSTANCE.translStatusMessage("infinity_upgrade_only_admin_break").withStyle(ChatFormatting.RED), true);
}
}

private void handleTooManyDropsBreak(BlockEvent.BreakEvent event) {
Player player = event.getPlayer();
if (!(event.getState().getBlock() instanceof WoodStorageBlockBase) || player.isShiftKeyDown()) {
return;
Expand Down Expand Up @@ -146,7 +166,7 @@ private void onBlockBreak(BlockEvent.BreakEvent event) {
return;
}
droppedItemEntityCount.addAndGet((int) Math.ceil(stack.getCount() / (double) Math.min(stack.getMaxStackSize(), AVERAGE_MAX_ITEM_ENTITY_DROP_COUNT)));
});
}, () -> false, false);

if (droppedItemEntityCount.get() > Config.SERVER.tooManyItemEntityDrops.get()) {
event.setCanceled(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import net.p3pp3rf1y.sophisticatedcore.upgrades.feeding.FeedingUpgradeWrapper;
import net.p3pp3rf1y.sophisticatedcore.upgrades.filter.FilterUpgradeContainer;
import net.p3pp3rf1y.sophisticatedcore.upgrades.filter.FilterUpgradeItem;
import net.p3pp3rf1y.sophisticatedcore.upgrades.infinity.InfinityUpgradeItem;
import net.p3pp3rf1y.sophisticatedcore.upgrades.jukebox.JukeboxUpgradeContainer;
import net.p3pp3rf1y.sophisticatedcore.upgrades.jukebox.JukeboxUpgradeItem;
import net.p3pp3rf1y.sophisticatedcore.upgrades.jukebox.JukeboxUpgradeWrapper;
Expand Down Expand Up @@ -158,6 +159,8 @@ private ModItems() {
new HopperUpgradeItem(Config.SERVER.hopperUpgrade.inputFilterSlots::get, Config.SERVER.hopperUpgrade.outputFilterSlots::get, Config.SERVER.hopperUpgrade.transferSpeedTicks::get, Config.SERVER.hopperUpgrade.maxTransferStackSize::get));
public static final DeferredHolder<Item, HopperUpgradeItem> ADVANCED_HOPPER_UPGRADE = ITEMS.register("advanced_hopper_upgrade", () ->
new HopperUpgradeItem(Config.SERVER.advancedHopperUpgrade.inputFilterSlots::get, Config.SERVER.advancedHopperUpgrade.outputFilterSlots::get, Config.SERVER.advancedHopperUpgrade.transferSpeedTicks::get, Config.SERVER.advancedHopperUpgrade.maxTransferStackSize::get));
public static final DeferredHolder<Item, InfinityUpgradeItem> INFINITY_UPGRADE = ITEMS.register("infinity_upgrade", () -> new InfinityUpgradeItem(Config.SERVER.maxUpgradesPerStorage));

public static final Supplier<StorageTierUpgradeItem> BASIC_TIER_UPGRADE = ITEMS.register("basic_tier_upgrade", () -> new StorageTierUpgradeItem(StorageTierUpgradeItem.TierUpgrade.BASIC, true));
public static final Supplier<StorageTierUpgradeItem> BASIC_TO_COPPER_TIER_UPGRADE = ITEMS.register("basic_to_copper_tier_upgrade", () -> new StorageTierUpgradeItem(StorageTierUpgradeItem.TierUpgrade.BASIC_TO_COPPER));
public static final Supplier<StorageTierUpgradeItem> BASIC_TO_IRON_TIER_UPGRADE = ITEMS.register("basic_to_iron_tier_upgrade", () -> new StorageTierUpgradeItem(StorageTierUpgradeItem.TierUpgrade.BASIC_TO_IRON));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mojang.datafixers.util.Pair;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
Expand All @@ -17,10 +18,7 @@

import javax.annotation.Nullable;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.IntFunction;
import java.util.function.Supplier;
import java.util.function.ToIntFunction;
import java.util.function.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

Expand Down Expand Up @@ -618,7 +616,7 @@ public void setStackInSlot(int slot, ItemStack stack, BiConsumer<Integer, ItemSt
}

@Override
public boolean isItemValid(int slot, ItemStack stack) {
public boolean isItemValid(int slot, ItemStack stack, @Nullable Player player, BiPredicate<Integer, ItemStack> isItemValidSuper) {
if (!slotDefinitions.containsKey(slot)) {
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,8 @@
"item.sophisticatedstorage.hopper_upgrade.tooltip": "Pulls items from block on top and/or pushes them to block below",
"item.sophisticatedstorage.advanced_hopper_upgrade": "Advanced Hopper Upgrade",
"item.sophisticatedstorage.advanced_hopper_upgrade.tooltip": "Pulls items from block on top and/or pushes them to block below\nFaster and with input / ouput options",
"item.sophisticatedstorage.infinity_upgrade": "Infinity Upgrade",
"item.sophisticatedstorage.infinity_upgrade.tooltip": "Makes all items in storage infinite",
"item.sophisticatedstorage.chipped.botanist_workbench_upgrade": "Chipped: Botanist's Workbench Upgrade",
"item.sophisticatedstorage.chipped.botanist_workbench_upgrade.tooltip": "Chipped Botanist's Workbench in an upgrade tab",
"item.sophisticatedstorage.chipped.glassblower_upgrade": "Chipped: Glassblower Upgrade",
Expand Down Expand Up @@ -262,6 +264,7 @@
"gui.sophisticatedstorage.settings.buttons.context_storage.tooltip_detail": "Inherited from player or overriden for this storage",
"keybind.sophisticatedstorage.category": "Sophisticated Storage",
"keybind.sophisticatedstorage.sort": "Sort Storage",
"gui.sophisticatedstorage.status.infinity_upgrade_only_admin_break": "Only Admins can break storage with Infinity Upgrade",
"gui.sophisticatedstorage.status.too_many_item_entity_drops": "Can't break the %s as it would cause too many (%s) item entities to drop from it\nConsider using %s or break it while sneaking to skip this check",
"gui.sophisticatedstorage.status.too_low_tier_upgrade_count": "Upgrading requires %s %ss",
"gui.sophisticatedstorage.status.packing_tape_disabled": "Config set to drop all storages as packed without the need for packing tape",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "sophisticatedstorage:item/infinity_upgrade"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit e8ac055

Please sign in to comment.