226 lines
6.2 KiB
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
|
|
})
|
|
|
|
|
|
|