Skip to content

Commit 70920d8

Browse files
committed
Show splat on evaluator if the debugger state has been modified / can be reset
1 parent d178d76 commit 70920d8

File tree

14 files changed

+136
-19
lines changed

14 files changed

+136
-19
lines changed

Common/src/generated/resources/assets/hexdebug/models/item/evaluator.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
{
22
"parent": "minecraft:item/handheld_rod",
3+
"overrides": [
4+
{
5+
"model": "hexdebug:item/evaluator/default",
6+
"predicate": {
7+
"hexdebug:eval_state": 0.0
8+
}
9+
},
10+
{
11+
"model": "hexdebug:item/evaluator/modified",
12+
"predicate": {
13+
"hexdebug:eval_state": 0.5
14+
}
15+
}
16+
],
317
"textures": {
418
"layer0": "hexdebug:item/evaluator"
519
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"parent": "hexdebug:item/evaluator"
3+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"parent": "hexdebug:item/evaluator",
3+
"textures": {
4+
"layer1": "hexdebug:item/evaluator/eval_state/modified"
5+
}
6+
}

Common/src/main/java/gay/object/hexdebug/mixin/MixinStaffCastEnv.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@ public abstract class MixinStaffCastEnv {
2828
) {
2929
var item = sender.getItemInHand(msg.handUsed()).getItem();
3030
if (item == HexDebugItems.EVALUATOR.getValue()) {
31-
var success = ItemEvaluator.handleNewEvaluatorPatternOnServer(sender, msg);
32-
if (success) {
33-
ci.cancel();
34-
}
31+
ItemEvaluator.handleNewPatternOnServer(sender, msg);
32+
ci.cancel();
3533
}
3634
}
3735
}

Common/src/main/kotlin/gay/object/hexdebug/adapter/DebugAdapter.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gay.`object`.hexdebug.adapter
22

