Neste guia, descreverei algumas modificações que apliquei para ajustar alguns comportamentos da interface do usuário e trapacear um pouco depois de concluir o jogo.
O jogo é escrito em Unity e C#, o que o torna relativamente fácil de explorar através da ferramenta dnSpy.
Observe que essas modificações não são mods reais, mas patches temporários porque no momento em que o jogo é atualizado pelos desenvolvedores, as alterações locais são substituídas. Existem estruturas de modificação, como BepInEx para outros jogos, mas eu não olhei para elas.
Preparativos
- Baixe o mais recente disponível dnSpy.
- Extraia-o para um local adequado e execute dnSpy.exe
- Em Arquivo > Abrir, localize o Assembly-CSharp.dll no
%{steam dir}\common\The Planet Crafter Prologue\Planet Crafter_Data\Managed
diretório.
Eu recomendo usar “Edit Method” em vez de “Edit Class” para evitar recompilação drástica de partes de código não relacionadas que podem quebrar outra coisa. Além disso, o dnSpy tem bugs, então não há necessidade de tentá-lo.
Modificar classificação
O jogo classifica os itens pelo nome por padrão, mas eu gosto de ar e comida na frente da lista. A classificação é tratada no método SpaceCraft.Inventory::AutoSort(). O método atualmente tem uma expressão LINQ para classificação que substituiremos por uma chamada direta para 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( "Garrafa de Água") && !id2.StartsWith("Garrafa de Água")) { return -1; } if (!id.StartsWith("Garrafa de Água") && id2.StartsWith("Garrafa de Água")) { return 1; } return id. CompareTo(id2); });
Não conheço todos os IDs dos itens, mas poderia ser despejado em um arquivo desse método via StreamWriter.
Mover itens do mesmo tipo para/do inventário
Por padrão, pode-se mover itens um por um, o que pode ser tedioso. Clicar em uma imagem de inventário é feito pelo método SpaceCraft.InventoryDisplayer::OnImageClicked(). Por padrão, tem ação para os cliques esquerdo e direito do mouse. Como não consegui encontrar uma maneira de verificar modificadores como teclas shift ou ctrl, decidi usar o botão do meio do mouse.
Quando o usuário clica no botão do meio do mouse, temos que encontrar os objetos no inventário atual com o mesmo id de item e obter a outra entidade de inventário. Em seguida, tente adicioná-lo ao outro inventário e, se for bem-sucedido, remova-o do inventário atual, lidando assim com o caso completo.
if (_eventTriggerCallbackData.pointerEventData.button == PointerEventData.InputButton.Middle) { DataConfig.UiType abertoUi = MijuTools.Managers.GetManager().GetOpenedUi(); if (openedUi == DataConfig.UiType.Container) { Inventário otherInventory = ((UiWindowContainer)MijuTools.Managers.GetManager().GetWindowViaUiId(openedUi)).GetOtherInventory(this.inventory); if (this.inventory != null && otherInventory != null) { string id = _eventTriggerCallbackData.worldObject.GetGroup().GetId(); Lista lista = new Lista(); foreach (WorldObject worldObject2 in this.inventory.GetInsideWorldObjects()) { if (worldObject2.GetGroup().GetId() == id) { list.Add(worldObject2); } } foreach (WorldObject worldObject3 na lista) { if (otherInventory.AddItem(worldObject3)) { this.inventory.RemoveItem(worldObject3, false); } } } } }
Capacidade de estoque (trapaça)
Por padrão, o estoque é bem pequeno e passei a maior parte do tempo indo e voltando entre depósitos, armazenamento e locais de construção. Eu também gosto de coletar todos os depósitos que estavam se tornando demorados e consumindo ar.
O inventário é gerenciado pela classe SpaceCraft.Inventory acima mencionada e sua capacidade é tratada no campo privado InventorySize. Infelizmente, tudo o que pude fazer é sobrescrever este campo em 3 locais: o construtor, o getter e o setter para não quebrar muito a estrutura do assembly:
public Inventory(int _inventoryId, int _inventorySize, List _worldObjectsInInventory = null) { this.inventoryId = _inventoryId; this.inventorySize = _inventorySize; this.inventorySize = 250; // <---------------------------------- this.worldObjectsInInventory = ((_worldObjectsInInventory != null) ? _worldObjectsInInventory : nova lista()); this.authorizedGroups = new List(); } public int GetSize() { this.inventorySize = 250; // <---------------------------------- return this.inventorySize; } public void SetSize(int _inventorySize) { if (_inventorySize == this.inventorySize) { return; } this.inventorySize = _inventorySize; this.inventorySize = 250; // <---------------------------------- this.RefreshDisplayerContent(); }
No entanto, isso tem algumas consequências da interface do usuário:
- A tela de inventário do jogador excederá a tela e você não poderá interagir com nada além dela.
- Afeta o “inventário” de equipamentos
- Afeta todos os contêineres, incluindo o minerador principal.
- Os itens coletados são adicionados ao final do inventário e podem não ser visíveis, incluindo itens de ar, água e comida.
- Muitos cliques ao depositar inventário em contêineres.
- Atraso de tela ao visualizar e mover itens em contêineres.
Felizmente, o último pode ser remediado pelos mods de classificação e movimento de grupo acima. Armazene itens por tipo em recipientes separados.
Localização do asteroide (trapaça)
Por padrão, o jogo tem como alvo um raio relativamente grande ao redor do jogador quando os asteróides (naturais e recursos chamados por meio de foguetes) pousam. Minha base fica na rocha lambda e a estrutura de lançamento também está lá. Consequentemente, muitas rochas acabam no lago da área de partida.
Os asteróides são tratados no SpaceCraft.AsteroidHandler e a seleção do alvo está no método SpawnAsteroid(). Encontre o loop e nele, um vetor calculado através de uma unidade aleatória e raio. Altere para algo assim:
Vetor2 = UnityEngine.Random.insideUnitCircle * Math.Min((float)_asteroidEvent.distanceFromPlayer, 20f);
A razão pela qual eu uso Math.Min é evitar reotimização indesejada do método quando ele é recompilado. 20f é bem apertado, então eu recomendo ir para um campo aberto ou posição elevada. Essa concentração tem a desvantagem de que o local do jogador é inundado com detritos que podem enterrar o jogador e essas rochas permanecem por minutos antes de desaparecer.
Aviso. Nas versões de Acesso Antecipado, os asteróides podem machucar o jogador, então dê ao mod um raio maior ou vá para dentro de casa e espere os detritos desaparecerem.
Isso é tudo o que estamos compartilhando hoje para isso The Planet Crafter guia. Este guia foi originalmente criado e escrito por Akarnokd. Caso não consigamos atualizar este guia, você pode encontrar a atualização mais recente seguindo este link.