Skip to content

Commit a93f5eb

Browse files
committed
fix: sneak-wrenching blaze bankers bypassed extra break check
fixes #77
1 parent d92a4d2 commit a93f5eb

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

common/src/main/java/dev/ithundxr/createnumismatics/content/backend/Coin.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import com.simibubi.create.foundation.gui.AllIcons;
2424
import com.simibubi.create.foundation.utility.Components;
2525
import com.simibubi.create.foundation.utility.Couple;
26-
import com.simibubi.create.foundation.utility.Pair;
2726
import dev.ithundxr.createnumismatics.registry.NumismaticsIcons;
2827
import dev.ithundxr.createnumismatics.registry.NumismaticsItems;
2928
import dev.ithundxr.createnumismatics.util.TextUtils;
@@ -169,4 +168,8 @@ public static Coin getCoinFromName(String name){
169168
}
170169
return selectedCoin;
171170
}
171+
172+
public static Iterable<Coin> valuesHighToLow() {
173+
return Arrays.stream(values()).sorted(Comparator.comparingInt(c -> -c.value))::iterator;
174+
}
172175
}

common/src/main/java/dev/ithundxr/createnumismatics/content/bank/blaze_banker/BankAccountBehaviour.java

+46-1
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,15 @@
2121
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
2222
import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType;
2323
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
24+
import com.simibubi.create.foundation.utility.Couple;
2425
import dev.ithundxr.createnumismatics.Numismatics;
2526
import dev.ithundxr.createnumismatics.content.backend.BankAccount;
27+
import dev.ithundxr.createnumismatics.content.backend.Coin;
28+
import dev.ithundxr.createnumismatics.util.Utils;
29+
import net.minecraft.core.NonNullList;
2630
import net.minecraft.nbt.CompoundTag;
31+
import net.minecraft.world.Containers;
32+
import net.minecraft.world.item.ItemStack;
2733

2834
import java.util.UUID;
2935

@@ -77,8 +83,47 @@ public BehaviourType<?> getType() {
7783
public void destroy() {
7884
super.destroy();
7985
BankAccount oldAccount = Numismatics.BANK.accounts.remove(accountUUID);
80-
if (oldAccount != null)
86+
if (oldAccount != null) {
8187
oldAccount.setLabel(null);
88+
89+
if (oldAccount.getBalance() != 0) {
90+
// Drop coins
91+
NonNullList<ItemStack> stacks = NonNullList.create();
92+
int spurs = oldAccount.getBalance();
93+
for (Coin coin : Coin.valuesHighToLow()) {
94+
if (spurs == 0)
95+
break;
96+
97+
Couple<Integer> amount = coin.convert(spurs);
98+
spurs = amount.getSecond();
99+
100+
int coinAmount = amount.getFirst();
101+
102+
while (coinAmount > 64) {
103+
stacks.add(coin.asStack(64));
104+
coinAmount -= 64;
105+
}
106+
if (coinAmount > 0)
107+
stacks.add(coin.asStack(coinAmount));
108+
}
109+
if (!stacks.isEmpty()) {
110+
Containers.dropContents(getWorld(), getPos(), stacks);
111+
}
112+
113+
{
114+
long start = System.currentTimeMillis();
115+
Numismatics.LOGGER.error("Bank account behaviour removed with non-zero balance"); // set breakpoint here when developing
116+
if (Utils.isDevEnv()) {
117+
long end = System.currentTimeMillis();
118+
if (end - start < 50) { // crash if breakpoint wasn't set
119+
throw new RuntimeException("Bank account behaviour removed with non-zero balance, please set a breakpoint above");
120+
}
121+
} else {
122+
Numismatics.LOGGER.error("Stacktrace: ", new RuntimeException("Bank account behaviour removed with non-zero balance"));
123+
}
124+
}
125+
}
126+
}
82127
Numismatics.BANK.markBankDirty();
83128
}
84129
}

common/src/main/java/dev/ithundxr/createnumismatics/content/bank/blaze_banker/BlazeBankerBlock.java

+2
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ public void setPlacedBy(@NotNull Level level, @NotNull BlockPos pos, @NotNull Bl
133133
public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) {
134134
if (!isTrusted(context.getPlayer(), context.getLevel(), context.getClickedPos()))
135135
return InteractionResult.FAIL;
136+
if (!mayBreak(context.getLevel(), context.getClickedPos(), state, context.getPlayer()))
137+
return InteractionResult.FAIL;
136138
return IWrenchable.super.onSneakWrenched(state, context);
137139
}
138140

0 commit comments

Comments
 (0)