196 lines
5.6 KiB
Lua
196 lines
5.6 KiB
Lua
christmas = {}
|
|
christmas.players = {}
|
|
christmas.data = minetest.get_mod_storage("christmas")
|
|
|
|
local function xplayer(player)
|
|
if not player:is_player() then
|
|
return
|
|
end
|
|
local name = player:get_player_name()
|
|
return christmas.players[name]
|
|
end
|
|
|
|
function christmas.get_present_formspec(pos)--Taken from default chest
|
|
local spos = pos.x .. "," .. pos.y .. "," .. pos.z
|
|
local formspec =
|
|
"size[8,9]" ..
|
|
"list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" ..
|
|
"list[current_player;main;0,4.85;8,1;]" ..
|
|
"list[current_player;main;0,6.08;8,3;8]" ..
|
|
"listring[nodemeta:" .. spos .. ";main]" ..
|
|
"listring[current_player;main]"
|
|
return formspec
|
|
end
|
|
|
|
local function to_time(time)
|
|
local remaining = time % 86400
|
|
remaining = remaining % 3600
|
|
local minutes = math.floor(remaining/60)
|
|
remaining = remaining % 60
|
|
local seconds = remaining
|
|
if (minutes < 10) then
|
|
minutes = "0" .. tostring(minutes)
|
|
end
|
|
if (seconds < 10) then
|
|
seconds = "0" .. tostring(seconds)
|
|
end
|
|
answer = minutes..':'..seconds
|
|
return answer
|
|
end
|
|
|
|
function christmas.eat_candy(hp_change, replace_with_item)
|
|
return function(itemstack, user, pointed_thing)
|
|
local name = user:get_player_name()
|
|
local p = xplayer(user)
|
|
christmas.players[name].candy = p.candy +1
|
|
if p.candy == 8 then
|
|
p.time = 60
|
|
p.hud.ui = user:hud_add({
|
|
hud_elem_type = "image",
|
|
position = {x = 0.1, y = 0.5},
|
|
offset = {x = -220, y = -260},
|
|
text = "christmas_powerup_ui.png",
|
|
scale = { x = 16, y = 17},
|
|
alignment = { x = 1, y = 0 },
|
|
})
|
|
p.hud.icon = user:hud_add({
|
|
hud_elem_type = "image",
|
|
position = {x = 0.1, y = 0.5},
|
|
offset = {x = -90, y = -251},
|
|
text = "christmas_candy_cane.png",
|
|
scale = { x = 16, y = 16},
|
|
alignment = { x = 1, y = 0 },
|
|
})
|
|
p.hud.time = user:hud_add({
|
|
hud_elem_type = "text",
|
|
position = {x = 0.1, y = 0.5},
|
|
offset = {x = 10, y = -10},
|
|
text = to_time (p.time),
|
|
number = 0xffffff,
|
|
scale = { x = 16, y = 16},
|
|
alignment = { x = 0, y = 0 },
|
|
})
|
|
end
|
|
if p.time > 0 then
|
|
p.time = p.time + 3
|
|
end
|
|
return minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing)
|
|
end
|
|
end
|
|
|
|
minetest.register_craftitem("christmas:candy_cane", {
|
|
description = "Candy Cane",
|
|
inventory_image = "christmas_candy_cane.png",
|
|
on_use = christmas.eat_candy(1)
|
|
})
|
|
minetest.register_craftitem("christmas:mince_pie", {
|
|
description = "Mince Pie",
|
|
inventory_image = "christmas_mincepie.png",
|
|
on_use = minetest.item_eat(2)
|
|
})
|
|
minetest.register_craftitem("christmas:gingerbread_man", {
|
|
description = "Gingerbread Man",
|
|
inventory_image = "christmas_gingerbread_man.png",
|
|
on_use = minetest.item_eat(2)
|
|
})
|
|
minetest.register_craftitem("christmas:cracker", {
|
|
description = "Christmas Cracker\n (To be shared with a friend)",
|
|
inventory_image = "christmas_cracker.png",
|
|
on_use = minetest.item_eat(2)
|
|
})
|
|
|
|
minetest.register_node("christmas:eggnog", {
|
|
description = "Eggnog",
|
|
drawtype = "plantlike",
|
|
tiles = {"christmas_eggnog.png"},
|
|
inventory_image = "christmas_eggnog.png",
|
|
on_use = minetest.item_eat(10),
|
|
groups = {vessel = 1, dig_immediate = 3, attached_node = 1},
|
|
})
|
|
minetest.register_node("christmas:present", {
|
|
description = "Christmas present",
|
|
tiles = {
|
|
"christmas_present.png",
|
|
"christmas_present_top.png"
|
|
},
|
|
drawtype = "mesh",
|
|
paramtype = "light",
|
|
mesh = "christmas_present.obj",
|
|
groups = {oddly_breakable_by_hand = 3, attached_node = 1},
|
|
on_construct = function(pos, itemstack, placer, pointed_thing)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("infotext", "Christmas Present")
|
|
meta:set_string("owner", "")
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("main", 1)
|
|
end,
|
|
after_place_node = function(pos, placer)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("owner", placer:get_player_name() or "")
|
|
meta:set_string("infotext", "Present from ".. meta:get_string("owner"))
|
|
end,
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
minetest.after(0.2,
|
|
minetest.show_formspec,
|
|
player:get_player_name(),
|
|
"christmas:present",
|
|
christmas.get_present_formspec(pos))
|
|
end,
|
|
})
|
|
minetest.register_node("christmas:stocking", {
|
|
description = "Christmas Stocking",
|
|
drawtype = "signlike",
|
|
tiles = {"christmas_stocking.png"},
|
|
inventory_image = "christmas_stocking.png",
|
|
paramtype = "light",
|
|
paramtype2 = "wallmounted",
|
|
sunlight_propagates = true,
|
|
selection_box = {
|
|
type = "wallmounted",
|
|
},
|
|
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3},
|
|
walkable = false,
|
|
on_construct = function(pos, itemstack, player)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("infotext", player:get_player_name().."'s Stocking")
|
|
end,
|
|
})
|
|
minetest.register_on_joinplayer(function(player)
|
|
local name = player:get_player_name()
|
|
christmas.players[name] = {}
|
|
christmas.players[name].candy = 0
|
|
christmas.players[name].hud = {}
|
|
christmas.players[name].time = 0
|
|
end)
|
|
|
|
local t = 0
|
|
minetest.register_globalstep (function(dtime)
|
|
t = t + dtime
|
|
if t > 1 then
|
|
t = 0
|
|
end
|
|
for _, player in ipairs(minetest.get_connected_players()) do
|
|
local p = xplayer(player)
|
|
if p.time > 0 and t > 1-dtime then
|
|
p.time = p.time - 1
|
|
player:hud_change(p.hud.time, "text", to_time(p.time))
|
|
elseif math.floor(p.time) == 1 then
|
|
p.candy = 0
|
|
end
|
|
if p.time > 0 then
|
|
player:set_physics_override({
|
|
speed = 2.5,
|
|
})
|
|
end
|
|
--minetest.chat_send_all(p.candy)
|
|
if p.time == 0 then
|
|
player:set_physics_override({
|
|
speed = 1,
|
|
})
|
|
player:hud_remove(p.hud.ui)
|
|
player:hud_remove(p.hud.icon)
|
|
player:hud_remove(p.hud.time)
|
|
end
|
|
end
|
|
end)
|