Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
You are viewing a potentially older version of this package.
View all versions.
CarryFriend
Hold E to carry your teammates. Requires the host to install the mod as well to function properly.
By Zichen
| Date uploaded | 5 days ago |
| Version | 1.0.0 |
| Download link | Zichen-CarryFriend-1.0.0.zip |
| Downloads | 1614 |
| Dependency string | Zichen-CarryFriend-1.0.0 |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2100README
背起队友 / CarryFriend
REPO 游戏交流 QQ 群:824639225
支持 R.E.P.O. v0.4。
Scroll down for English ↓
功能说明 (v1.0.0)
本模组允许玩家直接将队友背在自己的后背上移动。
- 发起背人:准心对准面前的队友/死尸头部,按住原生交互键 [E] 满 1.0 秒(默认值,可在配置中调整),即可瞬间背起。
- 自由移动:被背起的队友不再被锁死,可以在后背上自由控制视角并打字,动作表现自然。
- 主动放下:背人者长按 E 键 1.0 秒即可将队友放下(带读条进度,防止误触)。
- 自主挣脱:被背起的队友只需按 [Space] 空格键(使其起立)或扭头点击/抓取背人者的后背(触发加血交互),即可瞬间解除绑定并平滑落地。
- 房主模组确认(联机仲裁):非主机客户端按住 E 背人时,会首先向房主发送握手包。若房主未安装本模组,读条满后会显示“房主未安装背人模组,无法背起!”的红色警告并拒绝执行,以确保多人联机同步的绝对安全。
兼容性与名字对齐
- 名字修改模组适配:完美适配了名字修改模组,在扫描提示和读条进度上能够准确读取并显示队友的自定义名字。
- 物理防卡与防飞天:背人瞬间释放手部抓取(
ReleaseObject),并在背起期间忽略彼此碰撞体(IgnoreCollision),利用刚体速度阻尼公式跟随,完全不卡墙,极度平滑。
配置说明
| 分组 | 配置项 | 默认值 | 说明 |
|---|---|---|---|
| A.全局设置 | 模组启用 | 开启 | 总开关,关闭后模组完全失效,不占用任何性能。 |
| B.时间设置 | 按住E背起时间 (秒) | 1.0 | 按住E背起队友或死尸头部,以及背人者按住E放下队友所需的时长。 |
| 模组信息 | 语言 | English | 切换配置菜单的显示语言(首次安装如检测到中文环境会自动选中中文)。 |
English
Features (v1.0.0)
This mod allows you to carry your teammates directly on your back.
- Carry Teammate: Aim at your teammate or a dead teammate's head, and hold the interact key [E] for 1.0s (default value, configurable) to pick them up instantly.
- Free Action: The carried teammate is not locked in input, allowing them to look around, control their camera, or type on your back smoothly.
- Drop Teammate: The carrying player can hold [E] for 1.0s to drop their teammate (with a progress bar, preventing accidental dropping).
- Dismount: The carried teammate can press [Space] (Jump) or grab/interact with the carrying player's back (triggering heal interaction) to dismount smoothly at any time.
- Host Verification (Multiplayer Authority): Non-host clients will send a handshake to the host when holding E. If the host has not installed this mod, a red warning "Host has not installed CarryFriend mod, carry disabled!" will display, ensuring safety and consistency in multiplayer.
Compatibility & Name Alignment
- Name Modification Mod Adaptation: Perfectly adapted to name modification mods, ensuring teammate custom names are accurately read and displayed on scan prompts and bars.
- Anti-Clipping & Physics: Instantly releases hand grabs (
ReleaseObject) upon carrying, and ignores collisions between players (IgnoreCollision) during the process. Follows using smooth rigidbody velocity damping without clipping or flying bugs.
Settings
| Group | Setting | Default | Description |
|---|---|---|---|
| A. Global | Mod Enabled | On | Master toggle – disabling this turns off all features. |
| B. Timers | Interact Hold Duration (s) | 1.0 | Time required to hold [E] to carry a teammate/corpse, or to drop them. |
| Mod Info | Language | English | Switch display language (automatically detects and selects Chinese on first install if Chinese environment is present). |
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 开销,引入了DetectorTumbleCache和DetectorHeadCache静态缓存字典。利用碰撞检测器 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.Start与PlayerAvatar.ReviveRPC的 Postfix 补丁增设了绝对安全的try-catch保护外壳以及ViewID <= 0早期未就绪状态检测,完全避免了中途加入玩家由于网络组件未就绪而抛出异常打断进房流程,实现了对中途加入模组和无模组环境的完美双向适配。
- 对
1.0.1
- 彻底解决背人时向后退(按 S 键)被后面背的人挡住、难移动的物理 Bug:
- 问题分析:由于控制本地玩家运动的
PlayerControllerGameObject 与负责网络同步的PlayerAvatar在 GameObject 层级上物理分离。此前我们用GetComponentsInChildren<Collider>对两者收集碰撞体时,漏掉了本地唯一的PlayerController.instance上的 Capsule 物理身体碰撞体。这导致背人者本地的移动物理碰撞盒和背后挂着的布娃娃骨骼碰撞体依然在物理世界发生硬碰发生阻挡,导致后退时被乘客身体死死挡住,极难向后移动。 - 彻底解决阻挡:在
SetCollisionIgnore和SetCollisionIgnoreHead碰撞忽略控制中,额外引入了对本地PlayerController.instance身上所有子 Collider 碰撞体的自动合并提取。不管是司机还是乘客,在背人期间其本地PlayerController物理盒与对方所有的PlayerAvatar/PlayerTumble物理盒全部应用IgnoreCollision彻底忽略,后退没有任何摩擦和体积撞击阻力,行云流水!
- 问题分析:由于控制本地玩家运动的
- 彻底解决本地乘客端物理撕裂导致的“视角偏置歪斜、拉扯卡死走不动、相机视点在原地、下车闪回原地”恶性 Bug:
- 分离的 PlayerController 同步锁定:不仅锁死
PlayerAvatar,在本地LateUpdate里,只要乘客是本地玩家,同步将其分离的PlayerController.instance.transform及挂载的 Rigidbody 也强锁至背人者背后的位置。这彻底解决了由于PlayerControllerGameObject 与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。
- 分离的 PlayerController 同步锁定:不仅锁死
- 按键分流与角色状态隔离。根据本地角色状态隔离交互按键:背人者(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 汉化/改名模组的最真实昵称。
- 问题分析:在联机中,Unity 的 Tumble 布娃娃骨骼碰撞体状态若被游戏其他脚本(如玩家受击、倒地状态刷新)频繁重置或重新激活,会导致我们应用的
- 终极拦截房主(Host)被背高速跑动时撞飞队友的 Bug:
- 原因定位:房主(MasterClient)作为游戏世界物理的权威端,其倒地刚体的速度计算极其敏感且会作为全局判定。当房主被客机背负高速奔跑时,房主本地的布娃娃速度必然突破 4f 激活伤害检测器。虽然其他客户端本地尝试关闭了房主身上的碰撞,但由于受害检测
HurtCollider.PlayerHurt只在受害者(背人客机)本地权威响应,导致房主本地广播的伤害直接将客机在客机本地弹飞。 - 解决方案:引入 Harmony Patch,拦截
HurtCollider.PlayerHurt方法的执行前置(Prefix)。在判定触发时,若伤害来源的HurtCollider挂载在正处于背人关系中(ActiveCarries)的被背乘客或死尸头部时,强制拦截并返回false跳过整个伤害与物理击退逻辑。该拦截为底层根源切断,100% 杜绝了由于房主作为世界权威触发击飞广播把人撞飞的现象。
- 原因定位:房主(MasterClient)作为游戏世界物理的权威端,其倒地刚体的速度计算极其敏感且会作为全局判定。当房主被客机背负高速奔跑时,房主本地的布娃娃速度必然突破 4f 激活伤害检测器。虽然其他客户端本地尝试关闭了房主身上的碰撞,但由于受害检测
- 恢复死尸头部(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.5 秒后,背人者客户端检测到乘客 isTumbling 同步变为 false,即刻在全网断开背人状态。
- 乘客抓背加血下车:乘客用准心指着背人者后背抓取加血包,背人者端在 Update 里进行网络同步判定,触发瞬间下车。
- 精准的防掉线卡死检测:每 3.0 秒执行一次全局离线清理,若被背者或背人者中途退出、断连被销毁,自动复位本地状态,100% 杜绝卡死。
- 支持背人者死亡、被怪兽击倒等异常时,自动安全释放下车。
- 支持非主机客户端与主机的安全握手握包判定,防止房主没装引发联机冲突。