]> git.lizzy.rs Git - elidragon.git/blob - tags.lua
Merge pull request #4 from HimbeerserverDE/master
[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 minetest.check_player_privs(player_area.owner, {server = true}) 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(player).name
69                 local privs = minetest.get_player_privs(name)
70                 local has_fly = rank ~= "player"
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 ~= "dev" and rank ~= "helper" then
79                         privs.fly = nil
80                         privs.fast = nil
81                         privs.home = nil
82                         privs.tp = nil
83
84                         if rawget(_G, "armor") then
85                                 local inv = player:get_inventory()
86                                 local _, armor_inv = armor:get_valid_player(player, "[elidragon.limit_tick]")
87                                 for i, stack in pairs(armor_inv:get_list("armor")) do
88                                         if stack:get_name() == "lavastuff:boots" then
89                                                 local left = inv:add_item("main", stack)
90                                                 inv:set_stack("armor", i, left)
91                                                 armor_inv:set_stack("armor", i, left)
92                                                 armor:set_player_armor(player)
93
94                                                 local is_emtpy = left:is_empty()
95                                                 minetest.chat_send_player(name, minetest.colorize("#FF002C", is_emtpy
96                                                         and "Uneqipping your lava boots automatically"
97                                                         or "Please take off your lava boots in this zone!"
98                                                 ))
99
100                                                 if not is_emtpy then
101                                                         elidragon.skyblock.spawn_player(player)
102                                                 end
103
104                                                 break
105                                         end
106                                 end
107                         end
108                 else
109                         privs.home = true
110                         privs.tp = true
111                         if has_fly then
112                                 privs.fly = true
113                                 privs.fast = true
114                         end
115                 end
116                 local kill_area = elidragon.get_area_with_tag(name, "kill")
117                 if kill_area then
118                         player:set_pos({x = 0, y = -1000, z = 0})
119                         player:set_hp(0)
120                         if kill_area.param ~= "" then
121                                 elidragon.message(kill_area.param:gsub("%%", " "):gsub("@player", name))
122                         end
123                 end
124                 minetest.set_player_privs(name, privs)
125         end
126         minetest.after(0.5, elidragon.limit_tick)
127 end
128 minetest.after(0, elidragon.limit_tick)
129 minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
130         if elidragon.get_area_with_tag(player:get_player_name(), "no_pvp") then
131                 minetest.chat_send_player(hitter:get_player_name(), minetest.colorize("#FF6737", "You can not PVP here!"))
132                 return true
133         end
134 end)
135 minetest.register_on_player_hpchange(function(player, hp_change)
136         local name = player:get_player_name()
137         if elidragon.get_area_with_tag(name, "no_damage") and hp_change < 0 then
138                 return 0
139         end
140         return hp_change
141 end, true)
142 minetest.register_on_player_hpchange(function(player, hp_change)
143         local name = player:get_player_name()
144         local teleport_area = elidragon.get_area_with_tag(name, "teleport_on_damage")
145         if teleport_area and hp_change < 0 then
146                 elidragon.teleport(name, teleport_area.param)
147                 return 0
148         end
149         return hp_change
150 end, true)