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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user