Fix lodestone compass meta handling.
* The nature of a compass was being determined by looking at its meta. This caused lodestone compasses with unset meta to turn into regular compasses. Fixed by using string matching on the itemname. * Changed lodestone rightclick handler to explicitly set the correct name and frame of the compass used on it instead of waiting for globalstep to do this.
This commit is contained in:
parent
8ae605165b
commit
14c882f982
|
@ -35,6 +35,7 @@ local m_atan2 = math.atan2
|
||||||
local m_floor = math.floor
|
local m_floor = math.floor
|
||||||
local m_rnd = math.random
|
local m_rnd = math.random
|
||||||
local vec_new = vector.new
|
local vec_new = vector.new
|
||||||
|
local string_find = string.find
|
||||||
local string_to_pos = minetest.string_to_pos
|
local string_to_pos = minetest.string_to_pos
|
||||||
local get_connected_players = minetest.get_connected_players
|
local get_connected_players = minetest.get_connected_players
|
||||||
local get_item_group = minetest.get_item_group
|
local get_item_group = minetest.get_item_group
|
||||||
|
@ -90,8 +91,7 @@ end
|
||||||
-- itemstack: the compass including its optional lodestone metadata.
|
-- itemstack: the compass including its optional lodestone metadata.
|
||||||
--
|
--
|
||||||
local function get_compass_frame(pos, dir, itemstack)
|
local function get_compass_frame(pos, dir, itemstack)
|
||||||
local lpos_str = itemstack:get_meta():get_string("pointsto")
|
if not string_find(itemstack:get_name(), "_lodestone") then -- normal compass
|
||||||
if lpos_str == "" then -- normal compass
|
|
||||||
-- Compasses only work in the overworld
|
-- Compasses only work in the overworld
|
||||||
if compass_works(pos) then
|
if compass_works(pos) then
|
||||||
local spawn_pos = setting_get_pos("static_spawnpoint")
|
local spawn_pos = setting_get_pos("static_spawnpoint")
|
||||||
|
@ -101,6 +101,7 @@ local function get_compass_frame(pos, dir, itemstack)
|
||||||
return random_frame
|
return random_frame
|
||||||
end
|
end
|
||||||
else -- lodestone compass
|
else -- lodestone compass
|
||||||
|
local lpos_str = itemstack:get_meta():get_string("pointsto")
|
||||||
local lpos = string_to_pos(lpos_str)
|
local lpos = string_to_pos(lpos_str)
|
||||||
if not lpos then
|
if not lpos then
|
||||||
minetest.log("warning", "mcl_compass: invalid lodestone position!")
|
minetest.log("warning", "mcl_compass: invalid lodestone position!")
|
||||||
|
@ -185,10 +186,11 @@ minetest.register_globalstep(function(dtime)
|
||||||
-- check if current compass image still matches true orientation
|
-- check if current compass image still matches true orientation
|
||||||
compass_frame = get_compass_frame(pos, dir, stack)
|
compass_frame = get_compass_frame(pos, dir, stack)
|
||||||
if compass_nr - 1 ~= compass_frame then
|
if compass_nr - 1 ~= compass_frame then
|
||||||
if stack:get_meta():get_string("pointsto") == "" then
|
|
||||||
stack:set_name("mcl_compass:" .. compass_frame)
|
if string_find(stack:get_name(), "_lodestone") then
|
||||||
else
|
|
||||||
stack:set_name("mcl_compass:" .. compass_frame .. "_lodestone")
|
stack:set_name("mcl_compass:" .. compass_frame .. "_lodestone")
|
||||||
|
else
|
||||||
|
stack:set_name("mcl_compass:" .. compass_frame)
|
||||||
end
|
end
|
||||||
inv:set_stack("main", j, stack)
|
inv:set_stack("main", j, stack)
|
||||||
end
|
end
|
||||||
|
@ -251,9 +253,13 @@ minetest.register_alias("mcl_compass:compass", "mcl_compass:" .. stereotype_fram
|
||||||
minetest.register_node("mcl_compass:lodestone",{
|
minetest.register_node("mcl_compass:lodestone",{
|
||||||
description=S("Lodestone"),
|
description=S("Lodestone"),
|
||||||
on_rightclick = function(pos, node, player, itemstack)
|
on_rightclick = function(pos, node, player, itemstack)
|
||||||
if itemstack.get_name(itemstack).match(itemstack.get_name(itemstack),"mcl_compass:") then
|
local name = itemstack.get_name(itemstack)
|
||||||
if itemstack.get_name(itemstack) ~= "mcl_compass:lodestone" then
|
if string_find(name,"mcl_compass:") then
|
||||||
|
if name ~= "mcl_compass:lodestone" then
|
||||||
itemstack:get_meta():set_string("pointsto", minetest.pos_to_string(pos))
|
itemstack:get_meta():set_string("pointsto", minetest.pos_to_string(pos))
|
||||||
|
local dir = player:get_look_horizontal()
|
||||||
|
local frame = get_compass_frame(pos, dir, itemstack)
|
||||||
|
itemstack:set_name("mcl_compass:" .. frame .. "_lodestone")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
Loading…
Reference in New Issue