CbIPOK_Studio-ItemRackMod icon

ItemRackMod

Adds slotted item racks to the walls inside the starting truck, similar to the item shelf in Phasmophobia's van.

Last updated 11 hours ago
Total downloads 103
Total rating 0 
Categories Mods Tools Misc Levels Client-side Server-side AI Generated Quality Of Life
Dependency string CbIPOK_Studio-ItemRackMod-1.4.1
Dependants 0 other packages depend on this package

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2304 icon
BepInEx-BepInExPack

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

Preferred version: 5.4.2304

README

ItemRackMod

Добавляет систему хранения предметов внутрь начального грузовика:

  • Две настенные стойки (левая/правая) — сетка ячеек, куда предметы вешаются на стену.
  • Три горизонтальные платформыGrenadePlatform, DronePlatform, MinePlatform — для предметов, которые логичнее класть, чем вешать (гранаты, мины, дроны). У ячеек платформ нет физического коллайдера, только триггер.

Конкретные предметы (оружие, инструменты, гранаты, дроны и т.д.) закрепляются за конкретными ячейками через конфиг и расставляются туда автоматически при заходе в грузовик — не нужно руками разносить вещи по полкам каждый забег.

Сборка (Rider)

  1. Установи через Thunderstore Mod Manager BepInExPack для R.E.P.O. и запусти игру раз в modded-режиме — это создаст BepInEx/core/BepInEx.dll и 0Harmony.dll в папке игры.
  2. Скопируй 8 нужных .dll (список и точные пути — в BUILD.md) в папку src/libs/.
  3. Открой src/ItemRackMod.csproj в Rider → Build → Build Solution.
  4. Скопируй src/bin/Debug/net48/ItemRackMod.dll в <игра>/BepInEx/plugins/ItemRackMod/ItemRackMod.dll.

Как это устроено

Файлы

  • Patches.cs — Harmony-патч на TruckSafetySpawnPoint.Awake(): как только этот синглтон появляется внутри грузовика, на него вешается ItemRackController.
  • ItemRackController.cs — строит обе стены и все три платформы как сетки дочерних Transform + SphereCollider(isTrigger) на каждой ячейке. Держит справочник SlotKey → ItemRackSlot (Wall:Row:Col, например Left:2:4) и создаёт DefaultItemPlacement.
  • ItemRackSlot.cs — логика одной ячейки: удержание предмета (PhysGrabObject.OverrideKinematic + периодический Teleport), освобождение при захвате игроком, и 5-секундное "окно приоритета" после старта/сброса сцены (см. ниже).
  • DefaultItemPlacement.cs — активный сканер: первые 90 секунд после появления грузовика каждые 0.2 сек проходит по всем PhysGrabObject на сцене (FindObjectsOfType) и расставляет их по назначенным ячейкам — не дожидаясь, пока предмет случайно подплывёт к полке. Платформы обрабатываются в фиксированном порядке (мины → дроны → гранаты) — это специально, чтобы одинаковые предметы (например три мины) не "перескакивали" между ячейками при одновременном спавне.
  • DefaultItemNameResolver.cs — определяет имя/тип предмета через рефлексию (в т.ч. private/internal поля вроде ItemAttributes.itemName) плюс таблицу алиасов на реальные C#-классы игры ("sledge hammer" → ItemMelee) — нужно для предметов, у которых нет надёжного текстового имени или оно совпадает с другим предметом.
  • ModConfig.cs — все настройки + парсинг SlotAssignments/ItemOrientations из строк конфига.
  • Plugin.cs — точка входа; подписывается на SceneManager.sceneLoaded, чтобы при каждом переходе труба↔уровень↔магазин заново армировать стартовые привязки ячеек (ItemRackController.ResetForNewScene()).

"Окно приоритета" (5 секунд)

Ячейка с назначенным предметом (через SlotAssignments) первые 5 секунд после старта/сброса сцены принимает только этот предмет. По истечении 5 секунд фильтр снимается и ячейка становится универсальной — в неё можно вручную положить что угодно. Это защищает именные ячейки от постороннего предмета в момент, пока автоматическая расстановка ещё не успела всё разложить, но не блокирует их навсегда.

Настройка (BepInEx/config/ItemRackMod.cfg)

Основные секции: [Rack] (общие: Rows, Columns, SpacingHorizontal/Vertical, SlotRadius, MaxSnapSpeed, ShowVisualMarkers), [Rack.LeftWall]/[Rack.RightWall] (смещение и разворот стены), [Rack.GrenadePlatform]/[Rack.DronePlatform]/[Rack.MinePlatform] (смещение, разворот, шаг сетки, размер маркера — своя копия настроек на каждую платформу), и [Rack.ItemAssignments] с двумя ключевыми строками:

  • SlotAssignmentsWall:Row:Col=ИмяПредмета через запятую. WallLeft/Right (стены) или GrenadePlatform/DronePlatform/MinePlatform. Row/Col — с 1, от угла сетки.
  • ItemOrientationsИмяПредмета=X,Y,Z (доп. поворот в градусах) через ;. Применяется поверх обычного поворота ячейки — так пистолеты/дробовик/инструменты кладутся плашмя к стене, а карт-пушки/посохи остаются торчать перпендикулярно (для них просто нет записи в этом списке).

Текущий config/ItemRackMod.cfg в архиве — уже настроенный рабочий конфиг с реальной раскладкой (см. список предметов там).

Известные ограничения

  • Сеть/мультиплеер: авторитетность отдаётся мастер-клиенту через SemiFunc.IsMasterClientOrSingleplayer(), владение (PhotonView.Ownership) перед телепортом запрашивается штатным RequestOwnership(). Поведение в реальной мультиплеерной сессии стоит перепроверить на своей группе.
  • Визуальные маркеры используют дефолтный материал GameObject.CreatePrimitive — в билде игры может выглядеть иначе, чем в редакторе (в худшем случае — просто белый/розовый куб; создание маркера обёрнуто в try/catch, на сам мод это не влияет).
  • ItemOrientations — углы поворота подобраны вручную по факту (не теоретически), но если добавишь новый предмет в SlotAssignments, для него может понадобиться свой угол.