Buttonaktion über skript konfigurieren

    • Script Fragen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Buttonaktion über skript konfigurieren

      Hallo,

      ich möchte einen Button eine Aktion zuweisen. Wenn ich im Spiel bin, ist das durch den Button "SETUP ACTION" am Block des Buttonpanel sehr einfach möglich.
      Wenn das Ganze jedoch über ein Skript konfiguriren werden soll, bin ich auf die Schnittstelle "IMyButtonPanel" angewiesen.

      Die Schnittstelle SpaceEngineers.Game.ModAPI.Ingame.IMyButtonPanel gibt nicht viel her.

      C#-Quellcode

      1. public interface IMyButtonPanel : IMyTerminalBlock, IMyCubeBlock, IMyEntity
      2. {
      3. bool AnyoneCanUse {
      4. get;
      5. set;
      6. }
      7. string GetButtonName(int index);
      8. void SetCustomButtonName(int index, string name);
      9. bool HasCustomButtonName(int index);
      10. void ClearCustomButtonName(int index);
      11. bool IsButtonAssigned(int index);
      12. }
      Alles anzeigen

      Ich habe jedoch auch noch die Schnittstelle SpaceEngineers.Game.ModAPI.IMyButtonPanel gefunden.



      C#-Quellcode

      1. public interface IMyButtonPanel : Sandbox.ModAPI.IMyTerminalBlock, VRage.Game.ModAPI.IMyCubeBlock, VRage.Game.ModAPI.Ingame.IMyCubeBlock, VRage.Game.ModAPI.Ingame.IMyEntity, VRage.ModAPI.IMyEntity, Sandbox.ModAPI.Ingame.IMyTerminalBlock, SpaceEngineers.Game.ModAPI.Ingame.IMyButtonPanel
      2. {
      3. event Action<int> ButtonPressed;
      4. }

      Hier wird ein Event definiert. Kann es sein, dass ich darauf jedoch keine Zugriff von einem Skript aus einem Programm-Block habe.
      Wenn ich hier mit folgenden Code darauf zugreife, kommt immer die Fehlermeldung:

      'IMyButtonPanel' does not contain a definition for 'ButtonPressed' and ...

      C#-Quellcode

      1. public void Main(string argument, UpdateType uT) {
      2. Runtime.UpdateFrequency = UpdateFrequency.None;
      3. IMyButtonPanel button = (IMyButtonPanel) GridTerminalSystem.GetBlockWithName("ButtonPanel 1");
      4. button.ButtonPressed += ping_lcd;
      5. }
      6. public void ping_lcd( int e) {
      7. Echo("OK - Ereignis empfangen " + e);
      8. }
      Hat sonst noch jemand eine Idee? ?(

      Hintergrund:
      Ich baue ein Fahrstuhl-skript. Jede Etage braucht einen Ruf-Knopf und der Fahrstuhl selbst braucht Bewegungsknöpfe. Diese Knöpfe soll mein Skript selbst konfigurieren, um den Benutzer meines Skritpes Arbeit zu ersparen.

      MFG Heinchen
    • Zwar kann ich dir weder sagen, wie du genau auf die Buttons zugreifsat, noch, ob ein Einstellen über die Mod- oder gar Skript-API überhaupt möglich ist - aber hier ein Auszug aus einem Save und wie die Buttons bzw. deren Funktion hinterlegt sind:

      Quellcode

      1. <MyObjectBuilder_CubeBlock xsi:type="MyObjectBuilder_ButtonPanel">
      2. <SubtypeName>ButtonPanelLarge</SubtypeName>
      3. <EntityId>97791924551304366</EntityId>
      4. <CustomName>Button Panel</CustomName>
      5. <ShowInToolbarConfig>true</ShowInToolbarConfig>
      6. <Enabled>true</Enabled>
      7. <Toolbar>
      8. <ToolbarType>Character</ToolbarType>
      9. <SelectedSlot xsi:nil="true" />
      10. <Slots>
      11. <Slot>
      12. <Index>0</Index>
      13. <Item />
      14. <Data xsi:type="MyObjectBuilder_ToolbarItemTerminalBlock">
      15. <Action>OnOff</Action>
      16. <BlockEntityId>119534641635406565</BlockEntityId>
      17. </Data>
      18. </Slot>
      19. <Slot>
      20. <Index>1</Index>
      21. <Item />
      22. <Data xsi:type="MyObjectBuilder_ToolbarItemTerminalBlock">
      23. <Action>OnOff</Action>
      24. <BlockEntityId>75595448739756262</BlockEntityId>
      25. </Data>
      26. </Slot>
      27. </Slots>
      28. </Toolbar>
      29. <CustomButtonNames>
      30. <dictionary>
      31. <item>
      32. <Key>0</Key>
      33. <Value>Antenna - Toggle block On/Off</Value>
      34. </item>
      35. <item>
      36. <Key>1</Key>
      37. <Value>Door - Toggle block On/Off</Value>
      38. </item>
      39. </dictionary>
      40. </CustomButtonNames>
      41. </MyObjectBuilder_CubeBlock>
      Alles anzeigen

      Das sollte ev. einen Hinweis darauf geben, wie die Buttons referenziert sind (offenbar als Toolbar) - hoffe,. das hilft weiter.


      Als Randnote: Sofern du nur einen Button je Stockwerk benötigst, sollte es reichen, damit jeweils den PB mit einem Paramter aufzurufen. Den dazupassenden Button in der Gridliste zu finden und den Lift entsprechend dazu auszurichten sollte um einges leichter sein, als einem Button eine Aktion aufzuzwingen.
      "He who stays in the footsteps of others cannot improve."
    • Danke, für die schnelle Antwort. Ich komme leider nicht so oft zur Weiterentwicklung meines Skriptes, daher sind meine Antworten sehr verzögert.
      Ich habe mal nur der interessehalber getestet, ob ich auf die Eigenschaft von MyButtonPanel zugreifen kann. Es kommt natürlich eine Compilefehler "The type or member "MyButtonPanel" is prohibited". Der Ausschnitt aus dem Savegame war trotzdem sehr interessant. Ist eine gute Informationsquelle, die mir noch nicht eingefallen ist.
      Die automatisch Konfiguration der Buttons gebe ich auf, dass wird nicht so einfach gehen (evtl. nur mit richtigen Mods).
      Der Benutzer muss dann pro Stockwerk die Aktion zu meinen ProgramBlock selbst definieren. Das ist auch eigentlich nicht schwierig.

      Mein Skript findet die Buttons übrigens an Hand von Tags in den Buttonnamen. Das erste und letzte Stockwerk muss manuell ausgerichtet werden. Die Stockwerke dazwischen werden berechnet. Weitere Details kann ich ja mal irgendwann, wenn ich fertig bin, in eurer Forumsrubrik "Skriptvorstellung" schreiben.

      MFG Heinchen