<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://modding.kerbal.wiki/index.php?action=history&amp;feed=atom&amp;title=Custom_Launch_Locations</id>
	<title>Custom Launch Locations - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://modding.kerbal.wiki/index.php?action=history&amp;feed=atom&amp;title=Custom_Launch_Locations"/>
	<link rel="alternate" type="text/html" href="https://modding.kerbal.wiki/index.php?title=Custom_Launch_Locations&amp;action=history"/>
	<updated>2026-06-12T23:30:36Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://modding.kerbal.wiki/index.php?title=Custom_Launch_Locations&amp;diff=399&amp;oldid=prev</id>
		<title>KiwiShark: 3 revisions imported</title>
		<link rel="alternate" type="text/html" href="https://modding.kerbal.wiki/index.php?title=Custom_Launch_Locations&amp;diff=399&amp;oldid=prev"/>
		<updated>2024-10-09T16:46:05Z</updated>

		<summary type="html">&lt;p&gt;3 revisions imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:46, 9 October 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key web117_modding:diff:1.41:old-398:rev-399 --&gt;
&lt;/table&gt;</summary>
		<author><name>KiwiShark</name></author>
	</entry>
	<entry>
		<id>https://modding.kerbal.wiki/index.php?title=Custom_Launch_Locations&amp;diff=398&amp;oldid=prev</id>
		<title>Spacewarp&gt;Meckryl: Changed the patch for SpaceSimulation.syncVesselToLocation to respect the height of the vessel so that it adjusts height automatically, and also just generally made it function more like the original which I imagine will help prevent bugs and quirky behavior</title>
		<link rel="alternate" type="text/html" href="https://modding.kerbal.wiki/index.php?title=Custom_Launch_Locations&amp;diff=398&amp;oldid=prev"/>
		<updated>2024-01-08T14:30:40Z</updated>

		<summary type="html">&lt;p&gt;Changed the patch for SpaceSimulation.syncVesselToLocation to respect the height of the vessel so that it adjusts height automatically, and also just generally made it function more like the original which I imagine will help prevent bugs and quirky behavior&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:30, 8 January 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l139&quot;&gt;Line 139:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 139:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;And replace it with this:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;And replace it with this:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;TransformModel &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformModel &lt;/del&gt;= (TransformModel)GameManager.Instance.Game.UniverseModel.FindSimObjectByNameKey(objectName).transform;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;TransformModel &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transform &lt;/ins&gt;= (TransformModel)GameManager.Instance.Game.UniverseModel.FindSimObjectByNameKey(objectName).transform;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ITransformFrame transformFrame &lt;/del&gt;= (&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ITransformFrame&lt;/del&gt;)&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformModel&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;bodyFrame&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SimulationObjectState state = new SimulationObjectState();&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;state.position = FramePositionState.FromTransform(transform);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;GeographicPositionState geographicPositionState;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;__instance.GetGeographicPosition(state.position.referenceTransformGuid, state.position, out geographicPositionState);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;//geographicPositionState.heading = __instance.GetLaunchSiteHeading(geographicPositionState, position.localRotation);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Vector3d relSurfaceNVector = GameManager.Instance.Game.UniverseModel.FindCelestialBodyByName(location.surfaceLocation?.parentGuid).GetRelSurfaceNVector(geographicPositionState.latitude, geographicPositionState.longitude);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Vector3d vector3d &lt;/ins&gt;= &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Vector3d.Cross&lt;/ins&gt;(&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;relSurfaceNVector, Vector3d.up&lt;/ins&gt;)&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;QuaternionD quaternionD = QuaternionD.AngleAxis(Vector3d&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SignedAngle(relSurfaceNVector, Vector3d.up, vector3d), Vector3d.right);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;QuaternionD quaternionD2 = QuaternionD.identity&lt;/ins&gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Vector3d vector3d2 = new Vector3d(relSurfaceNVector.x, 0.0, relSurfaceNVector.z);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;if (vector3d2.sqrMagnitude &amp;gt; 5E-324)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    quaternionD2 = QuaternionD.AngleAxis(Math.Atan2(vector3d2.x, vector3d2.z) * 57.29577951308232, Vector3d.up);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;QuaternionD geographicPositionHeading = quaternionD2 * quaternionD;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Vector3d vector3d3 = state.position.localRotation * Vector3.forward;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;geographicPositionState.heading =  Vector3d.SignedAngle(geographicPositionHeading * Vector3.forward, vector3d3, relSurfaceNVector);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;__instance.GetBodyRelativePosition(geographicPositionState, out state.position);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;state.position.localPosition.y += vesselComponent.OffsetToGround;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;state.position.localRotation.w = 1.0;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;SimulationObjectState simulationObjectState = new SimulationObjectState&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;SimulationObjectState simulationObjectState = new SimulationObjectState&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     position = new FramePositionState&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     position = new FramePositionState&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         referenceTransformGuid = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformFrame&lt;/del&gt;.transform.Guid,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         referenceTransformGuid = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transform.bodyFrame&lt;/ins&gt;.transform.Guid,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         referenceFrameType = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformFrame&lt;/del&gt;.type,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         referenceFrameType = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transform.bodyFrame&lt;/ins&gt;.type,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         localPosition = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformFrame&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transform&lt;/del&gt;.localPosition,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         localPosition = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;state&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;position&lt;/ins&gt;.localPosition,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         localRotation = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformFrame&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transform&lt;/del&gt;.localRotation&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         localRotation = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;state&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;position&lt;/ins&gt;.localRotation&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;};&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;};&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l154&quot;&gt;Line 154:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 176:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RigidbodyState rigidbodyState3 = new RigidbodyState&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RigidbodyState rigidbodyState3 = new RigidbodyState&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     referenceTransformGuid = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformFrame&lt;/del&gt;.transform.Guid,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     referenceTransformGuid = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transform.bodyFrame&lt;/ins&gt;.transform.Guid,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     referenceFrameType = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformFrame&lt;/del&gt;.type,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     referenceFrameType = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transform.bodyFrame&lt;/ins&gt;.type,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     localPosition = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformFrame&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transform&lt;/del&gt;.localPosition,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     localPosition = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;state&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;position&lt;/ins&gt;.localPosition,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     localRotation = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transformFrame&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;transform&lt;/del&gt;.localRotation,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     localRotation = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;state&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;position&lt;/ins&gt;.localRotation,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     localVelocity = Vector3d.zero,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     localVelocity = Vector3d.zero,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     localAngularVelocity = Vector3d.zero&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     localAngularVelocity = Vector3d.zero&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key web117_modding:diff:1.41:old-397:rev-398:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Spacewarp&gt;Meckryl</name></author>
	</entry>
	<entry>
		<id>https://modding.kerbal.wiki/index.php?title=Custom_Launch_Locations&amp;diff=397&amp;oldid=prev</id>
		<title>Spacewarp&gt;Meckryl: Change topic to tutorials</title>
		<link rel="alternate" type="text/html" href="https://modding.kerbal.wiki/index.php?title=Custom_Launch_Locations&amp;diff=397&amp;oldid=prev"/>
		<updated>2024-01-08T00:42:24Z</updated>

		<summary type="html">&lt;p&gt;Change topic to tutorials&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:42, 8 January 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l167&quot;&gt;Line 167:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 167:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;And with this, you should be done!&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;And with this, you should be done!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Tutorials]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key web117_modding:diff:1.41:old-396:rev-397:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Spacewarp&gt;Meckryl</name></author>
	</entry>
	<entry>
		<id>https://modding.kerbal.wiki/index.php?title=Custom_Launch_Locations&amp;diff=396&amp;oldid=prev</id>
		<title>Spacewarp&gt;Meckryl: Created Page</title>
		<link rel="alternate" type="text/html" href="https://modding.kerbal.wiki/index.php?title=Custom_Launch_Locations&amp;diff=396&amp;oldid=prev"/>
		<updated>2024-01-08T00:30:04Z</updated>

		<summary type="html">&lt;p&gt;Created Page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
