From a132fadacd6ec0b226e0140b2093614c45788e21 Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Wed, 20 Nov 2019 11:58:09 +0200 Subject: [PATCH] Better sethome! --- ess/kits.lua | 6 +- sethome/init.lua | 185 +++++++++++++++++++++++++++++++++++++++ sethome/mod.conf | 4 + sethome/settingtypes.txt | 7 ++ 4 files changed, 198 insertions(+), 4 deletions(-) create mode 100644 sethome/init.lua create mode 100644 sethome/mod.conf create mode 100644 sethome/settingtypes.txt diff --git a/ess/kits.lua b/ess/kits.lua index a6c203d..027f9ff 100644 --- a/ess/kits.lua +++ b/ess/kits.lua @@ -158,7 +158,7 @@ local function cmd_kits(name, param, splitparams) for kit in pairs(kits_cache) do local perms = true if kit_privs then - perms = ess.priv_match(name, "ess.kits.kit." .. kit) or ess.priv_match(name, "ess.kits.all") + perms = ess.priv_match(name, "ess.kits.kit." .. kit) or ess.priv_match(name, "ess.kits.kits.all") end if perms then @@ -172,7 +172,7 @@ end local commands = { ["kits"] = { description = "Give or list available kits", - params = "( (delete | create) [] ) | ( [] [] )", + params = "(delete|create) [] | [] []", aliases = {"kit"}, privs = { ["ess.kits.kits"] = true, @@ -203,8 +203,6 @@ local commands = { ess.autoregister(commands, "kits") -local loaded = false - if kit_give ~= "" then minetest.register_on_newplayer(function(player) give_kit(player, kit_give) diff --git a/sethome/init.lua b/sethome/init.lua new file mode 100644 index 0000000..e7f6b51 --- /dev/null +++ b/sethome/init.lua @@ -0,0 +1,185 @@ +-- sethome override for Icy Essentials with multi-home support + +local maxhomes = tonumber(minetest.settings:get("sethome_count")) or 3 +local bedhome = minetest.settings:get_bool("sethome_bed", true) +local homerespawn = minetest.settings:get_bool("sethome_respawn", false) + +sethome = ess.register_module("home", "Homes") + +sethome.set = function(name, pos, target) + local player = minetest.get_player_by_name(name) + if not player or not pos then + return false, "Player not found!" + end + + if not target or target == "" then target = "home" end + + local homes = ess.get_player_meta(name, "homes") + if not homes then homes = {} end + + local count = 0 + for i in pairs(homes) do + if i ~= "bed" then + count = count + 1 + end + end + + if count >= maxhomes and maxhomes ~= 0 and not ess.priv_match(name, "home.multiple") and target ~= "bed" then + return false, string.format("You don't have permission to set more than %d homes.", maxhomes) + end + + homes[target:lower()] = pos + ess.set_player_meta(name, "homes", homes) + + return true +end + +sethome.get = function(name, target) + local player = minetest.get_player_by_name(name) + + if not target or target == "" then target = "home" end + + local homes = ess.get_player_meta(name, "homes") + if not homes then return false end + local targ = homes[target:lower()] + if not targ and target == "home" and homes["bed"] then + targ = homes["bed"] + target = "bed" + end + + if not targ then + return nil + end + + return targ, target +end + +sethome.go = function(name,point) + local pos, target = sethome.get(name,point) + local player = minetest.get_player_by_name(name) + + if player and pos then + ess.save_player_pos(player) + player:set_pos(pos) + return true, target + end + + return false +end + +local function cmd_home(name, params, splitparams) + local target = splitparams[1] + if not target or target == "" then + target = "home" + end + + local went, name = sethome.go(name, target) + + if went then + return true, string.format("Teleported to %s!", name) + end + + return false, string.format("Home \"%s\" does not exist.", target) +end + +local function cmd_set(name, params, splitparams) + local target = splitparams[1] + if not target or target == "" then + target = "home" + end + + local player = minetest.get_player_by_name(name) + local success, err = sethome.set(name, player:get_pos(), target) + + if player and success then + return true, string.format("Home \"%s\" set!", target) + end + + return false, err +end + +local function cmd_del(name, params, splitparams) + local target = splitparams[1] + if not target or target == "" then target = "home" end + + local homes = ess.get_player_meta(name, "homes") + if not homes then homes = {} end + homes[target:lower()] = nil + ess.set_player_meta(name, "homes", homes) + + return true, string.format("Home \"%s\" deleted successfully.", target) +end + +local function cmd_list(name, params, splitparams) + local target = splitparams[1] + if not target or target == "" then target = "home" end + + local homes = ess.get_player_meta(name, "homes") + if not homes then homes = {} end + + local names = {} + for i in pairs(homes) do + table.insert(names, i) + end + + return true, "Homes: " .. table.concat( names, ", " ) +end + +sethome.register_chatcommand("home", { + description = "Teleport you to your home point", + params = "[]", + privs = { + home = true, + ["home.all"] = true, + }, + func = cmd_home, +}) + +sethome.register_chatcommand("homes", { + description = "List your home points", + privs = { + home = true, + ["home.all"] = true, + }, + func = cmd_list, +}) + +sethome.register_chatcommand("sethome", { + description = "Set your home point", + params = "[]", + privs = { + home = true, + ["home.all"] = true, + ["home.multiple"] = true, + }, + func = cmd_set, +}) + +sethome.register_chatcommand("delhome", { + description = "Delete your home point", + params = "[]", + privs = { + home = true, + ["home.all"] = true, + }, + func = cmd_del, +}) + +if bedhome and minetest.get_modpath("beds") ~= nil and beds ~= nil then + local rclick = beds.on_rightclick + beds.on_rightclick = function (pos,player) + local name = player:get_player_name() + rclick(pos,player) + + local success = sethome.set(name, pos, "bed") + if success then + minetest.chat_send_player(name, "Bed spawnpoint set!") + end + end +end + +if homerespawn then + minetest.register_on_respawnplayer(function(player) + return sethome.go(player:get_player_name()) + end) +end diff --git a/sethome/mod.conf b/sethome/mod.conf new file mode 100644 index 0000000..5bd102d --- /dev/null +++ b/sethome/mod.conf @@ -0,0 +1,4 @@ +name = sethome +description = sethome override for Icy Essentials with multi-home support +depends = ess_core +optional_depends = beds diff --git a/sethome/settingtypes.txt b/sethome/settingtypes.txt new file mode 100644 index 0000000..862f2dc --- /dev/null +++ b/sethome/settingtypes.txt @@ -0,0 +1,7 @@ + +# Privilege home.multiple overrides this. Set to 0 to allow infinite amount. +sethome_count (Maximum allowed homes per player) int 3 + +sethome_bed (Automatically set bed home point) bool true + +sethome_respawn (Respawn at home) bool false