Skip to content

Commit 6fa2811

Browse files
committed
fix: 🐛 Fixed upgrade swaps allowing oversized tank and battery upgrades
1 parent 17be0c3 commit 6fa2811

6 files changed

Lines changed: 95 additions & 5 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ loader_version_range=[4,)
1515
mod_id=sophisticatedcore
1616
mod_name=Sophisticated Core
1717
mod_license=All Rights Reserved
18-
mod_version=1.4.81
18+
mod_version=1.4.82
1919
mod_group_id=net.p3pp3rf1y
2020
mod_authors=P3pp3rF1y
2121
mod_description=A library / shared functionality mod for Sophisticated Storage and Backpacks

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,8 @@ private static void onDrawScreen(ScreenEvent.Render.Post event) {
167167
}
168168
ItemStack held = containerGui.getMenu().getCarried();
169169
Slot under = containerGui.getSlotUnderMouse();
170-
if (!held.isEmpty() && under != null && under.mayPickup(mc.player) && !under.getItem().isEmpty()) {
171-
getStashResultAndTooltip(under.getItem(), held)
170+
if (!held.isEmpty() && under != null && !under.getItem().isEmpty()) {
171+
getStashResultAndTooltip(under.getItem(), held).filter(stashResultAndTooltip -> under.mayPickup(mc.player))
172172
.ifPresent(stashResultAndTooltip -> renderSpecialTooltip(event, mc, event.getGuiGraphics(), stashResultAndTooltip));
173173
}
174174
}
@@ -188,10 +188,10 @@ private static void onContainerScreenForeground(ContainerScreenEvent.Render.Fore
188188
Slot under = containerGui.getSlotUnderMouse();
189189
for (Slot s : menu.slots) {
190190
ItemStack stack = s.getItem();
191-
if (s == under || !s.mayPickup(mc.player) || stack.isEmpty()) {
191+
if (s == under || stack.isEmpty()) {
192192
continue;
193193
}
194-
getStashResultAndTooltip(stack, held)
194+
getStashResultAndTooltip(stack, held).filter(stashResultAndTooltip -> s.mayPickup(mc.player))
195195
.ifPresent(stashResultAndTooltip -> renderStashSign(mc, event.getGuiGraphics(), s, stack, stashResultAndTooltip.stashResult()));
196196
}
197197
}

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

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

40+
@Override
41+
public UpgradeSlotChangeResult canSwapUpgradeFor(ItemStack upgradeStackToPut, int upgradeSlot, IStorageWrapper storageWrapper, boolean isClientSide) {
42+
if (upgradeStackToPut.getItem() == this) {
43+
return checkExtraInsertConditions(upgradeStackToPut, storageWrapper, isClientSide, upgradeSlot, this);
44+
}
45+
46+
return super.canSwapUpgradeFor(upgradeStackToPut, upgradeSlot, storageWrapper, isClientSide);
47+
}
48+
4049
@Override
4150
public int getInventoryColumnsTaken() {
4251
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
@@ -51,6 +51,15 @@ public UpgradeType<TankUpgradeWrapper> getType() {
5151
return TYPE;
5252
}
5353

54+
@Override
55+
public UpgradeSlotChangeResult canSwapUpgradeFor(ItemStack upgradeStackToPut, int upgradeSlot, IStorageWrapper storageWrapper, boolean isClientSide) {
56+
if (upgradeStackToPut.getItem() == this) {
57+
return checkExtraInsertConditions(upgradeStackToPut, storageWrapper, isClientSide, upgradeSlot, this);
58+
}
59+
60+
return super.canSwapUpgradeFor(upgradeStackToPut, upgradeSlot, storageWrapper, isClientSide);
61+
}
62+
5463
@Override
5564
public UpgradeSlotChangeResult checkExtraInsertConditions(ItemStack upgradeStack, IStorageWrapper storageWrapper, boolean isClientSide,
5665
@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: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package net.p3pp3rf1y.sophisticatedcore.upgrades.tank;
2+
3+
import net.minecraft.network.chat.contents.TranslatableContents;
4+
import net.minecraft.world.item.ItemStack;
5+
import net.minecraft.world.level.material.Fluids;
6+
import net.neoforged.neoforge.fluids.FluidStack;
7+
import net.neoforged.neoforge.fluids.SimpleFluidContent;
8+
import net.p3pp3rf1y.sophisticatedcore.api.IStorageWrapper;
9+
import net.p3pp3rf1y.sophisticatedcore.common.gui.UpgradeSlotChangeResult;
10+
import net.p3pp3rf1y.sophisticatedcore.init.ModCoreDataComponents;
11+
import org.junit.jupiter.api.Test;
12+
13+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
14+
import static org.junit.jupiter.api.Assertions.assertFalse;
15+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
16+
import static org.mockito.ArgumentMatchers.any;
17+
import static org.mockito.Mockito.CALLS_REAL_METHODS;
18+
import static org.mockito.Mockito.doReturn;
19+
import static org.mockito.Mockito.mock;
20+
import static org.mockito.Mockito.when;
21+
22+
class TankUpgradeItemTest {
23+
@Test
24+
void canSwapUpgradeForRejectsSameTankWithContentsAboveTargetCapacity() {
25+
TankUpgradeItem tankUpgrade = mock(TankUpgradeItem.class, CALLS_REAL_METHODS);
26+
ItemStack upgradeStack = mock(ItemStack.class);
27+
when(upgradeStack.getItem()).thenReturn(tankUpgrade);
28+
when(upgradeStack.getOrDefault(ModCoreDataComponents.FLUID_CONTENTS, SimpleFluidContent.EMPTY))
29+
.thenReturn(SimpleFluidContent.copyOf(new FluidStack(Fluids.WATER, 40_001)));
30+
doReturn(40_000).when(tankUpgrade).getTankCapacity(any());
31+
32+
UpgradeSlotChangeResult result = tankUpgrade.canSwapUpgradeFor(upgradeStack, 0, mock(IStorageWrapper.class), false);
33+
34+
assertFalse(result.successful());
35+
TranslatableContents errorContents = assertInstanceOf(TranslatableContents.class, result.errorMessage().getContents());
36+
assertArrayEquals(new Object[]{"1.1"}, errorContents.getArgs());
37+
}
38+
}

0 commit comments

Comments
 (0)