Difference between revisions of "Programming Guide"

From Space Engineers Wiki
Jump to: navigation, search
(Added info from http://steamcommunity.com/sharedfiles/filedetails/?id=360966557 to match the /In-game_coding/ru page. Still needs formatting applied to rest of article.)
 
(Compiling)
(17 intermediate revisions by 6 users not shown)
Line 1: Line 1:
==Known Limitations==
+
== Introduction ==
Below is a list of the known limitations that we are aware of and the possible workarounds for each of them:
 
  
===Foreach not working at 64- bit===
 
''Problem'':
 
Currently using of foreach loop inside script will cause “bad program exception” at some configurations and prevent script from running. We are working of fixing this issue.
 
  
''Workaround'':
+
=== Editor access ===
All our interfaces used in in-game scripting are using lists as collections. Please use For loop for iteration across these lists
+
Only one player can edit the same script at time. If someone else has an editor for the current block open and someone else tries to open that block's editor, a notification will be shown that the editor is already open.
  
===Lambda functions not working===
+
=== Main method ===
''Problem'':
+
When the editor is opened for first time, void Main() method is present inside the code editor.
Currently lambda functions are not supported, if you use them in script, exception will be thrown and script will not run.
+
This is entry point that will be called when executing script. If Main method is removed / renamed, the script will not run and you will be notified in the programmable block details area.
 +
Custom methods/variables can be defined and used, but only the Main method will be called without reference.
  
''Workaround'':
+
=== Variables life ===
Please use method instead of lambda function if possible.
+
There are two types of variables for scripting:
 +
Local (inside the methods) – these variables will keep their value only during execution of a method.
 +
Value will be “lost” when the method ends.
 +
Global (outside the methods) - these variables will keep their values during the lifetime of script. E.g.
 +
If the variable needs to keep value between separate runs of program, it needs to be defined outside the methods.
 +
After pressing “Remember & Exit” or “Remember” buttons, the previous script will be overwritten and all Global variables will be lost.
  
===User defined static variables and methods not working===
+
=== Compiling ===
''Problem'':
+
When the “Check code” button is pressed, the code will be compiled and the result of the compilation will be shown.
Currently using user defined static members or methods will cause script to throw exception and the script will not run.
+
There are two steps of the compilation process:
 +
First the code inside editor is compiled by c# compiler for language errors.
 +
If there are any errors during compilation the following dialog is shown:
 +
It this case “aaa” string is placed before Main method. This is the wrong language construction and the compilation failed.
 +
In the error dialog the Line number error and description of the error is shown.
  
''Workaround'':
+
After compilation, the code is checked for usage of disallowed namespaces and types. In case that check fails,
Please don’t define static methods or variables.
+
the following dialog is shown:
 
 
===User defined variables are not saved===
 
''Problem'':
 
None of user defined variables inside the script is saved, therefore after loading the game they are reset into their default values.
 
 
 
Workaround:
 
None.
 
 
 
==GUI Overview==
 
===Programmable block===
 
 
 
The programmable block terminal panel screen currently contains two buttons:
 
 
 
''Edit'' – it will open the editor for editing scripts and the ability to save/load scripts from and to disk.
 
Also, you can upload your scripts to workshop and download subscribed scripts.
 
 
 
''Run'' – it will run the script that was remembered in editor. It will run the script only once. However this button is terminal action, so you can attach it to sensor, timer block, and button or add it to toolbar.
 
 
 
[[File:Steamworkshop webupload previewfile 360966557 preview.jpg|500px]]
 
 
 
''Details section'' – In this area the script exception will be shown (if any will occur)
 
 
 
===Editor===
 
 
 
[[File:Steamworkshop webupload previewfile 360966557 preview (1).jpg|500px]]
 
 
 
Code editor contains these buttons:
 
''Help'' – it will open the help guide inside the game.
 
''Check Code'' – it will check the code for code mistakes and also check if used code isn’t forbidden.
 
''Remember & Exit'' – it will save the code for execution, close editor screen and returns to terminal panel.
 
''Remember code'' – it will save code for execution and leave editor open.
 
''Browse Workshop'' – it will open a window for script management, you can save/load scripts from disk , upload scripts to workshop and download subscribed scripts.
 
''Line counter'' – it shows current line number and total number of lines in code
 
 
 
===Browse Workshop===
 
 
 
[[File:Browse workshop.jpg|200px]]
 
 
 
This screen is similar to blueprint screen and contains these buttons :
 
''Ok'' – it will load the selected script into the editor and close the screen
 
''Cancel'' – it will close the screen (no changes to code in editor)
 
''Details'' – it will open the "details" screen, where you can see description of script
 
''Rename (only for local scripts)'' – it will rename the selected script, if you try to rename to existing script, the game will ask you if you want to overwrite the existing script.
 
''Delete (only for local scripts)'' – it will ask you if you really want to delete the script, after the confirmation script will be deleted.
 
''Create from editor''– it will create new script with default name Script_XX it starts with 0 and if the script with the selected name already exists, it will increment the value. E.g. first there will be Script_0 then Script_1 etc…
 
''Replace from editor (only for local scripts)'' – it will replace (after user confirmation) the selected script with script from the editor.
 
''Refresh Scripts'' – will reload the local and subscribed script list
 
 
 
===Details (local script)===
 
 
 
[[File:Details (local script).jpg|500px]]
 
 
 
This screen will show up when you press details for local script and contains the following buttons:
 
''Rename'' – it will rename the selected script, if you try to rename to existing script, the game will ask if you want to overwrite the existing script.
 
''Delete'' – it will ask you if you want to delete the script, after confirmation script will be deleted.
 
''Publish'' – it will publish the script into workshop and show the workshop page with the script.
 
''Browse Workshop'' – it will open the workshop screen to browse and subscribe scripts.
 
''Close'' – it will close the screen
 
 
 
===Details (workshop script)===
 
 
 
This screen will show up when you press details for script from workshop and it contains these buttons:
 
Open in Workshop – it will open the current script workshop page.
 
Close – it will close the screen
 
Programming Guide
 
Introduction
 
 
 
Editor access
 
Only one player can edit same script at time. If someone else have open editor for current block and someone else will try to open editor, notification will be shown that editor is already open.
 
 
 
Main method
 
When editor is opened for first time, void Main() method is present inside code editor.
 
This is entry point that will be called when executing script. If Main method is removed / renamed, script will not run and you will be notified in programmable block details area.
 
Custom methods/variables can be defined and used, but only Main method will be called by script.
 
 
 
Variables life
 
There are two types of variables for script:
 
Local (inside the methods) – these variables will keep theirs value only during execution of method.
 
Value will be “lost” when method ends.
 
Global (outside the methods) - these variables will keep theirs values during lifetime of script. E.g.
 
If variable needs to keep value between separate runs of program ,it needs to be defined outside the methods.
 
After pressing “Remember&Exit” or “Remember” buttons, previous script will be overwritten and all Global variables will be lost.
 
 
 
Compiling
 
When “Check code” button is pressed, code will be compiled and result of compilation will be shown.
 
There are two steps of compilation process:
 
First code inside editor is compiled by c# compiler for language errors.
 
If there is any error during compilation following dialog is shown:
 
It this case “aaa” string is placed before Main method. This is wrong language construction and compilation failed.
 
In error dialog Line number error and description of the error is shown.
 
 
 
After compilation, code is check for usage of not allowed namespaces and types. In case that check fails,
 
Following dialog is shown:
 
 
In this case System.IO.Directory was used to delete some directory. This is forbidden and error is shown that “Not allowed type was used in script”.
 
In this case System.IO.Directory was used to delete some directory. This is forbidden and error is shown that “Not allowed type was used in script”.
  
If compilation and check passes following dialog is shown:
+
If compilation and checks pass, a dialog is shown, confirming the checks passed, and the code is saved.
This means that code doesn’t contain any language errors or not allowed methods.
 
  
Script execution
+
=== Script execution ===
 
When “Run” button is pressed or “Run” is assigned as terminal action, script is executed. Currently “Run” needs to be called manually e.g. user need to click on “Run” button or attach it as terminal action.
 
When “Run” button is pressed or “Run” is assigned as terminal action, script is executed. Currently “Run” needs to be called manually e.g. user need to click on “Run” button or attach it as terminal action.
 
Script is executed only on server even if it’s triggered from client. If there is any exception during script execution, all clients will be notified in programmable block details area about failure.
 
Script is executed only on server even if it’s triggered from client. If there is any exception during script execution, all clients will be notified in programmable block details area about failure.
 
In case of exception during script execution, script will not run again unless User opens editor and change script.
 
In case of exception during script execution, script will not run again unless User opens editor and change script.
  
Counting of instructions
+
=== Counting of instructions ===
 
Every time script is executed, every instruction of script is counted. If script executes more instruction than limit, execution is stopped and user is notified that script is too complex for execution. This prevents scripts to “freeze” game.
 
Every time script is executed, every instruction of script is counted. If script executes more instruction than limit, execution is stopped and user is notified that script is too complex for execution. This prevents scripts to “freeze” game.
  
Available interfaces
 
  
Possible actions
 
Currently only terminal actions can be triggered inside scripts. User can access terminal system for grid on which programmable block is located and trigger any terminal action on any block at grid.
 
  
GridTerminalSystem variable
+
== Available interfaces ==
Currently only following “built-in” variable that user can use: GridTerminalSystem. This is entry point of entire grid terminal system.
 
It has following methods available:
 
List<IMyTerminalBlock> Blocks{get;}
 
List<IMyBlockGroup> BlockGroups { get; }
 
void GetBlocksOfType<T>(List<IMyTerminalBlock> blocks, Func<IMyTerminalBlock, bool> collect = null);
 
void SearchBlocksOfName(string name,List<IMyTerminalBlock> blocks, Func<IMyTerminalBlock, bool> collect = null);
 
IMyTerminalBlock GetBlockWithName(string name);
 
With these methods all terminal blocks of grid can be collected.
 
  
Blocks property will get all block of grid terminal, this method internally allocates new memory.
+
=== Possible Actions ===
BlockGroups will get all groups of grid terminal, this method internally allocates new memory
+
Currently only terminal actions can be triggered inside scripts. User can access terminal system for grid on which programmable block is located and trigger any terminal action on any block at grid.
GetBlocksOfType will get all blocks of given type.
+
:* [[Programming_Guide/API_List|API List]]
SearchBlocksOfName method will fulltext search between all blocks and returns block that contains searched string , search is case insensitive.
 
GetBlockWithName method will get first block with exact name as provided , search is case sensitive.
 
 
 
Func<IMyTerminalBlock, bool> collect method can be used for defining search condition within search. E.g. Collect method for IMyRadioAntenna can define search function to search only for turned on antennas or antennas with specific range.
 
 
 
IMyCubeBlock
 
IMyCubeBlock is base class for every terminal block. It has following Properties and methods:
 
bool IsBeingHacked { get; }
 
bool IsFunctional { get; }
 
bool IsWorking { get; }
 
VRageMath.Vector3I Position { get; }
 
 
 
IsFunctional property tells if current block is constructed to the level it can operate
 
IsWorking property tells if current block is powered
 
 
IMyTerminalBlock
 
IMyTerminalBlock is base class for every terminal block, all of the block will have following properties and methods:
 
 
 
string CustomName
 
string CustomNameWithFaction
 
string DetailedInfo
 
bool HasLocalPlayerAccess()
 
bool HasPlayerAccess(long playerId)
 
void RequestShowOnHUD(bool enable)
 
void SetCustomName(string text)
 
void SetCustomName(StringBuilder text)
 
bool ShowOnHUD
 
void GetActions(List<Sandbox.ModAPI.Interfaces.ITerminalAction> resultList, Func<Sandbox.ModAPI.Interfaces.ITerminalAction, bool> collect = null);
 
void SearchActionsOfName(string name,List<Sandbox.ModAPI.Interfaces.ITerminalAction> resultList, Func<Sandbox.ModAPI.Interfaces.ITerminalAction, bool> collect = null);
 
Sandbox.ModAPI.Interfaces.ITerminalAction GetActionWithName(string name);
 
 
 
GetActions method will get all action available for current block.  
 
SearchActionsOfName method will fulltext search between all blocks actions and returns actions that contains searched string e.g. if block has actions : OnOff ,OnOff_On ,OnOff_Off
 
 
 
SearchActionsOfName with “OnOff” returns all actions SearchActionsOfName with _On will return only “OnOff_On”, searching with “On” will return all actions, search is case insensitive.
 
 
 
GetActionWithName method will get first action with exact name as provided , search is case sensitive.
 
  
ITerminalAction
+
=== Block Classes (Action List) ===
ITerminal action is representation of concrete action that can be triggered. It has following properties and methods:
+
:* [[Programming_Guide/Action_List|Block Action List]]
string Id { get; }
 
StringBuilder Name { get; }
 
void Apply(Sandbox.ModAPI.Ingame.IMyCubeBlock block);
 
  
Id is Id of action e.g. OnOff, OnOff_On
+
=== Same block class for different SubTypeID ===
Name is name of the action shown in UI e.g. Toggle block On/Off ,Toggle block On
+
Some blocks have same parent (e.g. <TypeId> in cubeblocks.sbc) and differs only by subtype (e.g. <SubtypeId>). This means there is no distinction between these block in code. <br />
Apply will apply action for given block (you need to provide block from which you took actions)
+
Example of these blocks is the Cargo Container: there are 3 types of cargo containers in the game: small, medium and large. These three types differ only by subtype and Type is same for them e.g. large cargo container id is: <br />
 
+
<Id><br />
IMyFunctionalBlock
+
<TypeId>CargoContainer</TypeId><br />
IMyFunctionalBlock is base class for every block that can be turned on or off, it’s derived from IMyTerminal block e.g. every Functional block is Terminal block but not all terminal blocks can be turned on or off.
+
<SubtypeId>LargeBlockLargeContainer</SubtypeId><br />
It has one Property:
+
</Id><br />
bool Enabled
+
Medium is:<br />
This property indicates if block is turned on or off by user.
+
<Id><br />
Terminal block and action name list - 1/3
+
<TypeId>CargoContainer</TypeId><br />
Disclaimer
+
<SubtypeId>SmallBlockMediumContainer</SubtypeId><br />
All terminal blocks have the following properties:
+
</Id><br />
Interface name: this name is the name of the block in code, it can differ from the name as displayed in the building screen. E.g. Antenna interface name is IMyRadioAntenna - you need to use this interface if you want to get all antennas.
+
And small is:<br />
 
+
<Id><br />
Parent: this is parent of the block (all blocks have IMyTerminalBlock as parent), this can be used for getting type of blocks instead of concrete block type. E.g. if you want to get all lights in grid you will use IMyLightingBlock, if you want only interior light you can use IMyInteriorLight.
+
<TypeId>CargoContainer</TypeId><br />
 
+
<SubtypeId>LargeBlockSmallContainer</SubtypeId><br />
Field: this is read only field available for block e.g. for IMyBeacon you can get Radius property. Based on this property you can increase/decrease radius of beacon.
+
</Id><br />
 
 
Actions: these are all available actions for block with their names in game, so if you want to increase broadcast radius for antenna, you need to execute DecreaseRadius action for block.
 
 
 
Same block class for different SubTypeID
 
Some blocks have same parent (e.g. <TypeId> in cubeblocks.sbc) and differs only by subtype (e.g. <SubtypeId>). This means there is no distinction between these block in code.  
 
Example of these blocks is the Cargo Container: there are 3 types of cargo containers in the game: small, medium and large. These three types differ only by subtype and Type is same for them e.g. large cargo container id is:  
 
<Id>
 
<TypeId>CargoContainer</TypeId>
 
<SubtypeId>LargeBlockLargeContainer</SubtypeId>
 
</Id>
 
Medium is:
 
<Id>
 
<TypeId>CargoContainer</TypeId>
 
<SubtypeId>SmallBlockMediumContainer</SubtypeId>
 
</Id>
 
And small is:
 
<Id>
 
<TypeId>CargoContainer</TypeId>
 
<SubtypeId>LargeBlockSmallContainer</SubtypeId>
 
</Id>
 
  
 
In this case there is only one class IMyCargoContainer for all types of cargo containers.
 
In this case there is only one class IMyCargoContainer for all types of cargo containers.
  
Antenna
+
==Whitelist==
Interface name: IMyRadioAntenna
+
The types and classes allowed in scripts are restricted. Refer to the [[Scripting Whitelist]] to see what you are allowed to use.
Parent: IMyFunctionalBlock
 
Fields: float Radius
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseRadius -> Increase Broadcast radius
 
DecreaseRadius -> Decrease Broadcast radius
 
 
 
Arc furnace
 
Interface name: IMyRefinery
 
Parent: IMyProductionBlock
 
Parent: IMyFunctionalBlock
 
Fields: bool UseConveyorSystem
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Artificial Mass
 
Interface name: IMyVirtualMass
 
Parent: IMyFunctionalBlock
 
Fields: None
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
 
 
Assembler
 
Interface name: IMyAssembler
 
Parent: IMyProductionBlock
 
Parent: IMyFunctionalBlock
 
Fields: bool UseConveyorSystem
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Battery
 
Interface name: IMyBatteryBlock
 
Parent: IMyFunctionalBlock
 
Fields: bool HasCapacityRemaining
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Recharge -> Recharge On/Off
 
 
 
Beacon
 
Interface name: IMyBeacon
 
Parent: IMyFunctionalBlock
 
Fields: float Radius
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseRadius -> Increase Broadcast radius
 
DecreaseRadius -> Decrease Broadcast radius
 
 
 
Button Panel
 
Interface name: IMyButtonPanel
 
Fields: bool AnyoneCanUse
 
Actions:
 
AnyoneCanUse -> Anyone Can Use On/Off
 
 
 
Camera
 
Interface name: IMyCameraBlock
 
Parent: IMyFunctionalBlock
 
Fields: None
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
View -> View
 
 
 
Cockpit
 
Interface name: IMyCockpit
 
Parent: IMyShipController
 
Fields:
 
bool ControlWheels
 
bool ControlThrusters
 
bool HandBrake
 
bool DampenersOverride
 
Actions:
 
ControlThrusters -> Control thrusters On/Off
 
ControlWheels -> Control wheels On/Off
 
HandBrake -> Handbrake On/Off
 
DampenersOverride -> Inertia dampeners On/Off
 
 
 
Collector
 
Interface name: IMyCollector
 
Parent: IMyFunctionalBlock
 
Fields: bool UseConveyorSystem
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Connector
 
Interface name: IMyShipConnector
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool ThrowOut
 
bool CollectAll
 
bool IsLocked
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
ThrowOut -> Throw Out On/Off
 
CollectAll -> Collect All On/Off
 
SwitchLock -> Switch lock
 
 
 
Control Panel
 
Interface name: IMyControlPanel
 
Fields: None
 
Actions: None
 
 
 
Control Station
 
Interface name: IMyCockpit
 
Parent: IMyShipController
 
Fields:
 
bool ControlWheels
 
bool ControlThrusters
 
bool HandBrake
 
bool DampenersOverride
 
Actions:
 
ControlThrusters -> Control thrusters On/Off
 
ControlWheels -> Control wheels On/Off
 
HandBrake -> Handbrake On/Off
 
DampenersOverride -> Inertia dampeners On/Off
 
 
 
Door
 
Interface name: IMyDoor
 
Parent: IMyFunctionalBlock
 
Fields: bool Open
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Open -> Open/Closed
 
Open_On -> Open
 
Open_Off -> Closed
 
 
 
Drill
 
Interface name: IMyShipDrill
 
Parent: IMyFunctionalBlock
 
Fields: bool UseConveyorSystem
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Flight Seat
 
Interface name: IMyCockpit
 
Parent: IMyShipController
 
Fields:
 
bool ControlWheels
 
bool ControlThrusters
 
bool HandBrake
 
bool DampenersOverride
 
Actions:
 
ControlThrusters -> Control thrusters On/Off
 
ControlWheels -> Control wheels On/Off
 
HandBrake -> Handbrake On/Off
 
DampenersOverride -> Inertia dampeners On/Off
 
 
 
Gatling Turret
 
Interface name: IMyLargeGatlingTurret
 
Parent: IMyLargeConveyorTurretBase
 
Parent: IMyLargeTurretBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool UseConveyorSystem
 
bool CanControl
 
float Range
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Control -> Control
 
IncreaseRange -> Increase Radius
 
DecreaseRange -> Decrease Radius
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Gravity Generator
 
Interface name: IMyGravityGenerator
 
Parent: IMyGravityGeneratorBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
float FieldWidth
 
float FieldHeight
 
float FieldDepth
 
float Gravity
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseWidth -> Increase Field width
 
DecreaseWidth -> Decrease Field width
 
IncreaseHeight -> Increase Field height
 
DecreaseHeight -> Decrease Field height
 
IncreaseDepth -> Increase Field depth
 
DecreaseDepth -> Decrease Field depth
 
IncreaseGravity -> Increase Acceleration
 
DecreaseGravity -> Decrease Acceleration
 
 
 
Grinder
 
Interface name: IMyShipGrinder
 
Parent: IMyShipToolBase
 
Parent: IMyFunctionalBlock
 
Fields: None
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Gyroscope
 
Interface name: IMyGyro
 
Parent: IMyFunctionalBlock
 
Fields:
 
float GyroPower
 
bool GyroOverride
 
float Yaw
 
float Pitch
 
float Roll
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreasePower -> Increase Power
 
DecreasePower -> Decrease Power
 
Override -> Override controls On/Off
 
IncreaseYaw -> Increase Yaw override
 
DecreaseYaw -> Decrease Yaw override
 
IncreasePitch -> Increase Pitch override
 
DecreasePitch -> Decrease Pitch override
 
IncreaseRoll -> Increase Roll override
 
DecreaseRoll -> Decrease Roll override
 
Terminal block and action name list - 2/3
 
Interior Light
 
Interface name: IMyInteriorLight
 
Parent: IMyLightingBlock
 
Parent: IMyFunctionalBlock
 
Fields:
 
float Radius
 
float Intensity
 
float BlinkIntervalSeconds
 
float BlinkLenght
 
float BlinkOffset
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseRadius -> Increase Radius
 
DecreaseRadius -> Decrease Radius
 
IncreaseBlink Interval -> Increase Blink Interval
 
DecreaseBlink Interval -> Decrease Blink Interval
 
IncreaseBlink Lenght -> Increase Blink Length
 
DecreaseBlink Lenght -> Decrease Blink Length
 
IncreaseBlink Offset -> Increase Blink Offset
 
DecreaseBlink Offset -> Decrease Blink Offset
 
 
 
Interior Turret
 
Interface name: IMyLargeInteriorTurret
 
Parent: IMyLargeTurretBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool CanControl
 
float Range
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Control -> Control
 
IncreaseRange -> Increase Radius
 
DecreaseRange -> Decrease Radius
 
 
 
Landing Gear
 
Interface name: IMyLandingGear
 
Parent: IMyFunctionalBlock
 
Fields:
 
float BreakForce
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Lock -> Lock
 
Unlock -> Unlock
 
SwitchLock -> Switch lock
 
Autolock -> Autolock On/Off
 
IncreaseBreakForce -> Increase Break Force
 
DecreaseBreakForce -> Decrease Break Force
 
 
 
Small Cargo Container
 
Interface name: IMyCargoContainer
 
Fields: None
 
Actions: None
 
 
 
Medium Cargo Container
 
Interface name: IMyCargoContainer
 
Fields: None
 
Actions:None
 
 
 
Large Cargo Container
 
Interface name: IMyCargoContainer
 
Fields: None
 
Actions: None
 
 
 
Small Reactor
 
Interface name: IMyReactor
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool UseConveyorSystem
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Large Reactor
 
Interface name: IMyReactor
 
Parent: IMyFunctionalBlock
 
Fields: bool UseConveyorSystem
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Small Thruster
 
Interface name: IMyThrust
 
Parent: IMyFunctionalBlock
 
Fields: float ThrustOverride
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseOverride -> Increase Thrust override
 
DecreaseOverride -> Decrease Thrust override
 
 
 
Large Thruster
 
Interface name: IMyThrust
 
Parent: IMyFunctionalBlock
 
Fields: float ThrustOverride
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseOverride -> Increase Thrust override
 
DecreaseOverride -> Decrease Thrust override
 
 
 
Medical Room
 
Interface name: IMyMedicalRoom
 
Parent: IMyFunctionalBlock
 
Fields: None
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
 
 
Merge Block
 
Interface name: IMyShipMergeBlock
 
Parent: IMyFunctionalBlock
 
Fields: None
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
 
 
Missile Turret
 
Interface name: IMyLargeMissileTurret
 
Parent: IMyLargeConveyorTurretBase
 
Parent: IMyLargeTurretBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool UseConveyorSystem
 
bool CanControl
 
float Range
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Control -> Control
 
IncreaseRange -> Increase Radius
 
DecreaseRange -> Decrease Radius
 
UseConveyor -> Use Conveyor System On/Of
 
 
 
Ore Detector
 
Interace name: IMyOreDetector
 
Parent: IMyFunctionalBlock
 
Fields:
 
float Range
 
bool BroadcastUsingAntennas
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
 
 
Passenger Seat
 
Interface name: IMyCockpit
 
Parent: IMyShipController
 
Fields:
 
bool ControlWheels
 
bool ControlThrusters
 
bool HandBrake
 
bool DampenersOverride
 
Actions:
 
ControlThrusters -> Control thrusters On/Off
 
ControlWheels -> Control wheels On/Off
 
HandBrake -> Handbrake On/Off
 
DampenersOverride -> Inertia dampeners On/Off
 
 
 
Piston
 
Interface name: IMyPistonBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
float Velocity
 
float MinLimit
 
float MaxLimit
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Reverse -> Reverse
 
IncreaseVelocity -> Increase Velocity
 
DecreaseVelocity -> Decrease Velocity
 
ResetVelocity -> Reset Velocity
 
IncreaseUpperLimit -> Increase Maximal distance
 
DecreaseUpperLimit -> Decrease Maximal distance
 
IncreaseLowerLimit -> Increase Minimal distance
 
DecreaseLowerLimit -> Decrease Minimal distance
 
 
 
Programmable block
 
Interface name: IMyProgrammableBlock
 
Parent: IMyFunctionalBlock
 
Fields: bool IsRunning
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Run -> Run
 
Terminal block and action name list - 3/3
 
Refinery
 
Interface name: IMyRefinery
 
Parent: IMyFunctionalBlock
 
Parent: IMyProductionBlock
 
Fields: bool UseConveyorSystem
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Spotlight
 
Interface name: IMyReflectorLight
 
Parent: IMyLightingBlock
 
Parent: IMyFunctionalBlock
 
Fields:
 
float Radius
 
float Intensity
 
float BlinkIntervalSeconds
 
float BlinkLenght
 
float BlinkOffset
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseRadius -> Increase Radius
 
DecreaseRadius -> Decrease Radius
 
IncreaseBlink Interval -> Increase Blink Interval
 
DecreaseBlink Interval -> Decrease Blink Interval
 
IncreaseBlink Lenght -> Increase Blink Length
 
DecreaseBlink Lenght -> Decrease Blink Length
 
IncreaseBlink Offset -> Increase Blink Offset
 
DecreaseBlink Offset -> Decrease Blink Offset
 
 
 
Remote Control
 
Interface name: IMyRemoteControl
 
Parent: IMyShipController
 
Fields:
 
bool ControlWheels
 
bool ControlThrusters
 
bool HandBrake
 
bool DampenersOverride
 
Actions:
 
ControlThrusters -> Control thrusters On/Off
 
ControlWheels -> Control wheels On/Off
 
HandBrake -> Handbrake On/Off
 
DampenersOverride -> Inertia dampeners On/Off
 
Control -> Control
 
 
 
Rocket Launcher
 
Interface name: IMySmallMissileLauncher
 
Parent: IMyFunctionalBlock
 
Fields: bool UseConveyorSystem
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Reloadable Rocket Launcher
 
Interface name: IMySmallMissileLauncherReload
 
Parent: IMyFunctionalBlock
 
Fields: bool UseConveyorSystem
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Rotor
 
Interface name: IMyMotorStator
 
Parent: IMyMotorBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool IsAttached
 
float Torque
 
float BrakingTorque
 
float Velocity
 
float LowerLimit
 
float UpperLimit
 
float Displacement
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Reverse -> Reverse
 
Detach -> Detach
 
Attach -> Attach
 
IncreaseTorque -> Increase Torque
 
DecreaseTorque -> Decrease Torque
 
IncreaseBrakingTorque -> Increase Braking tor.
 
DecreaseBrakingTorque -> Decrease Braking tor.
 
IncreaseVelocity -> Increase Velocity
 
DecreaseVelocity -> Decrease Velocity
 
ResetVelocity -> Reset Velocity
 
IncreaseLowerLimit -> Increase Lower limit
 
DecreaseLowerLimit -> Decrease Lower limit
 
IncreaseUpperLimit -> Increase Upper limit
 
DecreaseUpperLimit -> Decrease Upper limit
 
IncreaseDisplacement -> Increase Rotor displacement
 
DecreaseDisplacement -> Decrease Rotor displacement
 
 
 
Sensor
 
Interface name: IMySensorBlock
 
Parent: IMyFunctionalBlock
 
Fields:
 
float LeftExtend
 
float RightExtend
 
float TopExtend
 
float BottomExtend
 
float FrontExtend
 
float BackExtend
 
bool DetectPlayers
 
bool DetectFloatingObjects
 
bool DetectSmallShips
 
bool DetectLargeShips
 
bool DetectStations
 
bool DetectAsteroids
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseLeft -> Increase Left extent
 
DecreaseLeft -> Decrease Left extent
 
IncreaseRight -> Increase Right extent
 
DecreaseRight -> Decrease Right extent
 
IncreaseBottom -> Increase Bottom extent
 
DecreaseBottom -> Decrease Bottom extent
 
IncreaseTop -> Increase Top extent
 
DecreaseTop -> Decrease Top extent
 
IncreaseBack -> Increase Back extent
 
DecreaseBack -> Decrease Back extent
 
IncreaseFront -> Increase Front extent
 
DecreaseFront -> Decrease Front extent
 
Detect Players -> Detect players On/Off
 
Detect Floating Objects -> Detect floating objects On/Off
 
Detect Small Ships -> Detect small ships On/Off
 
Detect Large Ships -> Detect large ships On/Off
 
Detect Stations -> Detect stations On/Off
 
Detect Asteroids -> Detect Asteroids On/Off
 
 
 
Solar Panel
 
Interface name: IMySolarPanel
 
Fields:None
 
Actions:None
 
 
 
Sound Block
 
Interface name: IMySoundBlock
 
Parent: IMyFunctionalBlock
 
Fields:
 
float Volume
 
float Range
 
bool IsSoundSelected
 
float LoopPeriod
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseVolumeSlider -> Increase Volume
 
DecreaseVolumeSlider -> Decrease Volume
 
IncreaseRangeSlider -> Increase Range
 
DecreaseRangeSlider -> Decrease Range
 
PlaySound -> Play
 
StopSound -> Stop
 
IncreaseLoopableSlider -> Increase Loop time
 
DecreaseLoopableSlider -> Decrease Loop time
 
 
 
Spherical Gravity Generator
 
Interface name: IMyGravityGeneratorSphere
 
Parent: IMyGravityGeneratorBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
float Radius
 
float Gravity
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseRadius -> Increase Radius
 
DecreaseRadius -> Decrease Radius
 
IncreaseGravity -> Increase Acceleration
 
DecreaseGravity -> Decrease Acceleration
 
 
 
Timer Block
 
Interface name: IMyTimerBlock
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool IsCountingDown
 
float TriggerDelay
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
IncreaseTriggerDelay -> Increase Delay
 
DecreaseTriggerDelay -> Decrease Delay
 
TriggerNow -> Trigger now
 
Start -> Start
 
Stop -> Stop
 
 
 
Warhead
 
Interface name: IMyWarhead
 
Fields:
 
bool IsCountingDown
 
float DetonationTime
 
Actions:
 
IncreaseDetonationTime -> Increase Detonation time
 
DecreaseDetonationTime -> Decrease Detonation time
 
StartCountdown -> Start countdown
 
StopCountdown -> Stop countdown
 
Safety -> Safety On/Off
 
Detonate -> Detonate
 
 
 
Welder
 
Interface name: IMyShipWelder
 
Parent: IMyShipToolBase
 
Parent: IMyFunctionalBlock
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
UseConveyor -> Use Conveyor System On/Off
 
 
 
Wheel Suspension 1x1
 
Interface name: IMyMotorSuspension
 
Parent: IMyMotorBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool Steering
 
bool Propulsion
 
float Damping
 
float Strength
 
float Friction
 
float Power
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Steering -> Steering On/Off
 
Propulsion -> Propulsion On/Off
 
IncreaseDamping -> Increase Damping
 
DecreaseDamping -> Decrease Damping
 
IncreaseStrength -> Increase Strength
 
DecreaseStrength -> Decrease Strength
 
IncreaseFriction -> Increase Friction
 
DecreaseFriction -> Decrease Friction
 
IncreasePower -> Increase Power
 
DecreasePower -> Decrease Power
 
 
 
Wheel Suspension 3x3
 
Interface name: IMyMotorSuspension
 
Parent: IMyMotorBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool Steering
 
bool Propulsion
 
float Damping
 
float Strength
 
float Friction
 
float Power
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Steering -> Steering On/Off
 
Propulsion -> Propulsion On/Off
 
IncreaseDamping -> Increase Damping
 
DecreaseDamping -> Decrease Damping
 
IncreaseStrength -> Increase Strength
 
DecreaseStrength -> Decrease Strength
 
IncreaseFriction -> Increase Friction
 
DecreaseFriction -> Decrease Friction
 
IncreasePower -> Increase Power
 
DecreasePower -> Decrease Power
 
 
 
Wheel Suspension 5x5
 
Interface name: IMyMotorSuspension
 
Parent: IMyMotorBase
 
Parent: IMyFunctionalBlock
 
Fields:
 
bool Steering
 
bool Propulsion
 
float Damping
 
float Strength
 
float Friction
 
float Power
 
Actions:
 
OnOff -> Toggle block On/Off
 
OnOff_On -> Toggle block On
 
OnOff_Off -> Toggle block Off
 
Steering -> Steering On/Off
 
Propulsion -> Propulsion On/Off
 
IncreaseDamping -> Increase Damping
 
DecreaseDamping -> Decrease Damping
 
IncreaseStrength -> Increase Strength
 
DecreaseStrength -> Decrease Strength
 
IncreaseFriction -> Increase Friction
 
DecreaseFriction -> Decrease Friction
 
IncreasePower -> Increase Power
 
DecreasePower -> Decrease Power
 
Programmable block video
 
 
 
 
 
 
 
EDIT 01/02/15 - Changes: Allowed namespaces
 
Currently you can use only the following namespaces from Modding API:
 
Sandbox.ModAPI.Ingame
 
Sandbox.ModAPI.Interfaces
 
Sandbox.Common.ObjectBuilders
 
VRageMath
 
VRage
 
  
You cannot use Sandbox.ModAPI namespace or any other game namespaces
+
[[Category:Game Mechanics]]

Revision as of 00:48, 31 October 2016

Introduction

Editor access

Only one player can edit the same script at time. If someone else has an editor for the current block open and someone else tries to open that block's editor, a notification will be shown that the editor is already open.

Main method

When the editor is opened for first time, void Main() method is present inside the code editor. This is entry point that will be called when executing script. If Main method is removed / renamed, the script will not run and you will be notified in the programmable block details area. Custom methods/variables can be defined and used, but only the Main method will be called without reference.

Variables life

There are two types of variables for scripting: Local (inside the methods) – these variables will keep their value only during execution of a method. Value will be “lost” when the method ends. Global (outside the methods) - these variables will keep their values during the lifetime of script. E.g. If the variable needs to keep value between separate runs of program, it needs to be defined outside the methods. After pressing “Remember & Exit” or “Remember” buttons, the previous script will be overwritten and all Global variables will be lost.

Compiling

When the “Check code” button is pressed, the code will be compiled and the result of the compilation will be shown. There are two steps of the compilation process: First the code inside editor is compiled by c# compiler for language errors. If there are any errors during compilation the following dialog is shown: It this case “aaa” string is placed before Main method. This is the wrong language construction and the compilation failed. In the error dialog the Line number error and description of the error is shown.

After compilation, the code is checked for usage of disallowed namespaces and types. In case that check fails, the following dialog is shown: In this case System.IO.Directory was used to delete some directory. This is forbidden and error is shown that “Not allowed type was used in script”.

If compilation and checks pass, a dialog is shown, confirming the checks passed, and the code is saved.

Script execution

When “Run” button is pressed or “Run” is assigned as terminal action, script is executed. Currently “Run” needs to be called manually e.g. user need to click on “Run” button or attach it as terminal action. Script is executed only on server even if it’s triggered from client. If there is any exception during script execution, all clients will be notified in programmable block details area about failure. In case of exception during script execution, script will not run again unless User opens editor and change script.

Counting of instructions

Every time script is executed, every instruction of script is counted. If script executes more instruction than limit, execution is stopped and user is notified that script is too complex for execution. This prevents scripts to “freeze” game.


Available interfaces

Possible Actions

Currently only terminal actions can be triggered inside scripts. User can access terminal system for grid on which programmable block is located and trigger any terminal action on any block at grid.

Block Classes (Action List)

Same block class for different SubTypeID

Some blocks have same parent (e.g. <TypeId> in cubeblocks.sbc) and differs only by subtype (e.g. <SubtypeId>). This means there is no distinction between these block in code.
Example of these blocks is the Cargo Container: there are 3 types of cargo containers in the game: small, medium and large. These three types differ only by subtype and Type is same for them e.g. large cargo container id is:
<Id>
<TypeId>CargoContainer</TypeId>
<SubtypeId>LargeBlockLargeContainer</SubtypeId>
</Id>
Medium is:
<Id>
<TypeId>CargoContainer</TypeId>
<SubtypeId>SmallBlockMediumContainer</SubtypeId>
</Id>
And small is:
<Id>
<TypeId>CargoContainer</TypeId>
<SubtypeId>LargeBlockSmallContainer</SubtypeId>
</Id>

In this case there is only one class IMyCargoContainer for all types of cargo containers.

Whitelist

The types and classes allowed in scripts are restricted. Refer to the Scripting Whitelist to see what you are allowed to use.