1
0
mirror of https://github.com/soarqin/DSP_Mods.git synced 2025-12-09 18:13:31 +08:00

Work in progress

This commit is contained in:
2023-10-31 01:54:32 +08:00
parent 88f1fb22b8
commit 5d58a2a8fa
9 changed files with 169 additions and 7 deletions

View File

@@ -1,9 +1,14 @@
using System.Threading;
using System;
using System.Threading;
using BepInEx.Configuration;
using UnityEngine;
namespace UXAssist;
public static class PlanetFunctions
{
public static ConfigEntry<int> OrbitalCollectorMaxBuildCount;
private const int OrbitalCollectorItemId = 2105;
public static void DismantleAll(bool toBag)
{
var player = GameMain.mainPlayer;
@@ -141,5 +146,113 @@ public static class PlanetFunctions
Thread.Sleep(0);
}
}
}
public static void BuildOrbitalCollectors()
{
var player = GameMain.mainPlayer;
if (player == null) return;
var planet = GameMain.localPlanet;
if (planet is not { type: EPlanetType.Gas }) return;
var countToBuild = OrbitalCollectorMaxBuildCount.Value;
if (countToBuild == 0) countToBuild = -1;
var factory = planet.factory;
var stationPool = factory.transport.stationPool;
var stationCursor = factory.transport.stationCursor;
var entityPool = factory.entityPool;
var pos = new Vector3(0f, 0f, planet.realRadius * 1.025f + 0.2f);
var found = false;
for (var i = 1; i < stationCursor; i++)
{
if (stationPool[i] == null || stationPool[i].id != i) continue;
ref var entity = ref entityPool[stationPool[i].entityId];
pos = entity.pos;
found = true;
break;
}
var prebuildCursor = factory.prebuildCursor;
var prebuildPool = factory.prebuildPool;
if (!found)
{
for (var i = 1; i < prebuildCursor; i++)
{
if (prebuildPool[i].id != i) continue;
pos = prebuildPool[i].pos;
found = true;
break;
}
}
var testPos = pos;
var cellCount = PlanetGrid.DetermineLongitudeSegmentCount(0, factory.planet.aux.mainGrid.segment) * 5;
var cellRad = Math.PI / cellCount;
var distRadCount = 1;
for (var i = 1; i <= cellCount; i++)
{
testPos = Maths.RotateLF(0.0, 1.0, 0.0, cellRad, testPos);
if ((testPos - pos).sqrMagnitude < 14297f) continue;
distRadCount = i;
break;
}
for (var i = 0; i < cellCount && countToBuild != 0;)
{
/* Check for collision */
var collide = false;
for (var j = 1; j < stationCursor; j++)
{
if (stationPool[j] == null || stationPool[j].id != j) continue;
if ((entityPool[stationPool[j].entityId].pos - pos).sqrMagnitude >= 14297f) continue;
collide = true;
break;
}
for (var j = 1; j < prebuildCursor; j++)
{
if (prebuildPool[j].id != j) continue;
if ((prebuildPool[j].pos - pos).sqrMagnitude >= 14297f) continue;
collide = true;
break;
}
if (collide)
{
/* rotate for a small cell on sphere */
pos = Maths.RotateLF(0.0, 1.0, 0.0, cellRad, pos);
i++;
continue;
}
if (player.inhandItemId == OrbitalCollectorItemId && player.inhandItemCount > 0)
{
player.UseHandItems(1, out var _);
}
else
{
var count = 1;
var itemId = OrbitalCollectorItemId;
player.package.TakeTailItems(ref itemId, ref count, out var _);
if (count == 0) break;
}
var rot = Maths.SphericalRotation(pos, 0f);
var prebuild = new PrebuildData
{
protoId = 2105,
modelIndex = 117,
pos = pos,
pos2 = pos,
rot = rot,
rot2 = rot,
pickOffset = 0,
insertOffset = 0,
recipeId = 0,
filterId = 0,
paramCount = 0
};
factory.AddPrebuildDataWithComponents(prebuild);
prebuildCursor = factory.prebuildCursor;
if (countToBuild > 0) countToBuild--;
/* rotate for minimal distance for next OC on sphere */
pos = Maths.RotateLF(0.0, 1.0, 0.0, cellRad * distRadCount, pos);
i += distRadCount;
}
}
}