Facebook
From EagleEyes, 4 Months ago, written in C#.
Embed
Download Paste or View Raw
Hits: 44
  1. //                      INSTRUCTIONS:
  2. //
  3. // Receiving signal:
  4. // To receive signal, link an antenna on the same grid to this PB. No other setup is needed.
  5. //
  6. // Sending signal:
  7. // Attach PB to Toolbar with argument in the following format:
  8. //      {ElevatorID}Floor     OR     {ElevatorID}Stop
  9. // "ElevatorID" is the long number found in Custom Data in Control Panel of the elevator you want to control,
  10. // "Floor" is the number of the floor where you want to send the elevator (if Floor is 0 it will send a STOP signal),
  11. // "Stop" sends a signal to STOP the elevator regardless if it's reached a floor or not (you can also use 0).
  12. //
  13. // When compiling this script you will get a warning that the method for sending messages I am using is Obsolete.
  14. // The new method that Keen want's me to use is a bit confusing and I haven't quite figured it out yet. I will update the script
  15. // when I understand how to use the new method but until then, please ignore the warning.
  16. //
  17. //                  END OF INSTRUCTIONS
  18.  
  19.  
  20. //                      OPTIONS:
  21. //
  22. // If you want to control only one elevator with this PB and make it easy for PB arguments,
  23. // replace the '0' below with the ElevatorID (the long number in the Custom Data of the elevator you want to control).
  24. // Doing that will allow you to use only the floor number as an argument.
  25.  
  26. private long OnlyOneElevatorID = 0;
  27. IMyBroadcastListener _myBroadcastListener;
  28. string _broadCastTag = "cargo_elevator";
  29.  
  30. //                  END OF OPTIONS
  31.  
  32. //  Don't touch anything below this line!
  33.  
  34. public Program()
  35. {
  36.     Echo("Creating listeners");
  37.     _myBroadcastListener=IGC.RegisterBroadcastListener(_broadCastTag);
  38.     _myBroadcastListener.SetMessageCallback(_broadCastTag);
  39. }
  40.  
  41. private IMyRadioAntenna LastAntenna = null;
  42. private IMyRadioAntenna Antenna()
  43. {
  44.     if (LastAntenna != null && LastAntenna.IsWorking && LastAntenna.IsBroadcasting) return LastAntenna;
  45.     else
  46.     {
  47.         IMyRadioAntenna BestAntenna = null;
  48.         float maxRange = 0.0f;
  49.         List<IMyTerminalBlock> radioAntennas = new List<IMyTerminalBlock>();
  50.         GridTerminalSystem.GetBlocksOfType<IMyRadioAntenna>(radioAntennas);
  51.         foreach (IMyRadioAntenna antenna in radioAntennas)
  52.         {
  53.             if (antenna.Radius > maxRange && antenna.IsWorking && antenna.IsBroadcasting)
  54.             {
  55.                 BestAntenna = antenna;
  56.                 maxRange = antenna.Radius;
  57.             }
  58.         }
  59.         LastAntenna = BestAntenna;
  60.         if (BestAntenna == null) Echo("No Active antennas found on this grid.");
  61.         return BestAntenna;
  62.     }
  63. }
  64.  
  65. public void Main(string argument, UpdateType updateSource)
  66. {
  67.     try
  68.     {
  69.         if (
  70.         (updateSource & (UpdateType.Trigger | UpdateType.Terminal)) > 0
  71.         || (updateSource & (UpdateType.Mod)) > 0
  72.         || (updateSource & (UpdateType.Script)) > 0
  73.         )
  74.                 {
  75.                         if (argument != "")
  76.                         {
  77.                                 if (Antenna() == null) return;
  78.                                 string message = "VCZ:";
  79.                                 if (OnlyOneElevatorID != 0) message += "{" + OnlyOneElevatorID + "}" + argument;
  80.                                 else message += argument;
  81.                                 Echo("Broadcasting: " + message);
  82.                                 IGC.SendBroadcastMessage(_broadCastTag, message);
  83.                         }
  84.                 }
  85.                
  86.                 if ((updateSource & UpdateType.IGC) > 0)
  87.                 { // script was run because of incoming IGC message
  88.                         if (_myBroadcastListener.HasPendingMessage)
  89.                         {
  90.                                 var myIGCMessage = _myBroadcastListener.AcceptMessage();
  91.                                 if (myIGCMessage.Tag == _broadCastTag)
  92.                                 { // This is our tag
  93.                                         if (myIGCMessage.Data is string)
  94.                                         {
  95.                
  96.                                                 var incomingmessage = myIGCMessage.Data.ToString();
  97.                                                 if (String.IsNullOrWhiteSpace(argument) && String.IsNullOrWhiteSpace(incomingmessage))
  98.                                                 {
  99.                                                         Echo("Cannot send or receive an empty message.");
  100.                                                         return;
  101.                                                 }
  102.                                                 if (incomingmessage.StartsWith("VCZ:")) // Receiving a broadcast message
  103.                                                 {
  104.                                                         Echo("Received message: " + incomingmessage);
  105.                                                         long ElevatorID = GetID(incomingmessage);
  106.                                                         if (ElevatorID != 0)
  107.                                                         {
  108.                                                                 if (incomingmessage.ToLower().Contains("stop")) ApplyActionToElevator(ElevatorID, 0);
  109.                                                                 else ApplyActionToElevator(ElevatorID, GetFloor(incomingmessage));
  110.                                                         }
  111.                                                         else Echo("Could not get ElevatorID! (Incorrect message format?)");
  112.                                                 }
  113.                                         }
  114.                                 }
  115.                         }
  116.                 }
  117.     }
  118.     catch (Exception e)
  119.     {
  120.         Echo("Error in Main: " + e.StackTrace);
  121.     }
  122. }
  123.  
  124. private void ApplyActionToElevator(long ElevatorID, int floor)
  125. {
  126.     var Elevator = GridTerminalSystem.GetBlockWithId(ElevatorID);
  127.     if (Elevator != null && Elevator is IMyExtendedPistonBase)
  128.     {
  129.         if (floor == 0) Elevator.ApplyAction("Stop");
  130.         else Elevator.ApplyAction("SendToFloor" + floor);
  131.     }
  132.     else Echo("No block found with ID " + ElevatorID + " or it's not an elevator block.");
  133. }
  134.  
  135. private long GetID(string argument)
  136. {
  137.     long result = 0;
  138.     Int64.TryParse(argument.Substring(argument.IndexOf("{") + 1, argument.IndexOf("}") - (argument.IndexOf("{") + 1)), out result);
  139.     return result;
  140. }
  141.  
  142. private int GetFloor(string argument)
  143. {
  144.     int result = 0;
  145.     Int32.TryParse(argument.Substring(argument.IndexOf("}") + 1, 1), out result);
  146.     return result;
  147. }