Move helpers and chat commands to separate files

This commit is contained in:
rubenwardy 2015-06-10 17:45:18 +01:00
parent 85a40d2488
commit 85efc67049
4 changed files with 128 additions and 148 deletions

173
api.lua
View File

@ -18,6 +18,11 @@ function awards.save()
end end
end end
function awards.init()
awards.players = awards.load()
awards.def = {}
end
function awards.load() function awards.load()
local file = io.open(minetest.get_worldpath().."/awards.txt", "r") local file = io.open(minetest.get_worldpath().."/awards.txt", "r")
if file then if file then
@ -29,77 +34,15 @@ function awards.load()
return {} return {}
end end
awards.players = awards.load() awards.init()
function awards.player(name)
return awards.players[name]
end
-- A table of award definitions
awards.def = {}
function awards.tbv(tb,value,default)
if not default then
default = {}
end
if not tb or type(tb) ~= "table" then
if not value then
value = "[NULL]"
end
minetest.log("error", "awards.tbv - table "..dump(value).." is null, or not a table! Dump: "..dump(tb))
return
end
if not value then
error("[ERROR] awards.tbv was not used correctly!\n"..
"Value: '"..dump(value).."'\n"..
"Dump:"..dump(tb))
return
end
if not tb[value] then
tb[value] = default
end
end
function awards.assertPlayer(playern)
awards.tbv(awards.players, playern)
awards.tbv(awards.players[playern], "name", playern)
awards.tbv(awards.players[playern], "unlocked")
awards.tbv(awards.players[playern], "place")
awards.tbv(awards.players[playern], "count")
awards.tbv(awards.players[playern], "craft")
awards.tbv(awards.players[playern], "deaths", 0)
awards.tbv(awards.players[playern], "joins", 0)
awards.tbv(awards.players[playern], "chats", 0)
end
-- Load files -- Load files
dofile(minetest.get_modpath("awards").."/helpers.lua")
dofile(minetest.get_modpath("awards").."/triggers.lua") dofile(minetest.get_modpath("awards").."/triggers.lua")
-- API Functions -- API Functions
function awards._additional_triggers(name, data_table) function awards._additional_triggers(name, data_table)
-- To add triggers in another mod, you should override this function -- Depreciated!
-- If the code can't handle the trigger passed, then call the last value of _additional_triggers
--[[
local add_trig = awards._additional_triggers
awards._additional_triggers = function(name, data_table)
if data_table.trigger.type == "trigger" then
local tmp = {
award = name,
node = data_table.trigger.node,
target = data_table.trigger.target,
}
table.insert(awards.onTrigger,tmp)
elseif data_table.trigger.type == "trigger2" then
local tmp = {
award = name,
node = data_table.trigger.node,
target = data_table.trigger.target,
}
table.insert(awards.onTrigger2,tmp)
else
add_trig(name, data_table)
end
end
]]--
end end
function awards.register_achievement(name,data_table) function awards.register_achievement(name,data_table)
-- see if a trigger is defined in the achievement definition -- see if a trigger is defined in the achievement definition
@ -158,7 +101,7 @@ function awards.register_achievement(name,data_table)
if data_table.custom_announce == nil or data_table.custom_announce == "" then if data_table.custom_announce == nil or data_table.custom_announce == "" then
data_table.custom_announce = "Achievement Unlocked:" data_table.custom_announce = "Achievement Unlocked:"
end end
-- add the achievement to the definition table -- add the achievement to the definition table
data_table.name = name data_table.name = name
awards.def[name] = data_table awards.def[name] = data_table
@ -204,7 +147,7 @@ end
function awards.give_achievement(name, award) function awards.give_achievement(name, award)
-- Access Player Data -- Access Player Data
local data = awards.players[name] local data = awards.players[name]
-- Perform checks -- Perform checks
if not data then if not data then
return return
@ -290,7 +233,7 @@ function awards.give_achievement(name, award)
position = {x = 0.5, y = 0}, position = {x = 0.5, y = 0},
offset = {x = 0, y = 40}, offset = {x = 0, y = 40},
alignment = {x = 0, y = -1} alignment = {x = 0, y = -1}
}) })
local three = player:hud_add({ local three = player:hud_add({
hud_elem_type = "text", hud_elem_type = "text",
name = "award_title", name = "award_title",
@ -300,7 +243,7 @@ function awards.give_achievement(name, award)
position = {x = 0.5, y = 0}, position = {x = 0.5, y = 0},
offset = {x = 30, y = 100}, offset = {x = 30, y = 100},
alignment = {x = 0, y = -1} alignment = {x = 0, y = -1}
}) })
local four = player:hud_add({ local four = player:hud_add({
hud_elem_type = "image", hud_elem_type = "image",
name = "award_icon", name = "award_icon",
@ -317,50 +260,15 @@ function awards.give_achievement(name, award)
player:hud_remove(four) player:hud_remove(four)
end) end)
end end
-- record this in the log -- record this in the log
minetest.log("action", name.." has unlocked award "..title) minetest.log("action", name.." has unlocked award "..title)
-- save playertable -- save playertable
awards.save() awards.save()
end end
end end
-- List a player's achievements
minetest.register_chatcommand("list_awards", {
params = "obsolete",
description = "list_awards: obsolete. Use /awards",
func = function(name, param)
minetest.chat_send_player(name, "This command has been made obsolete. Use /awards instead.")
awards.showto(name, name, nil, false)
end
})
minetest.register_chatcommand("awards", {
params = "",
description = "awards: list awards",
func = function(name, param)
awards.showto(name, name, nil, false)
end
})
minetest.register_chatcommand("cawards", {
params = "",
description = "awards: list awards in chat",
func = function(name, param)
awards.showto(name, name, nil, true)
end
})
minetest.register_chatcommand("awd", {
params = "award name",
description = "awd: Details of awd gotten",
func = function(name, param)
local def = awards.def[param]
if def then
minetest.chat_send_player(name,def.title..": "..def.description)
else
minetest.chat_send_player(name,"Award not found.")
end
end
})
--[[minetest.register_chatcommand("gawd", { --[[minetest.register_chatcommand("gawd", {
params = "award name", params = "award name",
description = "gawd: give award to self", description = "gawd: give award to self",
@ -369,26 +277,6 @@ minetest.register_chatcommand("awd", {
end end
})]]-- })]]--
function awards._order_awards(name)
local done = {}
local retval = {}
local player = awards.player(name)
if player and player.unlocked then
for _,got in pairs(player.unlocked) do
if awards.def[got] then
done[got] = true
table.insert(retval,{name=got,got=true})
end
end
end
for _,def in pairs(awards.def) do
if not done[def.name] then
table.insert(retval,{name=def.name,got=false})
end
end
return retval
end
function awards.showto(name, to, sid, text) function awards.showto(name, to, sid, text)
if name == "" or name == nil then if name == "" or name == nil then
name = to name = to
@ -404,7 +292,7 @@ function awards.showto(name, to, sid, text)
local def = awards.def[str] local def = awards.def[str]
if def then if def then
if def.title then if def.title then
if def.description then if def.description then
minetest.chat_send_player(to, def.title..": "..def.description) minetest.chat_send_player(to, def.title..": "..def.description)
else else
minetest.chat_send_player(to, def.title) minetest.chat_send_player(to, def.title)
@ -418,9 +306,9 @@ function awards.showto(name, to, sid, text)
if sid == nil or sid < 1 then if sid == nil or sid < 1 then
sid = 1 sid = 1
end end
local formspec = "size[11,5]" local formspec = "size[11,5]"
local listofawards = awards._order_awards(name) local listofawards = awards._order_awards(name)
-- Sidebar -- Sidebar
if sid then if sid then
local item = listofawards[sid+0] local item = listofawards[sid+0]
@ -429,7 +317,7 @@ function awards.showto(name, to, sid, text)
formspec = formspec .. "label[1,2.75;Secret Award]".. formspec = formspec .. "label[1,2.75;Secret Award]"..
"image[1,0;3,3;unknown.png]" "image[1,0;3,3;unknown.png]"
if def and def.description then if def and def.description then
formspec = formspec .. "label[0,3.25;Unlock this award to find out what it is]" formspec = formspec .. "label[0,3.25;Unlock this award to find out what it is]"
end end
else else
local title = item.name local title = item.name
@ -447,13 +335,13 @@ function awards.showto(name, to, sid, text)
formspec = formspec .. "label[1,2.75;"..title..status.."]".. formspec = formspec .. "label[1,2.75;"..title..status.."]"..
"image[1,0;3,3;"..icon.."]" "image[1,0;3,3;"..icon.."]"
if def and def.description then if def and def.description then
formspec = formspec .. "label[0,3.25;"..def.description.."]" formspec = formspec .. "label[0,3.25;"..def.description.."]"
end end
end end
end end
-- Create list box -- Create list box
formspec = formspec .. "textlist[4.75,0;6,5;awards;" formspec = formspec .. "textlist[4.75,0;6,5;awards;"
local first = true local first = true
for _,award in pairs(listofawards) do for _,award in pairs(listofawards) do
local def = awards.def[award.name] local def = awards.def[award.name]
@ -462,14 +350,14 @@ function awards.showto(name, to, sid, text)
formspec = formspec .. "," formspec = formspec .. ","
end end
first = false first = false
if def.secret and not award.got then if def.secret and not award.got then
formspec = formspec .. "#ACACACSecret Award" formspec = formspec .. "#ACACACSecret Award"
else else
local title = award.name local title = award.name
if def and def.title then if def and def.title then
title = def.title title = def.title
end end
if award.got then if award.got then
formspec = formspec .. minetest.formspec_escape(title) formspec = formspec .. minetest.formspec_escape(title)
else else
@ -477,7 +365,7 @@ function awards.showto(name, to, sid, text)
end end
end end
end end
end end
formspec = formspec .. ";"..sid.."]" formspec = formspec .. ";"..sid.."]"
-- Show formspec to user -- Show formspec to user
@ -495,11 +383,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local name = player:get_player_name() local name = player:get_player_name()
if fields.awards then if fields.awards then
local event = minetest.explode_textlist_event(fields.awards) local event = minetest.explode_textlist_event(fields.awards)
if event.type == "CHG" then if event.type == "CHG" then
awards.showto(name,name,event.index,false) awards.showto(name,name,event.index,false)
end end
end end
return true return true
end) end)

37
chat_commands.lua Normal file
View File

@ -0,0 +1,37 @@
minetest.register_chatcommand("list_awards", {
params = "obsolete",
description = "list_awards: obsolete. Use /awards",
func = function(name, param)
minetest.chat_send_player(name, "This command has been made obsolete. Use /awards instead.")
awards.showto(name, name, nil, false)
end
})
minetest.register_chatcommand("awards", {
params = "",
description = "awards: list awards",
func = function(name, param)
awards.showto(name, name, nil, false)
end
})
minetest.register_chatcommand("cawards", {
params = "",
description = "awards: list awards in chat",
func = function(name, param)
awards.showto(name, name, nil, true)
end
})
minetest.register_chatcommand("awd", {
params = "award name",
description = "awd: Details of awd gotten",
func = function(name, param)
local def = awards.def[param]
if def then
minetest.chat_send_player(name,def.title..": "..def.description)
else
minetest.chat_send_player(name,"Award not found.")
end
end
})

56
helpers.lua Normal file
View File

@ -0,0 +1,56 @@
function awards.tbv(tb,value,default)
if not default then
default = {}
end
if not tb or type(tb) ~= "table" then
if not value then
value = "[NULL]"
end
minetest.log("error", "awards.tbv - table "..dump(value).." is null, or not a table! Dump: "..dump(tb))
return
end
if not value then
error("[ERROR] awards.tbv was not used correctly!\n"..
"Value: '"..dump(value).."'\n"..
"Dump:"..dump(tb))
return
end
if not tb[value] then
tb[value] = default
end
end
function awards.assertPlayer(playern)
awards.tbv(awards.players, playern)
awards.tbv(awards.players[playern], "name", playern)
awards.tbv(awards.players[playern], "unlocked")
awards.tbv(awards.players[playern], "place")
awards.tbv(awards.players[playern], "count")
awards.tbv(awards.players[playern], "deaths", 0)
awards.tbv(awards.players[playern], "joins", 0)
awards.tbv(awards.players[playern], "chats", 0)
end
function awards.player(name)
return awards.players[name]
end
function awards._order_awards(name)
local done = {}
local retval = {}
local player = awards.player(name)
if player and player.unlocked then
for _,got in pairs(player.unlocked) do
if awards.def[got] then
done[got] = true
table.insert(retval,{name=got,got=true})
end
end
end
for _,def in pairs(awards.def) do
if not done[def.name] then
table.insert(retval,{name=def.name,got=false})
end
end
return retval
end

View File

@ -13,6 +13,7 @@ else
end end
dofile(minetest.get_modpath("awards").."/api.lua") dofile(minetest.get_modpath("awards").."/api.lua")
dofile(minetest.get_modpath("awards").."/chat_commands.lua")
-- Light it up -- Light it up
awards.register_achievement("award_lightitup",{ awards.register_achievement("award_lightitup",{
@ -328,7 +329,7 @@ awards.register_onDeath(function(player,data)
local pos = player:getpos() local pos = player:getpos()
if pos and minetest.find_node_near(pos, 2, "fire:basic_flame") ~= nil then if pos and minetest.find_node_near(pos, 2, "fire:basic_flame") ~= nil then
return "award_burn" return "award_burn"
end end
return nil return nil
end) end)
@ -341,7 +342,7 @@ awards.register_onDeath(function(player,data)
local pos = player:getpos() local pos = player:getpos()
if pos and minetest.find_node_near(pos, 2, "default:lava_flowing") ~= nil then if pos and minetest.find_node_near(pos, 2, "default:lava_flowing") ~= nil then
return "award_in_the_flow" return "award_in_the_flow"
end end
return nil return nil
end) end)
@ -354,7 +355,7 @@ awards.register_onDeath(function(player,data)
local pos = player:getpos() local pos = player:getpos()
if pos and minetest.find_node_near(pos, 5, "default:stone_with_diamond") ~= nil then if pos and minetest.find_node_near(pos, 5, "default:stone_with_diamond") ~= nil then
return "award_this_is_sad" return "award_this_is_sad"
end end
return nil return nil
end) end)
@ -367,7 +368,6 @@ awards.register_onDeath(function(player,data)
local pos = player:getpos() local pos = player:getpos()
if pos and minetest.find_node_near(pos, 5, "bones:bones") ~= nil then if pos and minetest.find_node_near(pos, 5, "bones:bones") ~= nil then
return "award_the_stack" return "award_the_stack"
end end
return nil return nil
end) end)