Skip to content

Instantly share code, notes, and snippets.

@gotmachine
gotmachine / UnityObjectNullExtensions.cs
Created May 20, 2022 11:53
Extension methods for easier, faster more clear null and destroyed state checking for UnityEngine.Object
using System;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
#pragma warning disable IDE0041 // Use 'is null' check
namespace UnityObjectNullExtensions
{
public static class UnityObjectNullExtensionsSafe
@gotmachine
gotmachine / ShaderReplacer.cs
Created June 10, 2022 11:48
Harmony - Replace a method call in KSP and all loaded plugins
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Reflection.Emit;
using HarmonyLib;
using Mono.Cecil;
using Mono.Cecil.Cil;
using Mono.Cecil.Rocks;
using MonoMod.Utils;
@gotmachine
gotmachine / KSPPAWRefresh.cs
Created March 2, 2023 13:12
KSP PAW refresh
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
namespace Utils
{
public static class PAWUtils
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
@gotmachine
gotmachine / VectrosityCameraHandler.cs
Last active April 25, 2023 09:22
Enable Vectrosity in the KSP flight scene
using System.Collections;
using UnityEngine;
using Vectrosity;
using Camera = UnityEngine.Camera;
namespace VectrosityCameraHandler
{
[KSPAddon(KSPAddon.Startup.AllGameScenes, false)]
[DefaultExecutionOrder(9000)]
public class VectrosityCameraHandler : MonoBehaviour
@gotmachine
gotmachine / SerializablePartModule.cs
Created March 18, 2024 21:47
Custom serialization for partmodules
[AttributeUsage(AttributeTargets.Field)]
public class PartModuleSerializeAttribute : Attribute { }
public class SerializablePartModule : PartModule, ISerializationCallbackReceiver
{
private static readonly Dictionary<Type, SerializablePartModuleInfo> accessCache = new Dictionary<Type, SerializablePartModuleInfo>();
private static readonly BinaryFormatter bf = new BinaryFormatter();
[SerializeField] private byte[] serializedData;
[SerializeField] private int[] offsets;
@gotmachine
gotmachine / KSPDynamicPAWItem.cs
Created May 19, 2024 20:50
KSP Dynamic PAW Items
public class DynamicPAWModule : PartModule
{
private DynamicPAWToggle mainToggle;
private DynamicPAWToggle auxToggle;
private BasePAWGroup group;
public override void OnStart(StartState state)
{
group = new BasePAWGroup(nameof(DynamicPAWModule), "My Dynamic Module", false);
mainToggle = new DynamicPAWToggle(this, UI_Scene.All, group);
@gotmachine
gotmachine / FastFloatCurve.cs
Last active September 16, 2024 13:42
C# cubic hermite spline implementation similar to an Unity AnimationCurve, but faster
/// <summary>
/// A collection of keys mapping times to values, interpolated between keys by a cubic Hermite spline. <para/>
/// The implementation produce identical results as a UnityEngine.AnimationCurve, but calling Evaluate() is at least twice faster. <para/>
/// However, it doesn't support keys in/out weights, and behavior is always identical to WrapMode.ClampForever.
/// </summary>
public class FastFloatCurve : IEnumerable<FastFloatCurve.Key>, IConfigNode
{
/// <summary>
/// Define how a key tangent will be adjusted.
/// </summary>