Scripted OSD Overview
The Scripted OSD system allows you to write scripts on your server that can bring up a window on the client, displaying images, text, buttons etc, which the player is able to interact with.
Event( “AccessBuilding”, “[BUILDING_TYPE]” )
) and it generates the display window for the building.
For details of all the OSD commands and parameters available see the Reference section.
If you are looking to override or extend parts of the main UI layout with script, refer to the Scripting Main UI section.
ScriptedOSD Example
Here is a basic example script that activates a dialog on the client.
Event( "Custom", "HelloWorld" ) { osdcreate(OSDLIST,"Main","Hello World") osdaddauto(TEXT, "", "How would you like to respond") osdaddauto(BUTTON, "Option1", "Positively") osdaddauto(BUTTON, "Option2", "Negatively") osdactivate() } Event( "OSDSelect", "Main:Option1" ) { *notify %PLAYER% You responded positively } Event( "OSDSelect", "Main:Option2" ) { *notify %PLAYER% You responded negatively }
The first block - which is run when a custom event called 'HelloWorld' is run (for instance by entering *event {YourName} HelloWorld
) - lays out the initial menu of the OSD, a bit of text with two buttons.
Each 'osdaddauto' line adds a line to the display. TEXT is used to put some text on the screen, then BUTTON to add a couple of buttons. The second two blocks handle the response when the player selects one of the buttons. The second parameter of the event is formatted OSDNAME:OSDBUTTONNAME
.
If you want to control the layout of your OSD more directly (you will if you want to make anything that looks remotely decent), you use osdadd rather than osdaddauto, providing X,Y, width and height for each item. e.g.
osdcreate(OSDLOWER,"Main","Big Button") osdadd(BUTTON, 200, 0, 200, 100, "But1", "Press me!") osdactivate()
That also allows you to arrange things programmatically, so you'll probably end up with osd code like:
$buttonX = 200 $buttonY = 100 $buttonW = 200 $buttonH = 30 osdcreate(OSDLOWER,"Main","Big Button") osdadd(BUTTON, $buttonX, $buttonY, $buttonW, $buttonH, "But1", "Press me!") $buttonY += $buttonH + 10 osdadd(BUTTON, $buttonX, $buttonY, $buttonW, $buttonH, "But2", "No press me!") $buttonY += $buttonH + 10 osdactivate()
.. and if you're full expert you'll put all data, names, descriptions (etc) into an array, then write a function that creates the UI automatically by looping through the elements in the array. (Then you only have one function to maintain & improve and you can get on with more important things). Like:
function ShowStocks( $numStocks, $aStocks ) { $lineY = 10 $loop = 1 while( $loop <= $numStocks) { $itemName = $aStocks[$loop] $stocks = sysAmountInStocks( $itemName ) $sellPrice = sysGetSellPrice( $itemName ) $itemNum = sysGetItemNum( $itemName ) osdadd(BUTTON, 70, $lineY, 150, 22, "selectItem|$itemNum", "$itemName") osdadd(BIGTEXT, 255, $lineY, 80, 0, "", "$stocks ") if ( $sellPrice > 0 ) { $priceText = sysGetPriceText( $sellPrice ) osdadd(BIGTEXT, 390, $lineY, 100, 0, "", "$priceText") } else { osdadd(FADEDTEXT, 400, $lineY, 0, 0, "", "Not selling") } $lineY += 25 $loop += 1 } } //---------------------------------- $kNumFarmStocks = 6 $maFarmStocksItems[] = { "Wheat", "Hops", "Tea leaves", "Coffee beans", "Potatoes", "Sugar Cane", } Event( "AccessBuilding", "$kFarmBuildingType" ) { osdcreate(OSDLIST,"Farm","Farm Stocks") ShowStocks( $kNumFarmStocks, $maFarmStocksItems ) osdactivate() }