В этом руководстве, Я опишу несколько модификаций, которые я внес, чтобы настроить поведение пользовательского интерфейса и немного схитрить после завершения игры..
Игра написана на Unity и C#, что позволяет относительно легко исследовать ее с помощью инструмента dnSpy..
Однако обратите внимание, что эти модификации не являются настоящими модами, а временными патчами, поскольку в тот момент, когда разработчики обновляют игру,, локальные изменения перезаписываются. Существуют фреймворки для моддинга, например BepInEx для других игр, но я их не изучал.
Препараты
- Загрузите последнюю доступную версию dnSpy.
- Распакуйте его в подходящее место и запустите dnSpy.exe.
- В файле > Открыть, найдите Сборка-CSharp.dll в
%{паровой реж.}\commonThe Planet Crafter ПрологPlanet Crafter_DataManaged
каталог.
Я рекомендую использовать “Редактировать метод” вместо “Редактировать класс” чтобы избежать радикальной перекомпиляции несвязанных частей кода, которые могут сломать что-то еще. Также, В dnSpy есть ошибки, поэтому не нужно его искушать.
Изменить сортировку
По умолчанию игра сортирует предметы по названию, но мне нравится, когда воздух и еда находятся в начале списка.. Сортировка осуществляется в SpaceCraft.Инвентарь::Автосортировка() метод. В настоящее время метод имеет выражение LINQ для сортировки, которое мы заменим прямым вызовом Список::Сортировать().
this.worldObjectsInInventory.Sort(делегат(МирОбъект a, МирОбъект б) { идентификатор строки = a.GetGroup().GetId(); строка id2 = b.GetGroup().GetId(); если (id.StartsWith("КислородКапсула") && !id2.StartsWith("КислородКапсула")) { возвращаться -1; } если (!id.StartsWith("КислородКапсула") && id2.StartsWith("КислородКапсула")) { возвращаться 1; } если (id.StartsWith("ВодаБутылка") && !id2.StartsWith("ВодаБутылка")) { возвращаться -1; } если (!id.StartsWith("ВодаБутылка") && id2.StartsWith("ВодаБутылка")) { возвращаться 1; } вернуть идентификатор.CompareTo(идентификатор2); });
Я не знаю всех идентификаторов элементов, но их можно сбросить в файл из этого метода через StreamWriter..
Переместить предметы одного типа в/из инвентаря
По умолчанию, можно перемещать предметы один за другим, что может быть утомительно. Нажатие на изображение инвентаря обрабатывается SpaceCraft.InventoryDisplayer::OnImageClicked() метод. По умолчанию, у него есть действие для щелчка левой и правой кнопкой мыши. Поскольку я не смог найти способ проверить наличие модификаторов, таких как клавиши Shift или Ctrl., Я решил использовать среднюю кнопку мыши..
Когда пользователь нажимает среднюю кнопку мыши, нам нужно найти объекты в текущем инвентаре, имеющие тот же идентификатор предмета, затем получите другой объект инвентаря. Затем попробуйте добавить его в другой инвентарь и в случае успеха, удалить его из текущего инвентаря, таким образом обрабатывая весь случай.
если (_eventTriggerCallbackData.pointerEventData.button == PointerEventData.InputButton.Middle) { DataConfig.UiType opensUi = MijuTools.Managers.GetManager().GetOpenedUi(); если (openUi == DataConfig.UiType.Container) { Инвентарь ((UiWindowContainer)MijuTools.Managers.GetManager().GetWindowViaUiId(открылсяUi)).ПолучитьДругойИнвентарь(этот.инвентарь); если (этот.инвентарь != ноль && другоеИнвентарь != ноль) { идентификатор строки = _eventTriggerCallbackData.worldObject.GetGroup().GetId(); Список списка = новый список(); foreach (WorldObject worldObject2 в this.inventory.GetInsideWorldObjects()) { если (worldObject2.GetGroup().GetId() == идентификатор) { список.Добавить(мирОбъект2); } } foreach (WorldObject worldObject3 в списке) { если (другойInventory.AddItem(мирОбъект3)) { this.inventory.RemoveItem(мирОбъект3, ЛОЖЬ); } } } } }
Емкость инвентаря (Обман)
По умолчанию, инвентарь довольно мал, и я провел большую часть времени, перемещаясь между депозитами, складские и строительные площадки. Мне также нравится собирать все депозиты, что отнимало много времени и воздуха..
Инвентарь управляется вышеупомянутым SpaceCraft.Инвентарь класс и его емкость обрабатываются в инвентарьРазмер личное поле. К сожалению, все, что я мог сделать, это перезаписать это поле в 3 локации: конструктор, геттер и сеттер, чтобы не сильно нарушать структуру сборки:
публичный инвентарь(int _inventoryId, int _inventorySize, Список _worldObjectsInInventory = ноль) { this.inventoryId = _inventoryId; this.inventorySize = _inventorySize; this.inventorySize = 250; // <---------------------------------- this.worldObjectsInInventory = ((_worldObjectsInInventory != ноль) ? _worldObjectsInInventory : новый список()); this.authorizedGroups = новый список(); } общедоступный int GetSize() { this.inventorySize = 250; // <---------------------------------- верните этот.inventorySize; } общественная пустота SetSize(int _inventorySize) { если (_inventorySize == this.inventorySize) { возвращаться; } this.inventorySize = _inventorySize; this.inventorySize = 250; // <---------------------------------- this.RefreshDisplayerContent(); }
Однако, это имеет некоторые последствия для пользовательского интерфейса:
- Экран инвентаря игрока выйдет за пределы экрана, и вы не сможете ни с чем взаимодействовать за его пределами..
- Это влияет на оборудование “инвентарь”
- Это влияет на все контейнеры, включая основной майнер.
- Поднятые предметы добавляются в конец инвентаря и могут быть не видны., включая воздух, вода и продукты питания.
- Слишком много кликов при помещении инвентаря в контейнеры.
- Задержка экрана при просмотре и перемещении предметов в контейнерах.
К счастью, последнее можно исправить с помощью модов сортировщика и группового перемещения, указанных выше.. Храните предметы каждого типа в отдельных контейнерах..
Местоположение астероида (Обман)
По умолчанию, игра нацелена на относительно большой радиус вокруг игрока, когда астероиды (природные и ресурсы, доставляемые с помощью ракет) земля. Моя база находится у лямбда-скалы, там же находится и пусковое сооружение.. Следовательно, многие камни попадают в озеро в стартовой зоне.
Астероиды обрабатываются в SpaceCraft.AsteroidHandler и целевой выбор находится в СпаунАстероид() метод. Найдите петлю и в ней, вектор, рассчитанный с помощью случайного числа Unity и радиуса. Измените его на что-то вроде этого:
Вектор Vector2 = UnityEngine.Random.insideUnitCircle * Матем.мин.((плавать)_asteroidEvent.distanceFromPlayer, 20ж);
Причина, по которой я использую Math.Min, заключается в том, чтобы избежать нежелательной повторной оптимизации метода при его перекомпиляции.. 20f довольно узкий, поэтому я рекомендую выйти на открытое поле или на возвышенность.. Эта концентрация имеет тот недостаток, что локация игрока затоплена обломками, которые могут похоронить игрока, и эти камни остаются на несколько минут, прежде чем исчезнуть..
Предупреждение. В версиях раннего доступа, астероиды могут и причиняют вред игроку, поэтому либо дайте моду больший радиус, либо зайдите в помещение и подождите, пока обломки исчезнут..
Это все, чем мы делимся сегодня для этого. Планета Крафтер гид. Это руководство было первоначально создано и написано корневой кивок. На случай, если нам не удастся обновить это руководство, вы можете найти последнее обновление, следуя этому связь.