Gábriel
2024-07-07 6731db14e580ddccace186f5a8ac03dad0661e0c
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
a08ba2 41             local meta = technic.get_stack_meta(hotbar[i])
C 42             local charge = meta:get_int("technic:charge")
43             if charge >= 2 then
b8c902 44                 if not technic.creative_mode then
a08ba2 45                     charge = charge - 2;
C 46                     meta:set_int("technic:charge", charge)
47                     technic.set_RE_wear(hotbar[i], charge, flashlight_max_charge)
b8c902 48                     inv:set_stack("main", i, hotbar[i])
M 49                 end
d8437f 50                 return true
S 51             end
52         end
53     end
54     return false
82cba9 55 end
R 56
57 minetest.register_on_joinplayer(function(player)
58     local player_name = player:get_player_name()
d5df30 59     local pos = player:get_pos()
dd2962 60     local rounded_pos = vector.round(pos)
db7967 61     rounded_pos.y = rounded_pos.y + 1
ee0765 62     player_positions[player_name] = rounded_pos
dd2962 63     was_wielding[player_name] = true
82cba9 64 end)
dd2962 65
82cba9 66
R 67 minetest.register_on_leaveplayer(function(player)
68     local player_name = player:get_player_name()
dd2962 69     local pos = player_positions[player_name]
S 70     local nodename = minetest.get_node(pos).name
db7967 71     if nodename == "technic:light" then
dd2962 72         minetest.remove_node(pos)
S 73     end
74     player_positions[player_name] = nil
75 end)
82cba9 76
R 77 minetest.register_globalstep(function(dtime)
dd2962 78     for i, player in pairs(minetest.get_connected_players()) do
S 79         local player_name = player:get_player_name()
80         local flashlight_weared = check_for_flashlight(player)
d5df30 81         local pos = player:get_pos()
dd2962 82         local rounded_pos = vector.round(pos)
db7967 83         rounded_pos.y = rounded_pos.y + 1
dd2962 84         local old_pos = player_positions[player_name]
87fc21 85         local player_moved = old_pos and not vector.equals(old_pos, rounded_pos)
S 86         if not old_pos then
87             old_pos = rounded_pos
88             player_moved = true
89         end
82cba9 90
dd2962 91         -- Remove light, flashlight weared out or was removed from hotbar
S 92         if was_wielding[player_name] and not flashlight_weared then
93             was_wielding[player_name] = false
94             local node = minetest.get_node_or_nil(old_pos)
95             if node and node.name == "technic:light" then
96                 minetest.remove_node(old_pos)
82cba9 97             end
dd2962 98         elseif (player_moved or not was_wielding[player_name]) and flashlight_weared then
S 99             local node = minetest.get_node_or_nil(rounded_pos)
100             if node and node.name == "air" then
101                 minetest.set_node(rounded_pos, {name="technic:light"})
102             end
a8daa4 103             node = minetest.get_node_or_nil(old_pos)
dd2962 104             if node and node.name == "technic:light" then
S 105                 minetest.remove_node(old_pos)
106             end
107             player_positions[player_name] = rounded_pos
108             was_wielding[player_name] = true
ee0765 109         end
82cba9 110     end
R 111 end)
112
113 minetest.register_node("technic:light", {
114     drawtype = "glasslike",
71b13a 115     tiles = {"technic_light.png"},
82cba9 116     paramtype = "light",
d5df30 117     groups = {not_in_creative_inventory = 1},
60c75b 118     drop = "",
82cba9 119     walkable = false,
R 120     buildable_to = true,
121     sunlight_propagates = true,
a8daa4 122     light_source = minetest.LIGHT_MAX,
dd2962 123     pointable = false,
82cba9 124 })