You are viewing a potentially older version of this package. View all versions.
Zichen-CarryFriend-1.0.2 icon

CarryFriend

Hold "E" to carry/release teammates, hold "R" to request to be carried. Requires host installation for multiplayer support. Supports carrying up to 3 players.

By Zichen
Date uploaded 16 hours ago
Version 1.0.2
Download link Zichen-CarryFriend-1.0.2.zip
Downloads 693
Dependency string Zichen-CarryFriend-1.0.2

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2100 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2100

README

背起队友 / CarryFriend

支持 R.E.P.O. v0.4+。 交流 QQ 群:824639225

Scroll down for English ↓

功能说明

本模组允许你背起队友或他们的尸体,用于在联机游戏中进行救助与娱乐。

  • 背起/放下:对准队友或死尸头部,长按 "E" 键(默认 0.6 秒,判定时间由各自本地配置决定)。
  • 请求被背:对准活着的队友,长按 "R" 键(默认 0.6 秒,判定时间由各自本地配置决定)。
  • 主动下车:被背着时,按下 [Space] 空格键,或者长按 "E" / "R" 键,或者**用鼠标左键抓住队友后背加血点(即便手持任何加血道具)**即可下来。
  • 自由动作:被背着时仅屏蔽了 WASD 移动。你依然可以自由转头环顾、使用手部抓取周围物品、以及按 F1-F6 播放所有表情动作
  • 多人背负与圆弧对齐:房主可调整最大背负数(1至3人,默认1人)。支持多人同背并自动采用具有贴合感的圆弧排布,下车分散落地,防止发生物理碰撞。
  • 房主参数强同步与防回弹:房主设定的高度偏移和背人数在多人联机时强同步至各端解决抖动;特制纯净版无模组乘客适配,自动强制阻断其在背上起立,下车时自动调用原版物理 Teleport 强力定位,彻底根除下车瞬移回起点的原版同步 Bug。
  • 中途加入与复活自愈:Postfix 逻辑加装 try-catch 保护,完美适配中途加入(LateJoinNow)模组与纯净版联机;修复了倒地乘客被长按加血复活后卡在队友背上无法动弹的漏洞,复活即刻瞬间全端重置关系。

配置说明

分组 配置项 默认值 说明
A.模组信息 语言 English 配置文件显示语言,支持中文与英文。
B.全局设置 模组启用 开启 关闭后模组完全失效,不占用性能。
C.时间设置 按住E背起时间 (秒) 0.6 长按所需的按键判定时长。
D.规则设置 最大背负数量 1 单人同时背负的最大数量 (1-3)。由房主控制生效。

English

Features

Carry your teammates on your back!

  • Carry/Drop: Aim at your teammate or their dead head, hold "E" (default 0.6s, hold duration based on local config).
  • Request to be Carried: Aim at a live teammate, hold "R" (default 0.6s, hold duration based on local config).
  • Dismount: While carried, press Jump [Space], hold "E" or "R", or grab the carrier's back healing spot (even if holding items) with left-click to get down.
  • Free Action: Only WASD movement is blocked while carried. You can still look around, grab items, and press F1-F6 to use all expressions/emotes.
  • Multiple Passengers & Arc Layout: Host can adjust the passenger limit (1-3, default is 1). Multiple passengers are placed in an arc-shaped layout and dropped separately to prevent collisions.
  • Host Sync & Anti-Rubberband: Automatically synchronizes the host's height offset and passenger limit. Fully supports vanilla (unmodded) clients by restricting stand-ups and utilizing low-level network Teleports upon dismount to eliminate the origin teleportation bug.
  • Late Join & Revive Adaptations: Postfix logic wrapped in try-catch blocks for seamless integration with late-joining mods like Zichen-LateJoinNow and unmodded lobbies. Fixed carry locking issue when being revived/healed.

Settings

