public static void EjectorComponent_SetOrbit_Postfix(ref EjectorComponent __instance, int _orbitId) { var ejectorUID = GetEjectorUID(__instance); ManagedEjector managedEjector = GetOrCreateManagedEjector(ejectorUID, _orbitId); managedEjector.originalOrbitId = _orbitId; }
public static void EjectorComponent_Export_Prefix(ref EjectorComponent __instance, ref int __state) { // at save time we store the current orbitId , replace it with the originalOne, and restore it after the save. var ejectorUID = GetEjectorUID(__instance); ManagedEjector managedEjector = GetOrCreateManagedEjector(ejectorUID, __instance.orbitId); __state = __instance.orbitId; __instance.orbitId = managedEjector.originalOrbitId; }
public static void EjectorComponent_InternalUpdate_Postfix(ref EjectorComponent __instance, DysonSwarm swarm, AstroPose[] astroPoses) { var ejectorUID = GetEjectorUID(__instance); if (ejectorUID % BATCH_COUNT != batch) { return; } ManagedEjector managedEjector = GetOrCreateManagedEjector(ejectorUID, __instance.orbitId); if (!IsOrbitValid(managedEjector.originalOrbitId, swarm)) { managedEjector.originalOrbitId = 0; } if (__instance.orbitId != managedEjector.originalOrbitId && IsOrbitReachable(__instance, swarm, astroPoses, managedEjector.originalOrbitId)) { // by default we try to check if the original orbit is available SetOrbit(ref __instance, managedEjector.originalOrbitId); } else if ( (__instance.targetState == EjectorComponent.ETargetState.AngleLimit || __instance.targetState == EjectorComponent.ETargetState.Blocked || (__instance.targetState == EjectorComponent.ETargetState.None && forceRetargeting.Value)) && swarm.orbitCursor > 1) { // if the current orbit is not reachable activate auto targeting var testOrbit = __instance.orbitId; var orbitsCount = swarm.orbitCursor; while (--orbitsCount > 0) { testOrbit++; if (testOrbit >= swarm.orbitCursor) { testOrbit = 1; } if (testOrbit == 1 && ignoreOrbit1.Value) { continue; } if (IsOrbitReachable(__instance, swarm, astroPoses, testOrbit)) { SetOrbit(ref __instance, testOrbit); return; } } // no alternative orbit has been found. set the original as default SetOrbit(ref __instance, managedEjector.originalOrbitId); } }
internal static ManagedEjector GetOrCreateManagedEjector(int ejectorUID, int originalOrbitId) { if (!managedEjectors.ContainsKey(ejectorUID)) { var managedEjector = new ManagedEjector() { originalOrbitId = originalOrbitId }; managedEjectors.Add(ejectorUID, managedEjector); } return(managedEjectors[ejectorUID]); }
public static void UIEjectorWindow__OnUpdate_Postfix(ref UIEjectorWindow __instance, ref UIOrbitPicker ___orbitPicker) { if (__instance.ejectorId != 0 && __instance.factory != null) { if (autoRetargetingGO == null) { var stateText = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Ejector Window/state/state-text"); autoRetargetingGO = Instantiate(stateText, stateText.transform.position, Quaternion.identity); autoRetargetingGO.name = "auto-retargeting"; autoRetargetingGO.transform.SetParent(stateText.transform.parent); autoRetargetingGO.transform.localScale = new Vector3(1f, 1f, 1f); autoRetargetingGO.transform.localPosition = stateText.transform.localPosition + new Vector3(0f, -24f, 0f); } EjectorComponent ejector = __instance.factorySystem.ejectorPool[__instance.ejectorId]; var ejectorUID = GetEjectorUID(ejector); var text = "Retargeting - Original Orbit"; var color = TEXT_WHITE; ManagedEjector managedEjector = GetOrCreateManagedEjector(ejectorUID, ejector.orbitId); bool isAlternativeOrbit = ejector.orbitId != managedEjector.originalOrbitId; if (ejector.targetState == EjectorComponent.ETargetState.AngleLimit) { text = "Retargeting - No valid alternative"; color = TEXT_ORANGE; } if (isAlternativeOrbit) { ___orbitPicker.orbitId = managedEjector.originalOrbitId; text = $"Retargeting - Alternative Orbit [ {ejector.orbitId} ]"; color = TEXT_CYAN; } for (var i = 0; i < ___orbitPicker.orbitButtons.Length; i++) { var orbitButton = ___orbitPicker.orbitButtons[i]; var transition = orbitButton.transitions[0]; if (orbitButton.highlighted || orbitButton.updating || orbitButton.isPointerEnter || orbitButton.isPointerDown || !orbitButton.button.interactable) { continue; } if (isAlternativeOrbit && i == ejector.orbitId) { transition.target.color = BUTTON_CYAN; } else if (transition.target.color != transition.normalColor) { transition.target.color = transition.normalColor; } } var autoRetargetingText = autoRetargetingGO.GetComponent <Text>(); autoRetargetingText.text = text; autoRetargetingText.color = color; } }