StendhalScripting/Lua: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
imported>AntumDeluge |
imported>AntumDeluge →Stendhal Application: update for changes to Lua engine |
||
| Line 224: | Line 224: | ||
= Stendhal Application = |
= Stendhal Application = |
||
== Objects and Functions == |
|||
The following objects & functions are exposed to the Lua engine: |
|||
=== 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: |
|||
<pre> |
|||
-- 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 |
|||
</pre> |
|||
Example of creating an object instance: |
|||
<pre> |
|||
-- 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) |
|||
</pre> |
|||
To make scripting easier, Stendhal employs a {{StendhalFile|master|src/games/stendhal/server/core/scripting/lua/init.lua|master script}} & some helper objects & methods to handle the functionality mentioned above. An explanation of these objects & methods follows. |
|||
=== game === |
|||
The main object that handles setting zone & adding entities to game. |
|||
Methods: |
|||
* <code>game:add(object)</code> - Adds an object to the current zone. |
|||
* <code>game:setZone(name)</code> - Sets the current zone. |
|||
* <code>game:createSign(visible)</code> - Creates a new {{StendhalFile|master|src/games/stendhal/server/entity/mapstuff/sign/Sign.java|Sign}} instance. |
|||
* <code>game:createShopSign(name, title, caption, seller)</code> - Creates a new {{StendhalFile|master|src/games/stendhal/server/entity/mapstuff/sign/ShopSign.java|ShopSign}} instance. |
|||
=== npcHelper === |
|||
This object helps to create instances of {{StendhalFile|master|src/games/stendhal/server/entity/npc/SpeakerNPC.java|SpeakerNPC}} & {{StendhalFile|master|src/games/stendhal/server/entity/npc/SilentNPC.java|SilentNPC}} classes. |
|||
Methods: |
|||
* <code>npcHelper:createSpeakerNPC(name)</code> - Creates a new SpeakerNPC. |
|||
* <code>npcHelper:createSilentNPC()</code> - Creates a new SilentNPC. |
|||
* <code>npcHelper:setPath(npc, path, loop)</code> - Sets the path for the specified NPC. |
|||
* <code>npcHelper:setPathAndPosition(npc, path, loop)</code> - Sets the path & starting position of the specified NPC. |
|||
* <code>npcHelper:addMerchant(merchantType, npc, items, offer)</code> - Adds merchant behavior to <code>npc</code> of either a buyer or seller defined by <code>merchantType</code>. |
|||
* <code>npcHelper:addSeller(npc, items, offer)</code> - Adds seller merchant behavior to <code>npc</code>. |
|||
* <code>npcHelper:addBuyer(npc, items, offer)</code> - Adds buyer merchant behavior to <code>npc</code>. |
|||
== Zones == |
== Zones == |
||
| Line 289: | Line 233: | ||
<pre> |
<pre> |
||
game:setZone("0_semos_city") |
game:setZone("0_semos_city") |
||
</pre> |
|||
The logger is exposed to Lua via the <code>logger</code> object: |
|||
<pre> |
|||
local zone = "0_semos_city" |
|||
if game:setZone(zone) then |
|||
-- do something |
|||
else |
|||
logger:error("Could not set zone: " .. zone) |
|||
end |
|||
</pre> |
</pre> |
||
| Line 328: | Line 261: | ||
=== Signs === |
=== Signs === |
||
Signs can be created with <code> |
Signs can be created with <code>entities:createSign</code> and <code>entities:createShopSign</code>: |
||
<pre> |
<pre> |
||
| Line 334: | Line 267: | ||
if game:setZone(zone) then |
if game:setZone(zone) then |
||
-- create the sign instance |
-- create the sign instance |
||
local sign = |
local sign = entities:createSign() |
||
sign:setEntityClass("signpost") |
sign:setEntityClass("signpost") |
||
sign:setPosition(12, 55) |
sign:setPosition(12, 55) |
||
| Line 348: | Line 281: | ||
=== NPCs === |
=== NPCs === |
||
Use the <code> |
Use the <code>entities:createSpeakerNPC</code> method to create an interactive NPC: |
||
<pre> |
<pre> |
||
| Line 354: | Line 287: | ||
if game:setZone(zone) then |
if game:setZone(zone) then |
||
-- Use helper object to create a new NPC |
-- Use helper object to create a new NPC |
||
local npc = |
local npc = entities:createSpeakerNPC("Lua") |
||
npc:setEntityClass("littlegirlnpc") |
npc:setEntityClass("littlegirlnpc") |
||
npc:setPosition(10, 55) |
npc:setPosition(10, 55) |
||
| Line 368: | Line 301: | ||
-- Use helper object to create NPC path |
-- Use helper object to create NPC path |
||
entities:setPath(npc, nodes) |
|||
-- Dialogue |
-- Dialogue |
||
| Line 385: | Line 318: | ||
A simple example of adding a chat transition can be done without any special functionality: |
A simple example of adding a chat transition can be done without any special functionality: |
||
<pre> |
<pre> |
||
local frank = |
local frank = entities:createSpeakerNPC("Frank") |
||
frank:add(ConversationStates.IDLE, |
frank:add(ConversationStates.IDLE, |
||
ConversationPhrases.GREETING_MESSAGES, |
ConversationPhrases.GREETING_MESSAGES, |
||
| Line 394: | Line 327: | ||
</pre> |
</pre> |
||
This simply adds a response to saying "hello" & sets the NPC to attend to the player. |
This simply adds a response to saying "hello" & sets the NPC to attend to the player (equivalent of <code>frank:addGreeting("Hello")</code>). |
||
For more complicated behavior, we need to use some helper methods. If we want to check a condition we use the <code>newCondition</code> global function: |
For more complicated behavior, we need to use some helper methods. If we want to check a condition we use the <code>newCondition</code> global function: |
||
| Line 408: | Line 341: | ||
In this scenario, the NPC will only respond if the player is carrying <item>money</item>. |
In this scenario, the NPC will only respond if the player is carrying <item>money</item>. |
||
A NotCondition instance can be created with the <code>newNotCondition</code> global function: |
A NotCondition instance can be created with the <code>newNotCondition</code> global function or using the <code>conditions.not</code> method: |
||
Example usage: |
|||
<pre> |
<pre> |
||
-- using newNotCondition |
|||
newNotCondition |
local condition = newNotCondition("PlayerHasItemWithHimCondition", "money") |
||
-- using conditions.not |
|||
local condition = conditions.not(newCondition("PlayerHasItemWithHimCondition", "money") |
|||
</pre> |
</pre> |
||
| Line 464: | Line 403: | ||
==== Adding Merchant Behavior ==== |
==== Adding Merchant Behavior ==== |
||
The <code>merchants</code> object is used for adding merchant behavior (buying/selling) to an NPC. |
|||
Merchant behavior ''(buying/selling)'' can be set with one of the following helper functions: |
|||
* ''npcHelper:addMerchant(merchantType, npc, prices, addOffer)'' |
|||
* ''npcHelper:addBuyer(npc, prices, addOffer)'' |
|||
* ''npcHelper:addSeller(npc, prices, addOffer)'' |
|||
** Arguments: |
|||
*** ''merchantType:'' (string) If set to "buyer", will add buyer behavior, otherwise will be "seller" (may change type to boolean in future). |
|||
*** ''npc:'' (SpeakerNPC) The NPC to add the behavior to. |
|||
*** ''prices:'' (Map<String, Integer> or LuaTable) List of items & their prices. |
|||
*** ''addOffer:'' (boolean) If <code>true</code>, will add default replies for "offer". |
|||
Example of adding seller behavior to an NPC: |
Example of adding seller behavior to an NPC: |
||
<pre> |
<pre> |
||
if game:setZone("0_semos_city") then |
if game:setZone("0_semos_city") then |
||
local frank = |
local frank = entities.createSpeakerNPC("Frank") |
||
merchants:addSeller(frank, merchants.shops:get("shopname"), true) |
|||
game:add(frank) |
game:add(frank) |
||
| Line 513: | Line 444: | ||
Then add the seller behavior using the custom list: |
Then add the seller behavior using the custom list: |
||
<pre> |
<pre> |
||
merchants:addSeller(frank, priceList, true) |
|||
</pre> |
</pre> |
||
== System Properties == |
== System Properties == |
||
Java's system properties are exposed to Lua with the <code> |
Java's system properties are exposed to Lua with the <code>properties</code> object. |
||
Examples: |
Examples: |
||
<pre> |
<pre> |
||
-- property state |
-- property state |
||
if |
if properties:enabled("stendhal.testserver") then |
||
print("Test server enabled") |
print("Test server enabled") |
||
if |
if properties:equals("stendhal.testserver", "junk") then |
||
print("Junk enabled") |
print("Junk enabled") |
||
else |
else |
||
| Line 535: | Line 466: | ||
-- property value |
-- property value |
||
local prop = |
local prop = properties:getValue("stendhal.testserver") |
||
if prop ~= nil then |
if prop ~= nil then |
||
print("Test server enabled") |
print("Test server enabled") |
||