MineClone5/mods/ITEMS/mcl_clock/init.lua

124 lines
3.6 KiB
Lua
Raw Normal View History

2017-01-09 03:02:23 +01:00
--[[
mcl_clock, renew of the renew of the watch mod
Original from Echo, here: http://forum.minetest.net/viewtopic.php?id=3795
]]--
2017-02-20 21:16:51 +01:00
mcl_clock = {}
-- This is the itemstring of the default clock item. It is used for the default inventory image, help entries, and the like
mcl_clock.stereotype = "mcl_clock:clock"
local watch = {}
watch.old_time = -1
-- Image of all 64 possible faces
watch.images = {}
for frame=0,63 do
table.insert(watch.images, "mcl_clock_clock.png^[verticalframe:64:"..frame)
end
local function round(num)
return math.floor(num + 0.5)
end
function watch.get_clock_frame()
local t = 64 * minetest.get_timeofday()
t = round(t)
if t == 64 then t = 0 end
return tostring(t)
end
local doc_mod = minetest.get_modpath("doc") ~= nil
-- Register items
2017-08-04 16:04:39 +02:00
function watch.register_item(name, image, creative, frame)
local g = 1
if creative then
g = 0
end
local use_doc = name == mcl_clock.stereotype
if doc_mod and not use_doc then
doc.add_entry_alias("craftitems", mcl_clock.stereotype, "craftitems", name)
end
local longdesc, usagehelp
if use_doc then
longdesc = "Clocks are tools which shows the current time of day in the Overworld."
usagehelp = "The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol."
end
2017-02-08 17:02:45 +01:00
minetest.register_craftitem(name, {
description = "Clock",
_doc_items_create_entry = use_doc,
_doc_items_longdesc = longdesc,
_doc_items_usagehelp = usagehelp,
inventory_image = image,
2017-08-04 16:04:39 +02:00
groups = {not_in_creative_inventory=g, tool=1, clock=frame},
wield_image = "",
2017-02-08 17:02:45 +01:00
stack_max = 64,
})
end
2017-01-09 03:18:28 +01:00
-- This timer makes sure the clocks get updated from time to time regardless of time_speed,
-- just in case some clocks in the world go wrong
local force_clock_update_timer = 0
minetest.register_globalstep(function(dtime)
local now = watch.get_clock_frame()
2017-01-09 03:18:28 +01:00
force_clock_update_timer = force_clock_update_timer + dtime
2017-01-09 03:18:28 +01:00
if watch.old_time == now and force_clock_update_timer < 60 then
return
end
2017-01-09 03:18:28 +01:00
force_clock_update_timer = 0
watch.old_time = now
local players = minetest.get_connected_players()
for p, player in ipairs(players) do
for s, stack in ipairs(player:get_inventory():get_list("main")) do
local _, dim = mcl_util.y_to_layer(player:getpos().y)
-- Clocks do not work in the End, Nether or the Void
if dim ~= "end" and dim ~= "nether" and dim ~= "void" then
local count = stack:get_count()
if stack:get_name() == mcl_clock.stereotype then
player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count)
elseif string.sub(stack:get_name(), 1, 16) == "mcl_clock:clock_" then
player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count)
end
end
end
end
end)
2017-01-09 03:18:28 +01:00
-- Immediately set correct clock time after crafting
minetest.register_on_craft(function(itemstack)
if itemstack:get_name() == mcl_clock.stereotype then
2017-01-09 03:18:28 +01:00
itemstack:set_name("mcl_clock:clock_"..watch.get_clock_frame())
end
end)
-- Clock recipe
minetest.register_craft({
output = mcl_clock.stereotype,
recipe = {
2017-01-31 23:32:56 +01:00
{'', 'mcl_core:gold_ingot', ''},
{'mcl_core:gold_ingot', 'mesecons:redstone', 'mcl_core:gold_ingot'},
{'', 'mcl_core:gold_ingot', ''}
}
})
-- Clock tool
2017-08-04 16:04:39 +02:00
watch.register_item(mcl_clock.stereotype, watch.images[1], true, 1)
-- Faces
for a=0,63,1 do
local b = a
if b > 31 then
b = b - 32
else
b = b + 32
end
2017-08-04 16:04:39 +02:00
watch.register_item("mcl_clock:clock_"..tostring(a), watch.images[b+1], false, a+1)
end
2017-02-20 21:16:51 +01:00