private static void AddPropertyAndSyncEntityId(string id, out ValueSync <long, AutopilotTerminal> sync, string fieldName) { MyTerminalControlProperty <MyShipController, string> property = new MyTerminalControlProperty <MyShipController, string>(id); FieldInfo field = typeof(AutopilotTerminal).GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); sync = new ValueSync <long, AutopilotTerminal>(id, GenerateGetter <long>(field), GenerateSetter <long>(field), false); ValueSync <long, AutopilotTerminal> syncRef = sync; property.Getter = (block) => { AutopilotTerminal autopilot; if (!Registrar.TryGetValue(block, out autopilot)) { if (!Globals.WorldClosed) { Logger.AlwaysLog("failed lookup of block: " + block.getBestName(), Logger.severity.WARNING); } return(default(string)); } long entityId = syncRef.GetValue(autopilot); IMyEntity entity; if (!MyAPIGateway.Entities.TryGetEntityById(entityId, out entity)) { Logger.DebugLog("Failed to get entity for " + entityId, Logger.severity.WARNING); return("Unknown Entity"); } return(entity.GetNameForDisplay(autopilot.m_block.OwnerId)); }; AddControl(property, false); }
private void AddOffsetSlider(string id, string title, string toolTip, int dim) { MyTerminalControlSlider <MySpaceProjector> control = new MyTerminalControlSlider <MySpaceProjector>(id, MyStringId.GetOrCompute(title), MyStringId.GetOrCompute(toolTip)); ValueSync <float, Projector> tvs = new ValueSync <float, Projector>(control, (proj) => proj.m_offset_ev.GetDim(dim), (proj, value) => proj.m_offset_ev.SetDim(dim, value)); control.DefaultValue = dim == 1 ? 2.5f : 0f; control.Normalizer = (block, value) => Normalizer(MinOffset, MaxOffset, block, value); control.Denormalizer = (block, value) => Denormalizer(MinOffset, MaxOffset, block, value); control.Writer = (block, sb) => WriterMetres(tvs.GetValue(block), sb); TermControls_Offset.Add(control); }
private static void AddPropertyAndSync <TSync, TYield>(string id, out ValueSync <TSync, AutopilotTerminal> sync, string fieldName) where TSync : TYield { MyTerminalControlProperty <MyShipController, TYield> property = new MyTerminalControlProperty <MyShipController, TYield>(id); FieldInfo field = typeof(AutopilotTerminal).GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); sync = new ValueSync <TSync, AutopilotTerminal>(id, GenerateGetter <TSync>(field), GenerateSetter <TSync>(field), false); ValueSync <TSync, AutopilotTerminal> syncRef = sync; property.Getter = (block) => syncRef.GetValue(block); AddControl(property, false); }
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; } } }
public StaticVariables() { Logger.DebugLog("entered", Logger.severity.TRACE); MyAPIGateway.Session.DamageSystem.RegisterAfterDamageHandler((int)MyDamageSystemPriority.Low, AfterDamageHandler); TerminalControlHelper.EnsureTerminalControlCreated <MySpaceProjector>(); TermControls.Add(new MyTerminalControlSeparator <MySpaceProjector>()); AddCheckbox("HoloDisplay", "Holographic Display", "Holographically display this ship and nearby detected ships", Option.OnOff); AddCheckbox("HD_This_Ship", "This Ship", "Holographically display this ship", Option.ThisShip); AddCheckbox("HD_Owner", "Owned Ships", "Holographically display ships owned by this block's owner", Option.Owner); AddCheckbox("HD_Faction", "Faction Ships", "Holographically display faction owned ships", Option.Faction); AddCheckbox("HD_Neutral", "Neutral Ships", "Holographically display neutral ships", Option.Neutral); AddCheckbox("HD_Enemy", "Enemy Ships", "Holographically display enemy ships", Option.Enemy); MyTerminalControlSlider <MySpaceProjector> slider = new MyTerminalControlSlider <MySpaceProjector>("HD_RangeDetection", MyStringId.GetOrCompute("Detection Range"), MyStringId.GetOrCompute("Maximum distance of detected entity")); ValueSync <float, Projector> tvsRange = new ValueSync <float, Projector>(slider, (proj) => proj.m_rangeDetection, (proj, value) => proj.m_rangeDetection = value); slider.DefaultValue = DefaultRangeDetection; slider.Normalizer = (block, value) => Normalizer(MinRangeDetection, MaxRangeDetection, block, value); slider.Denormalizer = (block, value) => Denormalizer(MinRangeDetection, MaxRangeDetection, block, value); slider.Writer = (block, sb) => WriterMetres(tvsRange.GetValue(block), sb); TermControls.Add(slider); slider = new MyTerminalControlSlider <MySpaceProjector>("HD_RadiusHolo", MyStringId.GetOrCompute("Hologram Radius"), MyStringId.GetOrCompute("Maximum radius of hologram")); ValueSync <float, Projector> tvsRadius = new ValueSync <float, Projector>(slider, (proj) => proj.m_radiusHolo, (proj, value) => proj.m_radiusHolo = value); slider.DefaultValue = DefaultRadiusHolo; slider.Normalizer = (block, value) => Normalizer(MinRadiusHolo, MaxRadiusHolo, block, value); slider.Denormalizer = (block, value) => Denormalizer(MinRadiusHolo, MaxRadiusHolo, block, value); slider.Writer = (block, sb) => WriterMetres(tvsRadius.GetValue(block), sb); TermControls.Add(slider); slider = new MyTerminalControlSlider <MySpaceProjector>("HD_EntitySizeScale", MyStringId.GetOrCompute("Entity Size Scale"), MyStringId.GetOrCompute("Larger value causes entities to appear larger")); ValueSync <float, Projector> tvsScale = new ValueSync <float, Projector>(slider, (proj) => proj.m_sizeDistScale, (proj, value) => proj.m_sizeDistScale = value); slider.DefaultValue = DefaultSizeScale; slider.Normalizer = (block, value) => Normalizer(MinSizeScale, MaxSizeScale, block, value); slider.Denormalizer = (block, value) => Denormalizer(MinSizeScale, MaxSizeScale, block, value); slider.Writer = (block, sb) => sb.Append(tvsScale.GetValue(block)); TermControls.Add(slider); TermControls.Add(new MyTerminalControlSeparator <MySpaceProjector>()); MyTerminalControlCheckbox <MySpaceProjector> control = new MyTerminalControlCheckbox <MySpaceProjector>("HD_MouseControls", MyStringId.GetOrCompute("Mouse Controls"), MyStringId.GetOrCompute("Allow manipulation of hologram with mouse. User-specific setting.")); IMyTerminalValueControl <bool> valueControlBool = control; valueControlBool.Getter = block => MouseControls; valueControlBool.Setter = (block, value) => MouseControls = value; TermControls.Add(control); control = new MyTerminalControlCheckbox <MySpaceProjector>("HD_ShowBoundary", MyStringId.GetOrCompute("Show Boundary"), MyStringId.GetOrCompute("Show the boundaries of the hologram. User-specific setting.")); valueControlBool = control; valueControlBool.Getter = block => ShowBoundary; valueControlBool.Setter = (block, value) => ShowBoundary = value; TermControls.Add(control); control = new MyTerminalControlCheckbox <MySpaceProjector>("HD_ShowOffset", MyStringId.GetOrCompute("Show Offset Controls"), MyStringId.GetOrCompute("Display controls that can be used to adjust the position of the hologram. User-specific setting.")); control.Getter = block => ShowOffset; control.Setter = (block, value) => { ShowOffset = value; block.RebuildControls(); }; TermControls.Add(control); AddOffsetSlider("HD_OffsetX", "Right/Left Offset", "+ve moves hologram to the right, -ve moves hologram to the left", 0); AddOffsetSlider("HD_OffsetY", "Up/Down Offset", "+ve moves hologram up, -ve moves hologram down", 1); AddOffsetSlider("HD_OffsetZ", "Back/Fore Offset", "+ve moves hologram back, -ve moves hologram forward", 2); TermControls_Offset.Add(new MyTerminalControlSeparator <MySpaceProjector>()); AddCheckbox("HD_IntegrityColour", "Colour by Integrity", "Colour blocks according to their integrities", Option.IntegrityColours); IMyTerminalControlColor colour = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlColor, IMyProjector>("HD_FullIntegriyColour"); colour.Title = MyStringId.GetOrCompute("Whole"); colour.Tooltip = MyStringId.GetOrCompute("Colour when block has full integrity. User-specific setting."); colour.Getter = (block) => IntegrityFull; colour.Setter = (block, value) => IntegrityFull = value; TermControls_Colours.Add(colour); colour = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlColor, IMyProjector>("HD_CriticalIntegriyColour"); colour.Title = MyStringId.GetOrCompute("Func."); colour.Tooltip = MyStringId.GetOrCompute("Colour when block is just above critical integrity. User-specific setting."); colour.Getter = (block) => IntegrityFunctional; colour.Setter = (block, value) => IntegrityFunctional = value; TermControls_Colours.Add(colour); colour = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlColor, IMyProjector>("HD_CriticalIntegriyColour"); colour.Title = MyStringId.GetOrCompute("Broken"); colour.Tooltip = MyStringId.GetOrCompute("Colour when block is just below critical integrity. User-specific setting."); colour.Getter = (block) => IntegrityDamaged; colour.Setter = (block, value) => IntegrityDamaged = value; TermControls_Colours.Add(colour); colour = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlColor, IMyProjector>("HD_ZeroIntegriyColour"); colour.Title = MyStringId.GetOrCompute("Razed"); colour.Tooltip = MyStringId.GetOrCompute("Colour when block has zero integrity. User-specific setting."); colour.Getter = (block) => IntegrityZero; colour.Setter = (block, value) => IntegrityZero = value; TermControls_Colours.Add(colour); new ValueSync <long, Projector>("CentreEntity", (script) => script.m_centreEntityId, (script, value) => { script.m_centreEntityId = value; script.m_centreEntityId_AfterValueChanged(); }); }