From 842bb552b549275cea5bef8546b0a04e7a76c82b Mon Sep 17 00:00:00 2001 From: FoeFear <79296679+FoeFear@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:15:17 -0800 Subject: [PATCH 1/4] Fix invert tractor - Fix invert tractor stacking issue. - Fix invert tractor's infinite duration when activated. --- .../Functional Definitions/Abilities/InvertTractor.cs | 10 +++++----- .../Interaction Definitions/TractorBeam.cs | 10 +++++----- .../Entity Definitions/Entity.cs | 9 ++++++++- Assets/Scripts/HUD Scripts/ReticleScript.cs | 2 +- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Assets/Scripts/Functional Definitions/Abilities/InvertTractor.cs b/Assets/Scripts/Functional Definitions/Abilities/InvertTractor.cs index d49f3d01d..8d4c9f334 100644 --- a/Assets/Scripts/Functional Definitions/Abilities/InvertTractor.cs +++ b/Assets/Scripts/Functional Definitions/Abilities/InvertTractor.cs @@ -7,6 +7,7 @@ public override void SetTier(int abilityTier) if (abilityTier < 1) abilityTier = 1; base.SetTier(abilityTier); activeDuration = 5 * abilityTier; + cooldownDuration = 5 + abilityTier * 5; } protected override void Awake() @@ -19,11 +20,11 @@ protected override void Awake() } /// - /// Returns the engine power to the original value + /// Disable invert tractor /// public override void Deactivate() { - Core.tractorSwitched = false; + Core.invertTractors--; if (Core is ShellCore core && !MasterNetworkAdapter.lettingServerDecide) core.SetTractorTarget(null); base.Deactivate(); } @@ -35,13 +36,12 @@ public override void ActivationCosmetic(Vector3 targetPos) Execute(); } - /// - /// Increases core engine power to speed up the core + /// Invert tractor /// protected override void Execute() { - Core.tractorSwitched = true; + Core.invertTractors++; AudioManager.PlayClipByID("clip_buff", transform.position); base.Execute(); } diff --git a/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs b/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs index 45a44d9a0..b261e6833 100644 --- a/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs +++ b/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs @@ -138,7 +138,7 @@ protected void FixedUpdate() } else if (dist > 2f) { - if (!owner.tractorSwitched) + if (!owner.isTractorSwitched) { rigidbody.AddForce(dir.normalized * (dist - 2F) * rigidbody.mass * tractorStrength / Time.fixedDeltaTime); } @@ -165,7 +165,7 @@ protected void LateUpdate() private float auxillaryScaleY = 0.6F; protected void TractorBeamUpdate() { - lineRenderer.material.color = owner.tractorSwitched ? new Color32(255, 32, 255, 128) : new Color32(88, 239, 255, 128); + lineRenderer.material.color = owner.isTractorSwitched ? new Color32(255, 32, 255, 128) : new Color32(88, 239, 255, 128); this.energyPickupTimer -= Time.fixedDeltaTime * this.energyPickupSpeed; // Grab energy automatically after a while when the craft is not pulling something more important if (energyEnabled && (!target) && (this.energyPickupTimer < 0) && !owner.IsInvisible && !owner.isAbsorbing) @@ -209,7 +209,7 @@ protected void TractorBeamUpdate() coreGlow.gameObject.SetActive(true); targetGlow.gameObject.SetActive(true); var x = auxillaryParticleSystem.GetComponentInChildren().main; - x.startColor = new ParticleSystem.MinMaxGradient(owner.tractorSwitched ? new Color32(255, 32, 255, 128) : new Color32(88, 239, 255, 128)); + x.startColor = new ParticleSystem.MinMaxGradient(owner.isTractorSwitched ? new Color32(255, 32, 255, 128) : new Color32(88, 239, 255, 128)); auxillaryParticleSystem.SetActive(true); auxillaryParticleSystem.transform.position = Vector3.Lerp(transform.position, target.transform.position, 0.5F); auxillaryParticleSystem.transform.localScale = new Vector3((target.transform.position - transform.position).magnitude/0.2F, auxillaryScaleY, 1); @@ -277,7 +277,7 @@ public void SetTractorTarget(Draggable newTarget, bool fromClient = false, bool } } - if (target && ((MasterNetworkAdapter.mode != MasterNetworkAdapter.NetworkMode.Client && (!owner.tractorSwitched || !target.GetComponent())) || fromServer)) + if (target && ((MasterNetworkAdapter.mode != MasterNetworkAdapter.NetworkMode.Client && (!owner.isTractorSwitched || !target.GetComponent())) || fromServer)) { target.AddDrag(); } @@ -314,7 +314,7 @@ private bool IsValidDraggableTarget(Draggable newTarget) public static bool InvertTractorCheck(Entity owner, Draggable newTarget) { Entity requestedTarget = newTarget.gameObject.GetComponent(); - if (owner.tractorSwitched || !requestedTarget || (FactionManager.IsAllied(requestedTarget.faction, owner.faction) && (requestedTarget.isStandardTractorTarget))) + if (owner.isTractorSwitched || !requestedTarget || (FactionManager.IsAllied(requestedTarget.faction, owner.faction) && (requestedTarget.isStandardTractorTarget))) { return true; } diff --git a/Assets/Scripts/Game Object Definitions/Entity Definitions/Entity.cs b/Assets/Scripts/Game Object Definitions/Entity Definitions/Entity.cs index 26a85f330..4a1c53d2b 100644 --- a/Assets/Scripts/Game Object Definitions/Entity Definitions/Entity.cs +++ b/Assets/Scripts/Game Object Definitions/Entity Definitions/Entity.cs @@ -337,6 +337,8 @@ public float GetDamageFactor() [HideInInspector] public int absorptions = 0; + [HideInInspector] + public int invertTractors = 0; public bool canUseAbilities = true; @@ -344,7 +346,11 @@ public float GetDamageFactor() { get { return absorptions > 0; } } - public bool tractorSwitched = false; + + public bool isTractorSwitched // if true, switch tractor + { + get { return invertTractors > 0; } + } public SectorManager sectorMngr; protected Entity lastDamagedBy; @@ -753,6 +759,7 @@ public virtual void Rebuild() stealths = 0; absorptions = 0; + invertTractors = 0; BuildEntity(); GetComponentInChildren().Initialize(); // initialize the minimap dot diff --git a/Assets/Scripts/HUD Scripts/ReticleScript.cs b/Assets/Scripts/HUD Scripts/ReticleScript.cs index 5721d1236..70755d65b 100644 --- a/Assets/Scripts/HUD Scripts/ReticleScript.cs +++ b/Assets/Scripts/HUD Scripts/ReticleScript.cs @@ -302,7 +302,7 @@ void Update() // it's draggable if it's not an entity or it's a draggable entity with the same faction if (draggable && (targSys.GetTarget().position - craft.transform.position).sqrMagnitude <= 400 && (!targSys.GetTarget().GetComponent() - || FactionManager.IsAllied(targSys.GetTarget().GetComponent().faction, craft.faction) || craft.tractorSwitched)) + || FactionManager.IsAllied(targSys.GetTarget().GetComponent().faction, craft.faction) || craft.isTractorSwitched)) { craft.SetTractorTarget((craft.GetTractorTarget() == draggable) ? null : draggable); } From f6f6319d846dfeb725a12b22a430fd4ccc22b616 Mon Sep 17 00:00:00 2001 From: FoeFear <79296679+FoeFear@users.noreply.github.com> Date: Fri, 27 Feb 2026 18:07:26 -0800 Subject: [PATCH 2/4] Fix incorrect mass calculation when activating invert tractor --- .../Interaction Definitions/TractorBeam.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs b/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs index b261e6833..033b7140a 100644 --- a/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs +++ b/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs @@ -144,8 +144,8 @@ protected void FixedUpdate() } else { - owner.GetComponent().AddForce(-dir.normalized * (dist - 2F) * - rigidbody.mass * tractorStrength / Time.fixedDeltaTime); + var ownerRigbody = owner.GetComponent(); + ownerRigbody.AddForce(-dir.normalized * (dist - 2F) * ownerRigbody.mass * tractorStrength / Time.fixedDeltaTime); } } } From c94b40fb0e6823a1925308e98efb5a65c1dc3109 Mon Sep 17 00:00:00 2001 From: FoeFear <79296679+FoeFear@users.noreply.github.com> Date: Sun, 1 Mar 2026 18:04:56 -0800 Subject: [PATCH 3/4] Fix invert tractor causing certain objects to get stuck on one axis --- .../Interaction Definitions/TractorBeam.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs b/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs index 033b7140a..6985de611 100644 --- a/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs +++ b/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs @@ -262,7 +262,7 @@ public void SetTractorTarget(Draggable newTarget, bool fromClient = false, bool lineRenderer.enabled = (newTarget != null); } - if (target) + if (target && (!owner.isTractorSwitched || !target.GetComponent()) { target.RemoveDrag(); } From 0ff382b8b431327b5cfa639f2eee012cc5501c5a Mon Sep 17 00:00:00 2001 From: FoeFear <79296679+FoeFear@users.noreply.github.com> Date: Sun, 1 Mar 2026 18:09:02 -0800 Subject: [PATCH 4/4] Update TractorBeam.cs --- .../Interaction Definitions/TractorBeam.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs b/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs index 6985de611..de2734160 100644 --- a/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs +++ b/Assets/Scripts/Functional Definitions/Interaction Definitions/TractorBeam.cs @@ -262,7 +262,7 @@ public void SetTractorTarget(Draggable newTarget, bool fromClient = false, bool lineRenderer.enabled = (newTarget != null); } - if (target && (!owner.isTractorSwitched || !target.GetComponent()) + if (target && (!owner.isTractorSwitched || !target.GetComponent())) { target.RemoveDrag(); }