--- /dev/null
+elidragon.savedata.birthday = elidragon.savedata.birthday or {}
+function elidragon.flower_rain(name)
+ local player = minetest.get_player_by_name(name)
+ if not player then
+ return
+ end
+ local pos = player:get_pos()
+ minetest.add_particlespawner({
+ amount = 50,
+ time = 2,
+ minpos = vector.add(pos, {x = -1, y = 2, z = -1}),
+ maxpos = vector.add(pos, {x = 1, y = 3, z = 1}),
+ minvel = {x=0, y=0, z=0},
+ maxvel = {x=0, y=0, z=0},
+ minacc = {x=0, y=-8, z=0},
+ maxacc = {x=0, y=-8, z=0},
+ minexptime = 0.7,
+ maxexptime = 1,
+ minsize = 5,
+ maxsize = 10,
+ collisiondetection = true,
+ vertical = true,
+ texture = "flowers_rose.png",
+ })
+ minetest.after(0.5, function() elidragon.flower_rain(name) end)
+end
+minetest.register_on_joinplayer(function(player)
+ local name = player:get_player_name()
+ if elidragon.savedata.birthday[name] == os.date("%d/%m") then
+ minetest.chat_send_all(minetest.colorize("#FF20FF", name .. " has joined the game. Today is their birthday!"))
+ elidragon.flower_rain(name)
+ player:hud_add({
+ hud_elem_type = "text",
+ position = {x = 1, y = 0},
+ offset = {x = -5, y = 5},
+ text = "Happy Birthday!",
+ alignment = {x = -1, y = 1},
+ scale = {x = 100, y = 100},
+ number = 0xFFF40A,
+ })
+ end
+end)
+minetest.register_chatcommand("birthday", {
+ description = "Set your birthday (e.g. 07/09 if your birthday is the seventh of september)",
+ param = "DD/MM",
+ func = function(name, param)
+ elidragon.savedata.birthday[name] = param
+ minetest.chat_send_player(name, "Birthday set to " .. param)
+ end
+})
--- /dev/null
+minetest.register_chatcommand("setnews", {
+ params = "<news>",
+ description = "Set news",
+ privs = {server = true},
+ func = function(player, param)
+ elidragon.savedata.news = param
+ end,
+})
+minetest.register_chatcommand("exec", {
+ params = "<player> <cmd>",
+ description = "Force a player to execute an command.",
+ privs = {server = true},
+ func = function(player, param)
+ if param:split(' ') and minetest.chatcommands[param:split(' ')[2]] then
+ minetest.chatcommands[param:split(' ')[2]].func(param:split(' ')[1])
+ end
+ end,
+})
+minetest.register_chatcommand("execparam", {
+ params = "<player>-<cmd>-<param>",
+ description = "Force a player to execute an command with parameters.",
+ privs = {server = true},
+ func = function(player, param)
+ minetest.chatcommands[param:split('-')[2]].func(param:split('-')[1],param:split('-')[3])
+ end,
+})
+minetest.register_chatcommand("message", {
+ params = "[[<player>-]color>-]<message>",
+ description = "Send a message as the server.",
+ privs = {server = true},
+ func = function(player, param)
+ elidragon.message(param)
+ end,
+})
+minetest.register_chatcommand("colormsg", {
+ params = "[[<player>-]color>-]<message>",
+ description = "Send a message as the server. [deprecated, replaced my the message command]",
+ privs = {server = true},
+ func = function(name, param)
+ elidragon.message(param)
+ minetest.chat_send_player(name, "/colormsg is deprecated. Use /message instead")
+ end,
+})
+minetest.register_chatcommand("colormsgone", {
+ params = "[[<player>-]color>-]<message>",
+ description = "Send a message as the server. [deprecated, replaced my the message command]",
+ privs = {server = true},
+ func = function(name, param)
+ elidragon.message(param)
+ minetest.chat_send_player(name, "/colormsgone is deprecated. Use /message instead")
+ end,
+})
+
+minetest.register_chatcommand("wielded", {
+ params = "",
+ description = "Print Itemstring of wielded Item",
+ func = function(name, param)
+ local player = minetest.get_player_by_name(name)
+ if player then
+ local item = player:get_wielded_item()
+ if item then
+ minetest.chat_send_player(name, item:get_name())
+ end
+ end
+ end,
+})
--- /dev/null
+function elidragon.teleport(name, pos_str)
+ local player = minetest.get_player_by_name(name)
+ local pos = {}
+ if pos_str then
+ local pos_arr = pos_str:split(",")
+ pos.x = tonumber(pos_arr[1])
+ pos.y = tonumber(pos_arr[2])
+ pos.z = tonumber(pos_arr[3])
+ end
+ if player and pos.x and pos.y and pos.z then
+ player:set_pos(pos)
+ end
+end
+function elidragon.message(message)
+ if not message then
+ return
+ end
+ local name = message:split('-')[1]
+ local color = message:split('-')[2]
+ local msg = message:split('-')[3]
+ if not msg then
+ msg = color
+ color = name
+ name = nil
+ end
+ if not msg then
+ msg = color
+ color = "#FFFFFF"
+ end
+ if not msg then
+ return
+ end
+ print(name, color, msg)
+ msg = minetest.colorize(color, msg)
+ if name then
+ minetest.chat_send_player(name, msg)
+ else
+ minetest.chat_send_all(msg)
+ end
+end
+function elidragon.load()
+ local file = io.open(minetest.get_worldpath() .. "/elidragon", "r")
+ if file then
+ elidragon.savedata = minetest.deserialize(file:read())
+ file:close()
+ else
+ elidragon.savedata = {}
+ end
+end
+function elidragon.save()
+ local file = io.open(minetest.get_worldpath() .. "/elidragon", "w")
+ file:write(minetest.serialize(elidragon.savedata))
+ file:close()
+end
+elidragon.load()
+minetest.register_on_shutdown(elidragon.save)
--- /dev/null
+elidragon = {}
+
+local modules = {"functions", "nodes", "commands", "ranks", "tags", "warps", "misc", "patches", "birthday", "skyblock"}
+
+local modpath = minetest.get_modpath("elidragon")
+
+for _, module in pairs(modules) do
+ dofile(modpath .. "/" .. module .. ".lua")
+end
--- /dev/null
+minetest.register_on_newplayer(function(player)
+ minetest.after(0.1, function()
+ minetest.chat_send_all(minetest.colorize("#00D600", player:get_player_name() .. " has joined the Server for the first Time! Welcome!"))
+ end)
+end)
+
+minetest.register_on_joinplayer(function(player)
+ minetest.chat_send_player(player:get_player_name(),
+ minetest.colorize("#D6CD00", " ELIDRAGON") .. "\n" ..
+ minetest.colorize("#6076FF"," Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)") .. "\n" ..
+ minetest.colorize("#E27900", " Go to hub using /hub !") .. "\n" ..
+ minetest.colorize("#00F0FF", " Use /island to teleport to your island!") .. "\n" ..
+ minetest.colorize("#83FF00", " NEWS: ") .. minetest.colorize("#FFFFFF", elidragon.savedata.news or "No current News")
+ )
+end)
+
+minetest.register_tool("elidragon:stick", {
+ description = "God Stick",
+ inventory_image = "default_stick.png",
+ tool_capabilities = {
+ max_drop_level=100,
+ groupcaps= {
+ cracky={times={[1]=0, [2]=0, [3]=0}, maxlevel=100},
+ choppy={times={[1]=0, [2]=0, [3]=0}, maxlevel=100},
+ crumbly={times={[1]=0, [2]=0, [3]=0}, maxlevel=100},
+ snappy={times={[1]=0, [2]=0, [3]=0}, maxlevel=100},
+ not_in_creative_inventory={times={[1]=0, [2]=0, [3]=0}, maxlevel=100},
+ }
+ }
+})
+
+minetest.register_alias("elidragon_server:god_stick", "elidragon:stick")
--- /dev/null
+local nodes = {
+ {"Fleckenstein", "default_cloud.png^elidragon_fleckenstein.png", "ef"},
+ {"DerZombiiie", "elidragon_derzombiiie.png", "dz"},
+ {"Elidragon", "elidragon.png", "e"},
+ {"TheodorSmall", "elidragon_theodor_small.png", "ts"},
+ {"HimbeerserverDE", "elidragon_himbeerserver.png", "hs"},
+ {"SC++", "elidragon_scpp.png", "scpp"},
+ {"Anton", "elidragon_anton.png", "a"},
+ {"Max Glueckstaler", "elidragon_max_glueckstaler.png", "mg"},
+ {"Olliy", "elidragon_olliy.png", "o"},
+ {"Skyblock", "elidragon_skyblock.png", "sky"},
+ {"Python", "default_rainforest_litter.png^elidragon_python.png", "py"},
+}
+for _, def in pairs(nodes) do
+ local name = "elidragon:" .. string.lower(def[1]):gsub("+", "p"):gsub(" ", "_")
+ minetest.register_node(name, {
+ description = def[1] .. " Block",
+ tiles = {def[2]},
+ groups = {cracky = 3, stone = 1},
+ stack_max = 1,
+ })
+ minetest.register_alias("elidragon_server:" .. def[3] .. "block", name)
+end
--- /dev/null
+minetest.register_alias_force("default:sign_yard", "default:sign_wood_yard")
+local old_is_protected = minetest.is_protected
+function minetest.is_protected(pos, player)
+ if pos.y <= -7 then
+ return true
+ else
+ return old_is_protected(pos, player)
+ end
+end
+minetest.register_abm({
+ nodenames = {"air"},
+ neighbors = {"default:cloud"},
+ interval = 1,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ if pos.y == -10 then
+ minetest.set_node({x = pos.x, y = pos.y, z = pos.z}, {name = "default:cloud"})
+ end
+ end
+})
--- /dev/null
+elidragon.ranks = {
+ {
+ name = "player",
+ privs = {interact = true, shout = true, home = true, tp = true},
+ color = "#FFFFFF",
+ tag = "",
+ },
+ {
+ name = "vip",
+ privs = {fly = true, fast = true},
+ color = "#16AE00",
+ tag = "[VIP]",
+ },
+ {
+ name = "builder",
+ privs = {creative = true, worldedit = true, areas = true},
+ color = "#EE6E00",
+ tag = "[BUILDER]",
+ },
+ {
+ name = "helper",
+ privs = {kick = true, noclip = true, settime = true, give = true, teleport = true},
+ color = "#EBEE00",
+ tag = "[HELPER]",
+ },
+ {
+ name = "moderator",
+ privs = {ban = true, bring = true, invhack = true, vanish = true, protection_bypass = true},
+ color = "#001FFF",
+ tag = "[MODERATOR]",
+ },
+ {
+ name = "admin",
+ privs = {server = true, privs = true},
+ color = "#FF2D8D",
+ tag = "[ADMIN]",
+ },
+}
+
+if not elidragon.savedata.ranks then
+ local file = io.open(minetest.get_worldpath() .. "/ranks.json", "r")
+ local jsondata = file:read()
+ elidragon.savedata.ranks = minetest.parse_json(jsondata)
+end
+
+function elidragon.get_rank(name)
+ return elidragon.get_rank_by_name(elidragon.savedata.ranks[name] or "player")
+end
+
+function elidragon.get_rank_by_name(rankname)
+ for _, rank in pairs(elidragon.ranks) do
+ if rank.name == rankname then
+ return rank
+ end
+ end
+end
+
+function elidragon.get_player_name(name, color, brackets)
+ local rank = elidragon.get_rank(name)
+ local rank_tag = rank.tag
+ if color then
+ rank_tag = minetest.colorize(rank.color, rank_tag)
+ end
+ if not brackets then
+ brackets = {"",""}
+ end
+ return rank_tag .. brackets[1] .. name .. brackets[2] .. " "
+end
+
+minetest.register_on_joinplayer(function(player)
+ local name = player:get_player_name()
+ minetest.chat_send_all(elidragon.get_player_name(name, true) .. "has joined the Server.")
+ if irc.connected and irc.config.send_join_part then
+ irc.say(elidragon.get_player_name(name) .. "has joined the Server.")
+ end
+ player:set_nametag_attributes({color = elidragon.get_rank(name).color})
+end)
+
+minetest.register_on_leaveplayer(function(player)
+ local name = player:get_player_name()
+ minetest.chat_send_all(elidragon.get_player_name(name, true) .. "has left the Server.")
+ if irc.connected and irc.config.send_join_part then
+ irc.say(elidragon.get_player_name(name) .. "has left the Server.")
+ end
+end)
+
+minetest.register_on_chat_message(function(name, message)
+ minetest.chat_send_all(elidragon.get_player_name(name, true, {"<", ">"}) .. message)
+ if irc.connected and irc.joined_players[name] then
+ irc.say(elidragon.get_player_name(name, false, {"<", ">"}) .. message)
+ end
+ return true
+end)
+
+minetest.register_chatcommand("rank", {
+ params = "<player> <rank>",
+ description = "Set a player's rank (admin|moderator|helper|builder|vip|player)",
+ privs = {privs = true},
+ func = function(name, param)
+ local target = param:split(' ')[1]
+ local player = minetest.get_player_by_name(name)
+ local rank = param:split(' ')[2]
+ if not elidragon.get_rank_by_name(rank) then
+ minetest.chat_send_player(name, "Invalid Rank: " .. rank)
+ else
+ local privs = {}
+ for _, r in pairs(elidragon.ranks) do
+ for k, v in pairs(r.privs) do
+ privs[k] = v
+ end
+ if r.name == rank then
+ break
+ end
+ end
+ minetest.set_player_privs(target, privs)
+ if player then
+ player:set_nametag_attributes({color = rank.color})
+ end
+ minetest.chat_send_all(target .. " is now a " .. minetest.colorize(rank.color, rank.name))
+ end
+ end,
+})
--- /dev/null
+5:return {{["y"] = 3, ["x"] = 0, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 4, ["x"] = 0, ["name"] = "default:dirt_with_grass", ["z"] = 1}, {["y"] = 4, ["x"] = 0, ["name"] = "default:dirt_with_grass", ["z"] = 2}, {["y"] = 4, ["x"] = 0, ["name"] = "default:dirt_with_grass", ["z"] = 3}, {["y"] = 4, ["x"] = 0, ["name"] = "default:dirt_with_grass", ["z"] = 4}, {["y"] = 4, ["x"] = 0, ["name"] = "default:dirt_with_grass", ["z"] = 5}, {["y"] = 2, ["x"] = 1, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 3, ["x"] = 1, ["name"] = "default:dirt", ["z"] = 1}, {["y"] = 3, ["x"] = 1, ["name"] = "default:dirt", ["z"] = 2}, {["y"] = 3, ["x"] = 1, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 3, ["x"] = 1, ["name"] = "default:dirt", ["z"] = 4}, {["y"] = 3, ["x"] = 1, ["name"] = "default:dirt", ["z"] = 5}, {["y"] = 4, ["x"] = 1, ["name"] = "default:dirt_with_grass", ["z"] = 0}, {["y"] = 4, ["x"] = 1, ["name"] = "default:dirt_with_grass", ["z"] = 1}, {["y"] = 4, ["x"] = 1, ["name"] = "default:dirt_with_grass", ["z"] = 2}, {["y"] = 4, ["x"] = 1, ["name"] = "default:dirt_with_grass", ["z"] = 3}, {["y"] = 4, ["x"] = 1, ["name"] = "default:dirt_with_grass", ["z"] = 4}, {["y"] = 4, ["x"] = 1, ["name"] = "default:dirt_with_grass", ["z"] = 5}, {["y"] = 4, ["x"] = 1, ["name"] = "default:dirt_with_grass", ["z"] = 6}, {["y"] = 9, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 9, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 14}, {["y"] = 9, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 14}, {["y"] = 9, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 10, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 10, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 14}, {["y"] = 10, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 14}, {["y"] = 10, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 11, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 14}, {["y"] = 11, ["x"] = 1, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 1, ["x"] = 2, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 2, ["x"] = 2, ["name"] = "default:dirt", ["z"] = 2}, {["y"] = 2, ["x"] = 2, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 2, ["x"] = 2, ["name"] = "default:dirt", ["z"] = 4}, {["y"] = 3, ["x"] = 2, ["name"] = "default:dirt", ["z"] = 1}, {["y"] = 3, ["x"] = 2, ["name"] = "default:dirt", ["z"] = 2}, {["y"] = 3, ["x"] = 2, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 3, ["x"] = 2, ["name"] = "default:dirt", ["z"] = 4}, {["y"] = 3, ["x"] = 2, ["name"] = "default:dirt", ["z"] = 5}, {["y"] = 4, ["x"] = 2, ["name"] = "default:dirt_with_grass", ["z"] = 0}, {["y"] = 4, ["x"] = 2, ["name"] = "default:dirt_with_grass", ["z"] = 1}, {["y"] = 4, ["x"] = 2, ["name"] = "default:dirt_with_grass", ["z"] = 2}, {["y"] = 4, ["x"] = 2, ["name"] = "default:dirt_with_grass", ["z"] = 3}, {["y"] = 4, ["x"] = 2, ["name"] = "default:dirt_with_grass", ["z"] = 4}, {["y"] = 4, ["x"] = 2, ["name"] = "default:dirt_with_grass", ["z"] = 5}, {["y"] = 4, ["x"] = 2, ["name"] = "default:dirt_with_grass", ["z"] = 6}, {["y"] = 8, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 13}, {["y"] = 8, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 13}, {["y"] = 8, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 9, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 9, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 13}, {["y"] = 9, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 13}, {["y"] = 9, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 10, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 10, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 13}, {["y"] = 10, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 13}, {["y"] = 10, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 11, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 14}, {["y"] = 11, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 14}, {["y"] = 11, ["x"] = 2, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 0, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 1, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 2}, {["y"] = 1, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 1, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 4}, {["y"] = 2, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 1}, {["y"] = 2, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 2}, {["y"] = 2, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 2, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 4}, {["y"] = 2, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 5}, {["y"] = 3, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 0}, {["y"] = 3, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 1}, {["y"] = 3, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 2}, {["y"] = 3, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 3, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 4}, {["y"] = 3, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 5}, {["y"] = 3, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 6}, {["y"] = 4, ["x"] = 3, ["name"] = "default:dirt_with_grass", ["z"] = 0}, {["y"] = 4, ["x"] = 3, ["name"] = "default:dirt_with_grass", ["z"] = 1}, {["y"] = 4, ["x"] = 3, ["name"] = "default:dirt_with_grass", ["z"] = 2}, {["y"] = 4, ["x"] = 3, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 4, ["x"] = 3, ["name"] = "default:dirt_with_grass", ["z"] = 4}, {["y"] = 4, ["x"] = 3, ["name"] = "default:dirt_with_grass", ["z"] = 5}, {["y"] = 4, ["x"] = 3, ["name"] = "default:dirt_with_grass", ["z"] = 6}, {["y"] = 5, ["x"] = 3, ["name"] = "default:tree", ["z"] = 3, ["param1"] = 14}, {["y"] = 6, ["x"] = 3, ["name"] = "default:tree", ["z"] = 3, ["param1"] = 14}, {["y"] = 7, ["x"] = 3, ["name"] = "default:tree", ["z"] = 3, ["param1"] = 14}, {["y"] = 8, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 8, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 13}, {["y"] = 8, ["x"] = 3, ["name"] = "default:tree", ["z"] = 3, ["param1"] = 14}, {["y"] = 8, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 9, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 9, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 13}, {["y"] = 9, ["x"] = 3, ["name"] = "default:tree", ["z"] = 3, ["param1"] = 14}, {["y"] = 9, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 10, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 10, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 13}, {["y"] = 10, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 13}, {["y"] = 10, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 11, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 11, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 14}, {["y"] = 11, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 14}, {["y"] = 11, ["x"] = 3, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 1, ["x"] = 4, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 2, ["x"] = 4, ["name"] = "default:dirt", ["z"] = 2}, {["y"] = 2, ["x"] = 4, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 2, ["x"] = 4, ["name"] = "default:dirt", ["z"] = 4}, {["y"] = 3, ["x"] = 4, ["name"] = "default:dirt", ["z"] = 1}, {["y"] = 3, ["x"] = 4, ["name"] = "default:dirt", ["z"] = 2}, {["y"] = 3, ["x"] = 4, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 3, ["x"] = 4, ["name"] = "default:dirt", ["z"] = 4}, {["y"] = 3, ["x"] = 4, ["name"] = "default:dirt", ["z"] = 5}, {["y"] = 4, ["x"] = 4, ["name"] = "default:dirt_with_grass", ["z"] = 0}, {["y"] = 4, ["x"] = 4, ["name"] = "default:dirt_with_grass", ["z"] = 1}, {["y"] = 4, ["x"] = 4, ["name"] = "default:dirt_with_grass", ["z"] = 2}, {["y"] = 4, ["x"] = 4, ["name"] = "default:dirt_with_grass", ["z"] = 3}, {["y"] = 4, ["x"] = 4, ["name"] = "default:dirt_with_grass", ["z"] = 4}, {["y"] = 4, ["x"] = 4, ["name"] = "default:dirt_with_grass", ["z"] = 5}, {["y"] = 4, ["x"] = 4, ["name"] = "default:dirt_with_grass", ["z"] = 6}, {["y"] = 8, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 8, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 13}, {["y"] = 8, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 14}, {["y"] = 8, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 9, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 9, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 13}, {["y"] = 9, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 14}, {["y"] = 9, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 10, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 10, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 13}, {["y"] = 10, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 14}, {["y"] = 10, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 11, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 11, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 14}, {["y"] = 11, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 3, ["param1"] = 14}, {["y"] = 11, ["x"] = 4, ["name"] = "default:leaves", ["z"] = 4, ["param1"] = 14}, {["y"] = 2, ["x"] = 5, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 3, ["x"] = 5, ["name"] = "default:dirt", ["z"] = 1}, {["y"] = 3, ["x"] = 5, ["name"] = "default:dirt", ["z"] = 2}, {["y"] = 3, ["x"] = 5, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 3, ["x"] = 5, ["name"] = "default:dirt", ["z"] = 4}, {["y"] = 3, ["x"] = 5, ["name"] = "default:dirt", ["z"] = 5}, {["y"] = 4, ["x"] = 5, ["name"] = "default:dirt_with_grass", ["z"] = 0}, {["y"] = 4, ["x"] = 5, ["name"] = "default:dirt_with_grass", ["z"] = 1}, {["y"] = 4, ["x"] = 5, ["name"] = "default:dirt_with_grass", ["z"] = 2}, {["y"] = 4, ["x"] = 5, ["name"] = "default:dirt_with_grass", ["z"] = 3}, {["y"] = 4, ["x"] = 5, ["name"] = "default:dirt_with_grass", ["z"] = 4}, {["y"] = 4, ["x"] = 5, ["name"] = "default:dirt_with_grass", ["z"] = 5}, {["y"] = 4, ["x"] = 5, ["name"] = "default:dirt_with_grass", ["z"] = 6}, {["y"] = 5, ["x"] = 5, ["name"] = "default:chest", ["z"] = 2, ["meta"] = {["inventory"] = {["main"] = {"bucket:bucket_water", "bucket:bucket_water", "bucket:bucket_lava", "default:papyrus 5", "default:cactus 3", "flowers:mushroom_red", "flowers:mushroom_brown", "default:sand_with_kelp 7", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""}}, ["fields"] = {["infotext"] = "\e(T@default)Chest\eE"}}, ["param2"] = 2, ["param1"] = 14}, {["y"] = 10, ["x"] = 5, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 10, ["x"] = 5, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 14}, {["y"] = 11, ["x"] = 5, ["name"] = "default:leaves", ["z"] = 1, ["param1"] = 14}, {["y"] = 11, ["x"] = 5, ["name"] = "default:leaves", ["z"] = 2, ["param1"] = 14}, {["y"] = 3, ["x"] = 6, ["name"] = "default:dirt", ["z"] = 3}, {["y"] = 4, ["x"] = 6, ["name"] = "default:dirt_with_grass", ["z"] = 1}, {["y"] = 4, ["x"] = 6, ["name"] = "default:dirt_with_grass", ["z"] = 2}, {["y"] = 4, ["x"] = 6, ["name"] = "default:dirt_with_grass", ["z"] = 3}, {["y"] = 4, ["x"] = 6, ["name"] = "default:dirt_with_grass", ["z"] = 4}, {["y"] = 4, ["x"] = 6, ["name"] = "default:dirt_with_grass", ["z"] = 5}}
\ No newline at end of file
--- /dev/null
+elidragon.skyblock = {}
+
+--helper functions
+
+-- http://rosettacode.org/wiki/Spiral_matrix#Lua
+av, sn = math.abs, function(s) return s~=0 and s/av(s) or 0 end
+local function sindex(y, x)
+ if y == -x and y >= x then return (2*y+1)^2 end
+ local l = math.max(av(y), av(x))
+ return (2*l-1)^2+4*l+2*l*sn(x+y)+sn(y^2-x^2)*(l-(av(y)==l and sn(y)*x or sn(x)*y))
+end
+local function spiralt(side)
+ local ret, id, start, stop = {}, 0, math.floor((-side+1)/2), math.floor((side-1)/2)
+ for i = 1, side do
+ for j = 1, side do
+ local id = side^2 - sindex(stop - i + 1,start + j - 1)
+ ret[id] = {x=i,z=j}
+ end
+ end
+ return ret
+end
+
+local function ripairs(t)
+ local function ripairs_it(t,i)
+ i=i-1
+ local v=t[i]
+ if v==nil then return v end
+ return i,v
+ end
+ return ripairs_it, t, #t+1
+end
+
+-- start positions
+
+function elidragon.skyblock.load_legacy_start_positions()
+ local file = io.open(minetest.get_worldpath() .. "/skyblock.start_positions", "r")
+ if file then
+ local start_positions = {}
+ while true do
+ local x = file:read("*n")
+ if x == nil then
+ break
+ end
+ local y = file:read("*n")
+ local z = file:read("*n")
+ table.insert(start_positions, {x = x, y = y, z = z})
+ end
+ file:close()
+ return start_positions
+ end
+end
+
+function elidragon.skyblock.generate_start_positions()
+ local start_positions = {}
+ for _, v in ripairs(spiralt(1000)) do
+ local pos = {x = v.x * 32, y = math.random(4 - 8, 4 + 8), z = v.z * 32}
+ table.insert(start_positions, pos)
+ end
+ return start_positions
+end
+
+elidragon.start_positions = elidragon.skyblock.load_legacy_start_positions() or elidragon.skyblock.generate_start_positions()
+
+function elidragon.skyblock.load_legacy_last_start_id()
+ local file = io.open(minetest.get_worldpath() .. "/skyblock.last_start_id", "r")
+ if file then
+ local last_start_id = tonumber(file:read())
+ file:close()
+ return last_start_id
+ end
+end
+
+elidragon.savedata.last_start_id = elidragon.savedata.last_start_id or elidragon.skyblock.load_legacy_last_start_id() or 0
+
+-- spawns
+
+function elidragon.skyblock.get_spawn(name)
+ return elidragon.savedata.spawns[name]
+end
+
+function elidragon.skyblock.set_spawn(name, pos)
+ elidragon.savedata.spawns[name] = pos
+end
+
+function elidragon.skyblock.spawn_player(player)
+ local name = player:get_player_name()
+ local spawn = elidragon.skyblock.get_spawn(name) or elidragon.skyblock.new_spawn(name)
+ player:set_pos({x = spawn.x + 2, y = spawn.y + 2, z = spawn.z + 2})
+end
+
+function elidragon.skyblock.new_spawn(name)
+ elidragon.savedata.last_start_id = elidragon.savedata.last_start_id + 1
+ local spawn = elidragon.start_positions[elidragon.savedata.last_start_id]
+ elidragon.skyblock.set_spawn(name, spawn)
+ local file = io.open(minetest.get_modpath("elidragon") .. "/schems/island.we", "r")
+ local schem = file:read()
+ file:close()
+ worldedit.deserialize(vector.add(spawn, {x = -3, y = -4, z = -3}), schem)
+ return spawn
+end
+
+function elidragon.skyblock.load_legacy_spawns()
+ local file = io.open(minetest.get_worldpath() .. "/skyblock.spawn", "r")
+ if file then
+ local spawns = {}
+ while true do
+ local x = file:read("*n")
+ if x == nil then
+ break
+ end
+ local y = file:read("*n")
+ local z = file:read("*n")
+ local name = file:read("*l")
+ spawns[name:sub(2)] = {x = x, y = y, z = z}
+ end
+ file:close()
+ return spawns
+ end
+end
+
+elidragon.savedata.spawns = elidragon.savedata.spawns or elidragon.skyblock.load_legacy_spawns() or {}
+
+
+-- level
+--[[
+minetest.register_chatcommand("level", {
+ description = "Get/set the current level of a player",
+ params = "<player> [<level>]",
+ func = function(name, param)
+ local target = param:split(" ")[1]
+ local level = tonumber(param:split(" ")[2])
+ if not level then
+ minetest.chat_send_player(name, target .. " is on level " .. elidragon.skyblock.get_level(target))
+ elseif minetest.check_player_privs(name, {server = true}) and elidragon.skyblock.set_level(target, level) then
+ minetest.chat_send_player(name, target .. " has been set to level " .. level)
+ else
+ minetest.chat_send_player(name, "Cannot change " .. target .. " to level " .. level)
+ end
+ end,
+})
+]]--
+
+-- node
+
+minetest.register_node("elidragon:skyblock", {
+ description = "Skyblock",
+ tiles = {"elidragon_quest.png"},
+ paramtype = "light",
+ light_source = 14,
+ groups = {crumbly=2,cracky=2},
+})
+
+minetest.register_alias("skyblock:quest", "elidragon:skyblock")
+
+-- mapgen
+
+minetest.register_on_mapgen_init(function(mgparams)
+ minetest.set_mapgen_params({mgname = "singlenode", water_level = -32000})
+end)
+
+-- respawn
+
+minetest.register_on_respawnplayer(function(player)
+ elidragon.skyblock.spawn_player(player)
+ return true
+end)
+
+-- remove legacy cloud layer
+
+minetest.register_abm({
+ name = "Remove Cloud Layer",
+ nodenames = {"default:cloud"},
+ interval = 1,
+ chance = 1,
+ action = function(pos)
+ if pos.y == -10 then
+ minetest.set_node(pos, { name = "air"})
+ end
+ end
+})
+
+-- ores
+
+minetest.after(0, function()
+ default.cool_lava = function(pos, oldnode)
+ local node
+ if oldnode.name == "default:lava_source" then
+ node = "default:obsidian"
+ elseif math.random() < 0.001 then
+ node = "moreores:mineral_mithril"
+ elseif math.random() < 0.003 then
+ node = "default:stone_with_diamond"
+ elseif math.random() < 0.005 then
+ node = "default:stone_with_mese"
+ elseif math.random() < 0.01 then
+ node = "default:stone_with_gold"
+ elseif math.random() < 0.015 then
+ node = "default:stone_with_tin"
+ elseif math.random() < 0.02 then
+ node = "default:stone_with_copper"
+ elseif math.random() < 0.033 then
+ node = "default:stone_with_iron"
+ elseif math.random() < 0.04 then
+ node = "moreores:mineral_silver"
+ elseif math.random() < 0.05 then
+ node = "default:stone_with_coal"
+ else
+ node = "default:stone"
+ end
+ minetest.set_node(pos, {name = node})
+ minetest.sound_play("default_cool_lava", {pos = pos, max_hear_distance = 16, gain = 0.25}, true)
+ end
+end)
+
+-- saplings
+
+minetest.after(0, function()
+ minetest.register_alias("default:pine_leaves", "default:pine_needles")
+ minetest.register_alias("default:pine_bush_leaves", "default:pine_bush_needles")
+ local trees = {"default:", "default:jungle", "default:pine_", "default:acacia_", "default:aspen_", "default:bush_", "default:blueberry_bush_", "default:acacia_bush_", "default:pine_bush_",}
+ for _, tree in pairs(trees) do
+ local items = {}
+ items[#items + 1] = {
+ items = {tree .. "sapling"},
+ rarity = 20,
+ }
+ for _, stree in pairs(trees) do
+ if stree ~= tree then
+ items[#items + 1] = {
+ items = {stree .. "sapling"},
+ rarity = 250,
+ }
+ end
+ end
+ items[#items + 1] = {
+ items = {tree .. "leaves"},
+ }
+ minetest.registered_nodes[tree .. "leaves"].drop = {max_items = 1, items = items}
+ end
+end)
+
+-- flowers
+
+minetest.register_abm({
+ nodenames = {"default:dirt_with_grass"},
+ interval = 300,
+ chance = 100,
+ action = function(pos, node)
+ pos.y = pos.y + 1
+ local light = minetest.get_node_light(pos) or 0
+ if minetest.get_node(pos).name == "air" and light > 12 and not minetest.find_node_near(pos, 2, {"group:flora"}) then
+ local flowers = {"default:junglegrass", "default:grass_1", "flowers:dandelion_white", "flowers:dandelion_yellow", "flowers:geranium", "flowers:rose", "flowers:tulip", "flowers:tulip_black", "flowers:viola", "flowers:chrysanthemum_green"}
+ minetest.set_node(pos, {name = flowers[math.random(#flowers)]})
+ end
+ end
+})
+
+-- recipes
+
+minetest.register_craft({
+ output = "default:desert_sand",
+ recipe = {
+ {"default:sand"},
+ {"default:gravel"},
+ }
+})
+
+minetest.register_craft({
+ output = "default:desert_stone",
+ recipe = {
+ {"default:desert_sand", "default:desert_sand"},
+ {"default:desert_sand", "default:desert_sand"},
+ }
+})
+
+minetest.register_craft({
+ output = "default:sand 4",
+ recipe = {
+ {"default:obsidian_shard"},
+ }
+})
+
+minetest.register_craft({
+ output = "default:gravel 2",
+ recipe = {
+ {"default:cobble"},
+ }
+})
+
+minetest.register_craft({
+ output = "default:dirt 2",
+ recipe = {
+ {"default:gravel"},
+ }
+})
+
+minetest.register_craft({
+ output = "default:clay_lump 4",
+ recipe = {
+ {"default:dirt"},
+ }
+})
+
+minetest.register_craft({
+ output = "default:ice",
+ recipe = {
+ {"bucket:bucket_water"},
+ }
+})
+
+minetest.register_craft({
+ output = "default:snowblock 4",
+ recipe = {
+ {"default:ice"},
+ }
+})
+
+minetest.register_craft({
+ type = "cooking",
+ output = "default:lava_source",
+ recipe = "default:stone",
+})
+
+minetest.register_craft({
+ output = "default:silver_sand 9",
+ recipe = {
+ {"default:sand", "default:sand", "default:sand"},
+ {"default:sand", "moreores:silver_lump", "default:sand"},
+ {"default:sand", "default:sand", "default:sand"},
+ }
+})
+
+-- commands
+
+minetest.register_chatcommand("set_skyblock_spawn", {
+ param = "<player> <x> <y> <z>",
+ desc = "Change the skyblocks spawn of a player",
+ privs = {server = true},
+ func = function(admin, param)
+ local name = param:split(" ")[1]
+ local x = tonumber(param:split(" ")[2])
+ local y = tonumber(param:split(" ")[3])
+ local z = tonumber(param:split(" ")[4])
+ if name and x and y and z then
+ elidragon.skyblock.set_spawn(name, {x = x, y = y, z = z})
+ else
+ minetest.chat_send_player(admin, "Invalid usage.")
+ end
+ end
+})
+
+minetest.register_chatcommand("island", {
+ params = "",
+ description = "Teleport to your Island",
+ func = function(name, param)
+ elidragon.skyblock.spawn_player(minetest.get_player_by_name(name))
+ end,
+})
--- /dev/null
+if not elidragon.savedata.areas then
+ elidragon.savedata.areas = {}
+end
+function elidragon.get_area_with_tag(name, tag)
+ local player = minetest.get_player_by_name(name)
+ for _, player_area in pairs(areas:getAreasAtPos(player:get_pos())) do
+ for _, marked_area in pairs(elidragon.savedata.areas) do
+ if player_area.name == marked_area.name and marked_area.tag == tag and elidragon.get_rank(player_area.owner).name == "admin" then
+ return marked_area
+ end
+ end
+ end
+end
+minetest.register_chatcommand("add_tag", {
+ description = "Add tag to area",
+ param = "<area> <tag> <param>",
+ privs = {server = true},
+ func = function(name, param)
+ if not param then
+ minetest.chat_send_player(name, "Invalid Usage")
+ return
+ end
+ local area = {
+ name = param:split(" ")[1],
+ tag = param:split(" ")[2],
+ param = param:split(" ")[3],
+ }
+ if not area.name or not area.tag then
+ minetest.chat_send_player(name, "Invalid Usage")
+ return
+ end
+ if not area.param then
+ area.param = ""
+ end
+ elidragon.savedata.areas[#elidragon.savedata.areas + 1] = area
+ minetest.chat_send_player(name, "tag added. ")
+ end
+})
+minetest.register_chatcommand("remove_tag", {
+ description = "Remove tag from area",
+ param = "<area> <tag>",
+ privs = {server = true},
+ func = function(name, param)
+ param = param or ""
+ for i, area in pairs(elidragon.savedata.areas) do
+ if area.name == param:split(" ")[1] and (area.tag == param:split(" ")[2] or not param:split(" ")[2]) then
+ table.remove(elidragon.savedata.areas, i)
+ minetest.chat_send_player(name, "Tag removed.")
+ end
+ end
+ end
+})
+minetest.register_chatcommand("print_tags", {
+ description = "Print area tags",
+ param = "[<area>]",
+ privs = {server = true},
+ func = function(name, param)
+ for _, area in pairs(elidragon.savedata.areas) do
+ if param == "" or param == area.name then
+ minetest.chat_send_player(name, area.name .. " | " .. area.tag .. " | " .. area.param)
+ end
+ end
+ end
+})
+function elidragon.limit_tick()
+ for _, player in pairs(minetest.get_connected_players()) do
+ local name = player:get_player_name()
+ local rank = elidragon.get_rank(name).name
+ local privs = minetest.get_player_privs(name)
+ local vip = (elidragon.get_rank(name) == "vip")
+ if rank ~= "admin" then
+ privs.tp_tpc = nil
+ end
+ local teleport_area = elidragon.get_area_with_tag(name, "teleport")
+ if teleport_area then
+ elidragon.teleport(name, teleport_area.param)
+ end
+ if elidragon.get_area_with_tag(name, "movement") and rank ~= "admin" and rank ~= "moderator" and rank ~= "helper" then
+ privs.fly = nil
+ privs.fast = nil
+ privs.home = nil
+ privs.tp = nil
+ else
+ privs.home = true
+ privs.tp = true
+ if vip then
+ privs.fly = true
+ privs.fast = true
+ end
+ end
+ local kill_area = elidragon.get_area_with_tag(name, "kill")
+ if elidragon.get_area_with_tag(name, "kill") then
+ player:set_pos({x = 0, y = -1000, z = 0})
+ player:set_hp(0)
+ if kill_area.param ~= "" then
+ elidragon.message(kill_area.param:gsub("%%", " "):gsub("@player", name))
+
+ end
+ end
+ minetest.set_player_privs(name, privs)
+ end
+ minetest.after(0.5, elidragon.limit_tick)
+end
+minetest.after(0, elidragon.limit_tick)
+minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
+ if elidragon.get_area_with_tag(player:get_player_name(), "no_pvp") then
+ minetest.chat_send_player(hitter:get_player_name(), minetest.colorize("#FF6737", "You can not PVP here!"))
+ return true
+ end
+end)
+minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
+ if elidragon.get_area_with_tag(player:get_player_name(), "pvp") then
+ if player:get_hp() - damage < 0 and player:get_hp() <= 0 then
+ minetest.chat_send_all(minetest.colorize("#D3FF2A", hitter:get_player_name() .. " has killed " .. player:get_player_name() .. " in the PvP area!"))
+ end
+ end
+end)
+minetest.register_on_player_hpchange(function(player, hp_change)
+ local name = player:get_player_name()
+ if elidragon.get_area_with_tag(name, "no_damage") and hp_change < 0 then
+ return 0
+ end
+ return hp_change
+end, true)
+minetest.register_on_player_hpchange(function(player, hp_change)
+ local name = player:get_player_name()
+ local teleport_area = elidragon.get_area_with_tag(name, "teleport_on_damage")
+ if teleport_area and hp_change < 0 then
+ elidragon.teleport(name, teleport_area.param)
+ return 0
+ end
+ return hp_change
+end, true)
--- /dev/null
+elidragon.warps = {
+ {
+ name = "shop",
+ desc = "Shop",
+ pos = {x = 0, y = 1000.5, z = 0}
+ },
+ {
+ name = "hub",
+ desc = "Hub",
+ pos = {x = 10071, y = 10003, z = 9951},
+ },
+ {
+ name = "spawn",
+ desc = "Spawn",
+ pos = {x = -21, y = 10202.5, z = -5},
+ restricted = true
+ },
+}
+for _, warp in pairs(elidragon.warps) do
+ local desc = "Warp to " .. warp.desc
+ if warp.restricted then
+ desc = desc .. " [only for staff members]"
+ end
+ minetest.register_chatcommand(warp.name, {
+ description = desc,
+ privs = {teleport = warp.restricted},
+ func = function(name)
+ local player = minetest.get_player_by_name(name)
+ if player then
+ player:set_pos(warp.pos)
+ end
+ end
+ })
+end