]> git.lizzy.rs Git - elidragon.git/commitdiff
Initial Commit
authorElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 10 May 2020 10:37:43 +0000 (12:37 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Sun, 10 May 2020 10:37:43 +0000 (12:37 +0200)
25 files changed:
birthday.lua [new file with mode: 0644]
commands.lua [new file with mode: 0755]
functions.lua [new file with mode: 0755]
init.lua [new file with mode: 0755]
misc.lua [new file with mode: 0755]
nodes.lua [new file with mode: 0755]
patches.lua [new file with mode: 0755]
ranks.lua [new file with mode: 0755]
schems/island.we [new file with mode: 0644]
skyblock.lua [new file with mode: 0644]
tags.lua [new file with mode: 0755]
textures/elidragon.png [new file with mode: 0755]
textures/elidragon_anton.png [new file with mode: 0755]
textures/elidragon_derzombiiie.png [new file with mode: 0755]
textures/elidragon_fleckenstein.png [new file with mode: 0755]
textures/elidragon_himbeerserver.png [new file with mode: 0755]
textures/elidragon_max_glueckstaler.png [new file with mode: 0755]
textures/elidragon_olliy.png [new file with mode: 0755]
textures/elidragon_python.png [new file with mode: 0755]
textures/elidragon_quest.png [new file with mode: 0644]
textures/elidragon_scpp.png [new file with mode: 0755]
textures/elidragon_skyblock.png [new file with mode: 0755]
textures/elidragon_theodor_small.png [new file with mode: 0755]
textures/elidragon_tux.png [new file with mode: 0755]
warps.lua [new file with mode: 0755]

diff --git a/birthday.lua b/birthday.lua
new file mode 100644 (file)
index 0000000..7c33fd2
--- /dev/null
@@ -0,0 +1,50 @@
+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
+})
diff --git a/commands.lua b/commands.lua
new file mode 100755 (executable)
index 0000000..aaf8361
--- /dev/null
@@ -0,0 +1,66 @@
+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,
+})
diff --git a/functions.lua b/functions.lua
new file mode 100755 (executable)
index 0000000..a087cc5
--- /dev/null
@@ -0,0 +1,56 @@
+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)
diff --git a/init.lua b/init.lua
new file mode 100755 (executable)
index 0000000..aa44da1
--- /dev/null
+++ b/init.lua
@@ -0,0 +1,9 @@
+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
diff --git a/misc.lua b/misc.lua
new file mode 100755 (executable)
index 0000000..0cce86f
--- /dev/null
+++ b/misc.lua
@@ -0,0 +1,32 @@
+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")
diff --git a/nodes.lua b/nodes.lua
new file mode 100755 (executable)
index 0000000..8a7faa1
--- /dev/null
+++ b/nodes.lua
@@ -0,0 +1,23 @@
+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
diff --git a/patches.lua b/patches.lua
new file mode 100755 (executable)
index 0000000..8b5c5d2
--- /dev/null
@@ -0,0 +1,20 @@
+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
+})
diff --git a/ranks.lua b/ranks.lua
new file mode 100755 (executable)
index 0000000..35480f2
--- /dev/null
+++ b/ranks.lua
@@ -0,0 +1,122 @@
+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,
+})
diff --git a/schems/island.we b/schems/island.we
new file mode 100644 (file)
index 0000000..f9129eb
--- /dev/null
@@ -0,0 +1 @@
+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
diff --git a/skyblock.lua b/skyblock.lua
new file mode 100644 (file)
index 0000000..efc0771
--- /dev/null
@@ -0,0 +1,358 @@
+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,
+})
diff --git a/tags.lua b/tags.lua
new file mode 100755 (executable)
index 0000000..726e92e
--- /dev/null
+++ b/tags.lua
@@ -0,0 +1,133 @@
+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)
diff --git a/textures/elidragon.png b/textures/elidragon.png
new file mode 100755 (executable)
index 0000000..0479c67
Binary files /dev/null and b/textures/elidragon.png differ
diff --git a/textures/elidragon_anton.png b/textures/elidragon_anton.png
new file mode 100755 (executable)
index 0000000..272a7e7
Binary files /dev/null and b/textures/elidragon_anton.png differ
diff --git a/textures/elidragon_derzombiiie.png b/textures/elidragon_derzombiiie.png
new file mode 100755 (executable)
index 0000000..4df2654
Binary files /dev/null and b/textures/elidragon_derzombiiie.png differ
diff --git a/textures/elidragon_fleckenstein.png b/textures/elidragon_fleckenstein.png
new file mode 100755 (executable)
index 0000000..e30d3c8
Binary files /dev/null and b/textures/elidragon_fleckenstein.png differ
diff --git a/textures/elidragon_himbeerserver.png b/textures/elidragon_himbeerserver.png
new file mode 100755 (executable)
index 0000000..acee706
Binary files /dev/null and b/textures/elidragon_himbeerserver.png differ
diff --git a/textures/elidragon_max_glueckstaler.png b/textures/elidragon_max_glueckstaler.png
new file mode 100755 (executable)
index 0000000..a3ce7c1
Binary files /dev/null and b/textures/elidragon_max_glueckstaler.png differ
diff --git a/textures/elidragon_olliy.png b/textures/elidragon_olliy.png
new file mode 100755 (executable)
index 0000000..a7f7c31
Binary files /dev/null and b/textures/elidragon_olliy.png differ
diff --git a/textures/elidragon_python.png b/textures/elidragon_python.png
new file mode 100755 (executable)
index 0000000..b3b5b22
Binary files /dev/null and b/textures/elidragon_python.png differ
diff --git a/textures/elidragon_quest.png b/textures/elidragon_quest.png
new file mode 100644 (file)
index 0000000..5306305
Binary files /dev/null and b/textures/elidragon_quest.png differ
diff --git a/textures/elidragon_scpp.png b/textures/elidragon_scpp.png
new file mode 100755 (executable)
index 0000000..c868c1a
Binary files /dev/null and b/textures/elidragon_scpp.png differ
diff --git a/textures/elidragon_skyblock.png b/textures/elidragon_skyblock.png
new file mode 100755 (executable)
index 0000000..7554310
Binary files /dev/null and b/textures/elidragon_skyblock.png differ
diff --git a/textures/elidragon_theodor_small.png b/textures/elidragon_theodor_small.png
new file mode 100755 (executable)
index 0000000..61b4a68
Binary files /dev/null and b/textures/elidragon_theodor_small.png differ
diff --git a/textures/elidragon_tux.png b/textures/elidragon_tux.png
new file mode 100755 (executable)
index 0000000..4251f78
Binary files /dev/null and b/textures/elidragon_tux.png differ
diff --git a/warps.lua b/warps.lua
new file mode 100755 (executable)
index 0000000..41c8b55
--- /dev/null
+++ b/warps.lua
@@ -0,0 +1,34 @@
+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