Cuberite Forum

Full Version: [Plugin] Homes Plugin!?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3
Hi folks,

even if i dont use MC-Server for some reason, i am interested in creating a plugin.

Right now i am in process with a new home plugin:

- multiworld support (same home count each world for each level)
- User ranking support with different user home limits
- config.ini
- using sqlite database

Commands:
- homeset <HOMENAME>
- home <HOMENAME>
- homedel <HOMENAME>


Is anybody interested in this? If yes, any requests for functions?

If the feedback is good enough i may will try to release it, otherwhise i only use it to learn bit lua.
I moved this to "Plugin / Lua Discussion".
+1Big Grin
So what exactly will the plugin do? I'm not familiar with this "home" topic.
(11-25-2014, 06:23 AM)xoft Wrote: [ -> ]So what exactly will the plugin do? I'm not familiar with this "home" topic.

Player will be able to save positions and teleport to that save ones. Mainly its a simple but individual teleporting function for each player.

In config you can set the max amount of "homes" per world for each rank
Sounds fun, enjoy coding this Smile And don't forget to document it just the way you documented it for me.
Ok, still doing this, but i ran into an issue.

I want to do a sqlite query to get a list of tables. But somehow i am not able to return the query result.

The query function gets the playername as argument and should return a table of tables (a_List):
function cStorage:GetList( player )
    
    local a_List = {}
    
    -- get data from query
    function getResult(udata, cols, values, names)
        
        for i=1,cols do print('',names[i],values[i]) end
        
        return 0
    end
    
    -- get all player homes
    local sql = "SELECT * FROM " .. PluginName .. " WHERE Player='" .. player .. "'"
    self:DBExec(sql, getResult) 
    return a_List 
end


This is a sample result which should go into the table:
        ID      1
        Player  no_use_for_name
        Name    default
        World   world
        X       -68.877814274714
        Y       64
        Z       205.5105932393
        ID      2
        Player  no_use_for_name
        Name    hill
        World   world
        X       -66.54712734459
        Y       64
        Z       209.61457523444
        ID      3
        Player  no_use_for_name
        Name    hil
        World   world
        X       -66.54712734459
        Y       64
        Z       209.61457523444

I would expect something like:
a_List = {{row1,...}, {row2,...}...}

But maybe there is a better way?! I tried several things already, but didnt get it yet. Returning a single result is easy.

Any help would be nice
You're not putting anything into the a_List variable anywhere. The getResult() function should add an item into it. Most likely like this (note the use of the nrows() function instead of DBExec() ):
local theResult = {}
DB:nrows(
  "SELECT * FROM " .. PluginName .. " WHERE Player = \"" .. player .. "\"",
  function getResult(a_RowValues)
    -- add the returned row to our result table:
    table.insert(theResult, a_RowValues)
  end
)
return theResult

This will return the table as an array of dictionaries:
theResult = { {col1 = val1A, col2 = val2A}, {col1 = val1B, col2 = val2B}, {col1 = val1C, col2 = val2C}, ...}

EDIT: No, sorry, this code won't work either.
Where is your DBExec function coming from? Are you using one of the sqlite wrappers from any of the plugins?
If so, use the ExecuteStatement() function instead, it's more high-level and provides the right interface that you need, the code I posted earlier will work with ExecuteStatement, if you add a middle parameter to it:
local theResult = {}
DB:ExecuteStatement(
  "SELECT * FROM " .. PluginName .. " WHERE Player = ?",  -- Note the use of placeholders for increased safety
  { playerName },  -- Placeholders will be replaced with values from this table
  function getResult(a_RowValues)  -- This callback will be called for each retrieved DB row
    -- add the returned row to our result table:
    table.insert(theResult, a_RowValues)
  end
)
return theResult
Pages: 1 2 3