From 04e5db728cfac96ce36d1543c19850b5d9b3ab4b Mon Sep 17 00:00:00 2001 From: Teakowa Date: Sat, 26 Sep 2026 11:07:32 +0800 Subject: [PATCH] feat(manifest): resolve the 42 missing OverPy member functions Add manifest entries with receivers, defaults and enum domains for the player state, score, communication, chat, HUD, nameplate, spectate, throttle, team and assist members the pinned OverPy accepts, plus strIndex. The OverPy spellings enableGamemodeHud and enableGamemodeInWorldUi map to the catalog ids enableGameModeHud and enableGameModeInworldUI. Add pinned-oracle probes and document the supported forms. Closes #387 --- crates/opy-rs/src/manifest/data/manifest.json | 496 ++++++++++++++++++ .../probes/missing-member-actions.opy | 29 + .../manifest/probes/missing-member-values.opy | 21 + crates/opy-rs/src/manifest/probes/probes.json | 14 + .../language-support/callables-and-domains.md | 1 + 5 files changed, 561 insertions(+) create mode 100644 crates/opy-rs/src/manifest/probes/missing-member-actions.opy create mode 100644 crates/opy-rs/src/manifest/probes/missing-member-values.opy diff --git a/crates/opy-rs/src/manifest/data/manifest.json b/crates/opy-rs/src/manifest/data/manifest.json index 065c921a..d94bec94 100644 --- a/crates/opy-rs/src/manifest/data/manifest.json +++ b/crates/opy-rs/src/manifest/data/manifest.json @@ -3094,6 +3094,197 @@ "params": [], "receiver": "Player" }, + { + "catalogId": "getHorizontalSpeed", + "evidence": [ + "missing-member-values" + ], + "id": "getHorizontalSpeed", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "getVerticalSpeed", + "evidence": [ + "missing-member-values" + ], + "id": "getVerticalSpeed", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "getNumberOfDeaths", + "evidence": [ + "missing-member-values" + ], + "id": "getNumberOfDeaths", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "getNumberOfElims", + "evidence": [ + "missing-member-values" + ], + "id": "getNumberOfElims", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "getNumberOfFinalBlows", + "evidence": [ + "missing-member-values" + ], + "id": "getNumberOfFinalBlows", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "getScore", + "evidence": [ + "missing-member-values" + ], + "id": "getScore", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "isCommunicatingAnything", + "evidence": [ + "missing-member-values" + ], + "id": "isCommunicatingAnything", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "isCommunicatingSpray", + "evidence": [ + "missing-member-values" + ], + "id": "isCommunicatingSpray", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "isCommunicatingVoiceline", + "evidence": [ + "missing-member-values" + ], + "id": "isCommunicatingVoiceline", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "isCrouching", + "evidence": [ + "missing-member-values" + ], + "id": "isCrouching", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "isOnFire", + "evidence": [ + "missing-member-values" + ], + "id": "isOnFire", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "isOnWall", + "evidence": [ + "missing-member-values" + ], + "id": "isOnWall", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "isStanding", + "evidence": [ + "missing-member-values" + ], + "id": "isStanding", + "kind": "memberValue", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "getPlayerClosestToReticle", + "evidence": [ + "missing-member-values" + ], + "id": "getPlayerClosestToReticle", + "kind": "memberValue", + "params": [ + { + "domain": "Team", + "name": "team" + } + ], + "receiver": "Player" + }, + { + "catalogId": "isCommunicating", + "evidence": [ + "missing-member-values" + ], + "id": "isCommunicating", + "kind": "memberValue", + "params": [ + { + "domain": "Comms", + "name": "type" + } + ], + "receiver": "Player" + }, + { + "catalogId": "isInViewAngle", + "evidence": [ + "missing-member-values" + ], + "id": "isInViewAngle", + "kind": "memberValue", + "params": [ + { + "name": "location" + }, + { + "name": "viewAngle" + } + ], + "receiver": "Player" + }, + { + "catalogId": "strIndex", + "evidence": [ + "missing-member-values" + ], + "id": "strIndex", + "kind": "memberValue", + "params": [ + { + "name": "character" + } + ], + "receiver": "Any" + }, { "catalogId": "hasSpawned", "evidence": [ @@ -3230,6 +3421,311 @@ ], "receiver": "Player" }, + { + "catalogId": "detach", + "evidence": [ + "missing-member-actions" + ], + "id": "detach", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "disableDeathSpectateAllPlayers", + "evidence": [ + "missing-member-actions" + ], + "id": "disableDeathSpectateAllPlayers", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "disableDeathSpectateTargetHud", + "evidence": [ + "missing-member-actions" + ], + "id": "disableDeathSpectateTargetHud", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "disableScoreboard", + "evidence": [ + "missing-member-actions" + ], + "id": "disableScoreboard", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "disableTextChat", + "evidence": [ + "missing-member-actions" + ], + "id": "disableTextChat", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "enableDeathSpectateAllPlayers", + "evidence": [ + "missing-member-actions" + ], + "id": "enableDeathSpectateAllPlayers", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "enableDeathSpectateTargetHud", + "evidence": [ + "missing-member-actions" + ], + "id": "enableDeathSpectateTargetHud", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "enableKillFeed", + "evidence": [ + "missing-member-actions" + ], + "id": "enableKillFeed", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "enableMessages", + "evidence": [ + "missing-member-actions" + ], + "id": "enableMessages", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "enableScoreboard", + "evidence": [ + "missing-member-actions" + ], + "id": "enableScoreboard", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "enableTextChat", + "evidence": [ + "missing-member-actions" + ], + "id": "enableTextChat", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "enableVoiceChat", + "evidence": [ + "missing-member-actions" + ], + "id": "enableVoiceChat", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "resetHeroAvailability", + "evidence": [ + "missing-member-actions" + ], + "id": "resetHeroAvailability", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "stopAllHealingOverTime", + "evidence": [ + "missing-member-actions" + ], + "id": "stopAllHealingOverTime", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "stopTransformingThrottle", + "evidence": [ + "missing-member-actions" + ], + "id": "stopTransformingThrottle", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "enableGameModeHud", + "evidence": [ + "missing-member-actions" + ], + "id": "enableGamemodeHud", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "enableGameModeInworldUI", + "evidence": [ + "missing-member-actions" + ], + "id": "enableGamemodeInWorldUi", + "kind": "memberAction", + "params": [], + "receiver": "Player" + }, + { + "catalogId": "disableNameplatesFor", + "evidence": [ + "missing-member-actions" + ], + "id": "disableNameplatesFor", + "kind": "memberAction", + "params": [ + { + "name": "viewingPlayers" + } + ], + "receiver": "Player" + }, + { + "catalogId": "enableNameplatesFor", + "evidence": [ + "missing-member-actions" + ], + "id": "enableNameplatesFor", + "kind": "memberAction", + "params": [ + { + "name": "viewingPlayers" + } + ], + "receiver": "Player" + }, + { + "catalogId": "disableVoiceChat", + "evidence": [ + "missing-member-actions" + ], + "id": "disableVoiceChat", + "kind": "memberAction", + "params": [ + { + "name": "teamVoiceChat" + }, + { + "name": "matchVoiceChat" + }, + { + "name": "groupVoiceChat" + } + ], + "receiver": "Player" + }, + { + "catalogId": "setJumpVerticalSpeed", + "evidence": [ + "missing-member-actions" + ], + "id": "setJumpVerticalSpeed", + "kind": "memberAction", + "params": [ + { + "name": "jumpVerticalSpeedPercent" + } + ], + "receiver": "Player" + }, + { + "catalogId": "setScore", + "evidence": [ + "missing-member-actions" + ], + "id": "setScore", + "kind": "memberAction", + "params": [ + { + "name": "score" + } + ], + "receiver": "Player" + }, + { + "catalogId": "startTransformingThrottle", + "evidence": [ + "missing-member-actions" + ], + "id": "startTransformingThrottle", + "kind": "memberAction", + "params": [ + { + "name": "xAxisScalar" + }, + { + "name": "yAxisScalar" + }, + { + "domain": "Vector", + "name": "relativeDirection" + } + ], + "receiver": "Player" + }, + { + "catalogId": "moveToTeam", + "evidence": [ + "missing-member-actions" + ], + "id": "moveToTeam", + "kind": "memberAction", + "params": [ + { + "domain": "Team", + "name": "team" + }, + { + "default": -1, + "name": "slot" + } + ], + "receiver": "Player" + }, + { + "catalogId": "startGrantingAssistFor", + "evidence": [ + "missing-member-actions" + ], + "id": "startGrantingAssistFor", + "kind": "memberAction", + "params": [ + { + "name": "targets" + }, + { + "default": "ASSISTERS_AND_TARGETS", + "domain": "AssistReeval", + "name": "reevaluation" + } + ], + "receiver": "Player" + }, { "catalogId": "startScalingSize", "evidence": [ diff --git a/crates/opy-rs/src/manifest/probes/missing-member-actions.opy b/crates/opy-rs/src/manifest/probes/missing-member-actions.opy new file mode 100644 index 00000000..833ea08d --- /dev/null +++ b/crates/opy-rs/src/manifest/probes/missing-member-actions.opy @@ -0,0 +1,29 @@ +rule "missing member actions": + @Event eachPlayer + eventPlayer.detach() + eventPlayer.disableDeathSpectateAllPlayers() + eventPlayer.disableDeathSpectateTargetHud() + eventPlayer.disableNameplatesFor(getAllPlayers()) + eventPlayer.disableScoreboard() + eventPlayer.disableTextChat() + eventPlayer.disableVoiceChat(true, false, true) + eventPlayer.enableDeathSpectateAllPlayers() + eventPlayer.enableDeathSpectateTargetHud() + eventPlayer.enableGamemodeHud() + eventPlayer.enableGamemodeInWorldUi() + eventPlayer.enableKillFeed() + eventPlayer.enableMessages() + eventPlayer.enableNameplatesFor(getAllPlayers()) + eventPlayer.enableScoreboard() + eventPlayer.enableTextChat() + eventPlayer.enableVoiceChat() + eventPlayer.resetHeroAvailability() + eventPlayer.setJumpVerticalSpeed(50) + eventPlayer.setScore(5) + eventPlayer.startTransformingThrottle(1, 2, Vector.UP) + eventPlayer.stopAllHealingOverTime() + eventPlayer.stopTransformingThrottle() + eventPlayer.moveToTeam(Team.1) + eventPlayer.moveToTeam(Team.2, 2) + eventPlayer.startGrantingAssistFor(getAllPlayers()) + eventPlayer.startGrantingAssistFor(getAllPlayers(), AssistReeval.NONE) diff --git a/crates/opy-rs/src/manifest/probes/missing-member-values.opy b/crates/opy-rs/src/manifest/probes/missing-member-values.opy new file mode 100644 index 00000000..52c235cb --- /dev/null +++ b/crates/opy-rs/src/manifest/probes/missing-member-values.opy @@ -0,0 +1,21 @@ +globalvar v + +rule "missing member values": + @Event eachPlayer + v = eventPlayer.getHorizontalSpeed() + v = eventPlayer.getVerticalSpeed() + v = eventPlayer.getNumberOfDeaths() + v = eventPlayer.getNumberOfElims() + v = eventPlayer.getNumberOfFinalBlows() + v = eventPlayer.getScore() + v = eventPlayer.getPlayerClosestToReticle(Team.ALL) + v = eventPlayer.isCommunicating(Comms.ACKNOWLEDGE) + v = eventPlayer.isCommunicatingAnything() + v = eventPlayer.isCommunicatingSpray() + v = eventPlayer.isCommunicatingVoiceline() + v = eventPlayer.isCrouching() + v = eventPlayer.isInViewAngle(Vector.UP, 30) + v = eventPlayer.isOnFire() + v = eventPlayer.isOnWall() + v = eventPlayer.isStanding() + v = "abc".strIndex("b") diff --git a/crates/opy-rs/src/manifest/probes/probes.json b/crates/opy-rs/src/manifest/probes/probes.json index 19818a37..7ef17cc6 100644 --- a/crates/opy-rs/src/manifest/probes/probes.json +++ b/crates/opy-rs/src/manifest/probes/probes.json @@ -336,6 +336,20 @@ "outputSha256": "7b2ecd50c29af45d2747cd3bb15afbfbcd896887e145a25f6d66232112c0aecb", "sha256": "74fbae25f9bac410a94815eb40f76b70d8082db3d37a881f236568a6e3be008d", "source": "rule-condition.opy" + }, + { + "expect": "success", + "id": "missing-member-values", + "outputSha256": "30b6132638e707d7a7293ae8307188acd0669b04c388c2faf9386dc8d1355437", + "sha256": "beeccadafd6a6150e9df29fbb8d7c0e0912e5e3f086ae6f25508c343f892c0dc", + "source": "missing-member-values.opy" + }, + { + "expect": "success", + "id": "missing-member-actions", + "outputSha256": "95a6871fb42eb4ada1dfafc15630490d17a887ef44054d83a00122d475015549", + "sha256": "b151031d68fc1db3243f131aca08791d5df6ecc040dc9be13a3b65e4b0f6e17a", + "source": "missing-member-actions.opy" } ] } diff --git a/docs/language-support/callables-and-domains.md b/docs/language-support/callables-and-domains.md index 83dc2283..494671fe 100644 --- a/docs/language-support/callables-and-domains.md +++ b/docs/language-support/callables-and-domains.md @@ -27,6 +27,7 @@ canonical Workshop model. | `array[index]`, `array.slice(start, count)` | ✅ Supported | Indexing and slicing retain their distinct argument contracts. | | `string.format(...)` | ✅ Supported | Constant and dynamic indexed/sequential placeholder forms lower to canonical custom strings, including chunked forms beyond three dynamic values. | | Player members such as `setStatusEffect`, `setMoveSpeed`, `getPosition` and `teleport` | ✅ Supported | Receiver and enum arguments are checked before canonical lowering. | +| Player state, score, communication, chat, scoreboard, HUD, nameplate, spectate, throttle, team and assist members such as `getScore`, `isCrouching`, `isCommunicating(Comms.*)`, `isInViewAngle`, `setScore`, `disableVoiceChat(team, match, group)`, `enableGamemodeHud`, `enableGamemodeInWorldUi`, `startTransformingThrottle`, `moveToTeam(team[, slot])`, `startGrantingAssistFor(targets[, AssistReeval])`, `detach`, and `string.strIndex(character)` | ✅ Supported | Each resolves through the manifest with the pinned OverPy receiver, argument order, defaults and enum domains; the OverPy spellings `enableGamemodeHud` and `enableGamemodeInWorldUi` lower to the catalog `enableGameModeHud` and `enableGameModeInworldUI`. | | `vector.x`, `vector.y`, `vector.z` | ✅ Supported | Property access returns the corresponding numeric component. | | Member macros using `self` | ✅ Supported | Class-qualified member macros expand `self` to the call receiver while preserving argument and statement boundaries. |