-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Potential new KSP bugfix : ReRootPreserveSurfaceAttach (#142)
* New bugfix patch : ReRootPreserveSurfaceAttach * ReRootPreserveSurfaceAttach : prepare for release
- Loading branch information
1 parent
aa98056
commit a404b7d
Showing
4 changed files
with
82 additions
and
45 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
using HarmonyLib; | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.Text; | ||
using System.Threading.Tasks; | ||
using UnityEngine; | ||
|
||
namespace KSPCommunityFixes.BugFixes | ||
{ | ||
class ReRootCloneSurfaceAttach : BasePatch | ||
{ | ||
protected override void ApplyPatches(List<PatchInfo> patches) | ||
{ | ||
patches.Add(new PatchInfo( | ||
PatchMethodType.Prefix, | ||
AccessTools.Method(typeof(AttachNode), nameof(AttachNode.ReverseSrfNodeDirection)), | ||
this)); | ||
|
||
patches.Add(new PatchInfo( | ||
PatchMethodType.Prefix, | ||
AccessTools.Method(typeof(AttachNode), nameof(AttachNode.ChangeSrfNodePosition)), | ||
this)); | ||
} | ||
|
||
// In stock, this function is called after reversing a surface attachment during a re-root operation. | ||
// it tries to alter a part's surface attachment so that it mirrors the surface attach node of its parent. | ||
// But that's not a great idea, because a lot of things depend on the surface attach node never changing. | ||
// For example, if the user then picks the part back up, it won't attach the same way to anything else | ||
// To fix this, instead of using the child's actual srfAttachNode we create a new surface attach node and | ||
// just stick it in the regular AttachNode list. | ||
static bool AttachNode_ReverseSrfNodeDirection_Prefix(AttachNode __instance, AttachNode fromNode) | ||
{ | ||
// note that instead of cloning the child's srfAttachNode and using its properties, we use the fromNode | ||
// because we want to mirror the previous state as much as possible - this node WAS the other part's srfAttachNode | ||
AttachNode newSrfAttachNode = AttachNode.Clone(fromNode); | ||
newSrfAttachNode.owner = __instance.owner; | ||
newSrfAttachNode.attachedPart = fromNode.owner; | ||
// the name here isn't important, but if anyone is debugging an issue I'd like to make it clear where it came from. | ||
// I'm pretty sure the empty string has some special meaning, and we need to be sure it doesn't collide with any existing node IDs | ||
newSrfAttachNode.id = "KSPCF-reroot-srfAttachNode"; | ||
|
||
// convert the position, orientation from the other part's local space into ours | ||
Vector3 positionWorld = fromNode.owner.transform.TransformPoint(fromNode.position); | ||
Vector3 orientationWorld = fromNode.owner.transform.TransformDirection(fromNode.orientation); | ||
newSrfAttachNode.originalPosition = newSrfAttachNode.owner.transform.InverseTransformPoint(positionWorld); | ||
newSrfAttachNode.originalOrientation = -newSrfAttachNode.owner.transform.InverseTransformDirection(orientationWorld); | ||
newSrfAttachNode.position = newSrfAttachNode.originalPosition; | ||
newSrfAttachNode.orientation = newSrfAttachNode.originalOrientation; | ||
newSrfAttachNode.owner.attachNodes.Add(newSrfAttachNode); | ||
|
||
// now clear the srfAttachNodes from both parts | ||
__instance.attachedPart = null; | ||
fromNode.attachedPart = null; | ||
|
||
return false; | ||
} | ||
|
||
// this function is just horribly broken and no one could call it, ever | ||
static bool AttachNode_ChangeSrfNodePosition_Prefix() | ||
{ | ||
return false; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters