ShadowNinja
2013-07-11 5d470cd753efe8f4640099165a7bfc0c6e181c35
commit | author | age
82cba9 1 -- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621
R 2
3 flashlight_max_charge=30000
4       
5        minetest.register_tool("technic:flashlight", {
6             description = "Flashlight",
7             inventory_image = "technic_flashlight.png",
8     stack_max = 1,
9             on_use = function(itemstack, user, pointed_thing)
10     end,            
11     })
12      
13     minetest.register_craft({
14             output = "technic:flashlight",
15             recipe = {
16             {"glass","glass","glass"},
17                     {"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"},
18                     {"","technic:battery",""}
19             }
20     })
21 local players = {}
22 local player_positions = {}
23 local last_wielded = {}
24
25 function round(num) 
26     return math.floor(num + 0.5) 
27 end
28
29 minetest.register_on_joinplayer(function(player)
30     local player_name = player:get_player_name()
31     table.insert(players, player_name)
32     last_wielded[player_name] = flashlight_weared(player)
33     local pos = player:getpos()
34     local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
35     local wielded_item = player:get_wielded_item():get_name()
36     if flashlight_weared(player)==true then
37         -- Neuberechnung des Lichts erzwingen
38         minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
39         minetest.env:add_node(rounded_pos,{type="node",name="air"})
40     end
41     player_positions[player_name] = {}
42     player_positions[player_name]["x"] = rounded_pos.x;
43     player_positions[player_name]["y"] = rounded_pos.y;
44     player_positions[player_name]["z"] = rounded_pos.z;
45 end)
46
47 minetest.register_on_leaveplayer(function(player)
48     local player_name = player:get_player_name()
49     for i,v in ipairs(players) do
50         if v == player_name then 
51             table.remove(players, i)
52             last_wielded[player_name] = nil
53             -- Neuberechnung des Lichts erzwingen
54             local pos = player:getpos()
55             local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
56             minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
57             minetest.env:add_node(rounded_pos,{type="node",name="air"})
58             player_positions[player_name]["x"] = nil
59             player_positions[player_name]["y"] = nil
60             player_positions[player_name]["z"] = nil
61             player_positions[player_name]["m"] = nil
62             player_positions[player_name] = nil
63         end
64     end
65 end)
66
67 minetest.register_globalstep(function(dtime)
68     for i,player_name in ipairs(players) do
69         local player = minetest.env:get_player_by_name(player_name)
70         if flashlight_weared(player)==true then
71             -- Fackel ist in der Hand
72             local pos = player:getpos()
73             local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
74             if (last_wielded[player_name] ~= true) or (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
75                 -- Fackel gerade in die Hand genommen oder zu neuem Node bewegt
76                 local is_air  = minetest.env:get_node_or_nil(rounded_pos)
77                 if is_air == nil or (is_air ~= nil and (is_air.name == "air" or is_air.name == "technic:light")) then
78                     -- wenn an aktueller Position "air" ist, Fackellicht setzen
79                     minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
80                 end
81                 if (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
82                     -- wenn Position geänder, dann altes Licht löschen
83                     local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
84                     -- Neuberechnung des Lichts erzwingen
85                     local is_light = minetest.env:get_node_or_nil(old_pos)
86                     if is_light ~= nil and is_light.name == "technic:light" then
87                         minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
88                         minetest.env:add_node(old_pos,{type="node",name="air"})
89                     end
90                 end
91                 -- gemerkte Position ist nun die gerundete neue Position
92                 player_positions[player_name]["x"] = rounded_pos.x
93                 player_positions[player_name]["y"] = rounded_pos.y
94                 player_positions[player_name]["z"] = rounded_pos.z
95             end
96
97             last_wielded[player_name] = true;
98         elseif last_wielded[player_name] == true  then
99             -- Fackel nicht in der Hand, aber beim letzten Durchgang war die Fackel noch in der Hand
100             local pos = player:getpos()
101             local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
102             repeat
103                 local is_light  = minetest.env:get_node_or_nil(rounded_pos)
104                 if is_light ~= nil and is_light.name == "technic:light" then
105                     -- minetest.env:remove_node(rounded_pos)
106                     -- Erzwinge Neuberechnung des Lichts
107                     minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
108                     minetest.env:add_node(rounded_pos,{type="node",name="air"})
109                 end
110             until minetest.env:get_node_or_nil(rounded_pos) ~= "technic:light"
111             local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
112             repeat
113                 is_light  = minetest.env:get_node_or_nil(old_pos)
114                 if is_light ~= nil and is_light.name == "technic:light" then
115                     -- minetest.env:remove_node(old_pos)
116                     -- Erzwinge Neuberechnung des Lichts
117                     minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
118                     minetest.env:add_node(old_pos,{type="node",name="air"})
119                 end
120             until minetest.env:get_node_or_nil(old_pos) ~= "technic:light"
121             last_wielded[player_name] = true
122         end
123     end
124 end)
125
126 minetest.register_node("technic:light", {
127     drawtype = "glasslike",
128     tile_images = {"technic_light.png"},
129     paramtype = "light",
130     walkable = false,
131     is_ground_content = true,
132     light_propagates = true,
133     sunlight_propagates = true,
134     light_source = 15,
135     selection_box = {
136         type = "fixed",
137         fixed = {0, 0, 0, 0, 0, 0},
138     },
139 })
140 minetest.register_node("technic:light_off", {
141     drawtype = "glasslike",
142     tile_images = {"technic_light.png"},
143     paramtype = "light",
144     walkable = false,
145     is_ground_content = true,
146     light_propagates = true,
147     sunlight_propagates = true,
148     selection_box = {
149         type = "fixed",
150         fixed = {0, 0, 0, 0, 0, 0},
151     },
152 })
153
154 function flashlight_weared (player)
155 flashlight_on=false
156 local inv = player:get_inventory()
157 local hotbar=inv:get_list("main")
158         for i=1,8,1 do
159             
160             if hotbar[i]:get_name() == "technic:flashlight" then
161             item=hotbar[i]:to_table()
162             if item["metadata"]=="" or item["metadata"]=="0" then return flashlight_on end --flashlight not charghed
163             charge=tonumber(item["metadata"]) 
164             if charge-2>0 then
165              flashlight_on=true    
166              charge =charge-2;    
167             set_RE_wear(item,charge,flashlight_max_charge)
168             item["metadata"]=tostring(charge)
169             hotbar[i]:replace(item)
170             inv:set_stack("main",i,hotbar[i])
171             return true
172             end
173             end
174         end
175 return flashlight_on
176 end