Added setting for different compass modes instead of the hardcoded chain. Added "origin" mode

This commit is contained in:
Alexander Weber 2017-04-11 22:49:36 +02:00
parent 92917982ad
commit 27b8da1796
2 changed files with 35 additions and 19 deletions

View File

@ -1,25 +1,25 @@
-- default to static_spawnpoint or 0/0/0
local default_spawn = minetest.setting_get_pos("static_spawnpoint") or {x=0, y=0, z=0}
-- supported modes: default, sethome, beds, origin
local compass_mode = minetest.setting_get("compass_mode") or "default"
-- Get players spawn point (compass target) in order sethome, beds-spawn and static_spawnpoint
local function get_spawn(player)
local playername = player:get_player_name()
local spawn
if minetest.global_exists("sethome") then
spawn = sethome.get(playername)
local function get_destination(player, stack)
if compass_mode == "default" then
return minetest.setting_get_pos("static_spawnpoint") or default_spawn
elseif compass_mode == "sethome" then
return sethome.get(player:get_player_name()) or default_spawn
elseif compass_mode == "beds" then
return beds.spawn[player:get_player_name()] or default_spawn
elseif compass_mode == "origin" then
return minetest.string_to_pos(stack:get_metadata())
end
if not spawn and minetest.global_exists("beds") and beds.spawn then
spawn = beds.spawn[playername]
end
if not spawn then
spawn = default_spawn
end
return spawn
end
-- get right image number for players compas
local function get_compass_image(player)
local spawn = get_spawn(player)
local function get_compass_stack(player, stack)
local spawn = get_destination(player, stack)
local pos = player:getpos()
local dir = player:get_look_yaw()
local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z))
@ -29,7 +29,8 @@ local function get_compass_image(player)
local angle_dir = 90 - math.deg(dir)
local angle_relative = (angle_north - angle_dir) % 360
local compass_image = math.floor((angle_relative/30) + 0.5)%12
return compass_image
return "compass:"..compass_image.." 1 0 "..stack:get_metadata()
end
-- update inventory
@ -37,11 +38,20 @@ minetest.register_globalstep(function(dtime)
for i,player in ipairs(minetest.get_connected_players()) do
if player:get_inventory() then
for i,stack in ipairs(player:get_inventory():get_list("main")) do
if i > 8 then
break
end
if string.sub(stack:get_name(), 0, 8) == "compass:" then
player:get_inventory():set_stack("main", i, "compass:"..get_compass_image(player))
if compass_mode == "origin" then
local meta = stack:get_metadata()
if not meta or meta == "" then
meta = minetest.pos_to_string(player:getpos())
stack:set_metadata(meta)
player:get_inventory():set_stack("main", i, stack)
end
elseif i > 8 then
break
end
if i <= 8 then
player:get_inventory():set_stack("main", i, get_compass_stack(player, stack))
end
end
end
end

6
settingtypes.txt Normal file
View File

@ -0,0 +1,6 @@
# Where the compass should point
# default = points to the "static_spawnpoint" setting coordinates or to 0,0,0 if nothing set
# sethome = points to the players home from sethome mod, default as fallback
# beds = points to the players spawn point trough the beds mod, default as fallback
# origin = points to the individual compass origin that means the place the compass was crafted or picked first time
compass_mode (Compass Mode) string default