== Goal ==&lt;br /&gt;
In this tutorial I will show how to change the location of Launch Pad 1 to be anywhere you want&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
===== Required Mods: =====&lt;br /&gt;
&lt;br /&gt;
* SpaceWarp Template&lt;br /&gt;
* SpaceWarp&lt;br /&gt;
* Patch Manager&lt;br /&gt;
* Text Asset Dumper (technically not needed but I recommend installing this and doing the one time setup described below)&lt;br /&gt;
&lt;br /&gt;
===== Required tools: =====&lt;br /&gt;
&lt;br /&gt;
* dnSpy (or any other decompiler)&lt;br /&gt;
&lt;br /&gt;
===== Steps: =====&lt;br /&gt;
&lt;br /&gt;
# Install SpaceWarp, Patch Manager, and Text Asset Dumper.&lt;br /&gt;
# Launch KSP2.&lt;br /&gt;
# Open Settings &amp;gt; Mods, then scroll down to Patch manager and make sure &amp;quot;Always Invalidated Cache&amp;quot; is on.&lt;br /&gt;
# Go back to the title screen, and click the &amp;quot;Dump&amp;quot; button&lt;br /&gt;
# If you haven&amp;#039;t already done so, make a project for your mod using the SpaceWarp Template&lt;br /&gt;
&lt;br /&gt;
== Creating a custom launch site ==&lt;br /&gt;
Throughout this guide, I will be using Laythe as an example, just because that&amp;#039;s where I was trying to make my mod launch rockets.&lt;br /&gt;
&lt;br /&gt;
===== Creating a location =====&lt;br /&gt;
Open your project folder on your system explorer. Navigate to plugin_template/patches, and in that folder create a text file with a name that ends in .patch. In that file, put the following: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
@use &amp;quot;builtin:dictionary&amp;quot;;&lt;br /&gt;
@use &amp;quot;builtin:list&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
@patch celestial_bodies;&lt;br /&gt;
&lt;br /&gt;
:json #Laythe {&lt;br /&gt;
    data: $value:set(&amp;quot;LocalSimObjectsData&amp;quot;, [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Name&amp;quot;: &amp;quot;LaunchPad_spawn_01&amp;quot;,&lt;br /&gt;
            &amp;quot;RelativeTo&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;ReferenceFrame&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;LocalPosition&amp;quot;: {&lt;br /&gt;
                &amp;quot;x&amp;quot;: 0.0,&lt;br /&gt;
                &amp;quot;y&amp;quot;: 0.0,&lt;br /&gt;
                &amp;quot;z&amp;quot;: 0.0&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;LocalRotation&amp;quot;: {&lt;br /&gt;
                &amp;quot;x&amp;quot;: 0.0,&lt;br /&gt;
                &amp;quot;y&amp;quot;: 0.0,&lt;br /&gt;
                &amp;quot;z&amp;quot;: 0.0,&lt;br /&gt;
                &amp;quot;w&amp;quot;: 0.0&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;FixedGuid&amp;quot;: true&lt;br /&gt;
        }&lt;br /&gt;
            ]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Replace &amp;quot;Laythe&amp;quot; with whatever celestial body you want your object to appear on, and change the x, y, and z coordinates under LocalPosition to whatever local coordinates you&amp;#039;d like. An easy way to get a specific location on the surface is to land something there, save the game with your craft active, and then read the save file to see the position of your craft. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; If you want to make a custom location on Kerbin, you need to use $value:add rather than $value:set.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Patching KSP.Game.OABProvider ==&lt;br /&gt;
The OABProvider class is an interface for generating and using ObjectAssemblyBuilder objects (environments like the VAB that allow for construction). Eventually, the developers plan to implement many OABs through colonies and orbital assembly environments, and once they do this tutorial will probably be a LOT shorter. Unfortunately, at the moment the OABProvider class is hardcoded in many places to only generate one specific type of OAB: the VAB on Kerbin, with its predetermined launch sites.&lt;br /&gt;
&lt;br /&gt;
In your project, make a new class and add the following harmony patches to it:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
[HarmonyPrefix]&lt;br /&gt;
[HarmonyPatch(typeof(OABProvider), nameof(OABProvider.GetSurfaceLaunchPosition))]&lt;br /&gt;
public static bool GetSurfaceLaunchPosition(OABProvider __instance, string celestialBodyName, string launchPadName, ref Position __result)&lt;br /&gt;
{&lt;br /&gt;
    GameInstance game = GameManager.Instance.Game;&lt;br /&gt;
    CelestialBodyComponent celestialBodyComponent = game.UniverseModel.FindCelestialBodyByName(celestialBodyName);&lt;br /&gt;
    FramePositionState framePositionState;&lt;br /&gt;
    TransformModel transformModel = (TransformModel)game.UniverseModel.FindSimObjectByNameKey(launchPadName).transform;&lt;br /&gt;
    __result = new Position(celestialBodyComponent.transform.GetTransformFrame(TransformFrameType.Body), transformModel.localPosition);&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[HarmonyPrefix]&lt;br /&gt;
[HarmonyPatch(typeof(OABProvider), nameof(OABProvider.GetSurfaceLaunchLocation))]&lt;br /&gt;
public static bool GetSurfaceLaunchLocation(OABProvider __instance, string launchLocationName, ref SerializedLocation __result)&lt;br /&gt;
{&lt;br /&gt;
    string celestialBodyName = &amp;quot;Laythe&amp;quot;;&lt;br /&gt;
    SerializedLocation serializedLocation = default(SerializedLocation);&lt;br /&gt;
    serializedLocation.surfaceLocation = new SerializedSurfaceLocation?(new SerializedSurfaceLocation&lt;br /&gt;
    {&lt;br /&gt;
        parentGuid = celestialBodyName,&lt;br /&gt;
        objectName = launchLocationName&lt;br /&gt;
    });&lt;br /&gt;
    serializedLocation.LocationType = LocationType.SurfaceLocation;&lt;br /&gt;
    CelestialBodyComponent celestialBodyComponent = GameManager.Instance.Game.UniverseModel.FindCelestialBodyByName(celestialBodyName);&lt;br /&gt;
    serializedLocation.originatingSimObject = celestialBodyComponent.SimulationObject.GlobalId;&lt;br /&gt;
    serializedLocation.launchSituationUnknown = launchLocationName == &amp;quot;Dock_spawn_01&amp;quot;;&lt;br /&gt;
    __result = serializedLocation;&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;In the second method, change the value of celestialBodyName to be whatever celestial body you plan to be launching rockets from.&lt;br /&gt;
&lt;br /&gt;
These patches exist to tell the game to not only look for our launchpad on Kerbin, and in the case of the second function, to tell it to set the reference frame to be whatever world we actually put the launchpad on.&lt;br /&gt;
&lt;br /&gt;
NOTE: If you&amp;#039;ve never used harmony patches before, this is a good time to look into the basics of how they work and the basic pattern we&amp;#039;re using here to patch code copied in from the decompiler.&lt;br /&gt;
[[File:HarmonyImage.png|center|Courtesy of @evil.dana on discord]]&lt;br /&gt;
&lt;br /&gt;
===== About positions in KSP2: =====&lt;br /&gt;
Trying to store positions at a planetary (let alone interstellar) scale with a standard XYZ coordinate system would be a surefire way to encounter constant game breaking rounding issues. To get around this, the developers have created a system where everything takes place in different reference frames. If you&amp;#039;re in the SOI of a planet or moon, then your reference frame will be a coordinate system originating from that celestial body. This coordinate system rotates with the celestial body, so an object at rest on the surface doesn&amp;#039;t need to have its position updated at all.&lt;br /&gt;
&lt;br /&gt;
Basically, the main takeaway here is that whenever we set the position of something, we usually need to also tell the game what reference frame we&amp;#039;re working in.&lt;br /&gt;
&lt;br /&gt;
== Patching UniverseObserver ==&lt;br /&gt;
UniverseObserver contains a method called ApplyLaunchSiteCameraGimbalState, which is set to load specifically Kerbin when we go to launch a rocket. Just like with the methods from OABProvider, we need to patch that method and replace the hardcoded string &amp;quot;Kerbin&amp;quot; with our desired celestial body.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
if (!string.IsNullOrEmpty(text) &amp;amp;&amp;amp; game.SpaceSimulation.GetSurfaceObjectPosition(&amp;quot;Kerbin&amp;quot;, text, out framePositionState))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...becomes...&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
if (!string.IsNullOrEmpty(text) &amp;amp;&amp;amp; game.SpaceSimulation.GetSurfaceObjectPosition(&amp;quot;Laythe&amp;quot;, text, out framePositionState))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Patching SpaceSimulation ==&lt;br /&gt;
At this point, the game has completed the creation of your rocket and is attempting to spawn it into the world. The method SyncVesselToLocation is the final step where the game puts it on the launch pad and turns physics on. Sadly, the game is looking for our launchpad the wrong way, and will not find it unless we tell it to look the correct way. At this point there&amp;#039;s a LOT of stuff going on, so this patch is a bit messy. Copy the decompiled source code into a harmony patch just like we&amp;#039;ve done for all the others, make sure to put a &amp;quot;return false&amp;quot; at the very end of the method so the compiler is happy, and then look at the very end of the method. Find this block of code at the bottom:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
__instance.GetSurfaceObjectPosition(parentGuid, objectName, out simulationObjectState.position);&lt;br /&gt;
if (simulationObjectState.position.referenceTransformGuid != null)&lt;br /&gt;
{&lt;br /&gt;
    GeographicPositionState geographicPositionState;&lt;br /&gt;
    __instance.GetGeographicPosition(simulationObjectState.position.referenceTransformGuid, simulationObjectState.position, out geographicPositionState);&lt;br /&gt;
    geographicPositionState.altitudeFromRadius += (double)vesselComponent.OffsetToGround;&lt;br /&gt;
    geographicPositionState.heading = __instance.GetLaunchSiteHeading(geographicPositionState, simulationObjectState.position.localRotation);&lt;br /&gt;
    __instance.GetBodyRelativePosition(geographicPositionState, out simulationObjectState.position);&lt;br /&gt;
    RigidbodyState rigidbodyState3 = new RigidbodyState&lt;br /&gt;
    {&lt;br /&gt;
        referenceTransformGuid = simulationObjectState.position.referenceTransformGuid,&lt;br /&gt;
        referenceFrameType = simulationObjectState.position.referenceFrameType,&lt;br /&gt;
        localPosition = simulationObjectState.position.localPosition,&lt;br /&gt;
        localRotation = simulationObjectState.position.localRotation,&lt;br /&gt;
        localVelocity = Vector3d.zero,&lt;br /&gt;
        localAngularVelocity = Vector3d.zero&lt;br /&gt;
    };&lt;br /&gt;
    simulationObject.SetState(new SimulationObjectState?(simulationObjectState), __instance._universeModel);&lt;br /&gt;
    vesselComponent.SetState(vesselState, __instance._universeModel);&lt;br /&gt;
    simulationObject.FindComponent&amp;lt;RigidbodyComponent&amp;gt;().SetState(rigidbodyState3, __instance._universeModel);&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;And replace it with this:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
TransformModel transformModel = (TransformModel)GameManager.Instance.Game.UniverseModel.FindSimObjectByNameKey(objectName).transform;&lt;br /&gt;
ITransformFrame transformFrame = (ITransformFrame)transformModel.bodyFrame;&lt;br /&gt;
SimulationObjectState simulationObjectState = new SimulationObjectState&lt;br /&gt;
{&lt;br /&gt;
    position = new FramePositionState&lt;br /&gt;
    {&lt;br /&gt;
        referenceTransformGuid = transformFrame.transform.Guid,&lt;br /&gt;
        referenceFrameType = transformFrame.type,&lt;br /&gt;
        localPosition = transformFrame.transform.localPosition,&lt;br /&gt;
        localRotation = transformFrame.transform.localRotation&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
RigidbodyState rigidbodyState3 = new RigidbodyState&lt;br /&gt;
{&lt;br /&gt;
    referenceTransformGuid = transformFrame.transform.Guid,&lt;br /&gt;
    referenceFrameType = transformFrame.type,&lt;br /&gt;
    localPosition = transformFrame.transform.localPosition,&lt;br /&gt;
    localRotation = transformFrame.transform.localRotation,&lt;br /&gt;
    localVelocity = Vector3d.zero,&lt;br /&gt;
    localAngularVelocity = Vector3d.zero&lt;br /&gt;
};&lt;br /&gt;
simulationObject.SetState(new SimulationObjectState?(simulationObjectState), __instance._universeModel);&lt;br /&gt;
vesselComponent.SetState(vesselState, __instance._universeModel);&lt;br /&gt;
simulationObject.FindComponent&amp;lt;RigidbodyComponent&amp;gt;().SetState(rigidbodyState3, __instance._universeModel);&lt;br /&gt;
return false;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;And with this, you should be done!&lt;/div&gt;</summary>
		<author><name>Spacewarp&gt;Meckryl</name></author>
	</entry>
</feed>