Skip to content

Commit 6f93e36

Browse files
committed
Actual fix for issue #282
The CollisionEnhancer component can actually exist on non-part objects such as physical objects and fireworks.
1 parent f90accd commit 6f93e36

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

KSPCommunityFixes/Performance/CollisionEnhancerFastUpdate.cs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,23 @@ protected override void ApplyPatches()
1616
private static void CollisionEnhancer_FixedUpdate_Override(CollisionEnhancer __instance)
1717
{
1818
Part part = __instance.part;
19+
bool hasPart = part.IsNotNullOrDestroyed();
1920

20-
if (part.IsNullOrDestroyed() || part.partTransform.IsNullOrDestroyed())
21-
return;
22-
23-
Vector3 position = part.partTransform.position;
21+
Vector3 position;
22+
if (hasPart)
23+
{
24+
position = part.partTransform.position;
2425

25-
if (part.packed)
26+
if (part.packed)
27+
{
28+
__instance.lastPos = position;
29+
__instance.wasPacked = true;
30+
return;
31+
}
32+
}
33+
else
2634
{
27-
__instance.lastPos = position;
28-
__instance.wasPacked = true;
29-
return;
35+
position = __instance.transform.position;
3036
}
3137

3238
if (__instance.framesToSkip > 0)
@@ -36,7 +42,7 @@ private static void CollisionEnhancer_FixedUpdate_Override(CollisionEnhancer __i
3642
return;
3743
}
3844

39-
if (part.vessel.IsNullOrDestroyed() || part.vessel.heightFromTerrain > 1000f)
45+
if (hasPart && (part.vessel.IsNullOrDestroyed() || part.vessel.heightFromTerrain > 1000f))
4046
{
4147
__instance.lastPos = position;
4248
return;
@@ -49,14 +55,15 @@ private static void CollisionEnhancer_FixedUpdate_Override(CollisionEnhancer __i
4955

5056
CollisionEnhancerBehaviour mode = __instance.OnTerrainPunchThrough;
5157

52-
if (mode < CollisionEnhancerBehaviour.COLLIDE // only handle EXPLODE, TRANSLATE and TRANSLATE_BACK_SPLAT
58+
if (mode < CollisionEnhancerBehaviour.COLLIDE // only handle EXPLODE, TRANSLATE_BACK and TRANSLATE_BACK_SPLAT
5359
&& !CollisionEnhancer.bypass
54-
&& part.State != PartStates.DEAD
60+
&& (!hasPart || part.State != PartStates.DEAD)
5561
&& (__instance.lastPos - position).sqrMagnitude > CollisionEnhancer.minDistSqr
5662
&& Physics.Linecast(__instance.lastPos, position, out RaycastHit hit, 32768, QueryTriggerInteraction.Ignore)) // linecast against the "LocalScenery" layer
5763
{
5864
Vector3 rbVelocity = __instance.rb.velocity;
59-
Debug.Log($"[F: {Time.frameCount}]: [{__instance.name}] Collision Enhancer Punch Through - vel: {rbVelocity.magnitude}");
65+
string objectName = hasPart ? part.partInfo?.name ?? __instance.name : __instance.name;
66+
Debug.Log($"[Collision Enhancer] {mode.ToString()} on \"{objectName}\" (vel: {rbVelocity.magnitude.ToString("F0")})");
6067

6168
if (mode == CollisionEnhancerBehaviour.EXPLODE
6269
&& !CheatOptions.NoCrashDamage
@@ -86,8 +93,12 @@ private static void CollisionEnhancer_FixedUpdate_Override(CollisionEnhancer __i
8693
__instance.rb.velocity = newVel.IsInvalid() ? Vector3.zero : newVel;
8794
}
8895
}
89-
GameEvents.OnCollisionEnhancerHit.Fire(part, hit);
90-
GameEvents.onPartExplodeGroundCollision.Fire(part);
96+
97+
if (hasPart)
98+
{
99+
GameEvents.OnCollisionEnhancerHit.Fire(part, hit);
100+
GameEvents.onPartExplodeGroundCollision.Fire(part);
101+
}
91102
}
92103

93104
__instance.lastPos = position;

0 commit comments

Comments
 (0)