mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-12-27 18:39:34 +01:00
149 lines
4.4 KiB
Lua
149 lines
4.4 KiB
Lua
local S = minetest.get_translator("mcl_clock")
|
|
|
|
--[[
|
|
mcl_clock, renew of the renew of the mcl_clock mod
|
|
|
|
Original from Echo, here: http://forum.minetest.net/viewtopic.php?id=3795
|
|
]]--
|
|
|
|
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"
|
|
|
|
mcl_clock.old_time = -1
|
|
|
|
local clock_frames = 64
|
|
|
|
-- Timer for random clock spinning
|
|
local random_timer = 0.0
|
|
local random_timer_trigger = 1.0 -- random clock spinning tick in seconds. Increase if there are performance problems
|
|
local random_frame = math.random(0, clock_frames-1)
|
|
|
|
-- Image of all possible faces
|
|
mcl_clock.images = {}
|
|
for frame=0, clock_frames-1 do
|
|
local sframe = tostring(frame)
|
|
if string.len(sframe) == 1 then
|
|
sframe = "0" .. sframe
|
|
end
|
|
table.insert(mcl_clock.images, "mcl_clock_clock_"..sframe..".png")
|
|
end
|
|
|
|
local function round(num)
|
|
return math.floor(num + 0.5)
|
|
end
|
|
|
|
function mcl_clock.get_clock_frame()
|
|
local t = clock_frames * minetest.get_timeofday()
|
|
t = round(t)
|
|
if t == clock_frames then t = 0 end
|
|
return tostring(t)
|
|
end
|
|
|
|
local doc_mod = minetest.get_modpath("doc") ~= nil
|
|
|
|
-- Register items
|
|
function mcl_clock.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, tt
|
|
if use_doc then
|
|
longdesc = S("Clocks are tools which shows the current time of day in the Overworld.")
|
|
usagehelp = S("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.")
|
|
tt = S("Displays the time of day in the Overworld")
|
|
end
|
|
minetest.register_craftitem(name, {
|
|
description = S("Clock"),
|
|
_tt_help = tt,
|
|
_doc_items_create_entry = use_doc,
|
|
_doc_items_longdesc = longdesc,
|
|
_doc_items_usagehelp = usagehelp,
|
|
inventory_image = image,
|
|
groups = {not_in_creative_inventory=g, tool=1, clock=frame, disable_repair=1},
|
|
wield_image = "",
|
|
stack_max = 64,
|
|
})
|
|
end
|
|
|
|
-- 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 = mcl_clock.get_clock_frame()
|
|
force_clock_update_timer = force_clock_update_timer + dtime
|
|
random_timer = random_timer + dtime
|
|
-- This causes the random spinning of the clock
|
|
if random_timer >= random_timer_trigger then
|
|
random_frame = (random_frame + math.random(-4, 4)) % clock_frames
|
|
random_timer = 0
|
|
end
|
|
|
|
if mcl_clock.old_time == now and force_clock_update_timer < 60 then
|
|
return
|
|
end
|
|
force_clock_update_timer = 0
|
|
|
|
mcl_clock.old_time = now
|
|
mcl_clock.random_frame = random_frame
|
|
|
|
for p, player in pairs(minetest.get_connected_players()) do
|
|
for s, stack in pairs(player:get_inventory():get_list("main")) do
|
|
local dim = mcl_worlds.pos_to_dimension(player:get_pos())
|
|
|
|
local frame
|
|
-- Clocks do not work in certain zones
|
|
if not mcl_worlds.clock_works(player:get_pos()) then
|
|
frame = random_frame
|
|
else
|
|
frame = now
|
|
end
|
|
|
|
local count = stack:get_count()
|
|
if stack:get_name() == mcl_clock.stereotype then
|
|
player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..frame.." "..count)
|
|
elseif minetest.get_item_group(stack:get_name(), "clock") ~= 0 then
|
|
player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..frame.." "..count)
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- Immediately set correct clock time after crafting
|
|
minetest.register_on_craft(function(itemstack)
|
|
if itemstack:get_name() == mcl_clock.stereotype then
|
|
itemstack:set_name("mcl_clock:clock_"..mcl_clock.get_clock_frame())
|
|
end
|
|
end)
|
|
|
|
-- Clock recipe
|
|
minetest.register_craft({
|
|
output = mcl_clock.stereotype,
|
|
recipe = {
|
|
{'', 'mcl_core:gold_ingot', ''},
|
|
{'mcl_core:gold_ingot', 'mesecons:redstone', 'mcl_core:gold_ingot'},
|
|
{'', 'mcl_core:gold_ingot', ''}
|
|
}
|
|
})
|
|
|
|
-- Clock tool
|
|
mcl_clock.register_item(mcl_clock.stereotype, mcl_clock.images[1], true, 1)
|
|
|
|
-- Faces
|
|
for a=0,clock_frames-1,1 do
|
|
local b = a
|
|
if b > 31 then
|
|
b = b - 32
|
|
else
|
|
b = b + 32
|
|
end
|
|
mcl_clock.register_item("mcl_clock:clock_"..tostring(a), mcl_clock.images[b+1], false, a+1)
|
|
end
|
|
|