234 lines
6.4 KiB
Lua
234 lines
6.4 KiB
Lua
elidragon.quests = {}
|
|
|
|
elidragon.quests.list = {
|
|
dig_dirt = {
|
|
job = "Dig Dirt",
|
|
desc = "dig 10 x default:dirt or default:dirt_with_grass",
|
|
count = 10,
|
|
parents = {},
|
|
action = "dig",
|
|
items = {"default:dirt", "default:dirt_with_grass"},
|
|
reward = "default:dirt 20",
|
|
},
|
|
get_wood = {
|
|
job = "Get Wood",
|
|
desc = "dig 5 x default:wood",
|
|
count = 5,
|
|
parents = {},
|
|
action = "dig",
|
|
items = {"default:tree"},
|
|
reward = "default:apple 15",
|
|
},
|
|
build_stonegen = {
|
|
job = "Build a stone generator",
|
|
desc = "place default:lava_source using a bucket",
|
|
count = 1,
|
|
parents = {"dig_dirt"},
|
|
action = "place_liquid",
|
|
items = {"default:lava_source"},
|
|
reward = "flowers:waterlily 3",
|
|
},
|
|
craft_wood_pickaxe = {
|
|
job = "Craft a wooden pickaxe",
|
|
desc = "craft default:pick_wood",
|
|
count = 1,
|
|
parents = {"get_wood"},
|
|
action = "craft",
|
|
items = {"default:pick_wood"},
|
|
reward = "default:sand 5",
|
|
},
|
|
dig_cobble = {
|
|
job = "Dig Stone",
|
|
desc = "dig 10 x default:stone",
|
|
count = 10,
|
|
parents = {"craft_wood_pickaxe", "build_stonegen"},
|
|
action = "dig",
|
|
items = {"default:stone"},
|
|
reward = "default:chest_locked",
|
|
goal = "Stone Age",
|
|
},
|
|
craft_stone_pick = {
|
|
job = "Craft a Stone Pickaxe",
|
|
desc = "craft default:pick_stone",
|
|
count = 1,
|
|
parents = {"dig_cobble"},
|
|
action = "craft",
|
|
items = {"default:pick_stone"},
|
|
reward = "default:iron_lump",
|
|
},
|
|
craft_stone_axe = {
|
|
job = "Craft a Stone Axe",
|
|
desc = "craft default:axe_stone",
|
|
count = 1,
|
|
parents = {"craft_stone_pick"},
|
|
action = "craft",
|
|
items = {"default:axe_stone"},
|
|
reward = "default:iron_lump",
|
|
},
|
|
craft_stone_shovel = {
|
|
job = "Craft a Stone Shovel",
|
|
desc = "craft default:shovel_stone",
|
|
count = 1,
|
|
parents = {"dig_cobble"},
|
|
action = "craft",
|
|
items = {"default:shovel_stone"},
|
|
reward = "default:iron_lump",
|
|
},
|
|
craft_stone_sword = {
|
|
job = "Craft a stone sword",
|
|
desc = "craft default:sword_stone",
|
|
count = 1,
|
|
parents = {"craft_stone_shovel", "craft_stone_axe"},
|
|
action = "craft",
|
|
items = {"default:sword_stone"},
|
|
reward = "default:iron_lump",
|
|
goal = "Full Toolset",
|
|
},
|
|
craft_iron_pickaxe = {
|
|
job = "Make an Iron Pick",
|
|
desc = "craft default:pick_steel",
|
|
count = 1,
|
|
parents = {"craft_stone_pick", "craft_furnace"},
|
|
action = "craft",
|
|
items = {"default:pick_steel"},
|
|
reward = "default:dirt 25",
|
|
},
|
|
craft_dirt = {
|
|
job = "Craft some dirt!",
|
|
desc = "craft 99 x default:dirt",
|
|
count = 99,
|
|
parents = {"craft_stone_sword"},
|
|
action = "craft",
|
|
items = {"default:dirt"},
|
|
reward = "protector:protect 5",
|
|
},
|
|
craft_furnace = {
|
|
job = "Make a furnace",
|
|
desc = "craft default:furnace",
|
|
count = 1,
|
|
parents = {"dig_cobble"},
|
|
action = "craft",
|
|
items = {"default:furnace"},
|
|
reward = "default:coal_lump 5",
|
|
},
|
|
}
|
|
|
|
elidragon.quests.active = {}
|
|
|
|
-- functions
|
|
|
|
function elidragon.quests.complete(name, queststr)
|
|
local questname = string.gsub(queststr, "elidragon:", "")
|
|
local questdef = elidragon.quests.list[questname]
|
|
local player = minetest.get_player_by_name(name)
|
|
if not player then return end
|
|
local meta = player:get_meta()
|
|
meta:set_string(queststr, "true")
|
|
if questdef.goal then
|
|
minetest.chat_send_all(minetest.colorize("#84FFE3", name .. " has reached the goal ") .. minetest.colorize("#CF24FF", questdef.goal))
|
|
minetest.sound_play("elidragon_reach_goal")
|
|
else
|
|
minetest.sound_play("elidragon_finish_quest", {to_player = name})
|
|
end
|
|
player:get_inventory():add_item("main", ItemStack(questdef.reward))
|
|
elidragon.quests.update(name)
|
|
end
|
|
|
|
function elidragon.quests.update(name)
|
|
local player = minetest.get_player_by_name(name)
|
|
if not player then return end
|
|
local meta = player:get_meta()
|
|
local active_quests = elidragon.quests.active[name]
|
|
local unlock_delay = 2
|
|
for questname, questdef in pairs(elidragon.quests.list) do
|
|
local queststr = "elidragon:" .. questname
|
|
if not active_quests[questname] and not minetest.is_yes(meta:get_string(queststr)) then
|
|
local unlock = true
|
|
for _, parent in pairs(questdef.parents) do
|
|
if not minetest.is_yes(meta:get_string("elidragon:" .. parent)) then
|
|
unlock = false
|
|
break
|
|
end
|
|
end
|
|
if unlock then
|
|
active_quests[questname] = true
|
|
minetest.after(unlock_delay, function()
|
|
quests.start_quest(name, queststr)
|
|
minetest.sound_play("elidragon_new_quest", {to_player = name})
|
|
end)
|
|
unlock_delay = unlock_delay + 0.5
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function elidragon.quests.event(name, action, itemstack)
|
|
if not minetest.get_player_by_name(name) then return end
|
|
local item_name = itemstack:get_name()
|
|
local item_count = itemstack:get_count()
|
|
for questname, questdef in pairs(elidragon.quests.list) do
|
|
if questdef.action == action then
|
|
for _, item in pairs(questdef.items) do
|
|
if item == item_name then
|
|
quests.update_quest(name, "elidragon:" .. questname, item_count)
|
|
end
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- register quests
|
|
|
|
for questname, questdef in pairs(elidragon.quests.list) do
|
|
quests.register_quest("elidragon:" .. questname, {
|
|
title = questdef.job,
|
|
description = questdef.desc,
|
|
max = questdef.count,
|
|
autoaccept = true,
|
|
callback = elidragon.quests.complete
|
|
})
|
|
end
|
|
|
|
-- startup
|
|
|
|
minetest.register_on_joinplayer(function(player)
|
|
local name = player:get_player_name()
|
|
elidragon.quests.active[name] = {}
|
|
elidragon.quests.update(name)
|
|
quests.show_hud(name, true)
|
|
end)
|
|
|
|
-- callbacks
|
|
|
|
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
|
|
if not player then return end
|
|
elidragon.quests.event(player:get_player_name(), "craft", itemstack)
|
|
end)
|
|
|
|
minetest.register_on_dignode(function(pos, oldnode, player)
|
|
if not player then return end
|
|
elidragon.quests.event(player:get_player_name(), "dig", ItemStack(oldnode.name))
|
|
end)
|
|
|
|
minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack, pointed_thing)
|
|
if not player then return end
|
|
elidragon.quests.event(player:get_player_name(), "place", ItemStack(newnode.name))
|
|
end)
|
|
|
|
minetest.after(0, function()
|
|
for _, liquid in pairs(bucket.liquids) do
|
|
local bucket_item = minetest.registered_items[liquid.itemname]
|
|
local old_on_place = bucket_item.on_place
|
|
minetest.override_item(liquid.itemname, {
|
|
on_place = function(itemstack, user, pointed_thing)
|
|
local result = old_on_place(itemstack, user, pointed_thing)
|
|
if result and ItemStack(result) and ItemStack(result):get_name() == "bucket:bucket_empty" then
|
|
elidragon.quests.event(user:get_player_name(), "place_liquid", ItemStack(liquid.source))
|
|
end
|
|
return result
|
|
end
|
|
})
|
|
end
|
|
end)
|