people/commands.lua

226 lines
6.2 KiB
Lua

local dbg
if moddebug then dbg=moddebug.dbg("people") else dbg={v1=function() end,v2=function() end,v3=function() end} end
--- Get a person name from the next argument
-- @return The person name, the actual person, and the rest of the
-- arguments. If the person name is nil, the arguments are invalid.
-- If person is nil, the name is valid, but it's not a person that
-- actually exists.
local get_person = function(args)
if not args then return nil, nil, nil end
person_name, args = string.match(args, "^([^ ]+)(.*)")
if person_name and not people.is_valid_name(person_name) then
return nil, nil, nil
end
local person
if person_name then person = people.people[person_name] end
if args then args = string.sub(args, 2) end
return person_name, person, args
end
local subcmd = {}
subcmd.help = function(playername, args)
msg = "Subcommands:"
for c, _ in pairs(subcmd) do
msg = msg.." "..c
end
return msg, true
end
subcmd.create = function(playername, args)
local person, person_name
person_name, person, args = get_person(args)
if not person_name then
return "Name needs to be specified", false
end
if person then
return "Person "..person_name.." already exists", false
end
local player = minetest.get_player_by_name(playername)
if not player then
return "people create can only be used by a player", false
end
local pos = player:getpos()
local obj = minetest.add_entity(pos, "people:person")
if not obj then
return "Failed to add_entity", false
end
local ent = obj:get_luaentity()
ent.name = person_name
ent.owner = playername
people.people_add(ent)
return "Created "..person_name, true
end
subcmd.delete = function(playername, args)
local person, person_name
person_name, person, args = get_person(args)
if not person then
return "Specify a valid person"
end
local ent = people.people[person_name].entity
if not ent then
return "Can't delete when inactive", false
end
ent.object:remove()
people.people[person_name] = nil
return "Deleted "..person_name, true
end
subcmd.summon = function(playername, args)
local person, person_name
person_name, person, args = get_person(args)
if not person then
return "Specify a valid person"
end
local player = minetest.get_player_by_name(playername)
if not player then
return "people summon can only be used by a player", false
end
local pos = player:getpos()
local ent = people.people[person_name].entity
if not ent then
return "Can't summon because not active", false
end
ent.object:setpos(pos)
return "Summoned "..person_name, true
end
subcmd.where = function(playername, args)
local person, person_name
person_name, person, args = get_person(args)
if not person then
return "Specify a valid person"
end
local ent = people.people[person_name].entity
if not ent then
return person_name.." is inactive", false
end
return person_name.." is at "..minetest.pos_to_string(ent.object:getpos()), true
end
subcmd.setowner = function(playername, person, person_name, args)
local person, person_name
person_name, person, args = get_person(args)
if not person then
return "Specify a valid person"
end
local ent = people.people[person_name].entity
if not ent then
return person_name.." is inactive", false
end
if not minetest.get_player_by_name(args) then
return "No such new owner"
end
ent.owner = args
return "Set owner of "..person_name.. " to "..args, true
end
subcmd.list = function(playername, args)
local count = 0
for k, v in pairs(people.people) do
local msg = k.." : "
if v.entity then
msg = msg.."active at "..minetest.pos_to_string(v.entity.object:getpos())
else
msg = msg.."inactive for another "..v.waketime - minetest.get_gametime().."s at "..minetest.pos_to_string(v.pos)
end
minetest.chat_send_player(playername, msg)
count = count + 1
end
return count.." people", true
end
subcmd.tell = function(playername, args)
local person, person_name
person_name, person, args = get_person(args)
if not person then
return "Specify a valid person"
end
local ent = people.people[person_name].entity
if not ent then
return person.name.." is inactive, so can't hear you", false
end
if playername ~= ent.owner then
return person.name.." doesn't listen to you", false
end
local sender = minetest.get_player_by_name(playername)
if not sender then return end
senderpos = sender:getpos()
ent.on_tell(sender, senderpos, args)
end
subcmd.skin = function(playername, args)
local person, person_name
person_name, person, args = get_person(args)
if not args then
return "More arguments needed", false
end
if not minetest.get_modpath("skins") then
return "Skins mod is not installed", false
end
if person_name == "list" then
local texlist = ""
for _, skin in ipairs(skins.list) do
if string.match(skin, "^character_") then
if texlist ~= "" then texlist = texlist.." " end
texlist = texlist..string.sub(skin, 11)
end
end
return "Available skins: "..texlist, true
end
if not person then
return "Specify a valid person, or 'list'", false
end
if not args then
return "Specify skin", false
end
local req = "character_"..args
for _, skin in ipairs(skins.list) do
if skin == req then
person.entity.props.textures = {req..".png"}
person.entity:update_props()
return "Skin updated", true
end
end
return "No such skin as '"..args.."'", false
end
minetest.register_chatcommand("people", {
params = "<cmd> [name] [args]",
description = "Commands for working with the people module. 'people help' for help.",
func = function(name, param)
if not minetest.check_player_privs(name, {server=true}) then
return "People commands are currently all restricted to admins", false
end
local cmd, args
cmd, args = string.match(param, "^([^ ]+)(.*)")
if not cmd then return subcmd.help(nil, nil, nil, nil) end
if subcmd[cmd] then
if args then args = string.sub(args, 2) end
return subcmd[cmd](name, args)
end
return "No such people command '"..cmd.."' - see 'people help'", false
end
})