Scrap Clean
Press F to enter clean mode and remove dropped items or player-placed objects. Highlight the target you aim at, or sweep a ground-hugging dashed circle to clear everything inside it.
By khalil
| Date uploaded | a week ago |
| Version | 1.0.0 |
| Download link | khalil-Scrap_Clean-1.0.0.zip |
| Downloads | 20 |
| Dependency string | khalil-Scrap_Clean-1.0.0 |
This mod requires the following mods to function
BepInEx-BepInExPack_PEAK
BepInEx pack for PEAK. Preconfigured and ready to use.
Preferred version: 5.4.75301README
Scrap Clean
PEAK 的清理模组:一键清理掉落物与放置物。
安装
- 通过模组管理器(r2modman / Thunderstore Mod Manager)安装,或手动解压到
BepInEx/plugins/。 - 前置依赖:BepInExPack PEAK。
使用
| 操作 | 效果 |
|---|---|
F |
进入 / 退出清理模式 |
| 滚动滚轮 | 在「单选清理」与「范围清理」之间切换(无界,每滚一次换一个模式) |
| 鼠标左键 | 执行清理 |
进入模式、退出模式、切换模式都有明确的文字提示与上下滚动动画, 屏幕下方常驻的信息条会实时显示当前将清理哪个目标。
单选清理
按视线挑选:准星指向的掉落物或放置物会被高亮,左键清理它。
判定顺序为「距离上限(默认 100 米)→ 在视野锥内 → 无地形遮挡 → 与准星夹角最小」, 所以不在玩家眼中的东西不会被选中,也不会被误清理。
判定基于物体的视觉包围盒而不是它的坐标原点:像大炮(原点在底座)、 墙上的踏板菇(原点在墙面接触点)这类目标,用原点做判定会被自己的地面 / 墙面挡住而永远选不中。
范围清理
视线中会出现一个贴合表面的虚线圆形(半径 3 米,可配置)。圆心是准星命中的那个点, 圆环沿该点的表面法线展开并逐点吸附到真实几何体上: 地面贴地、墙面贴墙、斜坡沿坡面起伏,不会穿模。
圆内的所有掉落物与放置物会被一起清理。
什么是「掉落物」和「放置物」
- 掉落物:任何被丢在地上的道具(
Item.itemState == Ground)。 手里拿的、背包里的永远不会被清理。 - 放置物:玩家使用道具后留在地图上的物体。已确认支持:
- 绳索锚点(绳索炮 / 绳索卷轴打出的锚点)与其绳索
- 岩钉(
ClimbingSpikeHammered,含劣质岩钉) - 检查点旗帜(
Flag_Planted_Checkpoint) - 便携炉(
PortableStovetop_Placed) - 侦察兵大炮(
ScoutCannon_Placed) - 踏板菇 / 弹跳菇 / 满血蘑菇 / 云真菌的「已放置」形态
- 魔法豆藤蔓(
MagicBeanVine) - 锁链(
ChainShootable)与丛林藤蔓(JungleVine) - 系在玩家身上的气球(
TiedBalloon)
世界生成的地形、岩石、建筑、木质平台等固定景物绝不会被清理。
多人联机说明
清理分三条路径,全部依据 PUN 的实际规则实现:
- 自己的东西 → 直接删除。
- 别人的掉落物 → 物品允许接管所有权,抢过来后删除。
- 别人的放置物 → PUN 禁止转移这类物体的所有权, Scrap Clean 会向该物体的所有者客户端发送一个自定义事件(事件码 190), 由对方代为删除。对端也需要安装本模组,否则该物体保留不动(安全失败,绝不越权破坏)。
可以用 Network/AllowOwnershipTakeover = false 完全关闭跨玩家清理。
配置
配置文件:BepInEx/config/com.zhuanban.peak.scrapclean.cfg
| 项 | 默认 | 说明 |
|---|---|---|
General/ToggleKey |
F |
开关快捷键 |
General/SingleRange |
100 |
单选清理的视线判定距离上限(米),范围 5~300 |
General/AreaRadius |
3 |
范围清理圆半径(米) |
Filter/CleanDroppedItems |
true |
是否清理掉落物 |
Filter/CleanPlacedObjects |
true |
是否清理放置物 |
Network/AllowOwnershipTakeover |
true |
是否允许跨玩家清理 |
UI/ToastSeconds |
2 |
文字提示停留时间(秒) |
Debug/VerboseLogs |
false |
详细诊断日志(排查问题时才打开) |
按键冲突
游戏自带的 InputActions 没有占用 F,因此默认使用 F,不会与游戏功能冲突。
清理模式只接管鼠标左键与滚轮(进入期间它们只用于清理), 移动、跳跃、交互、语音等全部保持正常。 右键在清理模式下同样被抑制,避免误用手持道具的次要功能。
已知边界
- 固定所有权的放置物依赖对端响应:对端没装模组时清不掉。 这是 PUN 的硬限制,模组不会绕过它。
- 绳索需要连带处理:绳索本体与锚点是两次独立实例化, 模组会把锚点对应的绳索一起登记;跨客户端时由持有绳索的那一端在执行删除时一并处理。
- 范围清理受视线影响:圆心是准星命中的表面点,准星没打到任何表面时不会显示圆环。
- 高亮覆盖面:模组使用游戏原生的
_Interactable材质属性做高亮,与游戏悬停高亮同一条路径。 极少数材质(例如踏板菇的岩石 shader、便携炉的 URP/Lit)没有该属性, 对这些目标高亮不可见,但清理功能不受影响。 - 活体生物:蝎子 / 青蛙等身上带
MobItem : Item,走动时状态就是Ground, 因此也会被当作掉落物清理(这是刻意保留的行为)。
给开发者:构建与代码结构
构建
dotnet build -c Release
默认输出到 bin\Release\ScrapClean.dll 并自动复制到 BepInEx/plugins/。
游戏目录可用 -p:GameRoot=... 覆盖,或用 -p:DeployToGame=false 关闭自动部署。
目录结构
src/
ScrapCleanPlugin.cs 生命周期与 Harmony 挂载
ScrapCleanConfig.cs BepInEx 配置
CleanMode.cs 主状态机(输入 / 扫描 / 高亮 / 清理 / 提示)
TargetScanner.cs 候选目标的扫描与分类
Cleaner.cs 删除执行(三条网络路径)
CleanRequestRelay.cs 跨客户端清理请求(自定义事件 190)
HighlightRenderer.cs 原生 _Interactable 属性高亮
GroundRing.cs 贴合表面的虚线圆环
CleanUI.cs 提示文字与滚动动画
HarmonyPatches.cs CharacterInput.Sample 后置补丁(输入抑制)
SCInput.cs 输入读取
CenterCache.cs 视觉包围盒与代表点
SCLog.cs 日志
tools/ 只读研究脚本(资源探测,不参与构建)
CHANGELOG
Changelog
1.1.0
修复
- 多人联机下,自己扔出的蘑菇类放置物无法清理(踏板菇 / 弹跳菇 / 满血蘑菇 / 云雾菇)。 这些落地实体是在持有者客户端创建的,而所有权信息可能被 PUN 的缓存判错, 导致模组误以为"东西是别人的",只发出一句请求后就再无下文(界面一直显示"已请求清理")。 现在模组会正确识别"这台机器就是它的创建者/所有者",直接就地清理。
- 清理对方物品时的兜底:如果对方客户端没有安装本模组、或迟迟没有响应,
模组会在一小段等待后由本机接管所有权并完成清理,不再无限期停留在"已请求清理"。
这条兜底只在
Network/AllowOwnershipTakeover开启时生效。 - 绳索更换所有者后可能残留:删除绳索锚点时,若绳索视图的所有权缓存同样出错, 会留下一根悬空的绳子。现在锚点与绳索使用同一套所有权判定。
- 清理失败时不再误报成功:之前若所有权获取失败,界面仍会显示"已清理", 现在会如实提示失败原因。
改进
- 清理日志补充了
Owner/Creator/ 本地玩家编号,便于排查联机问题。
1.0.0
首发版本。
功能
F进入 / 退出清理模式。- 单选清理:按视线挑选目标 —— 准星指向的掉落物或放置物会被高亮,左键清理它。 判定顺序为「距离上限 → 在视野锥内 → 无地形遮挡 → 与准星夹角最小」, 因此不在玩家眼中的东西不会被选中。距离上限默认 100 米。
- 范围清理:视线中出现一个贴合表面的虚线圆形(默认半径 3 米), 圆心是准星命中的那个点,圆环沿命中面的法线展开并逐点吸附到真实几何体上: 地面贴地、墙面贴墙、斜坡沿坡面起伏。圆内的所有掉落物与放置物会被一起清理。
- 滚轮在两种模式之间切换(无界,每滚一次换一个模式)。
- 进入模式、退出模式、切换模式都有明确的文字提示与上下滚动动画,文字停留 2 秒后自行消失。
- 常驻信息条实时显示当前会清理哪个目标。
目标识别
- 掉落物:任何被丢在地上的道具(
Item.itemState == Ground)。 手里拿的、背包里的永远不会被清理。 - 放置物:玩家使用道具后留在地图上的物体 —— 绳索锚点与其绳索、岩钉(含劣质岩钉)、 检查点旗帜、便携炉、侦察兵大炮、踏板菇 / 弹跳菇 / 满血蘑菇 / 云真菌的已放置形态、 魔法豆藤蔓、锁链与丛林藤蔓、系在玩家身上的气球。
- 世界生成的地形、岩石、建筑、木质平台等固定景物绝不会被清理。
高亮
- 复用游戏原生的
_Interactable材质属性(与游戏自身的悬停高亮同一条路径), 零额外渲染开销,视觉风格与原生一致。
多人联机
清理分三条路径,全部依据 PUN 的实际规则实现:
- 自己的东西 → 直接删除。
- 别人的掉落物 → 物品是
OwnershipOption.Takeover,抢过所有权后删除。 - 别人的放置物 → PUN 禁止转移这类物体的所有权, 模组会向该物体的所有者客户端发送一个自定义事件(事件码 190),由对方代为删除。 对端也需要安装本模组,否则该物体保留不动(安全失败,绝不越权破坏别人的世界)。
输入
- 清理模式只接管鼠标左键与滚轮;移动、跳跃、交互、语音全部保持正常。
- 左键的"松开"事件会保留,因为游戏自身的绳索、攀爬、长按施法状态机用它做收尾。
配置
配置文件:BepInEx/config/com.zhuanban.peak.scrapclean.cfg
| 项 | 默认 | 说明 |
|---|---|---|
General/ToggleKey |
F |
开关快捷键 |
General/SingleRange |
100 |
单选清理的视线判定距离上限(米),范围 5~300 |
General/AreaRadius |
3 |
范围清理圆半径(米) |
Filter/CleanDroppedItems |
true |
是否清理掉落物 |
Filter/CleanPlacedObjects |
true |
是否清理放置物 |
Network/AllowOwnershipTakeover |
true |
是否允许跨玩家清理 |
UI/ToastSeconds |
2 |
文字提示停留时间(秒) |
Debug/VerboseLogs |
false |
详细诊断日志(排查问题时才打开) |
已知边界
- 固定所有权的放置物依赖对端响应:对端没装模组时清不掉。这是 PUN 的硬限制,模组不会绕过它。
- 范围清理受视线影响:准星没打到任何表面时不会显示圆环。
- 高亮覆盖面:极少数材质没有
_Interactable属性,对这些目标高亮不可见,但清理功能正常。 - 活体生物:蝎子 / 青蛙等身上带
MobItem : Item,走动时状态就是Ground, 因此也会被当作掉落物清理。