Skip to content

Commit 5baf6a5

Browse files
committed
fix: 🐛 Fixed upgrade swaps allowing oversized tank and battery upgrades
1 parent 6193142 commit 5baf6a5

6 files changed

Lines changed: 115 additions & 3 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ loader_version_range=[4,)
1313
mod_id=sophisticatedcore
1414
mod_name=Sophisticated Core
1515
mod_license=All Rights Reserved
16-
mod_version=1.4.94
16+
mod_version=1.4.95
1717
mod_group_id=net.p3pp3rf1y
1818
mod_authors=P3pp3rF1y
1919
mod_description=A library / shared functionality mod for Sophisticated Storage and Backpacks

src/main/java/net/p3pp3rf1y/sophisticatedcore/client/ClientEventHandler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,11 @@ private static void onContainerScreenForeground(ContainerScreenEvent.Render.Fore
203203
Slot under = containerGui.getSlotUnderMouse();
204204
for (Slot s : menu.slots) {
205205
ItemStack stack = s.getItem();
206-
if (s == under || !s.mayPickup(mc.player) || stack.isEmpty()) {
206+
if (s == under || stack.isEmpty()) {
207207
continue;
208208
}
209-
getStashResult(stack, held).ifPresent(stashResult -> renderStashSign(mc, event.getGuiGraphics(), s, stack, stashResult));
209+
getStashResult(stack, held).filter(stashResult -> s.mayPickup(mc.player))
210+
.ifPresent(stashResult -> renderStashSign(mc, event.getGuiGraphics(), s, stack, stashResult));
210211
}
211212
}
212213

src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/battery/BatteryUpgradeItem.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@ public UpgradeType<BatteryUpgradeWrapper> getType() {
3636
return TYPE;
3737
}
3838

39+
@Override
40+
public UpgradeSlotChangeResult canSwapUpgradeFor(ItemStack upgradeStackToPut, int upgradeSlot, IStorageWrapper storageWrapper, boolean isClientSide) {
41+
if (upgradeStackToPut.getItem() == this) {
42+
return checkExtraInsertConditions(upgradeStackToPut, storageWrapper, isClientSide, upgradeSlot, this);
43+
}
44+
45+
return super.canSwapUpgradeFor(upgradeStackToPut, upgradeSlot, storageWrapper, isClientSide);
46+
}
47+
3948
@Override
4049
public int getInventoryColumnsTaken() {
4150
return 2;

src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/tank/TankUpgradeItem.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@ public UpgradeType<TankUpgradeWrapper> getType() {
5050
return TYPE;
5151
}
5252

53+
@Override
54+
public UpgradeSlotChangeResult canSwapUpgradeFor(ItemStack upgradeStackToPut, int upgradeSlot, IStorageWrapper storageWrapper, boolean isClientSide) {
55+
if (upgradeStackToPut.getItem() == this) {
56+
return checkExtraInsertConditions(upgradeStackToPut, storageWrapper, isClientSide, upgradeSlot, this);
57+
}
58+
59+
return super.canSwapUpgradeFor(upgradeStackToPut, upgradeSlot, storageWrapper, isClientSide);
60+
}
61+
5362
@Override
5463
public UpgradeSlotChangeResult checkExtraInsertConditions(ItemStack upgradeStack, IStorageWrapper storageWrapper, boolean isClientSide,
5564
@Nullable IUpgradeItem<?> upgradeInSlot) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package net.p3pp3rf1y.sophisticatedcore.upgrades.battery;
2+
3+
import net.minecraft.network.chat.contents.TranslatableContents;
4+
import net.minecraft.world.item.ItemStack;
5+
import net.p3pp3rf1y.sophisticatedcore.api.IStorageWrapper;
6+
import net.p3pp3rf1y.sophisticatedcore.common.gui.UpgradeSlotChangeResult;
7+
import net.p3pp3rf1y.sophisticatedcore.init.ModCoreDataComponents;
8+
import org.junit.jupiter.api.Test;
9+
10+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
11+
import static org.junit.jupiter.api.Assertions.assertFalse;
12+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
13+
import static org.mockito.ArgumentMatchers.any;
14+
import static org.mockito.Mockito.CALLS_REAL_METHODS;
15+
import static org.mockito.Mockito.doReturn;
16+
import static org.mockito.Mockito.mock;
17+
import static org.mockito.Mockito.when;
18+
19+
class BatteryUpgradeItemTest {
20+
@Test
21+
void canSwapUpgradeForRejectsSameBatteryWithEnergyAboveTargetCapacity() {
22+
BatteryUpgradeItem batteryUpgrade = mock(BatteryUpgradeItem.class, CALLS_REAL_METHODS);
23+
ItemStack upgradeStack = mock(ItemStack.class);
24+
when(upgradeStack.getItem()).thenReturn(batteryUpgrade);
25+
when(upgradeStack.getOrDefault(ModCoreDataComponents.ENERGY_STORED, 0)).thenReturn(40_001);
26+
doReturn(40_000).when(batteryUpgrade).getMaxEnergyStored(any());
27+
28+
UpgradeSlotChangeResult result = batteryUpgrade.canSwapUpgradeFor(upgradeStack, 0, mock(IStorageWrapper.class), false);
29+
30+
assertFalse(result.successful());
31+
TranslatableContents errorContents = assertInstanceOf(TranslatableContents.class, result.errorMessage().getContents());
32+
assertArrayEquals(new Object[]{"1.1"}, errorContents.getArgs());
33+
}
34+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package net.p3pp3rf1y.sophisticatedcore.upgrades.tank;
2+
3+
import net.minecraft.SharedConstants;
4+
import net.minecraft.core.component.DataComponentMap;
5+
import net.minecraft.core.component.DataComponents;
6+
import net.minecraft.network.chat.contents.TranslatableContents;
7+
import net.minecraft.server.Bootstrap;
8+
import net.minecraft.world.item.Item;
9+
import net.minecraft.world.item.ItemStack;
10+
import net.minecraft.world.item.Items;
11+
import net.neoforged.neoforge.fluids.SimpleFluidContent;
12+
import net.p3pp3rf1y.sophisticatedcore.api.IStorageWrapper;
13+
import net.p3pp3rf1y.sophisticatedcore.common.gui.UpgradeSlotChangeResult;
14+
import net.p3pp3rf1y.sophisticatedcore.init.ModCoreDataComponents;
15+
import org.junit.jupiter.api.BeforeAll;
16+
import org.junit.jupiter.api.Test;
17+
18+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
19+
import static org.junit.jupiter.api.Assertions.assertFalse;
20+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
21+
import static org.mockito.ArgumentMatchers.any;
22+
import static org.mockito.Mockito.CALLS_REAL_METHODS;
23+
import static org.mockito.Mockito.doReturn;
24+
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.when;
26+
27+
class TankUpgradeItemTest {
28+
@BeforeAll
29+
static void setup() {
30+
SharedConstants.tryDetectVersion();
31+
Bootstrap.bootStrap();
32+
Bootstrap.validate();
33+
bindTestComponents(Items.EXPERIENCE_BOTTLE, Items.POTION, Items.GLASS_BOTTLE);
34+
}
35+
36+
private static void bindTestComponents(Item... items) {
37+
DataComponentMap components = DataComponentMap.builder().set(DataComponents.MAX_STACK_SIZE, 64).build();
38+
for (Item item : items) {
39+
item.builtInRegistryHolder().bindComponents(components);
40+
}
41+
}
42+
43+
@Test
44+
void canSwapUpgradeForRejectsSameTankWithContentsAboveTargetCapacity() {
45+
TankUpgradeItem tankUpgrade = mock(TankUpgradeItem.class, CALLS_REAL_METHODS);
46+
ItemStack upgradeStack = mock(ItemStack.class);
47+
SimpleFluidContent contents = mock(SimpleFluidContent.class);
48+
when(upgradeStack.getItem()).thenReturn(tankUpgrade);
49+
when(contents.getAmount()).thenReturn(40_001);
50+
when(upgradeStack.getOrDefault(ModCoreDataComponents.FLUID_CONTENTS, SimpleFluidContent.EMPTY)).thenReturn(contents);
51+
doReturn(40_000).when(tankUpgrade).getTankCapacity(any());
52+
53+
UpgradeSlotChangeResult result = tankUpgrade.canSwapUpgradeFor(upgradeStack, 0, mock(IStorageWrapper.class), false);
54+
55+
assertFalse(result.successful());
56+
TranslatableContents errorContents = assertInstanceOf(TranslatableContents.class, result.errorMessage().getContents());
57+
assertArrayEquals(new Object[]{"1.1"}, errorContents.getArgs());
58+
}
59+
}

0 commit comments

Comments
 (0)