Added New Chatcommands, a Team Chat and Chest Control

master
Elias Fleckenstein 2020-05-28 11:55:49 +02:00
parent 4725bbd95b
commit 2b2acde066
8 changed files with 230 additions and 85 deletions

View File

@ -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
})

52
chest_control.lua Normal file
View File

@ -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 = "<itemstring>",
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
})

View File

@ -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 = "<player> <command> <arguments...>",
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 = "[[<player>-]color>-]<message>",
description = "Send a message as the server.",
privs = {server = true},
func = function(player, param)
coronaserver.message(param)
end,
})

45
functions.lua Normal file
View File

@ -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)

View File

@ -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")

View File

@ -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")

View File

@ -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)

39
teamchat.lua Normal file
View File

@ -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 = "<nachricht>",
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)