mirror of
https://github.com/soarqin/DSP_Mods.git
synced 2026-05-09 15:17:10 +08:00
CheatEnabler: Add a new button and fix a crash
This commit is contained in:
@@ -1334,46 +1334,13 @@ public static class DysonSphereFunctions
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CreateIllegalDysonShellWithMaxOutput()
|
private static bool CreateIllegalDysonShellWithMaxOutputForLayer(DysonSphereLayer layer)
|
||||||
{
|
{
|
||||||
StarData star = null;
|
|
||||||
var dysonEditor = UIRoot.instance?.uiGame?.dysonEditor;
|
|
||||||
if (dysonEditor != null && dysonEditor.gameObject.activeSelf)
|
|
||||||
{
|
|
||||||
star = dysonEditor.selection.viewStar;
|
|
||||||
}
|
|
||||||
if (star == null)
|
|
||||||
{
|
|
||||||
star = GameMain.data?.localStar;
|
|
||||||
if (star == null)
|
|
||||||
{
|
|
||||||
UIMessageBox.Show("CheatEnabler".Translate(), "You are not in any system.".Translate(), "确定".Translate(), UIMessageBox.ERROR, null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
UXAssist.Functions.DysonSphereFunctions.InitCurrentDysonLayer(star, 0);
|
|
||||||
var dysonSphere = GameMain.data?.dysonSpheres[star.index];
|
|
||||||
if (dysonSphere == null)
|
|
||||||
{
|
|
||||||
UIMessageBox.Show("CheatEnabler".Translate(), string.Format("There is no Dyson Sphere data on \"{0}\".".Translate(), star.displayName), "确定".Translate(), UIMessageBox.ERROR, null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
DysonShell.s_vmap ??= new Dictionary<int, Vector3>(16384);
|
DysonShell.s_vmap ??= new Dictionary<int, Vector3>(16384);
|
||||||
DysonShell.s_outvmap ??= new Dictionary<int, Vector3>(16384);
|
DysonShell.s_outvmap ??= new Dictionary<int, Vector3>(16384);
|
||||||
DysonShell.s_ivmap ??= new Dictionary<int, int>(16384);
|
DysonShell.s_ivmap ??= new Dictionary<int, int>(16384);
|
||||||
var shellsChanged = false;
|
var shellsChanged = false;
|
||||||
var mutex = new object();
|
var mutex = new object();
|
||||||
Dictionary<(int, int), int> availableFrames = [];
|
|
||||||
HashSet<int> unusedFrameIds = [];
|
|
||||||
var layer = dysonSphere.layersIdBased[1];
|
|
||||||
if (layer != null)
|
|
||||||
{
|
|
||||||
dysonSphere.RemoveLayer(1);
|
|
||||||
}
|
|
||||||
var maxOrbitRadius = Patches.DysonSpherePatch.UnlockMaxOrbitRadiusEnabled.Value ? Patches.DysonSpherePatch.UnlockMaxOrbitRadiusValue.Value : dysonSphere.maxOrbitRadius;
|
|
||||||
layer = dysonSphere.AddLayerOnId(1, maxOrbitRadius, Quaternion.Euler(0f, 0f, 0f), Mathf.Sqrt(dysonSphere.gravity / maxOrbitRadius) / maxOrbitRadius * 57.2957802f);
|
|
||||||
if (layer == null) return;
|
|
||||||
|
|
||||||
var supposedShells = new List<SupposedShell>(60 * 59 * 58);
|
var supposedShells = new List<SupposedShell>(60 * 59 * 58);
|
||||||
Vector3[] nodePos = new Vector3[60];
|
Vector3[] nodePos = new Vector3[60];
|
||||||
for (var i = 0; i < 60; i++)
|
for (var i = 0; i < 60; i++)
|
||||||
@@ -1397,7 +1364,7 @@ public static class DysonSphereFunctions
|
|||||||
var maxJ = -1;
|
var maxJ = -1;
|
||||||
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount - 1 };
|
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount - 1 };
|
||||||
|
|
||||||
var gridScale = (int)(Math.Pow(maxOrbitRadius / 4000.0, 0.75) + 0.5);
|
var gridScale = (int)(Math.Pow(layer.orbitRadius / 4000.0, 0.75) + 0.5);
|
||||||
gridScale = (gridScale < 1) ? 1 : gridScale;
|
gridScale = (gridScale < 1) ? 1 : gridScale;
|
||||||
var cpPerVertex = gridScale * gridScale * 2;
|
var cpPerVertex = gridScale * gridScale * 2;
|
||||||
var barrier = 0x7FFFFFFF / cpPerVertex;
|
var barrier = 0x7FFFFFFF / cpPerVertex;
|
||||||
@@ -1457,6 +1424,85 @@ public static class DysonSphereFunctions
|
|||||||
}
|
}
|
||||||
shellsChanged = true;
|
shellsChanged = true;
|
||||||
}
|
}
|
||||||
|
return shellsChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CreateIllegalDysonShellWithMaxOutput()
|
||||||
|
{
|
||||||
|
StarData star = null;
|
||||||
|
var dysonEditor = UIRoot.instance?.uiGame?.dysonEditor;
|
||||||
|
if (dysonEditor != null && dysonEditor.gameObject.activeSelf)
|
||||||
|
{
|
||||||
|
star = dysonEditor.selection.viewStar;
|
||||||
|
}
|
||||||
|
if (star == null)
|
||||||
|
{
|
||||||
|
star = GameMain.data?.localStar;
|
||||||
|
if (star == null)
|
||||||
|
{
|
||||||
|
UIMessageBox.Show("CheatEnabler".Translate(), "You are not in any system.".Translate(), "确定".Translate(), UIMessageBox.ERROR, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UXAssist.Functions.DysonSphereFunctions.InitCurrentDysonLayer(star, 0);
|
||||||
|
var dysonSphere = GameMain.data?.dysonSpheres[star.index];
|
||||||
|
if (dysonSphere == null)
|
||||||
|
{
|
||||||
|
UIMessageBox.Show("CheatEnabler".Translate(), string.Format("There is no Dyson Sphere data on \"{0}\".".Translate(), star.displayName), "确定".Translate(), UIMessageBox.ERROR, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var layer = dysonSphere.layersIdBased[1];
|
||||||
|
if (layer != null)
|
||||||
|
{
|
||||||
|
dysonSphere.RemoveLayer(1);
|
||||||
|
}
|
||||||
|
var maxOrbitRadius = Patches.DysonSpherePatch.UnlockMaxOrbitRadiusEnabled.Value ? Patches.DysonSpherePatch.UnlockMaxOrbitRadiusValue.Value : dysonSphere.maxOrbitRadius;
|
||||||
|
layer = dysonSphere.AddLayerOnId(1, maxOrbitRadius, Quaternion.Euler(0f, 0f, 0f), Mathf.Sqrt(dysonSphere.gravity / maxOrbitRadius) / maxOrbitRadius * 57.2957802f);
|
||||||
|
if (layer == null) return;
|
||||||
|
|
||||||
|
var shellsChanged = CreateIllegalDysonShellWithMaxOutputForLayer(layer);
|
||||||
|
|
||||||
|
dysonSphere.CheckAutoNodes();
|
||||||
|
if (dysonSphere.autoNodeCount <= 0) dysonSphere.PickAutoNode();
|
||||||
|
dysonSphere.modelRenderer.RebuildModels();
|
||||||
|
if (shellsChanged) GameMain.gameScenario?.NotifyOnPlanDysonShell();
|
||||||
|
dysonSphere.inEditorRenderMaskS = 0;
|
||||||
|
dysonSphere.inEditorRenderMaskL = 0;
|
||||||
|
dysonSphere.inGameRenderMaskS = 0;
|
||||||
|
dysonSphere.inGameRenderMaskL = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CreateIllegalDysonShellWithMaxOutput2()
|
||||||
|
{
|
||||||
|
StarData star = null;
|
||||||
|
var dysonEditor = UIRoot.instance?.uiGame?.dysonEditor;
|
||||||
|
if (dysonEditor != null && dysonEditor.gameObject.activeSelf)
|
||||||
|
{
|
||||||
|
star = dysonEditor.selection.viewStar;
|
||||||
|
}
|
||||||
|
if (star == null)
|
||||||
|
{
|
||||||
|
star = GameMain.data?.localStar;
|
||||||
|
if (star == null)
|
||||||
|
{
|
||||||
|
UIMessageBox.Show("CheatEnabler".Translate(), "You are not in any system.".Translate(), "确定".Translate(), UIMessageBox.ERROR, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var dysonSphere = GameMain.data?.dysonSpheres[star.index];
|
||||||
|
if (dysonSphere == null)
|
||||||
|
{
|
||||||
|
UIMessageBox.Show("CheatEnabler".Translate(), string.Format("There is no Dyson Sphere data on \"{0}\".".Translate(), star.displayName), "确定".Translate(), UIMessageBox.ERROR, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var shellsChanged = false;
|
||||||
|
for (int i = dysonSphere.layersSorted.Length - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
var layer = dysonSphere.layersSorted[i];
|
||||||
|
if (layer == null) continue;
|
||||||
|
shellsChanged = CreateIllegalDysonShellWithMaxOutputForLayer(layer) || shellsChanged;
|
||||||
|
}
|
||||||
|
|
||||||
dysonSphere.CheckAutoNodes();
|
dysonSphere.CheckAutoNodes();
|
||||||
if (dysonSphere.autoNodeCount <= 0) dysonSphere.PickAutoNode();
|
if (dysonSphere.autoNodeCount <= 0) dysonSphere.PickAutoNode();
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ public static class UIConfigWindow
|
|||||||
I18N.Add("Complete Dyson Sphere shells instantly", "Complete Dyson Sphere shells instantly", "立即完成戴森壳建造");
|
I18N.Add("Complete Dyson Sphere shells instantly", "Complete Dyson Sphere shells instantly", "立即完成戴森壳建造");
|
||||||
I18N.Add("Remove all frames on Dyson Sphere", "Remove all frames on Dyson Sphere", "移除戴森球上的所有框架");
|
I18N.Add("Remove all frames on Dyson Sphere", "Remove all frames on Dyson Sphere", "移除戴森球上的所有框架");
|
||||||
I18N.Add("Generate illegal dyson shell", "Generate an illegal dyson shell (!!1st shell layer will be replaced!!)", "生成单层仙术戴森壳(!!会先删除第一层戴森壳!!)");
|
I18N.Add("Generate illegal dyson shell", "Generate an illegal dyson shell (!!1st shell layer will be replaced!!)", "生成单层仙术戴森壳(!!会先删除第一层戴森壳!!)");
|
||||||
|
I18N.Add("Generate illegal dyson shell 2", "Generate illegal dyson shells for all layers without nodes and shells", "为所有没有节点和壳的层级生成仙术戴森壳");
|
||||||
I18N.Add("Keep max production shells and remove others", "Keep max production shells and remove others", "保留发电量最高的戴森壳并移除其他戴森壳");
|
I18N.Add("Keep max production shells and remove others", "Keep max production shells and remove others", "保留发电量最高的戴森壳并移除其他戴森壳");
|
||||||
I18N.Add("Duplicate shells from that with highest production", "Duplicate shells from that with highest production", "从发电量最高的壳复制戴森壳");
|
I18N.Add("Duplicate shells from that with highest production", "Duplicate shells from that with highest production", "从发电量最高的壳复制戴森壳");
|
||||||
I18N.Add("Generate illegal dyson shell quickly", "Generate illegal dyson shell quickly", "快速生成仙术戴森壳");
|
I18N.Add("Generate illegal dyson shell quickly", "Generate illegal dyson shell quickly", "快速生成仙术戴森壳");
|
||||||
@@ -316,12 +317,18 @@ public static class UIConfigWindow
|
|||||||
{
|
{
|
||||||
y += 72f;
|
y += 72f;
|
||||||
var originalY = y;
|
var originalY = y;
|
||||||
var btn1 = wnd.AddButton(x, y, 300f, tab4, "Generate illegal dyson shell", 16, "button-generate-illegal-dyson-shells", () =>
|
var btn0 = wnd.AddButton(x, y, 300f, tab4, "Generate illegal dyson shell", 16, "button-generate-illegal-dyson-shells", () =>
|
||||||
{
|
{
|
||||||
UIMessageBox.Show("Generate illegal dyson shell".Translate(), "WARNING: This operation can be very slow, continue?".Translate(), "取消".Translate(), "确定".Translate(), UIMessageBox.WARNING, null,
|
UIMessageBox.Show("Generate illegal dyson shell".Translate(), "WARNING: This operation can be very slow, continue?".Translate(), "取消".Translate(), "确定".Translate(), UIMessageBox.WARNING, null,
|
||||||
() => { DysonSphereFunctions.CreateIllegalDysonShellWithMaxOutput(); });
|
() => { DysonSphereFunctions.CreateIllegalDysonShellWithMaxOutput(); });
|
||||||
});
|
});
|
||||||
y += 36f;
|
y += 36f;
|
||||||
|
var btn1 = wnd.AddButton(x, y, 300f, tab4, "Generate illegal dyson shell 2", 16, "button-generate-illegal-dyson-shells", () =>
|
||||||
|
{
|
||||||
|
UIMessageBox.Show("Generate illegal dyson shell 2".Translate(), "WARNING: This operation can be very slow, continue?".Translate(), "取消".Translate(), "确定".Translate(), UIMessageBox.WARNING, null,
|
||||||
|
() => { DysonSphereFunctions.CreateIllegalDysonShellWithMaxOutput2(); });
|
||||||
|
});
|
||||||
|
y += 36f;
|
||||||
var btn2 = wnd.AddButton(x, y, 300f, tab4, "Keep max production shells and remove others", 16, "button-keep-max-production-shells", () =>
|
var btn2 = wnd.AddButton(x, y, 300f, tab4, "Keep max production shells and remove others", 16, "button-keep-max-production-shells", () =>
|
||||||
{
|
{
|
||||||
UIMessageBox.Show("Keep max production shells and remove others".Translate(), "WARNING: This operation is DANGEROUS, continue?".Translate(), "取消".Translate(), "确定".Translate(), UIMessageBox.WARNING, null,
|
UIMessageBox.Show("Keep max production shells and remove others".Translate(), "WARNING: This operation is DANGEROUS, continue?".Translate(), "取消".Translate(), "确定".Translate(), UIMessageBox.WARNING, null,
|
||||||
@@ -352,6 +359,7 @@ public static class UIConfigWindow
|
|||||||
void onIllegalDysonShellFunctionsChanged(object o, EventArgs e)
|
void onIllegalDysonShellFunctionsChanged(object o, EventArgs e)
|
||||||
{
|
{
|
||||||
var enabled = Functions.DysonSphereFunctions.IllegalDysonShellFunctionsEnabled.Value;
|
var enabled = Functions.DysonSphereFunctions.IllegalDysonShellFunctionsEnabled.Value;
|
||||||
|
btn0.gameObject.SetActive(enabled);
|
||||||
btn1.gameObject.SetActive(enabled);
|
btn1.gameObject.SetActive(enabled);
|
||||||
btn2.gameObject.SetActive(enabled);
|
btn2.gameObject.SetActive(enabled);
|
||||||
btn3.gameObject.SetActive(enabled);
|
btn3.gameObject.SetActive(enabled);
|
||||||
|
|||||||
Reference in New Issue
Block a user