David Leal
2019-09-14 d5df30c3ff5ad0b9486288521abca5b517651936
commit | author | age
dd2962 1 -- Original code comes from walkin_light mod by Echo
S 2 -- http://minetest.net/forum/viewtopic.php?id=2621
82cba9 3
ee0765 4 local flashlight_max_charge = 30000
be2f30 5
S 6 local S = technic.getter
7
ee0765 8 technic.register_power_tool("technic:flashlight", flashlight_max_charge)
dd2962 9
S 10 minetest.register_alias("technic:light_off", "air")
4f78a6 11
e23f87 12 minetest.register_tool("technic:flashlight", {
be2f30 13     description = S("Flashlight"),
e23f87 14     inventory_image = "technic_flashlight.png",
82cba9 15     stack_max = 1,
99fd5d 16     wear_represents = "technic_RE_charge",
00d7c9 17     on_refill = technic.refill_RE_charge,
be2f30 18 })
S 19
e23f87 20 minetest.register_craft({
dd2962 21     output = "technic:flashlight",
S 22     recipe = {
23         {"technic:rubber",                "default:glass",   "technic:rubber"},
ee0765 24         {"technic:stainless_steel_ingot", "technic:battery", "technic:stainless_steel_ingot"},
S 25         {"",                              "technic:battery", ""}
e23f87 26     }
R 27 })
28
82cba9 29
dd2962 30 local player_positions = {}
S 31 local was_wielding = {}
d8437f 32
S 33 local function check_for_flashlight(player)
34     if player == nil then
35         return false
36     end
37     local inv = player:get_inventory()
38     local hotbar = inv:get_list("main")
39     for i = 1, 8 do
40         if hotbar[i]:get_name() == "technic:flashlight" then
41             local meta = minetest.deserialize(hotbar[i]:get_metadata())
70fb21 42             if meta and meta.charge and meta.charge >= 2 then
b8c902 43                 if not technic.creative_mode then
M 44                     meta.charge = meta.charge - 2;
45                     technic.set_RE_wear(hotbar[i], meta.charge, flashlight_max_charge)
46                     hotbar[i]:set_metadata(minetest.serialize(meta))
47                     inv:set_stack("main", i, hotbar[i])
48                 end
d8437f 49                 return true
S 50             end
51         end
52     end
53     return false
82cba9 54 end
R 55
56 minetest.register_on_joinplayer(function(player)
57     local player_name = player:get_player_name()
d5df30 58     local pos = player:get_pos()
dd2962 59     local rounded_pos = vector.round(pos)
db7967 60     rounded_pos.y = rounded_pos.y + 1
ee0765 61     player_positions[player_name] = rounded_pos
dd2962 62     was_wielding[player_name] = true
82cba9 63 end)
dd2962 64
82cba9 65
R 66 minetest.register_on_leaveplayer(function(player)
67     local player_name = player:get_player_name()
dd2962 68     local pos = player_positions[player_name]
S 69     local nodename = minetest.get_node(pos).name
db7967 70     if nodename == "technic:light" then
dd2962 71         minetest.remove_node(pos)
S 72     end
73     player_positions[player_name] = nil
74 end)
82cba9 75
R 76 minetest.register_globalstep(function(dtime)
dd2962 77     for i, player in pairs(minetest.get_connected_players()) do
S 78         local player_name = player:get_player_name()
79         local flashlight_weared = check_for_flashlight(player)
d5df30 80         local pos = player:get_pos()
dd2962 81         local rounded_pos = vector.round(pos)
db7967 82         rounded_pos.y = rounded_pos.y + 1
dd2962 83         local old_pos = player_positions[player_name]
87fc21 84         local player_moved = old_pos and not vector.equals(old_pos, rounded_pos)
S 85         if not old_pos then
86             old_pos = rounded_pos
87             player_moved = true
88         end
82cba9 89
dd2962 90         -- Remove light, flashlight weared out or was removed from hotbar
S 91         if was_wielding[player_name] and not flashlight_weared then
92             was_wielding[player_name] = false
93             local node = minetest.get_node_or_nil(old_pos)
94             if node and node.name == "technic:light" then
95                 minetest.remove_node(old_pos)
82cba9 96             end
dd2962 97         elseif (player_moved or not was_wielding[player_name]) and flashlight_weared then
S 98             local node = minetest.get_node_or_nil(rounded_pos)
99             if node and node.name == "air" then
100                 minetest.set_node(rounded_pos, {name="technic:light"})
101             end
102             local node = minetest.get_node_or_nil(old_pos)
103             if node and node.name == "technic:light" then
104                 minetest.remove_node(old_pos)
105             end
106             player_positions[player_name] = rounded_pos
107             was_wielding[player_name] = true
ee0765 108         end
82cba9 109     end
R 110 end)
111
112 minetest.register_node("technic:light", {
113     drawtype = "glasslike",
71b13a 114     tiles = {"technic_light.png"},
82cba9 115     paramtype = "light",
d5df30 116     groups = {not_in_creative_inventory = 1},
60c75b 117     drop = "",
82cba9 118     walkable = false,
R 119     buildable_to = true,
120     sunlight_propagates = true,
db7967 121     light_source = LIGHT_MAX,
dd2962 122     pointable = false,
82cba9 123 })