RealBadAngel
2012-12-13 b8d77627a4d28c624e63423eef317dd09c68e533
commit | author | age
a1fa7c 1 -- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621
MK 2
6a67be 3 flashlight_max_charge=30000
c5ff12 4       
6a67be 5        minetest.register_tool("technic:flashlight", {
MK 6             description = "Flashlight",
7             inventory_image = "technic_flashlight.png",
a1fa7c 8     stack_max = 1,
c5ff12 9             on_use = function(itemstack, user, pointed_thing)
MK 10     end,            
11     })
12      
13     minetest.register_craft({
6a67be 14             output = "technic:flashlight",
c5ff12 15             recipe = {
b8d776 16             {"technic:rubber","glass","technic:rubber"},
c5ff12 17                     {"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"},
MK 18                     {"","technic:battery",""}
19             }
20     })
a1fa7c 21 local players = {}
MK 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     local pos = player:getpos()
33     local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
34     player_positions[player_name] = {}
35     player_positions[player_name]["x"] = rounded_pos.x;
36     player_positions[player_name]["y"] = rounded_pos.y;
37     player_positions[player_name]["z"] = rounded_pos.z;
38 end)
39
40 minetest.register_on_leaveplayer(function(player)
41     local player_name = player:get_player_name()
42     for i,v in ipairs(players) do
43         if v == player_name then 
44             table.remove(players, i)
45             last_wielded[player_name] = nil
46             -- Neuberechnung des Lichts erzwingen
47             local pos = player:getpos()
48             local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
49             minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
50             minetest.env:add_node(rounded_pos,{type="node",name="air"})
51             player_positions[player_name]["x"] = nil
52             player_positions[player_name]["y"] = nil
53             player_positions[player_name]["z"] = nil
54             player_positions[player_name]["m"] = nil
55             player_positions[player_name] = nil
56         end
57     end
58 end)
59
60 minetest.register_globalstep(function(dtime)
61     for i,player_name in ipairs(players) do
62         local player = minetest.env:get_player_by_name(player_name)
01b21d 63         flashlight_weared=check_for_flashlight(player)
MK 64         local pos = player:getpos()
65         local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
66         local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
67         
68         if last_wielded[player_name] and not flashlight_weared then --remove light, flashlight weared out or was removed from hotbar
69             local node=minetest.env:get_node_or_nil(old_pos)
70             if node then
71             if node.name=="technic:light" then 
72                   minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
73                 minetest.env:add_node(old_pos,{type="node",name="air"})        
74               last_wielded[player_name]=false
75               end
76             end
a1fa7c 77             end
MK 78
01b21d 79         player_moved=not(old_pos.x==rounded_pos.x and old_pos.y==rounded_pos.y and old_pos.z==rounded_pos.z)
MK 80         if player_moved and last_wielded[player_name] and flashlight_weared  then
81             
82             local node=minetest.env:get_node_or_nil(rounded_pos)
83             if node then
84             if node.name=="air" then 
85                   minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
86               end
87             end
88             local node=minetest.env:get_node_or_nil(old_pos)
89             if node then
90               if node.name=="technic:light" then 
91                   minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
92                 minetest.env:add_node(old_pos,{type="node",name="air"})        
93               end
94             end
95             player_positions[player_name]["x"] = rounded_pos.x
96             player_positions[player_name]["y"] = rounded_pos.y
97             player_positions[player_name]["z"] = rounded_pos.z
98             
99         else if not last_wielded[player_name] and flashlight_weared then
100             local node=minetest.env:get_node_or_nil(rounded_pos)
101             if node then
102             if node.name=="air" then 
103                   minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
104               end
105             end
106             player_positions[player_name]["x"] = rounded_pos.x
107             player_positions[player_name]["y"] = rounded_pos.y
108             player_positions[player_name]["z"] = rounded_pos.z
109             last_wielded[player_name]=true
110             end            
111             
112     end
a1fa7c 113     end
MK 114 end)
115
116 minetest.register_node("technic:light", {
117     drawtype = "glasslike",
118     tile_images = {"technic_light.png"},
119     paramtype = "light",
120     walkable = false,
01b21d 121     buildable_to = true,
a1fa7c 122     is_ground_content = true,
MK 123     light_propagates = true,
124     sunlight_propagates = true,
125     light_source = 15,
126     selection_box = {
127         type = "fixed",
128         fixed = {0, 0, 0, 0, 0, 0},
129     },
130 })
131 minetest.register_node("technic:light_off", {
132     drawtype = "glasslike",
133     tile_images = {"technic_light.png"},
134     paramtype = "light",
135     walkable = false,
01b21d 136     buildable_to = true,
a1fa7c 137     is_ground_content = true,
MK 138     light_propagates = true,
139     sunlight_propagates = true,
140     selection_box = {
141         type = "fixed",
142         fixed = {0, 0, 0, 0, 0, 0},
143     },
144 })
145
01b21d 146 function check_for_flashlight (player)
4f2c97 147 if player==nil then return false end
a1fa7c 148 local inv = player:get_inventory()
MK 149 local hotbar=inv:get_list("main")
150         for i=1,8,1 do
151             
152             if hotbar[i]:get_name() == "technic:flashlight" then
153             item=hotbar[i]:to_table()
01b21d 154             if item["metadata"]=="" or item["metadata"]=="0" then return false end --flashlight not charghed
MK 155             charge=tonumber(item["metadata"]) 
a1fa7c 156             if charge-2>0 then
MK 157              charge =charge-2;    
01b21d 158             set_RE_wear(item,charge,flashlight_max_charge)
MK 159             item["metadata"]=tostring(charge)
a1fa7c 160             hotbar[i]:replace(item)
MK 161             inv:set_stack("main",i,hotbar[i])
01b21d 162             return true
a1fa7c 163             end
MK 164             end
165         end
01b21d 166 return false
a1fa7c 167 end