]> git.lizzy.rs Git - elidragon.git/blob - tags.lua
Merge branch 'master' of https://github.com/EliasFleckenstein03/elidragon
[elidragon.git] / tags.lua
1 if not elidragon.savedata.areas then
2         elidragon.savedata.areas = {}
3 end
4 function elidragon.get_area_with_tag(name, tag)
5         local player = minetest.get_player_by_name(name)
6         for _, player_area in pairs(areas:getAreasAtPos(player:get_pos())) do
7                 for _, marked_area in pairs(elidragon.savedata.areas) do
8                         if player_area.name == marked_area.name and marked_area.tag == tag and elidragon.get_rank(player_area.owner).name == "admin" then
9                                 return marked_area
10                         end
11                 end
12         end
13 end
14 minetest.register_chatcommand("add_tag", {
15     description = "Add tag to area",
16     param = "<area> <tag> <param>",
17     privs = {server = true},
18     func = function(name, param)
19                 if not param then 
20                         minetest.chat_send_player(name, "Invalid Usage")
21                         return
22                 end
23                 local area = {
24                         name = param:split(" ")[1],
25                         tag = param:split(" ")[2],
26                         param = param:split(" ")[3],
27                 }
28         if not area.name or not area.tag then
29             minetest.chat_send_player(name, "Invalid Usage")
30             return
31         end
32         if not area.param then
33                         area.param = ""
34                 end
35         elidragon.savedata.areas[#elidragon.savedata.areas + 1] = area
36         minetest.chat_send_player(name, "tag added. ")
37     end
38 })
39 minetest.register_chatcommand("remove_tag", {
40     description = "Remove tag from area",
41     param = "<area> <tag>",
42     privs = {server = true},
43     func = function(name, param)
44         param = param or ""
45                 for i, area in pairs(elidragon.savedata.areas) do
46                         if area.name == param:split(" ")[1] and (area.tag == param:split(" ")[2] or not param:split(" ")[2]) then
47                                 table.remove(elidragon.savedata.areas, i)
48                                 minetest.chat_send_player(name, "Tag removed.")
49                         end
50                 end
51     end
52 })
53 minetest.register_chatcommand("print_tags", {
54     description = "Print area tags",
55     param = "[<area>]",
56     privs = {server = true},
57     func = function(name, param)
58                 for _, area in pairs(elidragon.savedata.areas) do
59             if param == "" or param == area.name then
60                 minetest.chat_send_player(name, area.name .. " | " .. area.tag .. " | " .. area.param)
61             end
62                 end
63     end
64 })
65 function elidragon.limit_tick()
66     for _, player in pairs(minetest.get_connected_players()) do
67                 local name = player:get_player_name()
68                 local rank = elidragon.get_rank(name).name
69                 local privs = minetest.get_player_privs(name)
70                 local has_fly = elidragon.get_rank(name) == "vip" or elidragon.get_rank(name) == "builder"
71         if rank ~= "admin" then
72                         privs.tp_tpc = nil
73                 end
74         local teleport_area = elidragon.get_area_with_tag(name, "teleport")
75         if teleport_area then
76                         elidragon.teleport(name, teleport_area.param)
77         end
78                 if elidragon.get_area_with_tag(name, "movement") and rank ~= "admin" and rank ~= "moderator" and rank ~= "helper" then
79                         privs.fly = nil
80                         privs.fast = nil
81             privs.home = nil
82             privs.tp = nil
83                 else
84                         privs.home = true
85                         privs.tp = true
86                         if has_fly then
87                                 privs.fly = true
88                                 privs.fast = true
89                         end
90         end
91         local kill_area = elidragon.get_area_with_tag(name, "kill")
92         if elidragon.get_area_with_tag(name, "kill") then
93             player:set_pos({x = 0, y = -1000, z = 0})
94             player:set_hp(0)
95             if kill_area.param ~= "" then
96                 elidragon.message(kill_area.param:gsub("%%", " "):gsub("@player", name))
97                 
98             end
99         end
100                 minetest.set_player_privs(name, privs)
101     end
102     minetest.after(0.5, elidragon.limit_tick)
103 end
104 minetest.after(0, elidragon.limit_tick)
105 minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
106         if elidragon.get_area_with_tag(player:get_player_name(), "no_pvp") then
107                 minetest.chat_send_player(hitter:get_player_name(), minetest.colorize("#FF6737", "You can not PVP here!"))
108                 return true
109         end
110 end)
111 minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
112         if elidragon.get_area_with_tag(player:get_player_name(), "pvp") then
113                 if player:get_hp() - damage < 0 and player:get_hp() <= 0 then
114             minetest.chat_send_all(minetest.colorize("#D3FF2A", hitter:get_player_name() .. " has killed " .. player:get_player_name() .. " in the PvP area!"))
115         end
116         end
117 end)
118 minetest.register_on_player_hpchange(function(player, hp_change)
119     local name = player:get_player_name()
120         if elidragon.get_area_with_tag(name, "no_damage") and hp_change < 0 then
121         return 0
122         end
123     return hp_change
124 end, true)
125 minetest.register_on_player_hpchange(function(player, hp_change)
126         local name = player:get_player_name()
127     local teleport_area = elidragon.get_area_with_tag(name, "teleport_on_damage")
128         if teleport_area and hp_change < 0 then
129                 elidragon.teleport(name, teleport_area.param)
130         return 0
131         end
132     return hp_change
133 end, true)