Skip to content

Commit 7b46215

Browse files
committed
fix: 🐛 Fixed upgrade swaps allowing oversized tank and battery upgrades
1 parent d7291d4 commit 7b46215

6 files changed

Lines changed: 100 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.75
18+
mod_version=1.4.76
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
@@ -169,8 +169,8 @@ private static void onDrawScreen(ScreenEvent.Render.Post event) {
169169
}
170170
ItemStack held = containerGui.getMenu().getCarried();
171171
Slot under = containerGui.getSlotUnderMouse();
172-
if (!held.isEmpty() && under != null && under.mayPickup(mc.player) && !under.getItem().isEmpty()) {
173-
getStashResultAndTooltip(under.getItem(), held)
172+
if (!held.isEmpty() && under != null && !under.getItem().isEmpty()) {
173+
getStashResultAndTooltip(under.getItem(), held).filter(stashResultAndTooltip -> under.mayPickup(mc.player))
174174
.ifPresent(stashResultAndTooltip -> renderSpecialTooltip(event, mc, event.getGuiGraphics(), stashResultAndTooltip));
175175
}
176176
}
@@ -190,10 +190,10 @@ private static void onContainerScreenForeground(ContainerScreenEvent.Render.Fore
190190
Slot under = containerGui.getSlotUnderMouse();
191191
for (Slot s : menu.slots) {
192192
ItemStack stack = s.getItem();
193-
if (s == under || !s.mayPickup(mc.player) || stack.isEmpty()) {
193+
if (s == under || stack.isEmpty()) {
194194
continue;
195195
}
196-
getStashResultAndTooltip(stack, held)
196+
getStashResultAndTooltip(stack, held).filter(stashResultAndTooltip -> s.mayPickup(mc.player))
197197
.ifPresent(stashResultAndTooltip -> renderStashSign(mc, event.getGuiGraphics(), s, stack, stashResultAndTooltip.stashResult()));
198198
}
199199
}

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: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package net.p3pp3rf1y.sophisticatedcore.upgrades.battery;
2+
3+
import net.minecraft.core.component.DataComponentMap;
4+
import net.minecraft.network.chat.contents.TranslatableContents;
5+
import net.minecraft.world.item.ItemStack;
6+
import net.p3pp3rf1y.sophisticatedcore.api.IStorageWrapper;
7+
import net.p3pp3rf1y.sophisticatedcore.common.gui.UpgradeSlotChangeResult;
8+
import net.p3pp3rf1y.sophisticatedcore.init.ModCoreDataComponents;
9+
import org.junit.jupiter.api.Test;
10+
11+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
12+
import static org.junit.jupiter.api.Assertions.assertFalse;
13+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
14+
import static org.mockito.ArgumentMatchers.any;
15+
import static org.mockito.Mockito.CALLS_REAL_METHODS;
16+
import static org.mockito.Mockito.doReturn;
17+
import static org.mockito.Mockito.mock;
18+
import static org.mockito.Mockito.when;
19+
20+
class BatteryUpgradeItemTest {
21+
@Test
22+
void canSwapUpgradeForRejectsSameBatteryWithEnergyAboveTargetCapacity() {
23+
IStorageWrapper storageWrapper = mock(IStorageWrapper.class);
24+
BatteryUpgradeItem batteryUpgrade = mock(BatteryUpgradeItem.class, CALLS_REAL_METHODS);
25+
when(batteryUpgrade.asItem()).thenReturn(batteryUpgrade);
26+
when(batteryUpgrade.components()).thenReturn(DataComponentMap.EMPTY);
27+
doReturn(40_000).when(batteryUpgrade).getMaxEnergyStored(any());
28+
ItemStack upgradeStack = new ItemStack(batteryUpgrade);
29+
upgradeStack.set(ModCoreDataComponents.ENERGY_STORED, 40_001);
30+
31+
UpgradeSlotChangeResult result = batteryUpgrade.canSwapUpgradeFor(upgradeStack, 0, storageWrapper, false);
32+
33+
assertFalse(result.successful());
34+
TranslatableContents errorContents = assertInstanceOf(TranslatableContents.class, result.errorMessage().getContents());
35+
assertArrayEquals(new Object[]{"1.1"}, errorContents.getArgs());
36+
}
37+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package net.p3pp3rf1y.sophisticatedcore.upgrades.tank;
2+
3+
import net.minecraft.core.component.DataComponentMap;
4+
import net.minecraft.network.chat.contents.TranslatableContents;
5+
import net.minecraft.world.item.ItemStack;
6+
import net.minecraft.world.level.material.Fluids;
7+
import net.neoforged.neoforge.fluids.FluidStack;
8+
import net.neoforged.neoforge.fluids.SimpleFluidContent;
9+
import net.p3pp3rf1y.sophisticatedcore.api.IStorageWrapper;
10+
import net.p3pp3rf1y.sophisticatedcore.common.gui.UpgradeSlotChangeResult;
11+
import net.p3pp3rf1y.sophisticatedcore.init.ModCoreDataComponents;
12+
import org.junit.jupiter.api.Test;
13+
14+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
15+
import static org.junit.jupiter.api.Assertions.assertFalse;
16+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
17+
import static org.mockito.ArgumentMatchers.any;
18+
import static org.mockito.Mockito.CALLS_REAL_METHODS;
19+
import static org.mockito.Mockito.doReturn;
20+
import static org.mockito.Mockito.mock;
21+
import static org.mockito.Mockito.when;
22+
23+
class TankUpgradeItemTest {
24+
@Test
25+
void canSwapUpgradeForRejectsSameTankWithContentsAboveTargetCapacity() {
26+
IStorageWrapper storageWrapper = mock(IStorageWrapper.class);
27+
TankUpgradeItem tankUpgrade = mock(TankUpgradeItem.class, CALLS_REAL_METHODS);
28+
when(tankUpgrade.asItem()).thenReturn(tankUpgrade);
29+
when(tankUpgrade.components()).thenReturn(DataComponentMap.EMPTY);
30+
doReturn(40_000).when(tankUpgrade).getTankCapacity(any());
31+
ItemStack upgradeStack = new ItemStack(tankUpgrade);
32+
upgradeStack.set(ModCoreDataComponents.FLUID_CONTENTS, SimpleFluidContent.copyOf(new FluidStack(Fluids.WATER, 40_001)));
33+
34+
UpgradeSlotChangeResult result = tankUpgrade.canSwapUpgradeFor(upgradeStack, 0, storageWrapper, false);
35+
36+
assertFalse(result.successful());
37+
TranslatableContents errorContents = assertInstanceOf(TranslatableContents.class, result.errorMessage().getContents());
38+
assertArrayEquals(new Object[]{"1.1"}, errorContents.getArgs());
39+
}
40+
}

0 commit comments

Comments
 (0)