]> git.lizzy.rs Git - elidragon.git/commitdiff
Added Quests
authorElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 24 May 2020 12:53:19 +0000 (14:53 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 24 May 2020 12:53:19 +0000 (14:53 +0200)
README [new file with mode: 0644]
README.md [deleted file]
init.lua
mod.conf
quests.lua [new file with mode: 0644]
sounds/elidragon_finish_quest.ogg [new file with mode: 0755]
sounds/elidragon_new_quest.ogg [new file with mode: 0755]
sounds/elidragon_reach_goal.ogg [new file with mode: 0755]

diff --git a/README b/README
new file mode 100644 (file)
index 0000000..4f770da
--- /dev/null
+++ b/README
@@ -0,0 +1,2 @@
+# elidragon
+The plugins for the Elidragon server
diff --git a/README.md b/README.md
deleted file mode 100644 (file)
index 4f770da..0000000
--- a/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# elidragon
-The plugins for the Elidragon server
index 6c2649161080a02ea69a9c6310d2c4c706b1e6f9..6bda637e0f772770ad067eab169950c861e31b4e 100755 (executable)
--- a/init.lua
+++ b/init.lua
@@ -1,6 +1,6 @@
 elidragon = {}
 
-local modules = {"functions", "nodes", "commands", "ranks", "tags", "warps", "misc", "birthday", "skyblock", "playerlist"}
+local modules = {"functions", "nodes", "commands", "ranks", "tags", "warps", "misc", "birthday", "skyblock", "playerlist", "quests"}
 
 local modpath = minetest.get_modpath("elidragon")
 
index d0b6b878a7d6f14c7a21e252c51eaf3ec9d7c4eb..587fede6f857c2260de6a992e648ee5522f7bb71 100644 (file)
--- a/mod.conf
+++ b/mod.conf
@@ -1,5 +1,5 @@
 name = elidragon
 description = The plugins for the Elidragon Server
 author = Fleckenstein
-depends = worldedit, moreores, default, flowers, areas
+depends = worldedit, moreores, default, flowers, areas, technic, moretrees, controls, bucket, quests
 optional_depends = irc
diff --git a/quests.lua b/quests.lua
new file mode 100644 (file)
index 0000000..cedb394
--- /dev/null
@@ -0,0 +1,164 @@
+elidragon.quests = {}
+
+elidragon.quests.list = {
+       dig_dirt = {
+               job = "Dig Dirt",
+               desc = "You need ressources to build a stone generator!",
+               count = 10,
+               parents = {},
+               action = "dig",
+               items = {"default:dirt", "default:dirt_with_grass"},
+               reward = "default:dirt 20",
+       },
+       get_wood = {
+               job = "Get Wood",
+               desc = "Wood is one of your basic resources",
+               count = 5,
+               parents = {},
+               action = "dig",
+               items = {"default:tree"},
+               reward = "default:apple 15",
+       },
+       build_stonegen = {
+               job = "Build a stone generator",
+               desc = "Using lavacooling mechanisms to get access to cobblestone and ores! Be careful, you have only one lava 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 = "You need a pickaxe to get Cobblestone.",
+               count = 1,
+               parents = {"get_wood"},
+               action = "craft",
+               items = {"default:pick_wood"},
+               reward = "default:sand 5",
+       },
+       dig_cobble = {
+               job = "Dig Stone",
+               desc = "Let's get some cobble!",
+               count = 10,
+               parents = {"craft_wood_pickaxe", "build_stonegen"},
+               action = "dig",
+               items = {"default:stone"},
+               reward = "default:chest_locked",
+               goal = "Stoneage",
+       }
+}
+
+elidragon.savedata.quests = elidragon.savedata.quests or {}
+
+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
+       elidragon.savedata.quests[name][questname] = 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 completed_quests = elidragon.savedata.quests[name]
+       local active_quests = elidragon.quests.active[name]
+       local unlock_delay = 2
+       for questname, questdef in pairs(elidragon.quests.list) do
+               if not completed_quests[questname] and not active_quests[questname] then
+                       local unlock = true
+                       for _, parent in pairs(questdef.parents) do
+                               if not completed_quests[parent] then
+                                       unlock = false
+                                       break
+                               end
+                       end
+                       if unlock then
+                               active_quests[questname] = true
+                               minetest.after(unlock_delay, function()
+                                       quests.start_quest(name, "elidragon:" .. questname)
+                                       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.savedata.quests[name] = elidragon.savedata.quests[name] or {}
+       elidragon.quests.active[name] = {}
+       elidragon.quests.update(name)
+end)
+
+-- callbacks
+
+minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
+       elidragon.quests.event(player:get_player_name(), "craft", itemstack)
+end)
+
+minetest.register_on_dignode(function(pos, oldnode, player)
+       elidragon.quests.event(player:get_player_name(), "dig", ItemStack(oldnode.name))
+end)
+
+minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack, pointed_thing)
+       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)
diff --git a/sounds/elidragon_finish_quest.ogg b/sounds/elidragon_finish_quest.ogg
new file mode 100755 (executable)
index 0000000..e272caf
Binary files /dev/null and b/sounds/elidragon_finish_quest.ogg differ
diff --git a/sounds/elidragon_new_quest.ogg b/sounds/elidragon_new_quest.ogg
new file mode 100755 (executable)
index 0000000..6bdefb2
Binary files /dev/null and b/sounds/elidragon_new_quest.ogg differ
diff --git a/sounds/elidragon_reach_goal.ogg b/sounds/elidragon_reach_goal.ogg
new file mode 100755 (executable)
index 0000000..3c4377a
Binary files /dev/null and b/sounds/elidragon_reach_goal.ogg differ