From 2b2acde066551a8a4de6ed7fdec85da77da58c2e Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 28 May 2020 11:55:49 +0200 Subject: [PATCH] Added New Chatcommands, a Team Chat and Chest Control --- birthday.lua | 51 ------------------------------------- chest_control.lua | 52 +++++++++++++++++++++++++++++++++++++ commands.lua | 65 ++++++++++++++++++++++++++++++++++++++++++++++- functions.lua | 45 ++++++++++++++++++++++++++++++++ init.lua | 2 +- ranks.lua | 45 ++++++++++++++++++++------------ save.lua | 16 ------------ teamchat.lua | 39 ++++++++++++++++++++++++++++ 8 files changed, 230 insertions(+), 85 deletions(-) delete mode 100644 birthday.lua create mode 100644 chest_control.lua create mode 100644 functions.lua delete mode 100644 save.lua create mode 100644 teamchat.lua diff --git a/birthday.lua b/birthday.lua deleted file mode 100644 index 6ba87ea..0000000 --- a/birthday.lua +++ /dev/null @@ -1,51 +0,0 @@ -coronaserver.savedata.birthday = coronaserver.savedata.birthday or {} -function coronaserver.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() coronaserver.flower_rain(name) end) -end -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - if coronaserver.savedata.birthday[name] == os.date("%d.%m") then - minetest.chat_send_all(minetest.colorize("#FF20FF", name .. " hat heute Geburtstag!")) - coronaserver.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("geburtstag", { - description = "Setzte deinen geburtstag (z.b. 07.09 wenn du am 7. September Geburtstag hast)", - param = "TT.MM", - func = function(name, param) - coronaserver.savedata.birthday[name] = param - coronaserver.save() - minetest.chat_send_player(name, "Geburtstag auf den " .. param .. " gesetzt") - end -}) diff --git a/chest_control.lua b/chest_control.lua new file mode 100644 index 0000000..ade337a --- /dev/null +++ b/chest_control.lua @@ -0,0 +1,52 @@ +coronaserver.savedata.suspect_items = coronaserver.savedata.suspect_items or {} +minetest.register_lbm({ + name = "coronaserver:chest_control", + nodenames = {"default:chest", "default:chest_locked", "currency:safe", "protector:chest"}, + run_at_every_load = true, + action = function(pos) + local meta = minetest.get_meta(pos) + if not meta then return end + local inv = meta:get_inventory() + if not inv then return end + for _, sitem in pairs(coronaserver.savedata.suspect_items) do + if inv:contains_item("main", sitem) then + coronaserver.teamchat_message(nil, "Verdächtige Kiste bei Position " .. minetest.pos_to_string(pos)) + end + end + end +}) +minetest.register_chatcommand("add_suspect_item", { + description = "Mark an item as suspect", + param = "", + privs = {server = true}, + func = function(name, param) + if not param then return false, "Invalid Usage" end + table.insert(coronaserver.savedata.suspect_items, param) + return true, param .. " added to suspect items" + end +}) +minetest.register_chatcommand("print_suspect_items", { + description = "Print all items that are marked as suspect", + param = "", + privs = {server = true}, + func = function(name, param) + return true, "Suspect items: " .. table.concat(coronaserver.savedata.suspect_items, ", ") + end +}) +minetest.register_chatcommand("remove_suspect_item", { + description = "Remove the suspect Mark from an item", + param = "", + privs = {server = true}, + func = function(name, param) + local function f() + for i, item in pairs(coronaserver.savedata.suspect_items) do + if item == param then + table.remove(coronaserver.savedata.suspect_items, i) + return 1 + f() + end + end + return 0 + end + return true, "Removed " .. tostring(f()) .. " from list" + end +}) diff --git a/commands.lua b/commands.lua index fddb0d8..8ca4ce6 100644 --- a/commands.lua +++ b/commands.lua @@ -10,4 +10,67 @@ minetest.register_chatcommand("getip", { end end }) - + +minetest.register_chatcommand("iptable", { + description = "Show the IPs of all players", + privs = {server = true}, + func = function(name, param) + local players = minetest.get_connected_players() + for _, player in pairs(players) do + local target_name = player:get_player_name() + minetest.chat_send_player(name, target_name .. " | " .. minetest.get_player_information(target_name).address) + end + end +}) + +minetest.register_chatcommand("sudo", { + description = "Force other players to run commands", + params = " ", + privs = {server = true}, + func = function(name, param) + local target = param:split(" ")[1] + local command = param:split(" ")[2] + local argumentsdisp + local cmddef = minetest.chatcommands + local _, _, arguments = string.match(param, "([^ ]+) ([^ ]+) (.+)") + if not arguments then arguments = "" end + if target and command then + if cmddef[command] then + if minetest.get_player_by_name(target) then + if arguments == "" then argumentsdisp = arguments else argumentsdisp = " " .. arguments end + cmddef[command].func(target, arguments) + else + minetest.chat_send_player(name, minetest.colorize("#FF0000", "Invalid Player.")) + end + else + minetest.chat_send_player(name, minetest.colorize("#FF0000", "Nonexistant Command.")) + end + else + minetest.chat_send_player(name, minetest.colorize("#FF0000", "Invalid Usage.")) + end + 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, +}) + +minetest.register_chatcommand("message", { + params = "[[-]color>-]", + description = "Send a message as the server.", + privs = {server = true}, + func = function(player, param) + coronaserver.message(param) + end, +}) diff --git a/functions.lua b/functions.lua new file mode 100644 index 0000000..61c6ffc --- /dev/null +++ b/functions.lua @@ -0,0 +1,45 @@ +function coronaserver.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 coronaserver.load() + local file = io.open(minetest.get_worldpath() .. "/coronaserver", "r") + if file then + coronaserver.savedata = minetest.deserialize(file:read()) + file:close() + else + coronaserver.savedata = {} + end +end +function coronaserver.save() + local file = io.open(minetest.get_worldpath() .. "/coronaserver", "w") + file:write(minetest.serialize(coronaserver.savedata)) + file:close() +end +coronaserver.load() +minetest.register_on_shutdown(coronaserver.save) diff --git a/init.lua b/init.lua index e04d66a..ecb1002 100755 --- a/init.lua +++ b/init.lua @@ -1,6 +1,6 @@ coronaserver = {} -local modules = {"save", "privs", "ranks", "playerlist", "commands"} +local modules = {"functions", "privs", "ranks", "playerlist", "commands", "teamchat", "chest_control"} for _, m in pairs(modules) do dofile(minetest.get_modpath("coronaserver") .. "/" .. m .. ".lua") diff --git a/ranks.lua b/ranks.lua index a12a48b..e7d1aac 100755 --- a/ranks.lua +++ b/ranks.lua @@ -1,10 +1,22 @@ coronaserver.ranks = { + { + name = "evil", + color = "#4E4E4E", + tag = "[BÖSE]", + privs = {shout = true}, + }, { name = "student", color = "#BBBBBB", tag = "[SCHÜLER*IN]", - privs = {student = true, interact = true, shout = true, fast = true, spawn = true, home = true, zoom = true, pvp = true, iblocks = true}, + privs = {student = true, interact = true, fast = true, spawn = true, home = true, zoom = true, pvp = true, iblocks = true}, }, + { + name = "feuerwehr", + color = "#000000", + tag = "[FEUERWEHR]", + privs = {}, + }, { name = "teacher", color = "#16AE00", @@ -15,7 +27,7 @@ coronaserver.ranks = { name = "supporter", color = "#EE6E00", tag = "[SUPPORTER]", - privs = {kick = true}, + privs = {kick = true, team = true}, }, { name = "moderator", @@ -29,12 +41,6 @@ coronaserver.ranks = { tag = "[ENTWICKLER*IN]", privs = {privs = true}, }, - { - name = "hacker", - color = "#000000", - tag = "[HACKER]", - privs = {}, - }, { name = "admin", color = "#FF362D", @@ -67,14 +73,22 @@ function coronaserver.get_player_name(name, brackets) end return rank_tag .. brackets[1] .. name .. brackets[2] .. " " end +function coronaserver.reload_name_tag(name) + local player = minetest.get_player_by_name(name) + if not player then return end + player:set_nametag_attributes({color = coronaserver.get_rank(name).color}) +end minetest.register_on_joinplayer(function(player) local name = player:get_player_name() if coronaserver.get_rank(name).name == "student" and minetest.check_player_privs(name, {teacher = true}) then coronaserver.savedata.ranks[name] = "teacher" coronaserver.save() end + if coronaserver.get_rank(name).name == "hacker" then + coronaserver.savedata.ranks[name] = "student" + end minetest.chat_send_all(coronaserver.get_player_name(name) .. "has joined the Server.") - player:set_nametag_attributes({color = coronaserver.get_rank(name).color}) + coronaserver.reload_name_tag(name) end) minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() @@ -89,12 +103,12 @@ minetest.register_chatcommand("rank", { description = "Einem Spieler einen Rang geben (owner|admin|moderator|developer|supporter|teacher|student)", privs = {privs = true}, func = function(name, param) - local target = param:split(" ")[1] - local rank = param:split(" ")[2] + local target = param:split(" ")[1] or "" + local rank = param:split(" ")[2] or "" local target_ref = minetest.get_player_by_name(target) local rank_ref = coronaserver.get_rank_by_name(rank) if not rank_ref then - minetest.chat_send_player(name, "Invalider Rang: " .. (rank or "")) + minetest.chat_send_player(name, "Invalider Rang: " .. rank) else coronaserver.savedata.ranks[target] = rank local privs = {} @@ -107,10 +121,9 @@ minetest.register_chatcommand("rank", { end end minetest.set_player_privs(target, privs) - minetest.chat_send_all(target .. " is now a " .. minetest.colorize(rank_ref.color, rank_ref.name)) - if target_ref then - target_ref:set_nametag_attributes({color = rank_ref.color}) - end + minetest.chat_send_all(target .. "s Rang ist jetzt " .. minetest.colorize(rank_ref.color, rank_ref.name)) + coronaserver.reload_name_tag(name) end end, }) +minetest.register_privilege("team", "Team Member") diff --git a/save.lua b/save.lua deleted file mode 100644 index 3f779b9..0000000 --- a/save.lua +++ /dev/null @@ -1,16 +0,0 @@ -function coronaserver.load() - local file = io.open(minetest.get_worldpath() .. "/coronaserver", "r") - if file then - coronaserver.savedata = minetest.deserialize(file:read()) - file:close() - else - coronaserver.savedata = {} - end -end -function coronaserver.save() - local file = io.open(minetest.get_worldpath() .. "/coronaserver", "w") - file:write(minetest.serialize(coronaserver.savedata)) - file:close() -end -coronaserver.load() -minetest.register_on_shutdown(coronaserver.save) diff --git a/teamchat.lua b/teamchat.lua new file mode 100644 index 0000000..36d2051 --- /dev/null +++ b/teamchat.lua @@ -0,0 +1,39 @@ +function coronaserver.teamchat_message(name, message) + local msg = minetest.colorize("#08FF00", "(TEAMCHAT) ") + if name then + msg = msg .. coronaserver.get_player_name(name, {"<", ">"}) .. message + else + msg = msg .. message + end + local players = minetest.get_connected_players() + for _, player in pairs(players) do + local name = player:get_player_name() + if minetest.check_player_privs(name, {team = true}) then + minetest.chat_send_player(name, msg) + end + end +end + + +local teamchat_chatcommand_def = { + param = "", + description = "Etwas in dem Teamchat schreibem", + privs = {team = true}, + func = coronaserver.teamchat_message +} + +minetest.register_chatcommand("teamchat", teamchat_chatcommand_def) +minetest.register_chatcommand("t", teamchat_chatcommand_def) + +minetest.register_on_mods_loaded(function() + if not invis then return end + local old_invis_toggle = invis.toggle + function invis.toggle(player, toggle) + old_invis_toggle(player, toggle) + local name = type(player) == "userdata" and player:get_player_name() or player + coronaserver.teamchat_message(nil, coronaserver.get_player_name(name) .. "ist jetzt" .. (invis.get(name) and "" or " nicht mehr") .. minetest.colorize("#00FFFC", " unsichtbar")) + if not toggle then + coronaserver.reload_name_tag(name) + end + end +end) -- 2.44.0