The Planet Crafter Modification & Inventory + Move Items of the Same Type

The Planet Crafter Modification & Inventory + Move Items of the Same Type 1 - steamsplay.com
The Planet Crafter Modification & Inventory + Move Items of the Same Type 1 - steamsplay.com

In this guide, I’ll describe a few modifications I patched in to adjust a few UI behavior and to cheat a bit after I completed the game.
 
 
The game is written in Unity and C# which makes it relatively easy to explore via the dnSpy tool.
 
 
Note though that these modifications aren’t real mods but temporary patches because the moment the game is updated by the developers, the local changes are overwritten. There exist modding frameworks, such as BepInEx for other games but I have not looked into those.
 
 
Remark: This guide is a repost of the one I did for the Demo/Prologue.
 
 

Preparations

  • Download the latest available dnSpy: https://github.com/dnSpy/dnSpy/releases – [github.com] 
  • Extract it to a suitable location and run dnSpy.exe
  • In File > Open, locate the
     
     
     

    Assembly-CSharp.dll

     
     
     
    in the
     
     
     

    %{steam dir}\common\The Planet Crafter\Planet Crafter_Data\Managed

     
     
     
    directory.

 
I recommend using “Edit Method” instead of “Edit Class” to avoid drastic recompilation of unrelated code parts that may break something else. Also dnSpy has bugs so no need to tempt it.
 
 
 

Modify sorting

The game sorts items by their name by default but I like air and food in the front of the list. The sorting is handled in the SpaceCraft.Inventory::AutoSort() method. The method currently has a LINQ expression for sorting that we will replace with a direct call to 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("WaterBottle") && !id2.StartsWith("WaterBottle"))
 {
 return -1;
 }
 if (!id.StartsWith("WaterBottle") && id2.StartsWith("WaterBottle"))
 {
 return 1;
 }
 return id.CompareTo(id2);
});

 
 
I don’t know all the IDs of the items but could be dumped into a file from this method via StreamWriter.
 
 
 

Move items of the same type to/from inventory

By default, one can move items one by one, which can be tedious. Clicking on an inventory image is handled by SpaceCraft.InventoryDisplayer::OnImageClicked() method. By default, it has action for the left and right mouse clicks. Since I couldn’t find a way to check for modifiers such as shift or ctrl keys, I decided to use the middle mouse button.
 
 
When the user clicks the middle mouse button, we have to find the objects in the current inventory having the same item id, then get the other inventory entity. Then try adding it to the other inventory and if successful, remove it from the current inventory, thus handling the full case.
 
 

if (_eventTriggerCallbackData.pointerEventData.button == PointerEventData.InputButton.Middle)
{
 DataConfig.UiType openedUi = MijuTools.Managers.GetManager<WindowsHandler>().GetOpenedUi();
 if (openedUi == DataConfig.UiType.Container)
 {
 Inventory otherInventory = ((UiWindowContainer)MijuTools.Managers.GetManager<WindowsHandler>().GetWindowViaUiId(openedUi)).GetOtherInventory(this.inventory);
 if (this.inventory != null && otherInventory != null)
 {
 string id = _eventTriggerCallbackData.worldObject.GetGroup().GetId();
 List<WorldObject> list = new List<WorldObject>();
 foreach (WorldObject worldObject2 in this.inventory.GetInsideWorldObjects())
 {
 if (worldObject2.GetGroup().GetId() == id)
 {
 list.Add(worldObject2);
 }
 }
 foreach (WorldObject worldObject3 in list)
 {
 if (otherInventory.AddItem(worldObject3))
 {
 this.inventory.RemoveItem(worldObject3, false);
 }
 }
 }
 }
}

 
 
 

Inventory capacity (Cheating)

By default, the inventory is quite small and I spent most of the time going back and forth between deposits, storage and build sites. I also like collecting all deposits which was becoming time and air consuming.
 
 
The inventory is managed by the aforementioned SpaceCraft.Inventory class and its capacity is handled in the inventorySize private field. Unfortunately, all I could do is overwrite this field in 3 locations: the constructor, the getter and the setter to not break the assembly structure to much:
 
 

public Inventory(int _inventoryId, int _inventorySize, List<WorldObject> _worldObjectsInInventory = null)
{
 this.inventoryId = _inventoryId;
 this.inventorySize = _inventorySize;
 this.inventorySize = 250; // <----------------------------------
 this.worldObjectsInInventory = ((_worldObjectsInInventory != null) ? _worldObjectsInInventory : new List<WorldObject>());
 this.authorizedGroups = new List<Group>();
}
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();
}

 
 
However, this has some UI consequences:
 
– The inventory screen for the player will exceed the screen and you won’t be able to interact with anything beyond it.
 
– It affects the equipment “inventory”
 
– It affects all containers, including the core miner.
 
– Items picked up are added to the end of the inventory and may not be visible, including air, water and food items.
 
– Too many clicking when depositing inventory into containers.
 
– Screen lag when viewing and moving items around in containers.
 
 
Fortunately, the latter to can be remedied by the sorter and group move mods above. Store items per type in separate containers.
 
 
 

Asteroid location (Cheating)

By default, the game targets a relatively large radius around the player when asteroids (natural and resource called in via rockets) land. My base is at the lambda rock and the launch structure is also there. Consequently, many rocks end up in the lake of the starting area.
 
 
The asteroids are handled in the SpaceCraft.AsteroidHandler and the target selection is in the SpawnAsteroid() method. Find the loop and in it, a vector calculated via an Unity random and radius. Change it to something like this:
 
 

Vector2 vector = UnityEngine.Random.insideUnitCircle * Math.Min((float)_asteroidEvent.distanceFromPlayer, 0f);
Vector3 vector2 = new Vector3(position.x + vector.x + 100f, position.y, position.z + vector.y);

 
 
The reason I use Math.Min is to avoid unwanted reoptimization of the method when it gets recompiled. The 0f basically turns this calculation off so that the next line can statically offset the the landing location. Note the +100f added to the X coordinate, which is always east of the player in the ingame compass.
 
 
Earlier version of this modification used to just narrow the radius but since the EA dropped, asteroids can kill the player. This new approach makes them consistently land away from the player in one spot and is safer.
 
 

Written by akarnokd

 
 
Hope you enjoy the post for The Planet Crafter Modification & Inventory + Move Items of the Same Type, If you think we should update the post or something is wrong please let us know via comment and we will fix it how fast as possible! Thank you and have a great day!
 


Be the first to comment

Leave a Reply

Your email address will not be published.


*