diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index 053f9679b..debe5e563 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -13,54 +13,49 @@ local random_timer_trigger = 0.5 -- random compass spinning tick in seconds. Inc local random_frame = math.random(0, compass_frames-1) -function mcl_compass.get_compass_image(pos, dir, x, y, z) +function mcl_compass.get_compass_image(pos, dir, itemstack) -- Compasses do not work in certain zones - if mcl_worlds.compass_works(pos) and x ~= nil and y ~= nil and z ~= nil then - local _, dim = mcl_worlds.y_to_layer(y) + local lodestone_pos = minetest.string_to_pos(itemstack:get_meta():get_string("pointsto")) + + if lodestone_pos then --lodestone meta present + local _, dim = mcl_worlds.y_to_layer(lodestone_pos.y) local _, playerdim = mcl_worlds.y_to_layer(pos.y) - if dim == playerdim then --Check if player and compass target are in the same dimension, above check is just if the diemension is valid for the non lodestone compass - local spawn = {x=x,y=y,z=z} - local ssp = minetest.setting_get_pos("static_spawnpoint") - if ssp and x == 0 and y == 0 and z == 0 then - spawn = ssp - if type(spawn) ~= "table" or type(spawn.x) ~= "number" or type(spawn.y) ~= "number" or type(spawn.z) ~= "number" then - spawn = {x=0,y=0,z=0} - end - end - local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) + if dim == playerdim then --Check if player and compass target are in the same dimension, above check is just if the diemension is valid for the non lodestone compass + local function get_far_node(pos) --code from minetest dev wiki: https://dev.minetest.net/minetest.get_node + local node = minetest.get_node(pos) + if node.name == "ignore" then + minetest.get_voxel_manip():read_from_map(pos, pos) + node = minetest.get_node(pos) + end + return node + end + + if get_far_node(lodestone_pos).name == "mcl_compass:lodestone" then --check if lodestone still exists + local angle_north = math.deg(math.atan2(lodestone_pos.x - pos.x, lodestone_pos.z - pos.z)) + if angle_north < 0 then angle_north = angle_north + 360 end + local angle_dir = -math.deg(dir) + local angle_relative = (angle_north - angle_dir + 180) % 360 + return math.floor((angle_relative/11.25) + 0.5) % compass_frames .. "_lodestone" + else -- lodestone got destroyed + return random_frame .. "_lodestone" + end + else + return random_frame .. "_lodestone" + end + else --no lodestone meta, normal compass.... + local spawn = {x = 0, y=0, z=0} --before you guys tell me that the normal compass no points to real spawn, it always pointed to 0 0 + + if mcl_worlds.compass_works(pos) then --is the player in the overworld? + local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) if angle_north < 0 then angle_north = angle_north + 360 end local angle_dir = -math.deg(dir) local angle_relative = (angle_north - angle_dir + 180) % 360 return math.floor((angle_relative/11.25) + 0.5) % compass_frames - else - return random_frame - end - else - if x ~= 0 and y ~= 0 and z~= 0 and x ~= nil and y ~= nil and x~= nil then - local _, dim = mcl_worlds.y_to_layer(y) - local _, playerdim = mcl_worlds.y_to_layer(pos.y) - if dim == playerdim then --already explained that very same if statement above - local spawn = {x=x,y=y,z=z} - local ssp = minetest.setting_get_pos("static_spawnpoint") - if ssp and x == 0 and y == 0 and z == 0 then - spawn = ssp - if type(spawn) ~= "table" or type(spawn.x) ~= "number" or type(spawn.y) ~= "number" or type(spawn.z) ~= "number" then - spawn = {x=0,y=0,z=0} - end - end - local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) - if angle_north < 0 then angle_north = angle_north + 360 end - local angle_dir = -math.deg(dir) - local angle_relative = (angle_north - angle_dir + 180) % 360 - return math.floor((angle_relative/11.25) + 0.5) % compass_frames - else - return random_frame - end + else + return random_frame + end - else - return random_frame - end end end @@ -84,32 +79,9 @@ minetest.register_globalstep(function(dtime) local pos = player:get_pos() for j,stack in pairs(player:get_inventory():get_list("main")) do - checkblock = {x = nil, y = nil, z = nil} - checkblock = minetest.string_to_pos(stack:get_meta():get_string("pointsto")) - - - if checkblock == nil then --checking if the compass has lodestone meta - compass_image = mcl_compass.get_compass_image(pos, player:get_look_horizontal(), 0, 0, 0) --no lodestone meta - else - local function get_far_node(pos) --function that tries to read node normally, and does it even if its unloaded https://dev.minetest.net/minetest.get_node - local node = minetest.get_node(pos) - if node.name == "ignore" then - minetest.get_voxel_manip():read_from_map(pos, pos) - node = minetest.get_node(pos) - end - return node - end - - if get_far_node(checkblock).name == "mcl_compass:lodestone" then --check if lodestone still exists - compass_image = mcl_compass.get_compass_image(pos, player:get_look_horizontal(), checkblock.x, checkblock.y, checkblock.z) - compass_image = compass_image .. "_lodestone" - else -- lodestone got destroyed - compass_image = random_frame .. "_lodestone" - end - - - end - + compass_image = mcl_compass.get_compass_image(pos, player:get_look_horizontal(), stack) + + if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and minetest.get_item_group(stack:get_name(), "compass")-1 ~= compass_image then local itemname = "mcl_compass:"..compass_image