Group Setting Default Description
A.Mod Info Language English Display language for config options (supports English and Chinese).
B.Global Mod Enabled On Toggle to enable/disable the mod.
C.Timers Interact Hold Duration (s) 0.6 Hold duration required to carry, drop, or request to be carried.
D.Rules Max Carry Count 1 Maximum number of players/heads a single person can carry (1-3). Managed by Host.

CHANGELOG

1.0.2

  • 彻底解决“一个人同时背起两个人”或“两人循环互背套娃”的 Bug
    • 在背人/请求被背指令的最开始位置引入了双向互斥验证。若检测到参与背人的任何一方(司机/乘客)已经存在于全网背人记录中,则直接静默拦截并清空读条,防范多重挂载。
    • 在 Master Client 同步机制和客户端发送事件瞬间,引入了本地状态占位锁定,完全消除了由于网络高延迟(RTT)并发连点造成的双重背人/冲突背人。
  • 解决由于联机解绑广播导致“无关玩家同时被强制下车”的致命 Bug
    • 修复了 HandleCarryAction 在收到释放动作(actionType 2)时,误将 _isCarrying_isBeingCarried 作为通用状态判定,从而导致场上任何一处解绑发生都会强制将所有其他正在背人的无辜玩家同时强制放下的严重 Bug。现改为仅针对当前广播对应 ViewID 的具体玩家进行精确状态解绑与重置。
  • 彻底消除被背乘客高速移动时的“滋滋”摩擦风噪声
    • 针对被背起玩家(如主机)处于 isTumbling 倒地状态高速移动时,会频繁触发游戏原生 PlayerCollisionController 中代表坠落风噪声的 soundFallLoop 现象,在本地 LateUpdate 中对其每一帧调用 OverrideDisableFallLoop(0.2f) 强行阻断。彻底去除了在高速移动时耳机里传来的烦人风噪“滋滋”声。
  • 物理碰撞 OnCollisionStay 高频查找性能缓存优化
    • 针对在 PhysGrabObjectImpactDetector.OnCollisionStay 碰撞静音拦截中高频调用 GetComponentInParent 造成的 CPU 开销,引入了 DetectorTumbleCacheDetectorHeadCache 静态缓存字典。利用碰撞检测器 InstanceID 做 O(1) 静态查表,完美规避了每帧碰撞时向上遍历组件的性能负担,且场景重载时自动清理。
  • 跨场景数据残留与内存泄漏修复
    • 注册了 SceneManager.sceneLoaded 监听,在重开或切换地图时强制执行 ResetState(),自动清空所有全局缓存字典与延迟碰撞恢复队列(PendingRestores),确保跨场景内存干净,杜绝网络幽灵残留。
  • 被背尸体(死人头)复活瞬间自动下车解绑
    • UpdateCarryLogic 检测中,加入了对 _myCarriedHead.playerAvatar 存活状态的即时扫描。一旦检测到被背的死尸头部玩家已被复活,立刻强制执行解绑,无需等待 3 秒轮询,做到复活下车毫秒级顺发响应。
  • 启用与优化分布式死人头物理拉扯(主客机物理牵引效果完全对齐)
    • 激活了原本未在底层调用的 ExecuteDistributedHeadCarryDummy 分布式辅助物理同步。当死尸头部的物理所有权拥有者(如死亡玩家自身)检测到自己被背起时,由所有权端直接模拟拉扯并向全网同步物理,防止由于 Photon 所有权转移延迟导致非主客机看到的牵引、摆动不同步问题。
    • 在计算中加入了 !_isCarrying 保护拦截,规避了背人者自身客户端重复计算物理受力的 Bug。
  • 新增多乘客背负散开定位与房主参数强同步
    • 重新调整多人背负的空间对齐排布,背负 2 人和 3 人时由原先的直线平铺修改为带包裹感的“半径圆弧排布”(左右侧人偏前侧,中间人偏后侧),拉近乘客间距,使视觉效果更加贴合协调。
    • 房主设定的最大承载上限(Max Carry Count)与挂载垂直高度(CarryHeightOffset)在多人联机时自动强同步至所有安装了模组的好友客户端,解决多端视角分歧和乘客抖动,下车长按读条时间仍保留由各自本地配置决定。
    • 修复多人同时下车时,由于注销顺序与字典移除顺序冲突导致除一人落于身前、其余两人传送回最初被背起起点的问题。现在按照下车乘客索引安全地在司机后方左右侧分散落下,并强制刷新网络插值缓存,杜绝原地闪回。
  • 纯净版(无模组)玩家背负体验全面自愈与修复
    • 彻底攻克未装模组的乘客在背上按空格意外起立、被放下后必定瞬移回原起点的原版同步 Bug。
    • 背人者或主机本地每 0.1 秒轮询并检测乘客起立状态,一旦非模组乘客意外起立,自动通过 TumbleRequest 强行将其击倒以维持布娃娃状态;下车瞬间调用原版底层 PhysGrabObject.Teleport 同步物理瞬间移动,强制覆盖无模组玩家本地的刚体坐标,保证其在下车点稳妥站立。
  • 手持道具下车与加血复活卡死漏洞修复
    • 移除被背起下车时的“手持物品限制”。现在玩家手持加血注射器、药包等任何道具时,依然可以长按 E 或 R 正常下车。
    • 修复了被背乘客在被队友长按加血扶起(Revive)后,其背负状态仍残留在网络字典中,导致起身瞬间立刻被吸回背上并锁死控制的 Bug。现通过 Harmony 拦截 ReviveRPC,在任何加血复活发生时,瞬间在全端完全重置并清空该玩家的背负缓存并恢复控制器。
  • 完美适配中途加入(LateJoinNow)模组与稳定性保障
    • PlayerAvatar.StartPlayerAvatar.ReviveRPC 的 Postfix 补丁增设了绝对安全的 try-catch 保护外壳以及 ViewID <= 0 早期未就绪状态检测,完全避免了中途加入玩家由于网络组件未就绪而抛出异常打断进房流程,实现了对中途加入模组和无模组环境的完美双向适配。

