|
1 | 1 | package gay.object.hexdebug.mixin; |
2 | 2 |
|
| 3 | +import at.petrak.hexcasting.api.casting.eval.ResolvedPattern; |
3 | 4 | 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; |
4 | 7 | import at.petrak.hexcasting.common.msgs.MsgNewSpellPatternC2S; |
5 | 8 | import gay.object.hexdebug.items.ItemEvaluator; |
6 | 9 | import gay.object.hexdebug.registry.HexDebugItems; |
|
10 | 13 | import org.spongepowered.asm.mixin.injection.Inject; |
11 | 14 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; |
12 | 15 |
|
| 16 | +import java.util.HashSet; |
| 17 | +import java.util.List; |
| 18 | + |
13 | 19 | @Mixin(StaffCastEnv.class) |
14 | 20 | 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) |
24 | 22 | private static void handleNewEvaluatorPatternOnServer$hexdebug( |
25 | 23 | ServerPlayer sender, |
26 | 24 | MsgNewSpellPatternC2S msg, |
27 | 25 | CallbackInfo ci |
28 | 26 | ) { |
29 | 27 | 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) { |
32 | 50 | ci.cancel(); |
| 51 | + return; |
33 | 52 | } |
| 53 | + |
| 54 | + sender.awardStat(HexStatistics.PATTERNS_DRAWN); |
| 55 | + |
| 56 | + // actual new logic |
| 57 | + |
| 58 | + ItemEvaluator.handleNewPatternOnServer(sender, msg); |
| 59 | + ci.cancel(); |
34 | 60 | } |
35 | 61 | } |
0 commit comments