User Tools

Site Tools


lua:sharedtable

'shared' table

Any prog/script runs inside a script environment. See script environemnts for more details. This means that even “global” variables or functions declared in a script are only global to its environment. To overcome this limitation we have the 'shared' table to share data and functions between all scripts in an area.

The 'shared' table is a table that is common to all environments associated with game objects in a certain area. This means that each mob/room/object in a given area that runs a script that points to 'shared' will actually be referencing the same table, and the same is true for the area itself.

Using the 'shared' table is as simple as using a typical lua table:

​shared.message="Hello world!"

One can clear/reset the shared table by simply setting its value as an empty table:

shared={}

Note that because players do not belong to a specific area, scripts run in a player environment do not have access to any shared table. This is important to consider when running scripts with luai/mprun or calling CH:loadprog(), CH:loadfunction, or CH:loadscript.

Shared functions

Just like any other lua table, 'shared' table can also contain functions. Thus 'shared' table is an ideal place to store helper functions that would be used in different scripts throughout an area.

-- FUNCTION FOR DETERMINING GUILD AFFILIATION
-- send ch.class
function shared.find_guild(class)
  if class == "warrior"
  or class == "gladiator"
  or class == "paladin"
  or class == "samurai" then
    return "fighter"
  elseif class == "mage"
  or class == "illusionist"
  or class == "necromancer" then
    return "wizard"
  elseif class == "cleric"
  or class == "monk"
  or class == "templar" then
    return "cleric"
  elseif class == "thief"
  or class == "assassin"
  or class == "ninja"
  or class == "bard" then
    return "rogue"
  elseif class == "gunslinger" then
    return "gunslinger"
  elseif class == "ranger" then
    return "ranger"
  end
end

Tables in 'shared' table

We can also put tables inside 'shared' table just as easily. This will be helpful when you need to share table formatted data between your scripts. This is also a way to separate scripts and variables into different namespaces/modules as needed.

shared.somevalues = {
    bluecount=3,
    yellowcount=5,
    orangecount=1
}
 
shared.module1={}
local good_vnums={1234, 1235, 1246}
function shared.module1.check_vnum(vnum)
    for k,v in pairs(good_vnums) do
        if v==vnum then return true
    end
    return false
end

Loading shared code

When using shared table to store shared code such as helper functions, a typical way to do this is to put all the functions in a single prog and call this prog from any prog that uses the helper functions. Additionally, it is good practice to insure the code is only loaded once.

Example using a loaded flag:

-- mprog 1234
if shared.helpers_loaded then return
 
function shared.helper1()
    echo("helper 1 test test test")
end
 
function shared.helper2()
    echo("helper 2 test test test")
end
 
shared.helpers_loaded=true
-- mprog 1235
loadprog(1234)
shared.helper1()
-- mprog 1236
loadprog(1234)
shared.helper2()

Similar example using a module style:

-- mprog 1234
if shared.module1 then return
 
local module1={}
 
module1.helper1 = function()
    echo("helper 1 test test test")
end
 
module1.helper2 =  function()
    echo("helper 2 test test test")
end
 
shared.module1 = module1

Sharing with different prog types

All prog types have access to 'shared' table (mprog/oprog/aprog/rprog). However, if all your shared code is in mprog 1234 (as above example), only mprogs can easily load this code using loadprog. Loadprog called from oprog can only load oprogs, and similarly with aprog and rprog.

One strategy to overcome this limitation is to keep all the shared code in an aprog and load it from the different prog types accordingly:

-- aprog 1234, shared helper functions for all prog types
if shared.helpers_loaded then return
 
function shared.helper1()
    echo("helper 1 test test test")
end
 
function shared.helper2()
    echo("helper 2 test test test")
end
 
shared.helpers_loaded=true
-- aprog 1235
loadprog(1234)
shared.helper1()
shared.helper2()
-- mprog 1234
mob.proto.area:loadprog(1234)
shared.helper1()
shared.helper2()
-- oprog 1234
obj.proto.area:loadprog(1234)
shared.helper1()
shared.helper2()
-- rprog 1234
room.area:loadprog(1234)
shared.helper1()
shared.helper2()

Using 'loadscript' is also an option:

-- helpers_example.lua, shared helper functions for all prog types
if shared.helpers_loaded then return
 
function shared.helper1()
    echo("helper 1 test test test")
end
 
function shared.helper2()
    echo("helper 2 test test test")
end
 
shared.helpers_loaded=true
-- aprog 1235
loadscript('vodur','helpers_example')
shared.helper1()
shared.helper2()
-- mprog 1234
loadscript('vodur','helpers_example')
shared.helper1()
shared.helper2()
-- oprog 1234
loadscript('vodur','helpers_example')
shared.helper1()
shared.helper2()
-- rprog 1234
loadscript('vodur','helpers_example')
shared.helper1()
shared.helper2()
lua/sharedtable.txt · Last modified: 2015/09/28 16:36 by vodur