private static void HijackShoot() { TerminalControlHelper.EnsureTerminalControlCreated <MySmallMissileLauncher>(); Func <object, bool> False = (o) => false; foreach (ITerminalControl control in MyTerminalControlFactory.GetControls(typeof(MyUserControllableGun))) { if (control.Id == "ShootOnce") { MyTerminalControlButton <MyUserControllableGun> shootOnce = (MyTerminalControlButton <MyUserControllableGun>)control; EventSync <GuidedMissileLauncher> termControl_shootOnce = new EventSync <GuidedMissileLauncher>(shootOnce.Id, ShootOnceEvent, false); Action <MyUserControllableGun> originalAction = shootOnce.Action; shootOnce.Action = block => { if (IsGuidedMissileLauncher(block)) { termControl_shootOnce.RunEvent(block); } else { originalAction(block); } }; shootOnce.Actions[0].Action = shootOnce.Action; } else if (control.Id == "Shoot") { MyTerminalControlOnOffSwitch <MyUserControllableGun> shoot = (MyTerminalControlOnOffSwitch <MyUserControllableGun>)control; termControl_shoot = new ValueSync <bool, GuidedMissileLauncher>(shoot.Id, "value_termShoot"); var originalGetter = shoot.Getter; var originalSetter = shoot.Setter; shoot.Getter = (block) => { if (IsGuidedMissileLauncher(block)) { return(termControl_shoot.GetValue(block)); } else { return(originalGetter(block)); } }; shoot.Setter = (block, value) => { if (IsGuidedMissileLauncher(block)) { Logger.TraceLog("Set shoot: " + value); termControl_shoot.SetValue(block, value); } else { originalSetter(block, value); } }; shoot.Actions[0].Action = block => shoot.SetValue(block, !shoot.GetValue(block)); // toggle shoot.Actions[1].Action = block => shoot.SetValue(block, true); // on shoot.Actions[2].Action = block => shoot.SetValue(block, false); // off break; } } }