User Tools

Site Tools


scripting:scriptedosd

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.

One common use for ScriptedOSD is in conjunction with the 'Scripted' building type - When the player accesses the building, your script is run ( 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.

The second parameter of the OSDCreate function 'names' your OSD screen, and is important when dealing with the OSDSELECT response

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() 

}
scripting/scriptedosd.txt · Last modified: 2023/02/28 07:02 by mit

Except where otherwise noted, content on this wiki is licensed under the following license: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki