Skip to content

Commit 0afaa85

Browse files
committed
Fix broken staffcastenv production mixin
1 parent 5d288ea commit 0afaa85

File tree

1 file changed

+37
-11
lines changed

1 file changed

+37
-11
lines changed
Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package gay.object.hexdebug.mixin;
22

3+
import at.petrak.hexcasting.api.casting.eval.ResolvedPattern;
34
import at.petrak.hexcasting.api.casting.eval.env.StaffCastEnv;
5+
import at.petrak.hexcasting.api.casting.math.HexCoord;
6+
import at.petrak.hexcasting.api.mod.HexStatistics;
47
import at.petrak.hexcasting.common.msgs.MsgNewSpellPatternC2S;
58
import gay.object.hexdebug.items.ItemEvaluator;
69
import gay.object.hexdebug.registry.HexDebugItems;
@@ -10,26 +13,49 @@
1013
import org.spongepowered.asm.mixin.injection.Inject;
1114
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1215

16+
import java.util.HashSet;
17+
import java.util.List;
18+
1319
@Mixin(StaffCastEnv.class)
1420
public abstract class MixinStaffCastEnv {
15-
@Inject(
16-
method = "handleNewPatternOnServer",
17-
at = @At(
18-
value = "INVOKE",
19-
target = "Lat/petrak/hexcasting/xplat/IXplatAbstractions;getStaffcastVM(Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/world/InteractionHand;)Lat/petrak/hexcasting/api/casting/eval/vm/CastingVM;",
20-
ordinal = 0
21-
),
22-
cancellable = true
23-
)
21+
@Inject(method = "handleNewPatternOnServer", at = @At("HEAD"), cancellable = true)
2422
private static void handleNewEvaluatorPatternOnServer$hexdebug(
2523
ServerPlayer sender,
2624
MsgNewSpellPatternC2S msg,
2725
CallbackInfo ci
2826
) {
2927
var item = sender.getItemInHand(msg.handUsed()).getItem();
30-
if (item == HexDebugItems.EVALUATOR.getValue()) {
31-
ItemEvaluator.handleNewPatternOnServer(sender, msg);
28+
if (item != HexDebugItems.EVALUATOR.getValue()) return;
29+
30+
// FIXME: copied from handleNewPatternOnServer because I can't figure out how to inject before getStaffcastVM
31+
32+
boolean cheatedPatternOverlap = false;
33+
34+
List<ResolvedPattern> resolvedPatterns = msg.resolvedPatterns();
35+
if (!resolvedPatterns.isEmpty()) {
36+
var allPoints = new HashSet<HexCoord>();
37+
for (int i = 0; i < resolvedPatterns.size() - 1; i++) {
38+
ResolvedPattern pat = resolvedPatterns.get(i);
39+
allPoints.addAll(pat.getPattern().positions(pat.getOrigin()));
40+
}
41+
var currentResolvedPattern = resolvedPatterns.get(resolvedPatterns.size() - 1);
42+
var currentSpellPoints = currentResolvedPattern.getPattern()
43+
.positions(currentResolvedPattern.getOrigin());
44+
if (currentSpellPoints.stream().anyMatch(allPoints::contains)) {
45+
cheatedPatternOverlap = true;
46+
}
47+
}
48+
49+
if (cheatedPatternOverlap) {
3250
ci.cancel();
51+
return;
3352
}
53+
54+
sender.awardStat(HexStatistics.PATTERNS_DRAWN);
55+
56+
// actual new logic
57+
58+
ItemEvaluator.handleNewPatternOnServer(sender, msg);
59+
ci.cancel();
3460
}
3561
}

0 commit comments

Comments
 (0)