1.0.1

  • 彻底解决背人时向后退(按 S 键)被后面背的人挡住、难移动的物理 Bug:
    • 问题分析:由于控制本地玩家运动的 PlayerController GameObject 与负责网络同步的 PlayerAvatar 在 GameObject 层级上物理分离。此前我们用 GetComponentsInChildren<Collider> 对两者收集碰撞体时,漏掉了本地唯一的 PlayerController.instance 上的 Capsule 物理身体碰撞体。这导致背人者本地的移动物理碰撞盒和背后挂着的布娃娃骨骼碰撞体依然在物理世界发生硬碰发生阻挡,导致后退时被乘客身体死死挡住,极难向后移动。
    • 彻底解决阻挡:在 SetCollisionIgnoreSetCollisionIgnoreHead 碰撞忽略控制中,额外引入了对本地 PlayerController.instance 身上所有子 Collider 碰撞体的自动合并提取。不管是司机还是乘客,在背人期间其本地 PlayerController 物理盒与对方所有的 PlayerAvatar / PlayerTumble 物理盒全部应用 IgnoreCollision 彻底忽略,后退没有任何摩擦和体积撞击阻力,行云流水!
  • 彻底解决本地乘客端物理撕裂导致的“视角偏置歪斜、拉扯卡死走不动、相机视点在原地、下车闪回原地”恶性 Bug:
    • 分离的 PlayerController 同步锁定:不仅锁死 PlayerAvatar,在本地 LateUpdate 里,只要乘客是本地玩家,同步将其分离的 PlayerController.instance.transform 及挂载的 Rigidbody 也强锁至背人者背后的位置。这彻底解决了由于 PlayerController GameObject 与 PlayerAvatar 物理分离,在被背起期间 PlayerController 仍然停留在原地,导致本地视点/相机一动不动留在原地不跟随、且在下车(放下)瞬间身体被瞬间拉回原地的恶性 Bug。
    • 无条件物理锁死:将 LateUpdate 中的乘客 Rigidbody 和 Tumble 布娃娃刚体的 kinematic 锁定及背后坐标对齐改为无条件执行(不再受 !GetPlayerIsLocal 保护)。这确保了乘客在自己本地客户端也完美跟从,两端物理彻底对齐。
    • 本地控制器与输入封锁:当本地玩家作为乘客时,在 Update 帧中强行将本地 PlayerController.enabled 设为 false,锁死刚体速度为零。在下车(HandleCarryAction)和异常重置(ResetState)瞬间重新激活还原,从源头根除了主客双端控制器的物理拉扯。
    • 屏蔽 tumble 倒地暗角与镜头拉远:在本地乘客被背起期间,通过反射强行锁定 overrideTumbleUIDisableTimer = 1.0f。这完美消除了 Tumble 滚地时产生的黑色暗角渐变和很远很奇怪的 OverrideZoomSet 焦距,使其在队友背后获得非常稳定平顺的视角。
    • 修复长按 R 无法下车进度条重置 Bug:修改了 UpdateCarryLogic 顶端的清零过滤,仅在既不背人也不被背(!_isCarrying && !_isBeingCarried)的空闲状态下才将 _releaseTimer 归零,彻底解决了此前因被背时被高频强制清零导致长按下车进度条动不了的严重 Bug。
  • 按键分流与角色状态隔离。根据本地角色状态隔离交互按键:背人者(Carrier)状态下仅支持长按 "E" 键将乘客放下;被背乘客(Passenger)状态下仅支持长按 "R" 键从背后主动挣脱下车。彻底避免了乘客在别人背后拿取地上物资或开箱交互时误触发下车判定的冲突。
  • 终极屏蔽被背乘客高频物理碰撞、连续滋滋电流声与火花特效,并加入测试版限流 Debug 日志输出:
    • 问题分析:在联机中,Unity 的 Tumble 布娃娃骨骼碰撞体状态若被游戏其他脚本(如玩家受击、倒地状态刷新)频繁重置或重新激活,会导致我们应用的 Physics.IgnoreCollision 在物理引擎内部被自动失效还原,从而令被背者与背人者发生物理重叠解穿透,触发 PhysGrabObjectImpactDetector 强烈的物理碰撞反馈与火花、连续撞击声(听上去类似滋滋的电流声)。
    • 解决方案:引入 Harmony Patch,拦截 PhysGrabObjectImpactDetector.OnCollisionStay 的前置 Prefix 执行。一旦检测到碰撞对象是正处于背负关系中的活人乘客(IsPassenger)或死人头,强制返回 false 拦截掉,彻底根绝碰撞 Stay 的发声、火花与物理效果。
    • 测试日志输出:在 HurtCollider.PlayerHurt 以及 OnCollisionStay 拦截核心处,植入了 BepInEx 测试日志输出。为保护磁盘 I/O 效率,日志输出做了每秒限流 1 条的保护,可在联机日志中清晰观察到如 [CarryFriend TestLog] 拦截并屏蔽被背乘客 X 的击飞伤害 等活跃防飞天与静音日志。
    • 名字对齐:公开了 GetPlayerName 接口,使外部 Patch 日志能够打印对齐了 MoreUI 汉化/改名模组的最真实昵称。
  • 终极拦截房主(Host)被背高速跑动时撞飞队友的 Bug:
    • 原因定位:房主(MasterClient)作为游戏世界物理的权威端,其倒地刚体的速度计算极其敏感且会作为全局判定。当房主被客机背负高速奔跑时,房主本地的布娃娃速度必然突破 4f 激活伤害检测器。虽然其他客户端本地尝试关闭了房主身上的碰撞,但由于受害检测 HurtCollider.PlayerHurt 只在受害者(背人客机)本地权威响应,导致房主本地广播的伤害直接将客机在客机本地弹飞。
    • 解决方案:引入 Harmony Patch,拦截 HurtCollider.PlayerHurt 方法的执行前置(Prefix)。在判定触发时,若伤害来源的 HurtCollider 挂载在正处于背人关系中(ActiveCarries)的被背乘客或死尸头部时,强制拦截并返回 false 跳过整个伤害与物理击退逻辑。该拦截为底层根源切断,100% 杜绝了由于房主作为世界权威触发击飞广播把人撞飞的现象。
  • 恢复死尸头部(PlayerDeathHead)的 1.0.0 原版物理牵引与所有权同步机制:
    • 彻底撤销了 kinematic 位置锁死,还原了死人头被背负时的动态布娃娃物理效果。
    • 背人者直接抢占所有权:在 FixedUpdate 中,一旦本地判定为背着死人头的背人者,便直接对死人头调用 headPv.RequestOwnership() 抢占其 Photon network 物理控制权,并在背人者本地客户端每帧执行物理速度拉扯跟随。
    • 该方案为 1.0.0 原版最稳定的物理拉扯结构,能 100% 杜绝联机客机背死人头不同步及动作僵硬脱节的问题。
  • 修复死尸头部(PlayerDeathHead)在背着走动后放下时,会瞬间被拉扯瞬移回最初背起“原地”的网络物理同步 Bug。在放下时强行使所有客户端(包括拥有死人头所有权的 Owner)重写死人头的世界坐标、速度并释放,保证在当前实时位置平滑落地。
  • 修复背起死尸头部(PlayerDeathHead)时物理碰撞穿透导致背人玩家被顶起或飞天的 Bug。背起状态下直接强行 disable 死人头身上所有的 Collider 组件(消除其体积),放下时自动 re-enable 还原,彻底根治与其他物理/辅抓模组的挤压冲突。
  • 优化背起扫描机制,加入可交互物品防误触屏蔽。当准心看着物理抓取物体(PhysGrabObject)、固定抓取件(StaticGrabObject)或任意 Item 物品时,主动退避背人扫描且不弹提示框,确保玩家拿取物资与拾取装备交互的绝对优先权。
  • 新增长按 R 键被队友背起(主动请求上车)的功能,支持本地向 3.5 米内活人队友读条请求被其背在背后,与长按 E 背起互补且完美复用物理挂载 and 网络同步通道。
  • 修复当玩家背起房主(Host)时碰撞忽略失效导致房主与玩家重叠反弹、把人弹飞的抖动 Bug。
  • 引入了每 10 帧自动周期性刷新和重新强制应用背人者与乘客之间碰撞忽略的逻辑,避免中途因 Tumble 关节碰撞体重新激活而导致忽略失效。

1.0.0

  • 模组初始发布,支持在清醒状态下长按 E 背起或放下队友,以及背起死尸头部道具。
  • 采用全新的物理挂载载人系统,队友挂载在背后偏上并转脸朝外,利用倒地(Tumble)布娃娃物理实现自然的摆动悬挂。
  • 支持被背玩家穿墙物理(自动切换 Trigger),下车或重置时自动还原。
  • 完善的无模组原版客户端兼容下车判定:
    1. 乘客按空格起立:在冷却 1.5 秒后,背人者客户端检测到乘客 isTumbling 同步变为 false,即刻在全网断开背人状态。
    2. 乘客抓背加血下车:乘客用准心指着背人者后背抓取加血包,背人者端在 Update 里进行网络同步判定,触发瞬间下车。
  • 精准的防掉线卡死检测:每 3.0 秒执行一次全局离线清理,若被背者或背人者中途退出、断连被销毁,自动复位本地状态,100% 杜绝卡死。
  • 支持背人者死亡、被怪兽击倒等异常时,自动安全释放下车。
  • 支持非主机客户端与主机的安全握手握包判定,防止房主没装引发联机冲突。