====== System Functions ====== The scripting engine provides a set of 'System Functions', usually preceded by **sys**. Below is the complete list of system functions currently available. (Note also the list of [[Scripting:Reference:Special System Control Functions|special system control functions]] which includes special cases like the 'Sleep' function etc) ===== Player-status Functions ===== ==== sysAddToInventory ==== ^ Format | sysAddToInventory ( [Item], [Amount] )| ^ Description | Attempts to add an item to the current player's inventory. | ^ Parameters | **[Item]** - Name or number of the item | ^ | **[Amount]** - Amount of the item to be added | ^ Returns | **[Amount added]** - The actual amount of the item that was added | ^ Notes | This is an alternate method to calling ***grantitem [PlayerName] [Amount] [Item]** but the sys function does not message the player unlike *grantitem. Also, this function adheres to the player's capacity limit (*grantitem ignores it) - no items will be added if the player's inventory is already full. | //Example//: Event( "UseSkill", "Baker" ) { $added = sysAddToInventory( "Bread", 3 ) if ( $added > 0 ) { *msg %PLAYER% You made yourself $added Bread } else { *alert %PLAYER% You're carrying too much stuff } } ==== sysGetInventoryItemIndex ==== ^ Format | sysGetInventoryItemIndex ( [index] )| ^ Description | Returns the item in the current player's inventory. | ^ Parameters | **[index]** - Inventory slot number | ^ Returns | **[ItemNum]** - The item number in the specified inventory slot (or 0 if the slot is empty) | ^ Notes | Players currently have up to 64 inventory slots. | //Example//: Event( "Custom", "ListInventory" ) { $loop = 0 while( $loop < 64 ) { $itemNum = sysGetInventoryItemIndex( $loop ) if ( $itemNum != 0 ) { *msg %PLAYER% Item $loop : $itemNum } } } ==== sysGetNearestPlayer ==== ^ Format | sysGetNearestPlayer( [WorldX], [WorldY] )| ^ Description | Returns the ID of the player closest to the specified world coordinate | ^ Parameters | World Coordinate X,Y | ^ Returns | Player ID | //Example//: $kSpecialBuildingRecordNum = 10 Event( "UseItem", "Plunger" ) { SetBuildingContext( $kSpecialBuildingRecordNum ) $posX = $gBuildingWorldX $posY = $gBuildingWorldY $targetPlayerID = sysGetNearestPlayer( $posX, $posY ) $targetPlayerName = sysGetPlayerName( $targetPlayerID ) *say %PLAYER% used the plunger. The person closest to the special building was $targetPlayerName *explodebuilding $kSpecialBuildingRecordNum } ==== sysGetPlayerID ==== ^ Format | sysGetPlayerID( [Player Name] )| ^ Description | Returns the ID for a specified player name | ^ Parameters | Player Name | ^ Returns | Player ID | //Example//: Event( "Custom", "Special" ) { $playerID = sysGetPlayerID( "Bob" ) if ( $playerID <= 0 ) { *msg %PLAYER% Bob doesn't exist on this world } else { *msg %PLAYER% Bob's player ID is $playerID } } ==== sysIsPlayerIDOnline ==== ^ Format | sysIsPlayerIDOnline( [Player ID] )| ^ Description | Used to determine if the specified player is currently online on the world | ^ Parameters | Player ID | ^ Returns | **1** if the player is connected, **0** if not | ^ Example | ''**$isOnline = sysIsPlayerIDOnline(32)**'' | ==== sysIsInSpawnZone ==== ^ Format | sysIsInSpawnZone( [SpawnZone Type/ID] )| ^ Description | Used to determine if the current player is within the specified spawn zone region | ^ Parameters | SpawnZone Type/ID | ^ Returns | **1** if the player is in the region, **0** if not | ^ Example | ''**$isInDefaultSpawnZone = sysIsInSpawnZone(0)**'' | ==== sysIsInTown ==== Example : ''**$var = sysIsInTown("Home Town"))**'' \\ Returns 1 if the current player is within the boundaries of the specified town, 0 if not \\ ==== sysNumPlayersOnTeam ==== Example : ''**$var = sysNumPlayersOnTeam(3)**'' \\ Returns the number of players currently online and in the specified team \\ ==== sysPlayerInventory ==== ^ Format | sysPlayerInventory ( [Item] )| ^ Description | Returns the number of an item the current player currently posesses | ^ Parameters | **[Item]** - Name or number of the item | ^ Returns | Amount carried | //Example//: Event( "PreAccessBuilding", "10" ) { $hasKeys = sysPlayerInventory( "Keys" ) if ( $hasKeys == 0 ) { *msg %PLAYER% You cannot access this building without keys CancelTransaction() } } ==== sysPlayerSkillLevel ==== Example : ''**$var = sysPlayerSkillLevel("Farmer")**'' \\ Returns the current player's skill level for the skill named (0 means the player does not yet have this skill) \\ ==== sysPlayerIsLearningSkill ==== Example : ''**$isLearning = sysPlayerIsLearningSkill("Farmer")**'' \\ Returns **1** if the player is currently learning the specified skill, **0** if not. \\ ===== Player Building Ownership Functions ===== ==== sysPlayerGetNumBuildingsOfType ==== ^ Format | sysPlayerGetNumBuildingsOfType ( [PlayerID], [BuildingType] )| ^ Description | Returns the number of buildings of a particular type that the specified player currently owns | ^ Parameters | **[PlayerID]** - ID number of the player | ^ | **[BuildingType]** - Building type number | ^ Returns | Number owned | //Example//: Event( "Custom", "CountBuildings" ) { $numOwned = sysPlayerGetNumBuildingsOfType( $gPlayerID, 10 ) *msg %PLAYER% You currently own $numOwned type 10 buildings } ==== sysPlayerGetNearestOwnedBuildingOfType ==== ^ Format | sysPlayerGetNearestOwnedBuildingOfType ( [PlayerID], [BuildingType], [WorldX], [WorldY] ) | ^ Description | Locates the nearest building of the specified type owned by the player. If no WorldX, WorldY is specified, the players current position is used instead | ^ Parameters | Player ID number | ^ | Building type number | ^ | WorldX, WorldY | ^ Returns | BuildingID or 0 if the player doesn't own a building of that type | //Example//: Function FindNearestBuildingOfType( $buildingType ) { $buildingID = sysPlayerGetNearestOwnedBuildingOfType( $gPlayerID, $buildingType ) if ( $buildingID == 0 ) { *msg %PLAYER% You don't own any type $buildingType buildings } else { $buildingName = sysGetBuildingName( $buildingID ) *msg %PLAYER% The nearest type $buildingType building that you own is $buildingName } } ==== sysPlayerGetOwnedBuilding ==== ^ Format | sysPlayerGetOwnedBuilding ( [PlayerID], [Index] ) | ^ Description | Used to get the IDs of buildings owned by the player | ^ Parameters | [PlayerID] - Player ID number | ^ | [Index] - Number in the list of owned buildings | ^ Returns | BuildingID or 0 if the player doesnt own that many buildings | //Example//: Function SendOwnedBuildingsList( $playerID ) { $playerName = sysGetPlayerName( $playerID ) $loop = 1 while( $loop < 10 ) { $buildingID = sysPlayerGetOwnedBuilding( $playerID, $loop ) // No more buildings if ( $buildingID == 0 ) { return } $buildingName = sysGetBuildingName( $buildingID ) *msg $playerName Building $loop : ID = $buildingID ( $buildingName ) $loop += 1 } } ===== Building Functions ===== ==== sysAmountInStocks ==== ^ Format | sysAmountInStocks( [Item_Name or Num] )| ^ Description | Returns the amount of the item currently in the building's stocks | ^ Parameters | Item Name or number | ^ Example | ''**$amountInBuilding = sysAmountInStocks("Wood")**'' | ==== sysGetBuyPrice ==== ^ Format | sysGetBuyPrice [Item] ) | ^ Description | Returns the 'Buy Price' set for this item in the currently accessed building | ^ Parameters | Item name or number | ^ Returns | 'Buy Price' of the item in denari | ^ Notes | Related commands: *setbuyprice [BuildingID] [Item] [Price] | //Example//: Event( "AccessBuilding", "2" ) { $buyPrice = sysGetBuyPrice( "Flour" ) $buyPriceText = sysGetPriceText( $buyPrice ) osdcreate( OSDBUILDING, "BakeryOSD", "Bakery" ) osdaddat( 200, 100, 200, 40, "Sell|Flour", "Buying flour ($buyPriceText)" ) osdactivate() } ==== sysGetSellPrice ==== ^ Format | sysGetSellPrice( [Item_Name or Num] )| ^ Description | Returns the price that the item is currently set for sale at (Or 0 if it is not currently for sale) | ^ Parameters | Item Name or number | //Example//: Event( "AccessBuilding", "12" ) { osdcreate( OSDBUILDING, "Building", "Example" ) $woodSellPrice = sysGetSellPrice( "Wood" ) if ( $woodSellPrice == 0 ) { osdaddat( TEXT, 100, 100, 400, 0, "", "Not currently selling wood" ) } else { $woodSellPriceText = sysGetPriceText( $woodSellPrice ) osdaddat( TEXT, 100, 100, 400, 0, "", "Currently selling wood at $woodSellPriceText" ) } osdactivate() } ==== sysGetEmployeeID ==== ^ Format | sysGetEmployeeID( [Index] ) | ^ Description | Returns the employee player ID for the currently accessed building. Buildings can have up to 16 employees. | ^ Parameters | Index (0 - 15) | ^ Returns | PlayerID of the employee or 0 if none is set for this index | //Example//: Event( "AccessBuilding", "13" ) { osdcreate( OSDBUILDING, "Building", "Example" ) $employeeID = sysGetEmployeeID( 0 ) if ( $employeeID != 0 ) { $employeeName = sysGetPlayerName( $employeeID ) osdaddat( TEXT, 100, 100, 400, 0, "", "Employee : $employeeName" ) } else { osdaddat( TEXT, 100, 100, 400, 0, "", "There is no-one currently employed at this building" ) } osdactivate() } ==== sysGetBuildingName ==== ^ Format | sysGetBuildingName( [BuildingID] ) | ^ Description | Returns the building name for a particular ID | ^ Parameters | Building ID number | ^ Returns | The building name | //Example//: Event( "UseItem", "Map" ) { $nearestTownID = sysGetNearestTown( $gPlayerWorldX, $gPlayerWorldY ) $nearestTownName = sysGetBuildingName( $nearestTownID ) *msg %PLAYER% The nearest town is $nearestTownName } ==== sysGetMaxJobs ==== TBD\\ ===== Construction ===== ==== sysIsBuildingPositionValid ==== ^ Format | sysIsBuildingPositionValid( [Building Type] ) | ^ Description | Checks whether the player's current position is a valid place to add a building of the specified type | ^ Parameters | Building Type number | ^ Returns | 1 if the position is valid, 0 if not | //Example//: Event( "PlaceAnyBuilding", "" ) { $buildingType = $gParam[1] $isValid = sysIsBuildingPositionValid( $buildingType ) if ( $isValid == 1 ) { $buildingName = sysGetTextEntry() $constrAmount = -1 $didAdd = sysAddBuildingWorld( $buildingType,$gPlayerID,$gPlayerWorldX,$gPlayerWorldY,$buildingName,$constrAmount ) } } ==== sysAddBuilding ==== ^ Format | sysAddBuilding ( [Building Type], [Owner ID], [MapX], [MapY], [ [Building_Name], [Construction Amount 1], [Construction Amount 2] ] ) )| ^ Description | Used to add a new building to your world | ^ Parameters | Building Type number | ^ | Owner player ID | ^ | Map Coordinate X | ^ | Map Coordinate Y | ^ | (Optional) Building Name | ^ | (Optional) Construction Amount 1 | ^ | (Optional) Construction Amount 2 | ^ Returns | 1 if the building was added to the world, 0 if not | //Example//: Event( "PlaceAnyBuilding", "" ) { $nBuildingType = $gParam[1] $valid = sysIsBuildingPositionValid( $nBuildingType ) if ( $valid = 1 ) { $buildingName = sysGetTextEntry() $didAdd = sysAddBuilding( nBuildingType,$gPlayerID,$gPlayerX,$gPlayerY,$buildingName ) } } ==== sysAddBuildingWorld ==== TBD\\ ==== sysGetBuildingTypeName ==== TBD // // ==== sysGetConstructionMaterialsAmount ==== TBD // // ==== sysAddLocalBackgroundModel ==== TBD\\ ==== sysDeleteLocalBackgroundModel ==== TBD\\ ==== sysDeleteAllLocalBackgroundModels ==== TBD\\ ==== sysAddBackgroundModels ==== TBD\\ ===== Town Functions ===== ==== sysGetNearestTown ==== ==== sysTownGetRelationship ==== ==== sysTownGetNumBuildingsOfType ==== ^ Format | sysTownGetNumBuildingsOfType( [TownBuildingID], [BuildingType] )| ^ Description | Returns the number of buildings of this type currently exist within the specified town. Useful for when you want to script a system that limits the number of a particular type of building per town | ^ Parameters | BuildingID of the town to query | ^ | Type number of the building to check | ^ Returns | Number of this type of building in the town | //Example//: Event( "PlaceAnyBuilding", "" ) { $nBuildingType = $gParam[1] $nearestTownID = sysGetNearestTown( $gPlayerWorldX, $gPlayerWorldY ) $numInTown = sysTownGetNumBuildingsOfType( $nearestTownID, $nBuildingType ) if ( $numInTown >= 3 ) { *msg %PLAYER% There can only be 3 of each type of building in each town CancelTransaction() } else { $valid = sysIsBuildingPositionValid( $nBuildingType ) if ( $valid = 1 ) { $buildingName = sysGetTextEntry() $constrAmount = -1 $didAdd = sysAddBuildingWorld( $nBuildingType,$gPlayerID,$gPlayerWorldX,$gPlayerWorldY,$buildingName,$constrAmount ) } } } ===== World / Map Functions ===== ==== sysGetTileCenter ==== ^ Format | sysGetTileCenter ( [World X or Y] )| ^ Description | Returns the world coordinate value for the center of the map tile nearest to the specified position| ^ Parameters | **[World X or Y]** - World coordinate value | ^ Returns | World coordinate of tile center | //Example//: Event( "UseItem", "TileTeleport" ) { $tileCenterX = sysGetTileCenter( $gPlayerWorldX ) $tileCenterY = sysGetTileCenter( $gPlayerWorldY ) *setposworld %PLAYER% $tileCenterX $tileCenterY } ==== sysMapToWorld ==== ^ Format | sysMapToWorld ( [Map X or Y] )| ^ Description | Converts a map coordinate to a world coordinate| ^ Parameters | **[Map X or Y]** - Map coordinate value | ^ Returns | World coordinate | //Notes//: There are 2 coordinate systems used in the game ; Map Coordinates range from 0 to 255 (for the default map size), 0 to 511 or 0 to 1023 (if using a larger map size) and they correspond to the 'tiles' that make up the landscape. World coordinates are in centimeters. ==== sysWorldToMap ==== ^ Format | sysWorldToMap ( [Map X or Y] )| ^ Description | Converts a world coordinate to a map coordinate| ^ Parameters | **[World X or Y]** - World coordinate value | ^ Returns | Nearest map coordinate value | ==== sysGetBuildingAtWorldPos ==== ==== sysWorldGetNumBuildingsOfType ==== ^ Format | sysWorldGetNumBuildingsOfType( [BuildingType] )| ^ Description | Returns the number of buildings of this type currently existing within the world. Useful for when you want to script a system that limits the number of a particular type of building | ^ Parameters | Type number of the building to check | ^ Returns | Number of this type of building currently in the world | //Example//: Event( "PlaceAnyBuilding", "" ) { $nBuildingType = $gParam[1] $numInWorld = sysWorldGetNumBuildingsOfType( $nBuildingType ) if ( $numInWorld >= 1 ) { *msg %PLAYER% There can only be 1 of each type of building in the world CancelTransaction() } else { $valid = sysIsBuildingPositionValid( $nBuildingType ) if ( $valid = 1 ) { $buildingName = sysGetTextEntry() $constrAmount = -1 $didAdd = sysAddBuildingWorld( $nBuildingType,$gPlayerID,$gPlayerWorldX,$gPlayerWorldY,$buildingName,$constrAmount ) } } } ==== sysGetNearestForest ==== ===== Text Functions ===== ==== sysGetPlayerName ==== ^ Format | sysGetPlayerName( [PlayerID] )| ^ Description | Returns the name of the specified player| ^ Parameters | Player ID | ^ Returns | Player Name | //Example//: Event( "UseItem", "Potion" ) { $targetName = sysGetPlayerName( $gTargetID ) *msg %PLAYER% You used the potion while targeting $targetName } ==== sysGetItemName ==== Example : ''**$var = sysGetItemName ($itemNum))**'' \\ TBD\\ ==== sysGetSkillName ==== Example : ''**$var = sysGetSkillName($skillNum))**'' \\ TBD\\ ==== sysGetItemNum ==== ^ Format | sysGetItemNum( [Item Name] )| ^ Description | Gets an item number from a name| ^ Parameters | Item Name | ^ Returns | Item number | //Example//: Event( "UseItem", "Potion" ) { $itemNum = sysGetItemNum( "Potion" ) *msg %PLAYER% The item number is $itemNum } ==== sysGetSkillNum ==== TBD\\ ==== sysGetPriceText ==== ^ Format | sysGetPriceText ( [Price] )| ^ Description | Returns a text string displaying the price value expressed in a short format - e.g 2s 3d | ^ Parameters | Price value (in denari) | ^ Returns | Price text | //Example//: Event( "UseItem", "Potion" ) { $price = 20 if ( $gPlayerCash < $price ) { $priceText = sysGetPriceText( $price ) *alert %PLAYER% You need at least $priceText to use the potion CancelTransaction() } else { *grantcash %PLAYER% -$price } } ==== sysGetDateText ==== ^ Format | sysGetDateText( [Unix Time] )| ^ Description | Returns a text string displaying the date and time | ^ Parameters | Unix time (Number of seconds since 1 Jan 1970) | ^ Returns | Text of the date and time (e.g. "31st December 2014 18:00" ) | //Example//: Event( "UseItem", "Potion" ) { $nextUsePotionTime = $gServerTimeVar[0] $currTime = sysGetRealTime( "UnixTime" ) if ( $currTime < $nextUsePotionTime ) { $useDateText = sysGetDateText( $nextUsePotionTime ) *msg %PLAYER% You cannot use the potion until $useDateText CancelTransaction() } else { // Set server variable to store the next time the potion can be used - one hour from now $kOneHourInSeconds = 60 * 60 $gServerTimeVar[0] = $currTime + $kOneHourInSeconds } } ==== sysGetTimeText ==== TBD // // ==== sysGetRealTimeTextForDays ==== ^ Format | sysGetRealTimeTextForDays ( [Number of game days] )| ^ Description | Returns a text description of the time that will pass for the specified number of game days | ^ Parameters | Number of game days | ^ Returns | Time text | //Example//: Event( "UseItem", "Magic Potion" ) { $daysSinceLastUsed = $gGameDay - $gPlayerKey[LastUsedPotionDay] if ( $daysSinceLastUsed < 10 ) { $daysUntilCanUse = 10 - $daysSinceLastUsed $timeText = sysGetRealTimeTextForDays( $daysUntilCanUse ) *say You must wait $timeText until you can use the Magic Potion again } else { *effect %PLAYER% 10 $gPlayerKey[LastUsedPotionDay] = $gGameDay } } ===== Battle game Functions ===== ==== BattleSetPreludeTime ==== ==== BattleSetNumRounds ==== ==== BattleSetRoundTime ==== ==== BattleSetRoundScore ==== ==== BattleSendChallenge ==== ===== Maths Functions ===== ==== sysRand ==== ^ Format | sysRand ( [MAX_NUM] )| ^ Description | Returns a random number between 1 and the value specified | ^ Example | ''**$var = Rand(500)**'' | ==== sysSin ==== ^ Format | sysSin ( [ANGLE], [SCALE] )| ^ Description | Returns a sine value| ^ Parameters | Angle - 0 to 360 degrees | ^ | Scale - Scale applied to the result from the sine function (which normally returns a value from -1 to 1 | ^ Returns | Scaled sine value | //Example//: Event( "Custom", "TreeCircle" ) { $angle = 0 while ( $angle < 360 ) { $posX = sysSin( $angle, 100 ) $posY = sysCos( $angle, 100 ) $posX += $gPlayerWorldX $posY += $gPlayerWorldY *addtree 1,$posX,$posY $angle += 36 } } ==== sysCos ==== ^ Format | sysCos ( [ANGLE], [SCALE] )| ^ Description | Returns a cosine value| ^ Parameters | Angle - 0 to 360 degrees | ^ | Scale - Scale applied to the result from the cosine function (which normally returns a value from -1 to 1 | ^ Returns | Scaled cosine value | //Example//: See sysSin above \\ \\ ==== sysGetDist ==== ^ Format | sysGetDist ( [X1], [Y1], [X2], [Y2] )| ^ Description | Calculates the distance between two points| ^ Parameters | Point 1 X,Y | ^ | Point 2 X,Y | ^ Returns | Distance | //Example//: Event( "AccessBuilding", "1" ) { $dist = sysGetDist( $gPlayerWorldX, $gPlayerWorldY, $gBuildingWorldX, $gBuildingWorldY ) *msg %PLAYER% You accessed the building from $dist cm away } ===== Misc other functions ===== ==== sysRealTime ==== ^ Format | sysRealTime ( [Type] )| ^ Description | Returns details of the current real time (according to the server clock)| ^ Parameters | Type field specifying the date or time to fetch | ^ Returns | Depending on the type field: | ^ | **Year** - returns the current year (e.g. 2014) | ^ | **Month** - returns the current month number (1 to 12) | ^ | **Day** - returns the current day number (1 to 31) | ^ | **Hour** - returns the current hour (0 to 23) | ^ | **Minute** - returns the current minute (0 to 59) | ^ | **Second** - returns the current second (0 to 59) | ^ | **UnixTime** - number of seconds passed since 1st Jan, 1970 | //Example//: Event( "UseItem", "Tea" ) { $hour = sysRealTime( "Hour" ) if ( $hour < 18 ) { *msg %PLAYER% Tea can only be used at tea-time (6pm - 8pm) } else if ( $hour >= 20 ) { *msg %PLAYER% Tea can only be used at tea-time (6pm - 8pm) } else { *notifylarge %PLAYER% Tea-time! } } ==== sysRaceIsActive ==== TBD \\ \\