33
import at.petrak.hexcasting.api.casting.SpellList
44
import at.petrak.hexcasting.api.casting.eval.ExecutionClientView
5+
import at.petrak.hexcasting.api.casting.eval.ResolvedPatternType
56
import at.petrak.hexcasting.api.casting.iota.Iota
67
import at.petrak.hexcasting.api.casting.iota.PatternIota
78
import at.petrak.hexcasting.api.casting.math.HexPattern
@@ -12,8 +13,10 @@ import gay.`object`.hexdebug.adapter.DebugAdapterState.*
1213
import gay.`object`.hexdebug.adapter.proxy.DebugProxyServerLauncher
1314
import gay.`object`.hexdebug.debugger.*
1415
import gay.`object`.hexdebug.items.ItemDebugger
16+
import gay.`object`.hexdebug.items.ItemEvaluator
1517
import gay.`object`.hexdebug.networking.HexDebugNetworking
1618
import gay.`object`.hexdebug.networking.MsgDebuggerStateS2C
19+
import gay.`object`.hexdebug.networking.MsgEvaluatorStateS2C
1720
import gay.`object`.hexdebug.utils.futureOf
1821
import gay.`object`.hexdebug.utils.paginate
1922
import gay.`object`.hexdebug.utils.toFuture
@@ -59,6 +62,16 @@ open class DebugAdapter(val player: ServerPlayer) : IDebugProtocolServer {
5962

6063
protected open fun setDebuggerState(debuggerState: ItemDebugger.DebugState) {
6164
HexDebugNetworking.sendToPlayer(player, MsgDebuggerStateS2C(debuggerState))
65+
66+
// close the debugger grid if we stopped debugging
67+
if (debuggerState == ItemDebugger.DebugState.NOT_DEBUGGING) {
68+
val info = ExecutionClientView(true, ResolvedPatternType.EVALUATED, listOf(), null)
69+
IXplatAbstractions.INSTANCE.sendPacketToPlayer(player, MsgNewSpellPatternS2C(info, -1))
70+
}
71+
}
72+
73+
protected open fun setEvaluatorState(evalState: ItemEvaluator.EvalState) {
74+
HexDebugNetworking.sendToPlayer(player, MsgEvaluatorStateS2C(evalState))
6275
}
6376

6477
fun startDebugging(args: CastArgs): Boolean {
@@ -71,6 +84,7 @@ open class DebugAdapter(val player: ServerPlayer) : IDebugProtocolServer {
7184
fun disconnectClient() {
7285
if (state !is NotConnected) {
7386
remoteProxy.terminated(TerminatedEventArguments())
87+
7488
state = NotConnected
7589
}
7690
}
@@ -98,10 +112,15 @@ open class DebugAdapter(val player: ServerPlayer) : IDebugProtocolServer {
98112
fun evaluate(iota: Iota) = evaluate(SpellList.LList(listOf(iota)))
99113

100114
fun evaluate(list: SpellList) = debugger?.let {
101-
handleDebuggerStep(it.evaluate(list))
115+
val result = it.evaluate(list)
116+
if (result?.startedEvaluating == true) {
117+
setEvaluatorState(ItemEvaluator.EvalState.MODIFIED)
118+
}
119+
handleDebuggerStep(result)
102120
}
103121

104122
fun resetEvaluator() {
123+
setEvaluatorState(ItemEvaluator.EvalState.DEFAULT)
105124
debugger?.also {
106125
it.resetEvaluator()
107126
sendStoppedEvent("step")

Common/src/main/kotlin/gay/object/hexdebug/debugger/DebugStepResult.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ data class DebugStepResult(
77
val reason: String,
88
val type: DebugStepType? = null,
99
val loadedSources: Map<Source, LoadedSourceReason> = mapOf(),
10+
val startedEvaluating: Boolean = false,
1011
) {
1112
operator fun plus(other: DebugStepResult) = copy(
1213
loadedSources = loadedSources + other.loadedSources,

Common/src/main/kotlin/gay/object/hexdebug/debugger/HexDebugger.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,6 @@ class HexDebugger(
360360
}
361361

362362
fun getClientView(): ExecutionClientView {
363-
val image = vm.image
364363
val (stackDescs, ravenmind) = vm.generateDescs()
365364
val isStackClear = nextContinuation is Done // only close the window if we're done evaluating
366365
return ExecutionClientView(isStackClear, lastResolutionType, stackDescs, ravenmind)
@@ -370,11 +369,12 @@ class HexDebugger(
370369
* Use [DebugAdapter.evaluate][gay.object.hexdebug.adapter.DebugAdapter.evaluate] instead.
371370
*/
372371
internal fun evaluate(list: SpellList): DebugStepResult? {
373-
if (evaluatorResetData == null) {
372+
val startedEvaluating = evaluatorResetData == null
373+
if (startedEvaluating) {
374374
evaluatorResetData = Pair(nextContinuation, vm.image)
375375
}
376376
nextContinuation = nextContinuation.pushFrame(FrameEvaluate(list, false))
377-
return executeOnce()
377+
return executeOnce()?.copy(startedEvaluating = startedEvaluating)
378378
}
379379

380380
/**

Common/src/main/kotlin/gay/object/hexdebug/items/ItemEvaluator.kt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import at.petrak.hexcasting.common.items.ItemStaff
55
import at.petrak.hexcasting.common.lib.HexSounds
66
import at.petrak.hexcasting.common.msgs.*
77
import at.petrak.hexcasting.xplat.IXplatAbstractions
8+
import gay.`object`.hexdebug.HexDebug
89
import gay.`object`.hexdebug.adapter.DebugAdapterManager
10+
import gay.`object`.hexdebug.utils.itemPredicate
11+
import net.minecraft.client.player.LocalPlayer
12+
import net.minecraft.client.renderer.item.ClampedItemPropertyFunction
913
import net.minecraft.server.level.ServerPlayer
1014
import net.minecraft.stats.Stats
1115
import net.minecraft.world.InteractionHand
@@ -54,21 +58,31 @@ class ItemEvaluator(properties: Properties) : ItemStaff(properties) {
5458
}
5559

5660
companion object {
61+
val EVAL_STATE_PREDICATE = HexDebug.id("eval_state")
62+
63+
var evalState: EvalState = EvalState.DEFAULT
64+
65+
fun getProperties() = mapOf(
66+
EVAL_STATE_PREDICATE to ClampedItemPropertyFunction { _, _, entity, _ ->
67+
// don't show the active icon for debuggers held by other players, on the ground, etc
68+
val state = if (entity is LocalPlayer) evalState else EvalState.DEFAULT
69+
state.itemPredicate
70+
},
71+
)
72+
5773
/**
5874
* Copy of [StaffCastEnv.handleNewPatternOnServer][at.petrak.hexcasting.api.casting.eval.env.StaffCastEnv.handleNewPatternOnServer]
5975
* for evaluating patterns in the active debugger, if any.
60-
*
61-
* Returns `true` if the pattern was handled successfully (ie. handleNewPatternOnServer should be cancelled).
6276
*/
6377
@JvmStatic
64-
fun handleNewEvaluatorPatternOnServer(sender: ServerPlayer, msg: MsgNewSpellPatternC2S): Boolean {
78+
fun handleNewPatternOnServer(sender: ServerPlayer, msg: MsgNewSpellPatternC2S) {
6579
val debugAdapter = DebugAdapterManager[sender]
6680
val debugger = debugAdapter?.debugger
6781
if (debugAdapter == null || debugger == null) {
68-
return false
82+
return
6983
}
7084

71-
val clientInfo = debugAdapter.evaluate(msg.pattern) ?: return false
85+
val clientInfo = debugAdapter.evaluate(msg.pattern) ?: return
7286

7387
debugger.evaluatorUIPatterns.clear()
7488
if (!clientInfo.isStackClear) {
@@ -92,8 +106,11 @@ class ItemEvaluator(properties: Properties) : ItemStaff(properties) {
92106
ParticleSpray(sender.position(), Vec3(0.0, 1.5, 0.0), 0.4, Math.PI / 3, 30)
93107
.sprayParticles(sender.serverLevel(), IXplatAbstractions.INSTANCE.getPigment(sender))
94108
}
95-
96-
return true
97109
}
98110
}
111+
112+
enum class EvalState {
113+
DEFAULT,
114+
MODIFIED,
115+
}
99116
}

Common/src/main/kotlin/gay/object/hexdebug/networking/HexDebugNetworking.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ object HexDebugNetworking {
88
private val CHANNEL = NetworkChannel.create(HexDebug.id("networking_channel"))
99

1010
fun init() {
11+
// FIXME: gross.
1112
CHANNEL.register(MsgDebugAdapterProxyC2S::class.java, MsgDebugAdapterProxyC2S::encode, ::MsgDebugAdapterProxyC2S, MsgDebugAdapterProxyC2S::apply)
1213
CHANNEL.register(MsgDebugAdapterProxyS2C::class.java, MsgDebugAdapterProxyS2C::encode, ::MsgDebugAdapterProxyS2C, MsgDebugAdapterProxyS2C::apply)
1314
CHANNEL.register(MsgDebuggerStateS2C::class.java, MsgDebuggerStateS2C::encode, ::MsgDebuggerStateS2C, MsgDebuggerStateS2C::apply)
15+
CHANNEL.register(MsgEvaluatorStateS2C::class.java, MsgEvaluatorStateS2C::encode, ::MsgEvaluatorStateS2C, MsgEvaluatorStateS2C::apply)
1416
}
1517

1618
fun <T> sendToServer(message: T) = CHANNEL.sendToServer(message)

Common/src/main/kotlin/gay/object/hexdebug/networking/MsgDebuggerStateS2C.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ package gay.`object`.hexdebug.networking
33
import dev.architectury.networking.NetworkManager.PacketContext
44
import gay.`object`.hexdebug.HexDebug
55
import gay.`object`.hexdebug.items.ItemDebugger
6+
import gay.`object`.hexdebug.items.ItemDebugger.DebugState
7+
import gay.`object`.hexdebug.items.ItemEvaluator
8+
import gay.`object`.hexdebug.items.ItemEvaluator.EvalState
69
import net.minecraft.network.FriendlyByteBuf
710
import java.util.function.Supplier
811

9-
data class MsgDebuggerStateS2C(private val debuggerState: ItemDebugger.DebugState) {
12+
data class MsgDebuggerStateS2C(private val debuggerState: DebugState) {
1013
constructor(buf: FriendlyByteBuf) : this(
11-
buf.readEnum(ItemDebugger.DebugState::class.java),
14+
buf.readEnum(DebugState::class.java),
1215
)
1316

1417
fun encode(buf: FriendlyByteBuf) {
@@ -19,6 +22,9 @@ data class MsgDebuggerStateS2C(private val debuggerState: ItemDebugger.DebugStat
1922
ctx.queue {
2023
HexDebug.LOGGER.debug("Client received packet: {}", this)
2124
ItemDebugger.debugState = debuggerState
25+
if (debuggerState == DebugState.NOT_DEBUGGING) {
26+
ItemEvaluator.evalState = EvalState.DEFAULT
27+
}
2228
}
2329
}
2430
}

0 commit comments

Comments
 (0)