1
0
mirror of https://github.com/sys4-fr/server-nalc.git synced 2025-06-28 14:16:06 +02:00

Better quests, still testing

This commit is contained in:
Wouters Dorian
2015-07-27 01:49:32 +02:00
parent cc2afac4df
commit 7dfa469b59
19 changed files with 1030 additions and 383 deletions

View File

@ -1,34 +1,85 @@
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
--- HIGLY UNFINISHED!!!!
-- GOT THAT ENOUGH?
-- - gravgun
mff.quests = {}
mff.QPREFIX = "mff_quests:"
mff.QNOPREFIX = function(s) return s:sub(mff.QPREFIX:len()+1) end
mff.quests.quests = {
testdiggydiggyhole = {
title = "Dig 10 stone nodes",
max = 10,
desc = "As long as you can not dig stone, you are not a real miner.",
periodicity = 10,
objective = {
dig = {"default:stone"}
still_testing_quests = {
title = "Stone digger",
description = "TEST QUEST!\nGet a mithril ingot at the end!",
repeating = 60*60*24,
awards = {["moreores:mithril_ingot"] = 1},
tasks = {
diggy = {
title = "Dig 99 stone",
description = "Show you can dig through stone",
max = 99,
objective = {
dig = {"default:stone"}
}
},
diggysrevenge = {
title = "Dig the last stone",
description = "You really thought 99 was a good number? Dig the last one.",
requires = {"diggy"},
max = 1,
objective = {
dig = {"default:stone"}
}
}
}
},
still_testing_quests2 = {
title = "Coal digger",
description = "TEST QUEST!\nGet a mithril ingot at the end!",
repeating = 60*60*24,
awards = {["moreores:mithril_ingot"] = 1},
tasks = {
diggy = {
title = "Dig 19 coal",
description = "Get the fire mineral",
max = 19,
objective = {
dig = {"default:stone_with_coal"}
}
},
diggysrevenge = {
title = "Dig the last one",
description = "I do this because of a technical issue, sorry",
requires = {"diggy"},
max = 1,
objective = {
dig = {"default:stone_with_coal"}
}
}
}
},
still_testing_quests3 = {
title = "Shiny diamonds",
description = "TEST QUEST!\nGet a mithril ingot at the end!",
repeating = 60*60*24,
awards = {["moreores:mithril_ingot"] = 1},
tasks = {
diggy = {
title = "Dig 4 diamond",
description = "Yarr harr fiddle dee-dee, being a pirate is alright with me! Do what you want 'cause a pirate is free, you are a pirate! Go get the precious booty... underground. Mine it :/",
max = 4,
objective = {
dig = {"default:stone_with_diamond"}
}
},
diggysrevenge = {
title = "Ultimate calbon atom alignement",
description = "Really, we must fix this",
requires = {"diggy"},
max = 1,
objective = {
dig = {"default:stone_with_diamond"}
}
}
}
}
}
mff.quests.quest_status = {}
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
@ -39,82 +90,49 @@ function table.contains(table, element)
end
function mff.quests.start_quest(playername, qname, meta)
mff.quests.quest_status[playername][qname] = 0
quests.start_quest(playername, mff.QPREFIX .. qname, meta)
end
function mff.quests.restart_periodic_quest(playername, qname)
mff.quests.start_quest(playername, qname)
end
function mff.quests.start_periodicity_timer(playername, qname)
local tstamp = -mff.quests.quest_status[playername][qname]
minetest.after(tstamp-os.time(), mff.quests.restart_periodic_quest, playername, qname)
end
function mff.quests.start_all_periodicity_timers(playername)
local qstatus = mff.quests.quest_status[playername]
for qname, _ in pairs(qstatus) do
mff.quests.start_periodicity_timer(playername, qname)
end
end
function mff.quests.set_quest_ended(playername, questname, metadata)
local qstatus = mff.quests.quest_status[playername]
local qname = questname:sub(mff.QPREFIX:len()+1)
local qinfo = mff.quests.quests[qname]
if qinfo.periodicity ~= nil and qinfo.periodicity >= 1 then
qstatus[qname] = -(os.time() + qinfo.periodicity)
mff.quests.start_periodicity_timer(playername, qname)
else
qstatus[qname] = nil
function mff.quests.handle_quest_end(playername, questname, metadata)
for item, count in pairs(mff.quests.quests[mff.QNOPREFIX(questname)].awards) do
minetest.add_item(minetest.get_player_by_name(playername):getpos(), {name=item, count=count, wear=0, metadata=""})
end
end
-- Register the quests defined above
for qname, quest in pairs(mff.quests.quests) do
quests.register_quest(mff.QPREFIX .. qname, {
title = quest.title,
description = quest.desc,
max = quest.max,
autoaccept = true,
callback = mff.quests.set_quest_ended
})
quest.completecallback = mff.quests.handle_quest_end
local ret = quests.register_quest(mff.QPREFIX .. qname, quest)
end
-- For quests where you have to dig something, the updates happen here
-- TODO
-- implement magical iterator, going through BOTH the simple quests
-- AND tasked quests objectives, returning a tuple like this:
-- questname, questdef, taskname (nil?), taskdef (nil?), objective_container (that is, either questdef or taskdef), pointer_to_function_to_update_the_objective_progress_with_only_one_parameter_the_others_being_automagically_passed_to_the_quests_API_so_that_we_dont_have_to_write_ifs_and_elses_everywhere_to_handle_both_quest_and_tasks_cases_because_it_would_give_crap_code
minetest.register_on_dignode(function(pos, oldnode, digger)
if not digger then return end -- Already happened before
local qstatus = mff.quests.quest_status[digger:get_player_name()]
if not digger then return end
local pname = digger:get_player_name()
for qname, quest in pairs(mff.quests.quests) do
if qstatus[qname] ~= nil and qstatus[qname] >= 0 then
if quest.objective.dig then
if table.contains(quest.objective.dig, oldnode.name) then
quests.update_quest(digger:get_player_name(), mff.QPREFIX .. qname, 1)
if quest.tasks then
for tname, task in pairs(quest.tasks) do
if quests.is_task_visible(pname, mff.QPREFIX .. qname, tname)
and not quests.is_task_disabled(pname, mff.QPREFIX .. qname, tname)
and task.objective.dig then
if table.contains(task.objective.dig, oldnode.name) then
quests.update_quest_task(pname, mff.QPREFIX .. qname, tname, 1)
end
end
end
end
end
end)
-- TODO load data
--[[
for playername in players do
mff.quests.start_all_periodicity_timers(playername)
end
]]
minetest.register_on_joinplayer(function (player)
-- TODO do nothing
mff.quests.quest_status[player:get_player_name()] = {}
mff.quests.start_quest(player:get_player_name(), "testdiggydiggyhole")
end)
minetest.register_on_leaveplayer(function (player)
-- TODO do nothing
mff.quests.quest_status[player:get_player_name()] = nil
end)
minetest.register_on_shutdown(function()
-- TODO save data
end)
local playername = player:get_player_name()
for _, qname in ipairs({"still_testing_quests", "still_testing_quests2", "still_testing_quests3"}) do
if not quests.quest_restarting_in(playername, mff.QPREFIX .. qname) then
mff.quests.start_quest(playername, qname)
end
end
end)