StendhalScripting/LuaAPI
The following objects & functions are exposed to the Lua engine:
Objects
luajava
This is an object of the LuajavaLib library. It can be used to coerce Java static objects to Lua or create new Java object instances.
Example of exposing a static object & enums to Lua:
-- store a Java enum in a Lua global variable ConversationStates = luajava.bindClass("games.stendhal.server.entity.npc.ConversationStates") -- access the enum values like so ConversationStates.IDLE
Example of creating an object instance:
-- store instance in local variable local dog = luajava.newInstance("games.stendhal.server.entity.npc.SilentNPC") -- access object methods like so dog:setEntityClass("animal/puppy") dog:setPosition(2, 5) -- class with constructor using parameters local speaker = luajava.newInstance("games.stendhal.server.entity.npc.SpeakerNPC", "Frank") speaker:setOutfit("body=0,head=0,eyes=0,hair=5,dress=5") speaker:setPosition(2, 6)
To make scripting easier, Stendhal employs a master script & some helper objects & methods to handle the functionality mentioned above. An explanation of these objects & methods follows.
logger
Manages logging in Lua via the org.apache.log4j.Logger class.
Methods:
- logger:info(message)
- Prints an information level message to the console.
- message: Text to be printed.
- logger:warn(message)
- Prints a warning level message to the console.
- message: Text to be printed.
- logger:error(message)
- Prints an error level message to the console.
- message: Text to be printed.
Example usage:
local zone = "0_semos_city" if game:setZone(zone) then -- do something else logger:error("Could not set zone: " .. zone) end
properties
Defines functions for accessing Java system properties.
Methods:
- properties:getValue(p)
- Retrieves the value of a property.
- p: (string) Property name.
- returns: (string) Property value or `nil`.
- properties:enabled(p)
- Checks if a property is enabed.
- p: (string) Property name.
- returns: (boolean) `true` if enabled.
- properties:equals(p, v)
- Checks if a property is set to a specified value.
- p: (string) Property name.
- v: (string) Value to compare with.
- returns: (boolean) `true` if the value of the property is the same as `v`.
Examples usage:
-- example of only executing script contents on test server if not properties:enabed("stendhal.testserver") then do return end end
game
The main object that handles setting zone & adding entities to game.
Methods:
- game:add(object)
- Adds an RPObject instance to the current zone.
- object: Object to add.
- game:add(npc)
- Adds an NPC instance to the current zone.
- npc: NPC to add.
- game:add(creature, x, y)
- Adds a Creature instance to the current zone.
- creature: Creature to add.
- x: Horizontal position of where to add creature.
- y: Vertical position of where to add creature.
- game:remove(object)
- object:
- game:remove(npc)
- npc:
- game:addGameEvent(source, event, params)
- Adds a new GameEvent.
- source:
- event:
- params:
- game:setZone(name)
- Sets the current zone.
- name: String identifier for zone to be set as current zone.
- returns:
true
if zone was successfully set.
- game:setZone(zone)
- Sets the current zone.
- zone: StendhalRPZone instance to set as current zone.
- returns:
true
if zone was successfully set.
- game:getZone(object)
- Retrieves the zone where
object
is located. - object: The RPObject from which the zone should be retrieved.
- returns: StendhalRPZone or
null
if it doesn't exists
- game:getZone(name)
- Retrieves a zone by string ID.
- zoneName: Name of zone to retrieve.
- returns: StendhalRPZone or
null
if it doesn't exist.
- game:setMusic(filename, args)
- Sets the music for the currently selected zone.
- filename:
- File basename excluding .ogg extension.
- args:
- Lua table of key=value integer values.
- Valid keys:
- volume: Volume level (default: 100).
- x: The X coordinate of the sound source (default: 1).
- y: The Y coordinate of the sound source (default: 1).
- radius: The radius from which the music can be heard (default: 10000).
- game:playerIsInZone(player, zoneName)
- player:
- zoneName:
- returns:
boolean
- game:getCreatures()
- returns: An array of all available creatures.
- game:getCreature(clazz)
- Retrieves a Creature instance.
- clazz: String name of the creature.
- returns: Creature or
null
if doesn't exist.
- game:getItems()
- returns: Array list of available items.
- game:getItem(name)
- name:
- returns: Item instance or
null
if doesn't exist.
- game:modify(entity)
- entity:
- game:privateText(player, text)
- Sends a private text to a player.
- player: Player to receive the message.
- text: Message text to send to player.
- game:getMessage()
- returns:
String
entities
See also: StendhalAPI#Entities for public methods that can be performed on Entity
objects.
Methods:
- entities:getPlayer(name)
- Retrieves a logged in Player.
- name: (
String
) Name of player. - returns: Logged in Player or
null
.
- entities:getNPC(name)
- Retrieves an existing SpeakerNPC.
- name: (
String
) Name of NPC. - returns: SpeakerNPC instance or
null
.
- entities:getItem(name)
- Retrieves a registered Item.
- name: (
String
) Name of the item. - returns: Item instance or
null
if not a registered item.
- entities:getStackableItem(name)
- Retrieves a registered StackableItem.
- name: (
String
) Name of the item. - returns: StackableItem instance or
null
if not a registered stackable item.
- entities:createSpeakerNPC(name)
- Creates an interactive NPC.
- name: (
String
) Name of new NPC. - returns: New SpeakerNPC instance.
- entities:createSilentNPC()
- Creates a non-interactive NPC.
- returns: New SilentNPC instance.
- entities:setPath(entity, table, loop)
- DEPRECATED: path can now be set by directly calling the NPC's
setPath
method - Helper method for setting an NPC's path.
- entity: (
RPEntity
) Then entity whose path is being set. - table: (
LuaTable
) Table with list of coordinates representing nodes. - loop: (
boolean
) Iftrue
, the entity's path should loop.
- entities:setPathAndPosition(entity, table, loop) <nowiki>
- DEPRECATED: path can now be set by directly calling the NPC's
setPath
method - Helper function for setting an NPC's path & starting position.
- entity: (
RPEntity
) Then entity whose path is being set. - table: (
LuaTable
) Table with list of coordinates representing nodes. - loop: (
boolean
) Iftrue
, the entity's path should loop.
- entities:createSign(visible)
- Creates a new Sign entity.
- visible: (
boolean
) (optional) Iffalse
, the sign will not have a visual representation. - returns: New
Sign
instance.
- entities:createShopSign(name, title, caption, seller)
- Creates a new ShopSign entity.
- name: (
String
) The shop name. - title: (
String
) The sign title. - caption: (
String
) The caption above the table. - seller: (
boolean
)true
, if this sign is for items sold by an NPC (defaults totrue
ifnull
). - returns: New
ShopSign
instance.
- entities:summonCreature(table)
- Summons a creature into the area.
- table: Key-value table containing parameters for summoning creature.
- keys:
- name: (
string
) Name of creature to be summoned. - zone: (
string
) Name of zone where creature should be summoned. - x: (
int
) Horizontal position of summon location. - y: (
int
) Vertical position of summon location. - summoner: (
string
) (optional) Name of entity doing the summoning (used for logging game events). - raid: (
bool
) (optional) Whether or not the creature should be aRaidCreature
instance (default: true).
Lua Entity Classes
LuaSpeakerNPC
- Inherits: SpeakerNPC
Public methods:
- add (states, triggers, conditions, nextState, reply, actions)
- Additional method to support passing Lua data types as parameters.
- states : The conversation state(s) the entity should be in to trigger response. Can be ConversationStates enum value or
LuaTable
of ConversationStates. - triggers :
String
orLuaTable
of strings to trigger response. - conditions : Conditions to check for this response. Can be ChatCondition instance, a
LuaTable
of ChatCondition instances, or a function. - nextState : (
ConversationState
) Conversation state to set entity to after response. - reply : (
String
) The NPC's response ornull
. - actions : Actions to execute. Can be ChatAction instance, a
LuaTable
of ChatAction instances, or a function.
- setPath (table, loop)
- Set a path for this entity to follow.
- table : (
table
) Table of coordinates to set as path. Example:{{35, 79}, {35, 89}, {40, 89}}
- loop : (
boolean
) (optional) Iftrue
, entity should loop around to restart path when reaching the end.
- setPathAndPosition (table, loop)
- Set path & starting position for entity. The starting position is the first node in the path.
- table : (
table
) Table of coordinates to set as path. Example:{{35, 79}, {35, 89}, {40, 89}}
- loop : (
boolean
) (optional) Iftrue
, entity should loop around to restart path when reaching the end.
LuaSilentNPC
- Inherits: SilentNPC
Public methods:
- setPath (table, loop)
- Set a path for this entity to follow.
- table : (
table
) Table of coordinates to set as path. Example:{{35, 79}, {35, 89}, {40, 89}}
- loop : (
boolean
) (optional) Iftrue
, entity should loop around to restart path when reaching the end.
- setPathAndPosition (table, loop)
- Set path & starting position for entity. The starting position is the first node in the path.
- table : (
table
) Table of coordinates to set as path. Example:{{35, 79}, {35, 89}, {40, 89}}
- loop : (
boolean
) (optional) Iftrue
, entity should loop around to restart path when reaching the end.
entities.manager
This is simply the entity manager instance.
Public methods:
TODO
quests
Adds helper functions for creating & manipulating quests & exposes select public methods of the games.stendhal.server.core.rp.StendhalQuestSystem class.
Methods:
- quests:create(slotName, name)
- Creates a new quest.
- slotName: (optional) The string identifier for the quest.
- name: (optional) The human-readable name that can be shown in travel log.
- returns: New games.stendhal.server.core.scripting.lua.QuestHelper.LuaQuest instance.
- quests:load(quest)
- Adds a quest to the world.
- quest: The IQuest instance to be loaded.
- quests:unload(questName)
- Removes a quest from the world.
- questName: String name of the quest to be removed.
- quests:cache(quest)
- Caches a quest for loading at server startup.
- quest: IQuest instance to be loaded.
- aliases:
- quests:register
- quests:isLoaded(quest)
- Checks if a quest has been loaded.
- quest: IQuest instance to check.
- returns:
true
if the instance matches stored quests.
- quests:listAll(player)
- List all quests the player knows about.
- player: Player to create the report for.
- returns: String report.
- quests:list(player, questName)
- Creates a report on a specified quest for a player.
- player: Player to create the report for.
- questName: Name of quest to be reported.
- returns: String report.
- quests:listStates(player)
- Dumps the internal quest states for the specified player. This is used for the InspectAction.
- player: Player to create the report for.
- returns: String report.
- quests:getQuest(questName)
- Retrieves the IQuest object for a named quest.
- questName: Name of quest.
- returns:
IQuest
ornull
if doesn't exist.
- quests:getQuestFromSlot(questSlot)
- Retrieves the IQuest object for a quest.
- questSlot: Quest identifier string.
- returns:
IQuest
ornull
if doesn't exist.
- quests:getOpen(player)
- Retrieves a list of open quests from a player.
- player: Player instance to be checked.
- returns: List of string identifiers for open quests.
- quests:getCompleted(player)
- Retrieves a list of completed quests from a player.
- player: Player instance to be checked.
- returns: List of string identifiers for completed quests.
- quests:getIncomplete(player, region)
- Retrieves a list of incomplete quests in a specified region.
- player: Player instance to be checked.
- region: Region name/identifier.
- returns: List of string identifiers of incomplete quests in region.
- quests:getRepeatable(player)
- Retrieves a list of quests a player has completed, and can now do again.
- player: Player instance to be checked.
- returns:
- quests:getDescription(player, questName)
- Retrieves the description of a quest.
- player: Player instance to be checked.
- questName: Name of the quest.
- returns:
String
description.
- quests:getLevelWarning(player, questName)
- If the quest is too dangerous, add a warning unless the player has already completed it.
- player: Player instance to be checked.
- questName: Name of the quest.
- returns:
String
- quests:getProgressDetails(player, questeName)
- Retrieves details on the progress of the quest.
- player: Player instance to be checked.
- questName: Name of the quest.
- returns:
List<String>
- quests:getNPCNamesForUnstartedInRegionForLevel(player, region)
- Retrieves a list of the unique npc names for unstarted quests in a specified region.
- player: Player instance to be checked.
- region: Region to check in.
- returns:
List<String>
- quests:getDescriptionForUnstartedInRegionFromNPCName(player, region, name)
- Retrieves quest descriptions for unstarted quests in a specified region matching a specific NPC name.
- player: Player instance to be checked.
- region: Region to check in.
- name: Name of NPC.
- returns:
List<String>
quests.simple
A special class for creating a simple collect single item quest.
Methods:
- quests.simple:create(slotName, properName, npcName)
- slotName:
String
identifier to be used for quest. - properName: Human-readable name to be displayed in travel log.
- npcName: The NPC associated with the quest.
- returns: SimpleQuest instance.
SimpleQuest Object
games.stendhal.server.maps.quests.SimpleQuestCreator.SimpleQuest
Methods:
- setDescription(descr)
- descr: (
String
)
- setRepeatable(delay)
- delay: (
Integer
)
- setItemToCollect(itemName, quantity)
- itemName: (
String
) - quantity: (
int
)
- setXPReward(xp)
- xp: (
int
)
- setKarmaReward(karma)
- karma: (
double
)
- setKarmaAcceptReward(karma)
- karma: (
double
)
- setKarmaRejectReward(karma)
- karma: (
double
)
- addItemReward(itemName, quantity)
- itemName: (
String
) - quantity: (
int
) (optional)
- addStatReward(id, amount)
- id: (
String
) See IDs below. - amount: (
int
)- IDs:
- xp:
- def:
- atk:
- ratk:
- setVerboseReward(verbose)
- verbose: (
boolean
)
- setReply(id, reply)
- id: (
String
) See IDs below. - reply: (
String
)- IDs:
- request:
- accept:
- reject:
- reward:
- verbose_reward_prefix:
- already_active:
- missing:
- no_repeat:
- cooldown_prefix:
- setRegion(regionName)
- regionName: (
String
)
Also inherits methods from AbstractQuest:
Example:
-- create SimpleQuest instance local quest = simpleQuest:create("wood_for_lua", "Wood for Lua", "Lua") quest:setDescription("Lua needs help gathering wood.") quest:setRequestReply("I need help gathering some wood. Will you help me?") quest:setAcceptReply("Great!") quest:setRewardReply("Thank a bunch!") quest:setRejectReply("Fine! I don't need your help anyway.") quest:setItemToCollect("wood", 5) quest:setRepeatable(true) quest:setRepeatDelay(10) quest:setXPReward(50) quest:setKarmaReward(5.0) quest:addItemReward("rose", 3) quest:addItemReward("money", 100) quest:setRegion(Region.SEMOS_CITY) quests:register(quest)
conditions
Object for creating games.stendhal.server.entity.npc.ChatCondition instances.
Methods:
- conditions:create(function)
- Creates a custom ChatCondition.
- function: Lua function to be invoked when
ChatCondition.fire
is called. - returns: New
ChatCondition
instance.
- conditions:notCondition(condition)
- Creates a NotCondition.
- condition: Can be a
ChatCondition
,LuaValue
containing aChatCondition
instance, a Lua table ofChatCondition
instances, or a function. - returns: New
NotCondition
instance.
- conditions:andCondition(conditionList)
- Creates an AndCondition.
- conditionList: Lua table containing
ChatCondition
instances. - returns: New
AndCondition
instance.
actions
Object for creating games.stendhal.server.entity.npc.ChatAction instances.
Methods:
- actions:create(function)
- Creates a custom ChatAction.
- function: A Lua function to be executed when
ChatAction.fire
is called. - returns: New
ChatAction
instance.
- actions:multiple(actionList)
- Helper method for creating a MultipleActions instance.
- actionList: A Lua table containing ChatAction instances.
- returns: New
MultipleActions
instance.
merchants
Exposes merchant handling classes & functions to Lua.
Members:
- merchants.shops
- This is the games.stendhal.server.entity.npc.ShopList instance.
- public methods: TODO
Methods:
- merchants:add(merchantType, npc, prices, addOffer)
- Adds merchant behavior to a SpeakerNPC.
- merchantType: If set to "buyer", will add buyer behavior, otherwise will be "seller".
- npc: The SpeakerNPC to add the behavior to.
- prices: List of items & their prices (can be instance of either Map<String, Integer> or a Lua table).
- addOffer: If
true
, will add default replies for "offer" (default:true
).
- merchants:addSeller(npc, prices, addOffer)
- Adds seller behavior to a SpeakerNPC.
- npc: The SpeakerNPC to add the behavior to.
- prices: List of items & their prices (can be instance of either Map<String, Integer> or a Lua table).
- addOffer: If
true
, will add default replies for "offer" (default:true
).
- merchants:addBuyer(npc, prices, addOffer)
- Adds buyer behavior to a SpeakerNPC.
- npc: The SpeakerNPC to add the behavior to.
- prices: List of items & their prices (can be instance of either Map<String, Integer> or a Lua table).
- addOffer: If
true
, will add default replies for "offer" (default:true
).
arrays
Handles some conversion of Java arrays & lists to Lua tables.
Methods:
- arrays:toTable(list)
- Converts a Java array or list to a Lua table.
- list: Java array or list.
- returns: New Lua table with contents of
list
added.
grammar
Exposes the games.stendhal.common.grammar.Grammar parser instance to Lua.
Static Classes & Enumerations
ConversationStates
The games.stendhal.server.entity.npc.ConversationStates enum.
Example usage:
local npc = entities:createSpeakerNPC("foo") npc:setCurrentState(ConversationStates.IDLE)
ConversationPhrases
The games.stendhal.server.entity.npc.ConversationPhrases class.
Example usage:
local npc = entities:createSpeakerNPC("foo") npc:add(ConversationStates.IDLE, ConversationPhrases.GREETING_MESSAGES, nil, ConversationStates.ATTENDING, "Hello! How can I help you.", nil)
CollisionAction
The games.stendhal.server.entity.CollisionAction enum.
Example usage:
local npc = entities:createSilentNPC() npc:setCollisionAction(CollisionAction.STOP)
SkinColor
The games.stendhal.common.constants.SkinColor enum.
Example usage:
local npc = entities:createSpeakerNPC("foo") npc:setOutfit("body=0,head=0,hair=3,dress=5") npc:setOutfitColor("skin", SkinColor.DARK)
Direction
The games.stendhal.common.Direction enum.
Example usage:
local npc = entities:createSpeakerNPC("foo") npc:setDirection(Direction.DOWN)
DaylightPhase
The games.stendhal.server.core.rp.DaylightPhase enum.
Region
The games.stendhal.server.maps.Region class.
MathHelper
The games.stendhal.common.MathHelper class.
Color
The java.awt.Color class.
Example usage:
local npc = entities:createSpeakerNPC("foo") npc:setOutfit("body=0,head=0,hair=3,dress=5") npc:setOutfitColor("dress", Color.BLUE)
Supplemental Methods
A few convenience methods are added to make scripting easier.
String Manipulation
The following methods have been added to the built-in Lua string library.
- string.startsWith(st, prefix)
- Checks if a string begins with a set of characters.
- st: The string to be checked.
- prefix: The prefix to be compared with.
- returns:
true
ifprefix
matches the beginning characters ofst
.- aliases:
- string.beginsWith
- string.endsWith(st, suffix)
- Checks if a string ends with a set of characters.
- st: The string to be checked.
- suffix: The suffix to be compared with.
- returns:
true
ifsuffix
matches then end characters ofst
.
- string.isNumber(st)
- Checks if a string contains numeric characters only.
- st: The string to be checked.
- returns:
true
if all characters are numeric,false
otherwise.- aliases:
- string.isNumeric
- string.trim(st)
- Removes leading & trailing whitespace from a string.
- st: The string to be trimmed.
- returns: Trimmed string.
- string.ltrim(st)
- Removes leading whitespace from a string.
- st: The string to be trimmed.
- returns: Trimmed string.
- string.rtrim(st)
- Removes trailing whitespace from a string.
- st: The string to be trimmed.
- returns: Trimmed string.
- string.builder(st)
- Creates a new instance of java.lang.StringBuilder.
- st: (optional) String to append on instantiation.
- returns: new StringBuilder instance.
Table Manipulation
The following methods have been added to the built-in Lua table library.
- table.concat(tbl1, tbl2)
- Merges the contents of one table into another.
- tbl1: The table receiving the new content.
- tbl2: The table containing the content to be copied.
- table.contains (table, o)
- Checks if a table contains a value.
- table : (
table
) Table to be checked. - o : The object to check for.
- returns: (
boolean
)true
ifo
is intable
.
- table.clean(tbl)
- Removes
nil
values from a table. - tbl: The table to be cleaned.
- returns: Copy of
tbl
withnil
values removed.
- table.join (table, delim)
- Joins a table of strings into a string.
- table : (
table
) Table to be joined. - delim : (
string
) Character(s) to be used as separator. - returns: (
string
) The resulting string.