Merge pull request 'The New, Improved, Safe and More Powerful /clearmobs command' (#3528) from clearmobs_improvements into master

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3528
This commit is contained in:
ancientmarinerdev 2023-03-14 02:48:26 +00:00
commit 7b53b6e45f

View file

@ -534,20 +534,110 @@ minetest.register_globalstep(function(dtime)
timer = 0 timer = 0
end) end)
minetest.register_chatcommand("clearmobs",{ minetest.register_chatcommand("clearmobs",{
privs={maphack=true}, privs={maphack=true},
params = "<all>|<nametagged>|<range>", params = "[<all>|<hostile/passive>|<name>] [<nametagged>|<range>]",
description=S("Removes all spawned mobs except nametagged and tamed ones. all removes all mobs, nametagged only nametagged ones and with the range paramter all mobs in a distance of the current player are removed."), description=S("Removes specified spawned mobs except nametagged and tamed ones. For param2, use nametagged to remove those with a nametag, or range for all mobs in a distance of the current player to be removed."),
func=function(n,param) func=function(player, param)
local p = minetest.get_player_by_name(n) local default = false
local num=tonumber(param) if not param or param == "" then
default = true
minetest.chat_send_player(player,
S("Default usage. Clearing hostile mobs. For more options please type: /help clearmobs"))
end
local mob, unsafe = param:match("^([%w]+)[ ]?([%w%d]*)$")
local all = false
local nametagged = false
local mob_name, mob_type, range
-- Param 1 resolve
if mob and mob ~= "" then
if mob == "all" then
all = true
elseif mob == "passive" or mob == "monster" then
mob_type = mob
elseif mob then
mob_name = mob
end
--minetest.log ("mob: [" .. mob .. "]")
else
--minetest.log("No valid first param")
if default then
--minetest.log("Use default")
mob_type = "monster"
end
--return
end
-- Param 2 resolve
if unsafe and unsafe ~= "" then
--minetest.log ("unsafe: [" .. unsafe .. "]")
if unsafe == "nametagged" then
nametagged = true
end
local num = tonumber(unsafe)
if num then range = num end
end
local p = minetest.get_player_by_name(player)
for _,o in pairs(minetest.luaentities) do for _,o in pairs(minetest.luaentities) do
if o.is_mob then if o and o.is_mob then
if param == "all" or local mob_match = false
( param == "nametagged" and o.nametag ) or
( param == "" and ( not o.nametag or o.nametag == "" ) and not o.tamed ) or if all then
( num and num > 0 and vector.distance(p:get_pos(),o.object:get_pos()) <= num ) then --minetest.log("Match - All mobs specified")
o.object:remove() mob_match = true
elseif mob_type then
--minetest.log("Match - o.type: ".. tostring(o.type))
--minetest.log("mob_type: ".. tostring(mob_type))
if mob_type == "monster" and o.type == mob_type then
--minetest.log("Match - monster")
mob_match = true
elseif mob_type == "passive" and o.type ~= "monster" and o.type ~= "npc" then
--minetest.log("Match - passive")
mob_match = true
else
--minetest.log("No match for type.")
end
elseif mob_name and (o.name == mob_name or string.find(o.name, mob_name)) then
--minetest.log("Match - mob_name = ".. tostring(o.name))
mob_match = true
else
--minetest.log("No match - o.type = ".. tostring(o.type))
--minetest.log("No match - mob_name = ".. tostring(o.name))
--minetest.log("No match - mob_type = ".. tostring(mob_name))
end
if mob_match then
local in_range = true
if (not range or range <= 0 ) then
in_range = true
else
if ( vector.distance(p:get_pos(),o.object:get_pos()) <= range ) then
in_range = true
else
--minetest.log("Out of range")
in_range = false
end
end
--minetest.log("o.nametag: ".. tostring(o.nametag))
if in_range and ( (not o.nametag or o.nametag == "" ) and not o.tamed ) then
--minetest.log("No nametag or tamed. Kill it")
o.object:remove()
elseif nametagged and o.nametag then
--minetest.log("Namedtagged and it has a name tag. Kill it")
o.object:remove()
else
--minetest.log("Tamed or out of range, do not kill")
end
end end
end end
end end