summer-engine 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +27 -5
- package/.codex-plugin/plugin.json +28 -6
- package/.cursor-plugin/plugin.json +27 -5
- package/.factory-plugin/plugin.json +27 -5
- package/.opencode/plugins/summer.js +1 -1
- package/CHANGELOG.md +120 -0
- package/README.md +22 -7
- package/assets/audit/scene_audit.gd +4136 -0
- package/assets/seeing/seeing_probe.gd +1873 -0
- package/dist/cli/commands/setup.js +6 -19
- package/dist/cli/commands/skills.js +57 -32
- package/dist/core/api-client.d.ts +9 -1
- package/dist/core/api-client.js +21 -4
- package/dist/core/capabilities/agent-playbook.js +46 -0
- package/dist/core/capabilities/audit/accept.d.ts +55 -0
- package/dist/core/capabilities/audit/accept.js +147 -0
- package/dist/core/capabilities/audit/args.d.ts +95 -0
- package/dist/core/capabilities/audit/args.js +89 -0
- package/dist/core/capabilities/audit/audit.d.ts +56 -0
- package/dist/core/capabilities/audit/audit.js +287 -0
- package/dist/core/capabilities/audit/frame.d.ts +14 -0
- package/dist/core/capabilities/audit/frame.js +35 -0
- package/dist/core/capabilities/audit/gaps.d.ts +96 -0
- package/dist/core/capabilities/audit/gaps.js +257 -0
- package/dist/core/capabilities/audit/judge.d.ts +162 -0
- package/dist/core/capabilities/audit/judge.js +1134 -0
- package/dist/core/capabilities/audit/math.d.ts +110 -0
- package/dist/core/capabilities/audit/math.js +263 -0
- package/dist/core/capabilities/audit/summary.d.ts +74 -0
- package/dist/core/capabilities/audit/summary.js +212 -0
- package/dist/core/capabilities/board.d.ts +31 -0
- package/dist/core/capabilities/board.js +43 -0
- package/dist/core/capabilities/camera-view.d.ts +4 -2
- package/dist/core/capabilities/camera-view.js +6 -3
- package/dist/core/capabilities/connect-signal.d.ts +85 -0
- package/dist/core/capabilities/connect-signal.js +285 -0
- package/dist/core/capabilities/engine-fallbacks.d.ts +5 -0
- package/dist/core/capabilities/engine-fallbacks.js +5 -0
- package/dist/core/capabilities/engine-ops.d.ts +5 -1
- package/dist/core/capabilities/engine-ops.js +0 -3
- package/dist/core/capabilities/engine-receipt.d.ts +12 -0
- package/dist/core/capabilities/engine-receipt.js +26 -0
- package/dist/core/capabilities/file-read.d.ts +64 -0
- package/dist/core/capabilities/file-read.js +325 -0
- package/dist/core/capabilities/game-task-plan.js +4 -2
- package/dist/core/capabilities/grep.d.ts +60 -0
- package/dist/core/capabilities/grep.js +190 -0
- package/dist/core/capabilities/inspect-node.d.ts +56 -0
- package/dist/core/capabilities/inspect-node.js +225 -0
- package/dist/core/capabilities/inspect-resource.d.ts +61 -0
- package/dist/core/capabilities/inspect-resource.js +376 -0
- package/dist/core/capabilities/math3d.d.ts +28 -0
- package/dist/core/capabilities/math3d.js +88 -0
- package/dist/core/capabilities/motion-generation.d.ts +62 -0
- package/dist/core/capabilities/motion-generation.js +138 -0
- package/dist/core/capabilities/placement-batch.d.ts +102 -0
- package/dist/core/capabilities/placement-batch.js +483 -0
- package/dist/core/capabilities/placement-math.d.ts +70 -0
- package/dist/core/capabilities/placement-math.js +209 -0
- package/dist/core/capabilities/placement-script.d.ts +42 -0
- package/dist/core/capabilities/placement-script.js +1096 -0
- package/dist/core/capabilities/placement.d.ts +485 -0
- package/dist/core/capabilities/placement.js +1731 -0
- package/dist/core/capabilities/project-context.d.ts +33 -2
- package/dist/core/capabilities/project-context.js +87 -4
- package/dist/core/capabilities/replace-node.d.ts +91 -0
- package/dist/core/capabilities/replace-node.js +423 -0
- package/dist/core/capabilities/runtime-control.d.ts +20 -4
- package/dist/core/capabilities/runtime-control.js +67 -2
- package/dist/core/capabilities/scene-batch.d.ts +63 -0
- package/dist/core/capabilities/scene-batch.js +394 -0
- package/dist/core/capabilities/scene-readback.d.ts +36 -0
- package/dist/core/capabilities/scene-readback.js +54 -0
- package/dist/core/capabilities/seeing/args.d.ts +348 -0
- package/dist/core/capabilities/seeing/args.js +178 -0
- package/dist/core/capabilities/seeing/candidates.d.ts +127 -0
- package/dist/core/capabilities/seeing/candidates.js +282 -0
- package/dist/core/capabilities/seeing/math.d.ts +134 -0
- package/dist/core/capabilities/seeing/math.js +269 -0
- package/dist/core/capabilities/seeing/probe.d.ts +62 -0
- package/dist/core/capabilities/seeing/probe.js +188 -0
- package/dist/core/capabilities/seeing/scoring.d.ts +235 -0
- package/dist/core/capabilities/seeing/scoring.js +639 -0
- package/dist/core/capabilities/seeing/seeing.d.ts +233 -0
- package/dist/core/capabilities/seeing/seeing.js +1341 -0
- package/dist/core/capabilities/seeing/shot-store.d.ts +52 -0
- package/dist/core/capabilities/seeing/shot-store.js +204 -0
- package/dist/core/capabilities/surface-snap-mesh.d.ts +88 -0
- package/dist/core/capabilities/surface-snap-mesh.js +425 -0
- package/dist/core/capabilities/surface-snap.d.ts +77 -0
- package/dist/core/capabilities/surface-snap.js +461 -0
- package/dist/core/capabilities/tool-dispatch.js +231 -72
- package/dist/core/capabilities/tscn.d.ts +85 -0
- package/dist/core/capabilities/tscn.js +391 -0
- package/dist/core/capabilities/world-snapshot.d.ts +58 -0
- package/dist/core/capabilities/world-snapshot.js +150 -0
- package/dist/core/capability-skew.d.ts +5 -5
- package/dist/core/capability-skew.js +14 -6
- package/dist/core/headless/worker-engine-client.d.ts +1 -1
- package/dist/core/headless/worker-engine-client.js +2 -2
- package/dist/core/library-read.d.ts +37 -5
- package/dist/core/library-read.js +264 -33
- package/dist/core/library-search.d.ts +2 -2
- package/dist/core/skills-registry.d.ts +9 -1
- package/dist/core/skills-registry.js +25 -2
- package/dist/installer/agent-config.d.ts +9 -4
- package/dist/installer/agent-config.js +194 -392
- package/dist/installer/agent-table.d.ts +119 -0
- package/dist/installer/agent-table.js +619 -0
- package/dist/installer/setup.js +4 -2
- package/dist/installer/skill-locations.d.ts +8 -17
- package/dist/installer/skill-locations.js +22 -101
- package/dist/installer/version-check.d.ts +5 -1
- package/dist/installer/version-check.js +38 -28
- package/dist/mcp/server.js +9 -3
- package/dist/mcp/tools/asset-tools.js +21 -3
- package/dist/mcp/tools/audit-tools.d.ts +23 -0
- package/dist/mcp/tools/audit-tools.js +60 -0
- package/dist/mcp/tools/debug-tools.js +3 -1
- package/dist/mcp/tools/file-tools.js +17 -4
- package/dist/mcp/tools/generate-tools.js +74 -66
- package/dist/mcp/tools/library-tools.js +2 -0
- package/dist/mcp/tools/perception-tools.js +6 -19
- package/dist/mcp/tools/placement-tools.d.ts +24 -0
- package/dist/mcp/tools/placement-tools.js +91 -0
- package/dist/mcp/tools/project-tools.js +18 -15
- package/dist/mcp/tools/scene-tools.js +71 -83
- package/dist/mcp/tools/seeing-tools.d.ts +24 -0
- package/dist/mcp/tools/seeing-tools.js +64 -0
- package/dist/mcp/tools/spatial-tools.js +17 -9
- package/dist/mcp/tools/visual-tools.js +59 -7
- package/gemini-extension.json +26 -4
- package/integrations/README.md +48 -19
- package/integrations/amp/README.md +12 -0
- package/integrations/amp/manifest-target.json +3 -0
- package/integrations/antigravity/README.md +12 -0
- package/integrations/antigravity/manifest-target.json +3 -0
- package/integrations/claude-desktop/README.md +12 -0
- package/integrations/claude-desktop/manifest-target.json +3 -0
- package/integrations/cline/README.md +8 -9
- package/integrations/cline-cli/README.md +12 -0
- package/integrations/cline-cli/manifest-target.json +3 -0
- package/integrations/copilot-jetbrains/README.md +12 -0
- package/integrations/copilot-jetbrains/manifest-target.json +3 -0
- package/integrations/crush/README.md +12 -0
- package/integrations/crush/manifest-target.json +3 -0
- package/integrations/github-copilot/README.md +8 -8
- package/integrations/goose/README.md +12 -0
- package/integrations/goose/manifest-target.json +3 -0
- package/integrations/grok-build/README.md +12 -0
- package/integrations/grok-build/manifest-target.json +3 -0
- package/integrations/hermes/README.md +12 -0
- package/integrations/hermes/manifest-target.json +3 -0
- package/integrations/junie/README.md +12 -0
- package/integrations/junie/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +6 -10
- package/integrations/kimi-code/README.md +12 -0
- package/integrations/kimi-code/manifest-target.json +3 -0
- package/integrations/kiro/README.md +12 -0
- package/integrations/kiro/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +8 -8
- package/integrations/mistral-vibe/README.md +12 -0
- package/integrations/mistral-vibe/manifest-target.json +3 -0
- package/integrations/opencode/README.md +9 -12
- package/integrations/qoder/README.md +12 -0
- package/integrations/qoder/manifest-target.json +3 -0
- package/integrations/qwen-code/README.md +12 -0
- package/integrations/qwen-code/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +8 -7
- package/integrations/rovo-dev/README.md +12 -0
- package/integrations/rovo-dev/manifest-target.json +3 -0
- package/integrations/trae/README.md +12 -0
- package/integrations/trae/manifest-target.json +3 -0
- package/integrations/visual-studio/README.md +12 -0
- package/integrations/visual-studio/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +9 -9
- package/integrations/warp/README.md +12 -0
- package/integrations/warp/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +8 -9
- package/integrations/zed/README.md +12 -0
- package/integrations/zed/manifest-target.json +3 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +59 -15
- package/library/references/mcp-tools-reference/resource.yaml +1 -1
- package/library/references/summer-folder/resource.yaml +1 -1
- package/library/references/summer-folder/summer-folder.md +1 -1
- package/library/skills/3d-lighting/SKILL.md +1 -1
- package/library/skills/README.md +264 -0
- package/library/skills/adaptive-music/SKILL.md +1 -1
- package/library/skills/agent-playtesting/SKILL.md +1 -1
- package/library/skills/ai-characters-in-games/SKILL.md +220 -0
- package/library/skills/ai-characters-in-games/resource.yaml +30 -0
- package/library/skills/ambient-bed/SKILL.md +1 -1
- package/library/skills/animated-loop/SKILL.md +1 -1
- package/library/skills/animation-tree/SKILL.md +1 -1
- package/library/skills/art-direction/SKILL.md +1 -1
- package/library/skills/asset-strategy/SKILL.md +2 -1
- package/library/skills/asset-strategy/resource.yaml +2 -1
- package/library/skills/audio-direction/SKILL.md +1 -1
- package/library/skills/auto-fire-targeting/SKILL.md +1 -1
- package/library/skills/brainstorm-game/SKILL.md +1 -1
- package/library/skills/brainstorming/SKILL.md +1 -1
- package/library/skills/browse-templates/SKILL.md +3 -3
- package/library/skills/browse-templates/resource.yaml +1 -1
- package/library/skills/camera-rigs/SKILL.md +128 -0
- package/library/skills/camera-rigs/resource.yaml +29 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +1 -1
- package/library/skills/character-animation-wiring/SKILL.md +1 -1
- package/library/skills/character-model/SKILL.md +1 -1
- package/library/skills/character-movement/SKILL.md +326 -0
- package/library/skills/character-movement/references/default-third-person-controller.gd +201 -0
- package/library/skills/character-movement/references/default-third-person-verification-probe.gd +154 -0
- package/library/skills/character-movement/references/movement-3d.md +136 -0
- package/library/skills/character-movement/references/platformer-feel.md +83 -0
- package/library/skills/character-movement/resource.yaml +40 -0
- package/library/skills/character-portrait/SKILL.md +1 -1
- package/library/skills/cinematic-cutscene/SKILL.md +1 -1
- package/library/skills/combat-basics/SKILL.md +159 -0
- package/library/skills/combat-basics/references/projectiles-and-aoe.md +100 -0
- package/library/skills/combat-basics/resource.yaml +34 -0
- package/library/skills/concept-art/SKILL.md +1 -1
- package/library/skills/create-asset-sheet/SKILL.md +1 -1
- package/library/skills/debug/SKILL.md +1 -1
- package/library/skills/debugging-game-feel/SKILL.md +1 -1
- package/library/skills/design-level/SKILL.md +1 -1
- package/library/skills/design-mechanic/SKILL.md +1 -1
- package/library/skills/design-npc/SKILL.md +1 -1
- package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
- package/library/skills/dispatching-parallel-agents/SKILL.md +1 -1
- package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
- package/library/skills/environment-kit/SKILL.md +1 -1
- package/library/skills/export-and-ship/SKILL.md +1 -1
- package/library/skills/fabricating-assets/SKILL.md +1 -1
- package/library/skills/facial-and-lipsync/SKILL.md +1 -1
- package/library/skills/fps-controller/SKILL.md +9 -7
- package/library/skills/fps-controller/resource.yaml +4 -1
- package/library/skills/game-feel/SKILL.md +1 -1
- package/library/skills/gameskill/SKILL.md +1 -1
- package/library/skills/gdscript-patterns/SKILL.md +1 -1
- package/library/skills/generate-motion/SKILL.md +9 -9
- package/library/skills/generate-motion/resource.yaml +2 -1
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
- package/library/skills/headless-scripting/SKILL.md +1 -1
- package/library/skills/in-game-purchases/SKILL.md +254 -0
- package/library/skills/in-game-purchases/resource.yaml +29 -0
- package/library/skills/instantiate-asset-pack/SKILL.md +1 -1
- package/library/skills/investigating-bugs/SKILL.md +1 -1
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +1 -1
- package/library/skills/make-game/SKILL.md +25 -3
- package/library/skills/make-game/references/2d-platformer-polish.md +93 -0
- package/library/skills/make-game/references/2d-platformer.md +117 -0
- package/library/skills/make-game/references/2d-rpg-content.md +234 -0
- package/library/skills/make-game/references/2d-rpg.md +241 -0
- package/library/skills/make-game/references/2d-survivors-progression.md +201 -0
- package/library/skills/make-game/references/2d-survivors.md +237 -0
- package/library/skills/make-game/references/3d-fps-systems.md +216 -0
- package/library/skills/make-game/references/3d-fps.md +177 -0
- package/library/skills/make-game/references/3d-horror-systems.md +186 -0
- package/library/skills/make-game/references/3d-horror.md +201 -0
- package/library/skills/make-game/references/3d-third-person-systems.md +220 -0
- package/library/skills/make-game/references/3d-third-person.md +215 -0
- package/library/skills/make-game/resource.yaml +6 -1
- package/library/skills/multiplayer/SKILL.md +150 -0
- package/library/skills/multiplayer/resource.yaml +33 -0
- package/library/skills/multiplayer-movement/SKILL.md +510 -0
- package/library/skills/multiplayer-movement/files.md +501 -0
- package/library/skills/multiplayer-movement/resource.yaml +30 -0
- package/library/skills/multiplayer-project/SKILL.md +521 -0
- package/library/skills/multiplayer-project/files.md +448 -0
- package/library/skills/multiplayer-project/resource.yaml +36 -0
- package/library/skills/multiplayer-publish/SKILL.md +229 -0
- package/library/skills/multiplayer-publish/export-errors.md +89 -0
- package/library/skills/multiplayer-publish/resource.yaml +28 -0
- package/library/skills/multiplayer-state/SKILL.md +438 -0
- package/library/skills/multiplayer-state/files.md +592 -0
- package/library/skills/multiplayer-state/resource.yaml +35 -0
- package/library/skills/multiplayer-testing/SKILL.md +236 -0
- package/library/skills/multiplayer-testing/resource.yaml +39 -0
- package/library/skills/music-track/SKILL.md +1 -1
- package/library/skills/navigate-summer/SKILL.md +1 -1
- package/library/skills/new-project/SKILL.md +1 -1
- package/library/skills/organic-model/SKILL.md +1 -1
- package/library/skills/pixel-art/SKILL.md +1 -1
- package/library/skills/play/SKILL.md +1 -1
- package/library/skills/playtesting-a-feature/SKILL.md +1 -1
- package/library/skills/procedural-animation/SKILL.md +2 -2
- package/library/skills/procedural-animation/resource.yaml +1 -1
- package/library/skills/prop-model/SKILL.md +1 -1
- package/library/skills/psx-retro-rendering/SKILL.md +1 -1
- package/library/skills/realtime-wet-surfaces/SKILL.md +2 -2
- package/library/skills/remote-deploy/SKILL.md +1 -1
- package/library/skills/retarget/SKILL.md +1 -1
- package/library/skills/running-in-the-cloud/SKILL.md +1 -1
- package/library/skills/save-load/SKILL.md +156 -0
- package/library/skills/save-load/resource.yaml +27 -0
- package/library/skills/scene-composition/SKILL.md +1 -1
- package/library/skills/scene-hierarchy-design/SKILL.md +1 -1
- package/library/skills/scene-scripting/SKILL.md +1 -1
- package/library/skills/scene-to-level/SKILL.md +1 -1
- package/library/skills/skill-create/SKILL.md +1 -1
- package/library/skills/skill-improve/SKILL.md +1 -1
- package/library/skills/skill-test/SKILL.md +1 -1
- package/library/skills/skintokens-auto-rigging/SKILL.md +1 -1
- package/library/skills/skybox-panorama/SKILL.md +1 -1
- package/library/skills/sound-effect/SKILL.md +1 -1
- package/library/skills/spatial-placement/SKILL.md +134 -3
- package/library/skills/spatial-placement/references/kit-placement-tools.md +364 -0
- package/library/skills/spatial-placement/resource.yaml +16 -2
- package/library/skills/sprite-sheet/SKILL.md +1 -1
- package/library/skills/summer-analytics/SKILL.md +147 -0
- package/library/skills/summer-analytics/resource.yaml +28 -0
- package/library/skills/summer-friends/SKILL.md +226 -0
- package/library/skills/summer-friends/resource.yaml +28 -0
- package/library/skills/summer-leaderboards/SKILL.md +231 -0
- package/library/skills/summer-leaderboards/resource.yaml +30 -0
- package/library/skills/summer-match-results/SKILL.md +286 -0
- package/library/skills/summer-match-results/resource.yaml +32 -0
- package/library/skills/summer-matchmaking/SKILL.md +301 -0
- package/library/skills/summer-matchmaking/resource.yaml +32 -0
- package/library/skills/summer-parties/SKILL.md +253 -0
- package/library/skills/summer-parties/resource.yaml +30 -0
- package/library/skills/summer-player-data/SKILL.md +322 -0
- package/library/skills/summer-player-data/resource.yaml +30 -0
- package/library/skills/summer-store/SKILL.md +271 -0
- package/library/skills/summer-store/resource.yaml +29 -0
- package/library/skills/summer-world-chat/SKILL.md +195 -0
- package/library/skills/summer-world-chat/resource.yaml +30 -0
- package/library/skills/summer-world-saves/SKILL.md +284 -0
- package/library/skills/summer-world-saves/resource.yaml +29 -0
- package/library/skills/text-to-motion/SKILL.md +99 -0
- package/library/skills/text-to-motion/prompts-and-controls.md +34 -0
- package/library/skills/text-to-motion/resource.yaml +41 -0
- package/library/skills/text-to-motion/rigging-for-text-motion.md +54 -0
- package/library/skills/tileable-texture/SKILL.md +1 -1
- package/library/skills/trailer-shot/SKILL.md +1 -1
- package/library/skills/tune-performance/SKILL.md +1 -1
- package/library/skills/ui-basics/SKILL.md +10 -1
- package/library/skills/ui-graphics/SKILL.md +1 -1
- package/library/skills/use-widget-asset/SKILL.md +1 -1
- package/library/skills/using-summer/SKILL.md +2 -2
- package/library/skills/using-summer/resource.yaml +2 -2
- package/library/skills/vehicle-model/SKILL.md +1 -1
- package/library/skills/verification-before-completion/SKILL.md +1 -1
- package/library/skills/verifying-scenes/SKILL.md +76 -2
- package/library/skills/verifying-scenes/resource.yaml +13 -2
- package/library/skills/vfx-dissolve/SKILL.md +1 -1
- package/library/skills/vfx-fire/SKILL.md +1 -1
- package/library/skills/vfx-hit-spark/SKILL.md +1 -1
- package/library/skills/vfx-lightning/SKILL.md +1 -1
- package/library/skills/vfx-magic-glow/SKILL.md +1 -1
- package/library/skills/vfx-muzzle-flash/SKILL.md +1 -1
- package/library/skills/vfx-smoke/SKILL.md +1 -1
- package/library/skills/vfx-water-ripple/SKILL.md +1 -1
- package/library/skills/voice-line/SKILL.md +1 -1
- package/library/skills/web-and-touch-input/SKILL.md +38 -0
- package/library/skills/web-and-touch-input/resource.yaml +28 -0
- package/library/skills/web-compatibility-look/SKILL.md +62 -0
- package/library/skills/web-compatibility-look/resource.yaml +30 -0
- package/library/skills/world-building-3d/SKILL.md +8 -1
- package/library/skills/world-building-3d/references/spatial-tools.md +1 -1
- package/library/skills/world-building-3d/resource.yaml +2 -1
- package/library/skills/writing-plans/SKILL.md +1 -1
- package/library/skills/writing-skills/SKILL.md +1 -1
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +2 -2
- package/library/tools/attach-to-surface/resource.yaml +142 -0
- package/library/tools/batch/resource.yaml +9 -3
- package/library/tools/connect-ports/resource.yaml +120 -0
- package/library/tools/connect-signal/resource.yaml +3 -2
- package/library/tools/debug-views/resource.yaml +94 -0
- package/library/tools/frame-nodes/resource.yaml +104 -0
- package/library/tools/frame-shot/resource.yaml +134 -0
- package/library/tools/generate-motion/resource.yaml +44 -9
- package/library/tools/get-board/resource.yaml +50 -0
- package/library/tools/get-project-context/resource.yaml +13 -2
- package/library/tools/grep/resource.yaml +77 -0
- package/library/tools/inspect-asset/resource.yaml +71 -0
- package/library/tools/inspect-node/resource.yaml +9 -2
- package/library/tools/inspect-resource/resource.yaml +16 -5
- package/library/tools/instantiate-scene/resource.yaml +27 -2
- package/library/tools/measure/resource.yaml +96 -0
- package/library/tools/place-adjacent/resource.yaml +113 -0
- package/library/tools/play/resource.yaml +15 -2
- package/library/tools/raycast/resource.yaml +101 -0
- package/library/tools/read-file/resource.yaml +36 -2
- package/library/tools/read-library/resource.yaml +2 -2
- package/library/tools/repeat-along/resource.yaml +129 -0
- package/library/tools/replace-node/resource.yaml +11 -5
- package/library/tools/scene-audit/resource.yaml +144 -0
- package/library/tools/screenshot/resource.yaml +13 -2
- package/library/tools/search-assets/resource.yaml +18 -0
- package/library/tools/shot-sheet/resource.yaml +110 -0
- package/library/tools/snap-to-surface/resource.yaml +4 -1
- package/library/tools/world-snapshot/resource.yaml +24 -3
- package/library/tools/zoom/resource.yaml +105 -0
- package/package.json +3 -3
- package/registry/generated/aliases.json +17 -3
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +26 -4
- package/registry/generated/index.json +2154 -469
- package/registry/generated/marketplace.claude.json +2 -2
- package/registry/generated/plugin.claude.json +27 -5
- package/registry/generated/plugin.codex.json +28 -6
- package/registry/generated/plugin.cursor.json +27 -5
- package/registry/generated/plugin.factory.json +27 -5
- package/registry/generated/skills-index.md +264 -0
- package/registry/generated/skills-registry.json +901 -206
- package/registry/generated/templates-registry.json +2 -2
- package/library/skills/host-authoritative-state/SKILL.md +0 -332
- package/library/skills/host-authoritative-state/resource.yaml +0 -28
- package/library/skills/peer-to-peer-multiplayer/SKILL.md +0 -373
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +0 -28
- package/library/skills/setup-multiplayer/SKILL.md +0 -336
- package/library/skills/setup-multiplayer/resource.yaml +0 -28
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: setup-multiplayer
|
|
3
|
-
description: "Use when the user wants to add multiplayer to an existing Summer game: co-op LAN, co-op online, competitive PvP, or a lobby. Start with Summer Engine's high-level MultiplayerAPI plus MultiplayerSpawner and MultiplayerSynchronizer; use custom networking only with a justified reason. Walks peer authority, RPC patterns, replication, and irreversible architecture decisions. It does not claim that managed matchmaking or hosting is live. Trigger on \"multiplayer\", \"co-op\", \"PvP\", \"online\", \"netcode\", \"rollback\", \"MultiplayerAPI\", \"host migration\", \"matchmaking\"."
|
|
4
|
-
license: MIT
|
|
5
|
-
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
-
category: multiplayer-and-networking
|
|
7
|
-
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep Edit Write summer_get_scene_tree summer_inspect_node summer_add_node summer_set_prop summer_connect_signal summer_save_scene summer_get_script_errors summer_project_setting summer_play summer_stop
|
|
9
|
-
paths: ["**/*.gd", "**/*.tscn", "**/*.tres", "project.godot"]
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# /setup-multiplayer — Add Multiplayer Without Repainting the Project
|
|
13
|
-
|
|
14
|
-
## Overview
|
|
15
|
-
|
|
16
|
-
Multiplayer is a one-way door. Pick the wrong authority model and refactoring
|
|
17
|
-
later is brutal. Start with **Summer Engine's high-level MultiplayerAPI +
|
|
18
|
-
MultiplayerSpawner + MultiplayerSynchronizer + ENet**. Do not roll custom
|
|
19
|
-
networking without a measured reason.
|
|
20
|
-
|
|
21
|
-
**Core principle:** the architecture decision (peer authority vs server authority) is harder than the code. Lock it before touching a single RPC.
|
|
22
|
-
|
|
23
|
-
## Steps
|
|
24
|
-
|
|
25
|
-
### 1. Ask the four blocking questions
|
|
26
|
-
|
|
27
|
-
Before any code:
|
|
28
|
-
|
|
29
|
-
> 1. What kind of multiplayer? co-op LAN / co-op online / competitive PvP / lobbies + matchmaking
|
|
30
|
-
> 2. How many players? 2 / 2–4 / 8+
|
|
31
|
-
> 3. Who runs the simulation? host (one of the players) / dedicated server / authoritative peer-to-peer
|
|
32
|
-
> 4. What's the network you're targeting? same Wi-Fi / public internet with ~80ms RTT / mobile
|
|
33
|
-
|
|
34
|
-
Wait. Each answer flips an irreversible knob.
|
|
35
|
-
|
|
36
|
-
### 2. Pick the authority model — irreversible decision
|
|
37
|
-
|
|
38
|
-
**Lock it now.** Refactoring authority is a project-killer.
|
|
39
|
-
|
|
40
|
-
| Model | Best for | Pros | Cons |
|
|
41
|
-
|---|---|---|---|
|
|
42
|
-
| **Host authority** (one player runs the sim) | Co-op (2–4 players), casual PvP, friends-only | Cheapest. No server bill. Host migration possible. | Host advantage (no lag for them). Cheating possible. |
|
|
43
|
-
| **Dedicated server authority** | Competitive PvP, matchmaking, > 4 players | Fair. Anti-cheat possible. Stable. | Server bill. Need a deploy story. Higher complexity. |
|
|
44
|
-
| **Peer-to-peer with shared authority** | Lock-step strategy / RTS, fighting games (rollback) | Symmetric latency. No "host advantage". | Determinism is a project on its own. Hard to debug. |
|
|
45
|
-
|
|
46
|
-
**Default recommendation:** host authority for co-op (2–4 players), dedicated server for everything else. If user says "competitive PvP" + "lobbies": dedicated.
|
|
47
|
-
|
|
48
|
-
State the choice explicitly:
|
|
49
|
-
|
|
50
|
-
> Going with **host authority** for 2–4 player co-op. The first player to start a game is the host. Their scene tree is the source of truth; clients receive replicated state and send input RPCs. Host migration is hard with this model — if the host quits, the game ends. Confirm?
|
|
51
|
-
|
|
52
|
-
### 3. Pick the transport
|
|
53
|
-
|
|
54
|
-
Almost always: **ENetMultiplayerPeer**. It is UDP with reliability layers and
|
|
55
|
-
ships with Summer Engine. Validate the actual game topology and player count;
|
|
56
|
-
this is local netcode, not managed hosting or matchmaking.
|
|
57
|
-
|
|
58
|
-
When to switch:
|
|
59
|
-
- **WebSocketMultiplayerPeer**: if you need the game to run in the browser (HTML5 export). ENet doesn't work in browsers.
|
|
60
|
-
- **WebRTCMultiplayerPeer**: if you need browser AND P2P (no central server). Higher complexity.
|
|
61
|
-
- **Custom transport**: never, unless you've shipped multiplayer before.
|
|
62
|
-
|
|
63
|
-
### 4. Pick what to replicate — the replication graph
|
|
64
|
-
|
|
65
|
-
Replicate the *minimum*. Every replicated field is bandwidth + bug surface.
|
|
66
|
-
|
|
67
|
-
For a typical co-op shooter:
|
|
68
|
-
|
|
69
|
-
| Object | Replicated state | Replication frequency | Authority |
|
|
70
|
-
|---|---|---|---|
|
|
71
|
-
| Player position / rotation | x, y, z, yaw | 20 Hz | Owner peer |
|
|
72
|
-
| Player health | int | On change | Server/host |
|
|
73
|
-
| Player input intent | move_dir, jump, fire | 30 Hz | Owner peer (sends to host) |
|
|
74
|
-
| Enemy state | position, hp, FSM state | 10 Hz | Host only |
|
|
75
|
-
| World items (pickups) | spawn / despawn events | On change | Host only |
|
|
76
|
-
| UI / menus | nothing | nothing | Local only |
|
|
77
|
-
| Particles, decorative VFX | nothing | nothing | Local only (each peer plays its own) |
|
|
78
|
-
|
|
79
|
-
**Don't replicate:**
|
|
80
|
-
- Local UI state.
|
|
81
|
-
- Cosmetic-only VFX (each peer simulates locally).
|
|
82
|
-
- Camera / view position (each peer has their own camera).
|
|
83
|
-
- Audio (use 3D audio with replicated positions, not replicate the AudioStreamPlayer).
|
|
84
|
-
|
|
85
|
-
### 5. Read the scene to find what changes
|
|
86
|
-
|
|
87
|
-
```
|
|
88
|
-
summer_get_scene_tree
|
|
89
|
-
summer_inspect_node "./World/Player"
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Note: the existing single-player Player needs to become a per-peer Player. The path is to spawn one Player per connected peer.
|
|
93
|
-
|
|
94
|
-
### 6. Propose the change set
|
|
95
|
-
|
|
96
|
-
> I'm about to:
|
|
97
|
-
> - Add a `Network` autoload (`scripts/network.gd`) that owns peer setup + spawn lifecycle.
|
|
98
|
-
> - Convert `./World/Player` from a static scene node into a `MultiplayerSpawner`-managed instance, spawned per peer on join.
|
|
99
|
-
> - Add a `MultiplayerSynchronizer` to the player scene replicating `position`, `rotation.y`, `health`.
|
|
100
|
-
> - Convert player input from local → input intent RPC sent to the authority.
|
|
101
|
-
> - Add a basic host/join UI on the main menu.
|
|
102
|
-
>
|
|
103
|
-
> Authority model: host. Transport: ENet. Tick: 30 Hz input, 20 Hz position. Confirm before I touch anything?
|
|
104
|
-
|
|
105
|
-
### 7. Build it
|
|
106
|
-
|
|
107
|
-
#### a) Network autoload
|
|
108
|
-
|
|
109
|
-
`scripts/network.gd`:
|
|
110
|
-
|
|
111
|
-
```gdscript
|
|
112
|
-
class_name Network
|
|
113
|
-
extends Node
|
|
114
|
-
|
|
115
|
-
const PORT := 7000
|
|
116
|
-
const MAX_PLAYERS := 4
|
|
117
|
-
|
|
118
|
-
signal player_joined(peer_id: int)
|
|
119
|
-
signal player_left(peer_id: int)
|
|
120
|
-
|
|
121
|
-
@export var player_scene: PackedScene
|
|
122
|
-
|
|
123
|
-
var _peer: MultiplayerPeer
|
|
124
|
-
|
|
125
|
-
func host_game() -> Error:
|
|
126
|
-
var enet := ENetMultiplayerPeer.new()
|
|
127
|
-
var err := enet.create_server(PORT, MAX_PLAYERS - 1)
|
|
128
|
-
if err != OK:
|
|
129
|
-
return err
|
|
130
|
-
_peer = enet
|
|
131
|
-
multiplayer.multiplayer_peer = _peer
|
|
132
|
-
multiplayer.peer_connected.connect(_on_peer_connected)
|
|
133
|
-
multiplayer.peer_disconnected.connect(_on_peer_disconnected)
|
|
134
|
-
# Host spawns its own player at id=1 (server id)
|
|
135
|
-
_spawn_player(1)
|
|
136
|
-
return OK
|
|
137
|
-
|
|
138
|
-
func join_game(address: String) -> Error:
|
|
139
|
-
var enet := ENetMultiplayerPeer.new()
|
|
140
|
-
var err := enet.create_client(address, PORT)
|
|
141
|
-
if err != OK:
|
|
142
|
-
return err
|
|
143
|
-
_peer = enet
|
|
144
|
-
multiplayer.multiplayer_peer = _peer
|
|
145
|
-
return OK
|
|
146
|
-
|
|
147
|
-
func _on_peer_connected(peer_id: int) -> void:
|
|
148
|
-
# Only the host spawns players. Clients receive via MultiplayerSpawner.
|
|
149
|
-
if multiplayer.is_server():
|
|
150
|
-
_spawn_player(peer_id)
|
|
151
|
-
player_joined.emit(peer_id)
|
|
152
|
-
|
|
153
|
-
func _on_peer_disconnected(peer_id: int) -> void:
|
|
154
|
-
var node_name := str(peer_id)
|
|
155
|
-
var players := get_tree().get_first_node_in_group("players_root")
|
|
156
|
-
if players != null and players.has_node(node_name):
|
|
157
|
-
players.get_node(node_name).queue_free()
|
|
158
|
-
player_left.emit(peer_id)
|
|
159
|
-
|
|
160
|
-
func _spawn_player(peer_id: int) -> void:
|
|
161
|
-
var player: Node = player_scene.instantiate()
|
|
162
|
-
player.name = str(peer_id) # name = peer id; sync by name
|
|
163
|
-
player.set_multiplayer_authority(peer_id)
|
|
164
|
-
var players_root := get_tree().get_first_node_in_group("players_root")
|
|
165
|
-
players_root.add_child(player, true)
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
Register as autoload in `project.godot`:
|
|
169
|
-
|
|
170
|
-
```
|
|
171
|
-
summer_project_setting(key="autoload/Network", value="*res://scripts/network.gd")
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
#### b) Player scene with MultiplayerSynchronizer
|
|
175
|
-
|
|
176
|
-
In the player scene, add:
|
|
177
|
-
|
|
178
|
-
```
|
|
179
|
-
Player (CharacterBody3D)
|
|
180
|
-
├── CollisionShape3D
|
|
181
|
-
├── Camera3D # local-only, attach in script if peer is local
|
|
182
|
-
├── MeshInstance3D
|
|
183
|
-
└── MultiplayerSynchronizer
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
```
|
|
187
|
-
summer_add_node(scenePath="res://scenes/player.tscn", parent="./World/Players/Player", type="MultiplayerSynchronizer", name="Sync")
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
`scenePath` is required on `summer_add_node`, `summer_set_prop`,
|
|
191
|
-
`summer_connect_signal` and `summer_save_scene`; it names the exact `res://`
|
|
192
|
-
scene to mutate and does not default to the open tab.
|
|
193
|
-
|
|
194
|
-
Configure the synchronizer to replicate `position`, `rotation.y`, `health`. A standalone `SceneReplicationConfig.tres` is worth it here because the same config is shared by every player instance — not because embedded sub_resources fail (they don't):
|
|
195
|
-
|
|
196
|
-
```gdscript
|
|
197
|
-
# scripts/player_net.gd
|
|
198
|
-
extends CharacterBody3D
|
|
199
|
-
|
|
200
|
-
@export var move_speed: float = 5.0
|
|
201
|
-
@export var max_health: int = 100
|
|
202
|
-
|
|
203
|
-
@onready var camera: Camera3D = $Camera3D
|
|
204
|
-
@onready var sync: MultiplayerSynchronizer = $Sync
|
|
205
|
-
|
|
206
|
-
var health: int = 100
|
|
207
|
-
|
|
208
|
-
func _ready() -> void:
|
|
209
|
-
health = max_health
|
|
210
|
-
var auth := get_multiplayer_authority()
|
|
211
|
-
var is_local := auth == multiplayer.get_unique_id()
|
|
212
|
-
camera.current = is_local
|
|
213
|
-
set_physics_process(is_local) # only the owner runs movement
|
|
214
|
-
set_process_input(is_local)
|
|
215
|
-
|
|
216
|
-
func _physics_process(delta: float) -> void:
|
|
217
|
-
var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
|
|
218
|
-
var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
|
|
219
|
-
if direction:
|
|
220
|
-
velocity.x = direction.x * move_speed
|
|
221
|
-
velocity.z = direction.z * move_speed
|
|
222
|
-
else:
|
|
223
|
-
velocity.x = move_toward(velocity.x, 0, move_speed)
|
|
224
|
-
velocity.z = move_toward(velocity.z, 0, move_speed)
|
|
225
|
-
if not is_on_floor():
|
|
226
|
-
velocity.y -= 9.8 * delta
|
|
227
|
-
move_and_slide()
|
|
228
|
-
# position is replicated automatically via MultiplayerSynchronizer
|
|
229
|
-
|
|
230
|
-
@rpc("any_peer", "call_local", "reliable")
|
|
231
|
-
func take_damage(amount: int) -> void:
|
|
232
|
-
if not multiplayer.is_server():
|
|
233
|
-
return # only host applies damage
|
|
234
|
-
health = max(0, health - amount)
|
|
235
|
-
if health == 0:
|
|
236
|
-
rpc("on_died")
|
|
237
|
-
|
|
238
|
-
@rpc("authority", "call_local", "reliable")
|
|
239
|
-
func on_died() -> void:
|
|
240
|
-
queue_free()
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
#### c) RPC patterns — the four flavors
|
|
244
|
-
|
|
245
|
-
Lock the conventions:
|
|
246
|
-
|
|
247
|
-
| RPC config | Use case |
|
|
248
|
-
|---|---|
|
|
249
|
-
| `@rpc("authority", "call_local", "reliable")` | Host tells everyone something happened (health change result, death) |
|
|
250
|
-
| `@rpc("any_peer", "call_remote", "unreliable")` | Frequent input intent (movement, look) — drop is OK |
|
|
251
|
-
| `@rpc("any_peer", "call_remote", "reliable")` | Rare input event (fire weapon, pick up item) — drop NOT OK |
|
|
252
|
-
| `@rpc("any_peer", "call_local", "reliable")` | Player asks host to do something (request damage) |
|
|
253
|
-
|
|
254
|
-
**Authority validation is mandatory.** Inside any `any_peer` RPC, check `multiplayer.get_remote_sender_id()` and validate the sender owns the action.
|
|
255
|
-
|
|
256
|
-
```gdscript
|
|
257
|
-
@rpc("any_peer", "call_local", "reliable")
|
|
258
|
-
func request_fire() -> void:
|
|
259
|
-
var sender := multiplayer.get_remote_sender_id()
|
|
260
|
-
if sender != get_multiplayer_authority():
|
|
261
|
-
return # someone else is trying to control this player; drop
|
|
262
|
-
# ... actually fire
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
#### d) Lag compensation outline
|
|
266
|
-
|
|
267
|
-
Defer to a specialist skill, but flag the basics:
|
|
268
|
-
|
|
269
|
-
- For projectiles: spawn locally on owner's machine at fire time, replicate the spawn event with a timestamp. Other peers fast-forward the projectile by their RTT.
|
|
270
|
-
- For hit detection: server-authoritative + simple latency tolerance (host accepts hits within ~100ms past server time).
|
|
271
|
-
- For movement: client-side prediction plus server reconciliation is the
|
|
272
|
-
standard model. Summer Engine does not provide this game-specific layer; you
|
|
273
|
-
write it. Competitive PvP requires specialist lag-compensation work.
|
|
274
|
-
|
|
275
|
-
### 8. Save and verify
|
|
276
|
-
|
|
277
|
-
```
|
|
278
|
-
summer_save_scene(scenePath="res://scenes/player.tscn")
|
|
279
|
-
summer_get_script_errors(path="res://scripts/player_net.gd") # one file per call; path required
|
|
280
|
-
summer_play
|
|
281
|
-
# user tests by running two instances locally (Debug → Customize Run Instances → 2)
|
|
282
|
-
summer_stop
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
Test checklist:
|
|
286
|
-
- [ ] Two instances connect (one hosts, one joins).
|
|
287
|
-
- [ ] Each instance sees its own player as local (camera attached, can move).
|
|
288
|
-
- [ ] Each instance sees the other player move smoothly (sync at 20 Hz).
|
|
289
|
-
- [ ] Damage RPC routes through host (not double-applied on each peer).
|
|
290
|
-
- [ ] Disconnect cleans up the disconnected player's node.
|
|
291
|
-
|
|
292
|
-
## Common mistakes
|
|
293
|
-
|
|
294
|
-
| Don't | Do | Why |
|
|
295
|
-
|---|---|---|
|
|
296
|
-
| Decide authority model halfway through | Lock it in step 2 before touching code | Refactoring authority is a project-killer |
|
|
297
|
-
| Replicate every property | Replicate position, rotation, health, that's it | Bandwidth + bug surface |
|
|
298
|
-
| Run physics on every peer for every player | Physics on owner only, others receive transform | Otherwise jitter and divergence |
|
|
299
|
-
| Trust the client | Validate `get_remote_sender_id()` in every `any_peer` RPC | Cheaters route through the wrong RPC |
|
|
300
|
-
| Copy-pasting a `SceneReplicationConfig` per player scene | One standalone `.tres`, referenced everywhere | Replication config must match on every peer; duplicated copies drift |
|
|
301
|
-
| Roll custom transport | ENet (or WebSocket for browser) | You will hit edge cases ENet already solved |
|
|
302
|
-
| Skip authority check in damage RPC | `if not multiplayer.is_server(): return` at the top of damage handlers | Otherwise damage applied N times |
|
|
303
|
-
| Spawn players on every peer | MultiplayerSpawner — host spawns, clients receive | Otherwise N copies of each player |
|
|
304
|
-
| `@rpc("any_peer")` everything | Use `authority` for server→clients, `any_peer` only for client→server | Mismatched flow = exploits |
|
|
305
|
-
| Camera replicated | Camera is local-only, set `current = is_local` on spawn | Each peer needs their own camera |
|
|
306
|
-
|
|
307
|
-
## Anti-patterns
|
|
308
|
-
|
|
309
|
-
- **"Let's also have rollback netcode for our co-op shooter."** Rollback is a 6-month project on its own. Use it for fighting games and lock-step RTS, not co-op.
|
|
310
|
-
- **NAT punchthrough on day one.** Use Steam Networking or a relay; don't write punchthrough yourself for v1.
|
|
311
|
-
- **Dedicated servers without a deploy story.** If you can't redeploy in < 5 min, the dedicated path isn't ready.
|
|
312
|
-
- **Custom serialization.** Summer Engine's variant serialization is fine. Do
|
|
313
|
-
not write your own packing until you measure bandwidth.
|
|
314
|
-
- **Host migration in v1.** It's a feature, not a primitive. Ship without it; add later if churn data demands.
|
|
315
|
-
|
|
316
|
-
## Collaborative protocol
|
|
317
|
-
|
|
318
|
-
This skill rewires the project at the architectural level. Always ask before each block of changes. Group writes — "I'm about to add the autoload + 2 scenes + 3 scripts + InputMap entries. OK?".
|
|
319
|
-
|
|
320
|
-
## Want a working starter?
|
|
321
|
-
|
|
322
|
-
For a known-good multiplayer scaffold (host + join UI, ENet transport, MultiplayerSpawner, replicated player), point users at:
|
|
323
|
-
|
|
324
|
-
→ **template-id**: none ships today. Run `summer list templates` for the live list rather than naming one from memory.
|
|
325
|
-
|
|
326
|
-
For now: this skill produces the scaffold inline. When the template lands, link from here.
|
|
327
|
-
|
|
328
|
-
## See also
|
|
329
|
-
|
|
330
|
-
- `multiplayer-and-networking/multiplayerapi-basics/SKILL.md` — deeper MultiplayerAPI patterns
|
|
331
|
-
- `multiplayer-and-networking/client-server-pattern/SKILL.md` — dedicated server architecture
|
|
332
|
-
- `multiplayer-and-networking/peer-replication/SKILL.md` — synchronizer config patterns
|
|
333
|
-
- `multiplayer-and-networking/enet-vs-websocket/SKILL.md` — transport choice
|
|
334
|
-
- `multiplayer-and-networking/lag-compensation/SKILL.md` — deeper netcode for competitive (when shipped)
|
|
335
|
-
- `multiplayer-and-networking/state-sync/SKILL.md` — selective replication patterns
|
|
336
|
-
- `multiplayer-and-networking/lobby-and-matchmaking/SKILL.md` — lobby UI + Steam matchmaking
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
id: skill/setup-multiplayer
|
|
2
|
-
kind: skill
|
|
3
|
-
version: 1.0.4
|
|
4
|
-
summary: Add multiplayer to an existing game — LAN/online co-op, PvP, lobbies — via MultiplayerAPI, MultiplayerSpawner, and MultiplayerSynchronizer.
|
|
5
|
-
use_when:
|
|
6
|
-
- "adding multiplayer to an existing Summer game: co-op LAN, co-op online, competitive PvP, or a lobby"
|
|
7
|
-
- a solo game needs LAN co-op, online co-op, versus play, or a lobby added
|
|
8
|
-
facets:
|
|
9
|
-
lifecycle:
|
|
10
|
-
- build
|
|
11
|
-
domains:
|
|
12
|
-
- multiplayer
|
|
13
|
-
- scripting
|
|
14
|
-
modalities:
|
|
15
|
-
- scripts
|
|
16
|
-
- scenes
|
|
17
|
-
compatibility:
|
|
18
|
-
engine: ">=4.6"
|
|
19
|
-
related:
|
|
20
|
-
skills:
|
|
21
|
-
- skill/peer-to-peer-multiplayer
|
|
22
|
-
- skill/host-authoritative-state
|
|
23
|
-
source: official
|
|
24
|
-
license: MIT
|
|
25
|
-
status: stable
|
|
26
|
-
recommended: true
|
|
27
|
-
aliases:
|
|
28
|
-
- skills/multiplayer-and-networking/setup-multiplayer
|