Traveritas/petween-physics ↗★ 0
petween-physics
Throw-physics companion plugin for Petween — fling the pet, gravity + wall bounces, configurable impact effects
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Traveritas/petween-physics说明文档
阅读完整 README ↗配置
全部参数均可在设置卡片中运行时编辑:打开 DSH 设置面板,找到 "Petween Physics" 卡片 (紧跟主插件的 "Petween" 卡片之后),按分组调整——物理(重力/弹性/摩擦/甩出倍率/起掷与落定 速度/速度上限/飞行兜底)、碰壁动画(开关/动画下拉/打断开关)、碰壁切图(开关/pose 六选一/保持 时长)、落地滑动(最小反弹高度/地面摩擦/滑动动画下拉),采样/去抖/容差收在"高级"折叠区。 改动停手 300ms 后自动保存(原子写盘),卡片头部显示保存中/已保存/保存失败状态;"恢复默认"一键 写回出厂值。
落盘位置:~/.dsh/petween-physics/config.json($DSH_HOME/petween-physics/config.json,
重启后生效于新加载)。从 dsh-motion-pet-physics 0.1.x 升级时,首次启动自动把
$DSH_HOME/motion-pet-physics/ 迁移为 $DSH_HOME/petween-physics/(目录重命名;跨盘/被占用
导致重命名失败时改为复制并保留旧目录)。手改 JSON 也行:host 启动时读取该文件——文件不存在用默认值;JSON 损坏
则告警并自动重写默认值;字段写错(未知字段/越界值)会按字段回落默认,合法字段保留。
HTTP 侧(host 半提供):GET /api/petween-physics/config 读取,PUT 同路径提交部分或完整
config——服务端按 CONFIG_NUMERIC_FIELDS 表校验并拒绝未知字段与超范围数值(400
INVALID_CONFIG,错误信息带期望范围;不做静默 clamp),跨源写会被 403 拦截。
动画 id 下拉的数据源:主插件 GET /api/petween/animations 的自定义动画 + 硬编码的常用
builtin: 内置动画 + 本插件默认 user:physics-bounce-pop;主插件不可用时回落静态列表,
当前配置里手填的未知 id 也会以"当前值"保留显示。
为什么不用 cordis Config schema(对照本机安装的 dsh 0.1.0-rc.7 源码核实):
- Plugins 设置页的
settings.plugin.item卡片槽按 host 侧 settings 系统服务的命名空间 派发(其 tab controller 只派发ctx.settingsScope.describe()里出现的 key), 没有任何表面会为外部插件自动渲染Configschema 表单; - 外部插件浏览器半的 entry 由 shell boot 以
loader.create({ name })创建,不携带 entry config, 即浏览器半没有配置通道; - 官方 settings 路径要求把配置搬进 DSH settings 文档体系,与"自有 config.json + HTTP 路由"
的架构不符。因此选用
settings.section槽(order 135,主插件已验证的同款契约)。
可调项(src/client/config.ts,含默认值与接受范围):
| 项 | 默认 | 范围 | 说明 |
|---|---|---|---|
physics.gravity | 3000 | 100..100000 | 重力加速度(px/s²) |
physics.restitution | 0.6 | 0..1 | 弹性系数(1 = 完全弹性) |
physics.friction | 0 | 0..1 | 水平空气阻尼(每秒) |
physics.throwMultiplier | 1 | 0..10 | 释放速度倍率 |
physics.minThrowSpeed | 350 | 0..10000 | 低于此释放速度(px/s)视为"停放"不起飞 |
physics.settleSpeed | 120 | 0..10000 | 贴底且速度低于此值(px/s)即落定 |
physics.maxSpeed | 4000 | 100..100000 | 释放速度上限(px/s) |
physics.maxFlightMs | 20000 | 500..600000 | 飞行时长兜底(近弹性配置也不会永久弹跳);兜底落定发生在当前帧位置,该位置可能不在地面(重新拖拽即可修正) |
physics.minBounceHeightPx | 12 | 0..2000 | 预测反弹高度(vy²/2g)低于此值(px)改为地面滑动,不再反弹/不触发碰壁效果;0 = 保持旧的连弹行为 |
physics.groundFriction | 2 | 0..50 | 地面滑动期间的水平衰减(每秒,公式同空气阻尼);越大滑得越短 |
bounceAnimation.enabled | true | — | 碰壁时播放变形动画 |
bounceAnimation.id | user:physics-bounce-pop | 非空 ≤200 字符 | 动画库 id |
bounceAnimation.interrupt | true | — | 播放时打断在播动画 |
flashPose.enabled | false | — | 碰壁时切换图片 |
flashPose.poseKey | success | 六个 pose 之一 | 切换到的 pose 槽位 |
flashPose.holdMs | 800 | 0..60000 | 图片保持 ms(≤0 保持到下个状态变化) |
slideAnimationId | null | null 或非空 ≤200 字符 | 进入地面滑动时播放一次的动画 id;null = 不播 |
sampleWindowMs | 120 | 10..2000 | 拖拽测速窗口 |
effectDebounceMs | 150 | 0..5000 | 同壁效果去抖窗口 |
applyFalseTolerance | 2 | 1..60(整数) | 连续 apply 失败容忍次数 |