En esta guía, describiré algunas modificaciones que realicé para ajustar algunos comportamientos de la interfaz de usuario y hacer trampas un poco después de completar el juego.
El juego está escrito en Unity y C#, lo que lo hace relativamente fácil de explorar a través de la herramienta dnSpy.
Sin embargo, tenga en cuenta que estas modificaciones no son modificaciones reales sino parches temporales porque en el momento en que los desarrolladores actualizan el juego, los cambios locales se sobrescriben. Existen marcos de modificación, como BepInEx para otros juegos, pero no los he investigado.
Preparativos
- Descargar lo último disponible dnSpy.
- Extraerlo a una ubicación adecuada y ejecutar dnSpy.exe
- En Archivo > Abrir, busque el Assembly-CSharp.dll existentes
%{steam dir}\common\The Planet Crafter Prologue\Planet Crafter_Data\Managed
directorio.
Recomiendo usar "Editar método" en lugar de "Editar clase" para evitar una recompilación drástica de partes de código no relacionadas que pueden romper algo más. Además, dnSpy tiene errores, así que no hay necesidad de tentarlo.
Modificar clasificación
El juego ordena los elementos por su nombre de forma predeterminada, pero me gusta el aire y la comida al principio de la lista. La clasificación se maneja en el método SpaceCraft.Inventory::AutoSort(). El método actualmente tiene una expresión LINQ para ordenar que reemplazaremos con una llamada directa a List::Sort().
this.worldObjectsInInventory.Sort(delegate(WorldObject a, WorldObject b) { string id = a.GetGroup().GetId(); string id2 = b.GetGroup().GetId(); if (id.StartsWith("OxygenCapsule" ) && !id2.StartsWith("OxygenCapsule")) { return -1; } if (!id.StartsWith("OxygenCapsule") && id2.StartsWith("OxygenCapsule")) { return 1; } if (id.StartsWith( "Botella de agua") && !id2.StartsWith("Botella de agua")) { return -1; } if (!id.StartsWith("Botella de agua") && id2.StartsWith("Botella de agua")) { return 1; } return id. Comparar con (id2); });
No conozco todos los ID de los elementos, pero podría volcarse en un archivo de este método a través de StreamWriter.
Mover artículos del mismo tipo hacia/desde el inventario
De forma predeterminada, uno puede mover elementos uno por uno, lo que puede ser tedioso. Hacer clic en una imagen de inventario se maneja mediante el método SpaceCraft.InventoryDisplayer::OnImageClicked(). De forma predeterminada, tiene acción para los clics izquierdo y derecho del mouse. Como no pude encontrar una manera de buscar modificadores como las teclas shift o ctrl, decidí usar el botón central del mouse.
Cuando el usuario hace clic en el botón central del mouse, debemos encontrar los objetos en el inventario actual que tienen la misma identificación de artículo y luego obtener la otra entidad de inventario. Luego intente agregarlo al otro inventario y, si tiene éxito, elimínelo del inventario actual, manejando así el caso completo.
if (_eventTriggerCallbackData.pointerEventData.button == PointerEventData.InputButton.Middle) { DataConfig.UiTypeopenUi = MijuTools.Managers.GetManager().GetOpenedUi(); if (openedUi == DataConfig.UiType.Container) { Inventory otherInventory = ((UiWindowContainer)MijuTools.Managers.GetManager().GetWindowViaUiId(openedUi)).GetOtherInventory(this.inventory); if (this.inventory != null && otherInventory != null) { string id = _eventTriggerCallbackData.worldObject.GetGroup().GetId(); Lista lista = nueva Lista (); foreach (WorldObject worldObject2 en este.inventario.GetInsideWorldObjects()) { if (worldObject2.GetGroup().GetId() == id) { list.Add(worldObject2); } } foreach (WorldObject worldObject3 en la lista) { if (otherInventory.AddItem(worldObject3)) { this.inventory.RemoveItem(worldObject3, false); } } } } }
Capacidad de inventario (trampa)
Por defecto, el inventario es bastante pequeño y pasé la mayor parte del tiempo yendo y viniendo entre depósitos, almacenamiento y sitios de construcción. También me gusta recolectar todos los depósitos, lo que consumía mucho tiempo y aire.
El inventario es administrado por la clase SpaceCraft.Inventory antes mencionada y su capacidad se maneja en el campo privado InventorySize. Desafortunadamente, todo lo que pude hacer es sobrescribir este campo en 3 ubicaciones: el constructor, el getter y el setter para no romper demasiado la estructura del ensamblaje:
Inventario público (int _inventoryId, int _inventorySize, List _worldObjectsInInventory = null) { this.inventoryId = _inventoryId; this.inventorySize = _inventorySize; this.inventorySize = 250; // <---------------------------------- this.worldObjectsInInventory = ((_worldObjectsInInventory != null) ? _worldObjectsInInventory : lista nueva()); this.authorizedGroups = new List(); } public int GetSize() { this.inventorySize = 250; // <---------------------------------- devuelve this.inventorySize; } public void SetSize(int _inventorySize) { if (_inventorySize == this.inventorySize) { return; } this.inventorySize = _inventorySize; this.inventorySize = 250; // <---------------------------------- esto.RefreshDisplayerContent(); }
Sin embargo, esto tiene algunas consecuencias en la interfaz de usuario:
- La pantalla de inventario del jugador excederá la pantalla y no podrás interactuar con nada más allá.
- Afecta el “inventario” de equipos
- Afecta a todos los contenedores, incluido el minero central.
- Los artículos recogidos se agregan al final del inventario y es posible que no estén visibles, incluidos los artículos de aire, agua y alimentos.
- Demasiados clics al depositar inventario en contenedores.
- Retraso de pantalla al ver y mover elementos en contenedores.
Afortunadamente, esto último se puede remediar con el clasificador y las modificaciones de movimiento de grupo anteriores. Almacene artículos por tipo en contenedores separados.
Ubicación del asteroide (trampa)
De forma predeterminada, el juego apunta a un radio relativamente grande alrededor del jugador cuando aterrizan asteroides (naturales y recursos llamados a través de cohetes). Mi base está en la roca lambda y la estructura de lanzamiento también está allí. En consecuencia, muchas rocas acaban en el lago de la zona de salida.
Los asteroides se manejan en SpaceCraft.AsteroidHandler y la selección de objetivos se realiza en el método SpawnAsteroid(). Encuentre el bucle y, en él, un vector calculado a través de una unidad aleatoria y radio. Cámbialo por algo como esto:
Vector2 vector = UnityEngine.Random.insideUnitCircle * Math.Min((float)_asteroidEvent.distanceFromPlayer, 20f);
La razón por la que uso Math.Min es para evitar la reoptimización no deseada del método cuando se vuelve a compilar. 20f es bastante estrecho, así que recomiendo salir a un campo abierto o a una posición elevada. Esta concentración tiene el inconveniente de que la ubicación del jugador está inundada de escombros que pueden enterrar al jugador y esas rocas permanecen durante minutos antes de desaparecer.
Advertencia. En las versiones de acceso anticipado, los asteroides pueden dañar al jugador y lo hacen, así que dale al mod un radio más grande o entra y espera a que desaparezcan los escombros.
Eso es todo lo que estamos compartiendo hoy para este The Planet Crafter guía. Esta guía fue originalmente creada y escrita por akarnokd. En caso de que no actualicemos esta guía, puede encontrar la última actualización siguiendo este liga.