summaryrefslogtreecommitdiff
path: root/flashlight.lua
diff options
context:
space:
mode:
authorMaciej Kasatkin <mk@realbadangel.pl>2012-10-14 23:36:34 +0200
committerMaciej Kasatkin <mk@realbadangel.pl>2012-10-14 23:36:34 +0200
commita1fa7c2c36cf09dea805e444b3c2734cc1e32c1e (patch)
treeb464162c3aaab37ed4dfe67f40a46e1bf73899bd /flashlight.lua
parent3f61321cbecdc43737bd27994427b953086bd033 (diff)
Added Flashlight
Diffstat (limited to 'flashlight.lua')
-rw-r--r--flashlight.lua160
1 files changed, 160 insertions, 0 deletions
diff --git a/flashlight.lua b/flashlight.lua
index 8b34e94..4247f2d 100644
--- a/flashlight.lua
+++ b/flashlight.lua
@@ -1,8 +1,11 @@
+-- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621
+
flashlight_max_charge=30000
minetest.register_tool("technic:flashlight", {
description = "Flashlight",
inventory_image = "technic_flashlight.png",
+ stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
end,
})
@@ -15,3 +18,160 @@ flashlight_max_charge=30000
{"","technic:battery",""}
}
})
+local players = {}
+local player_positions = {}
+local last_wielded = {}
+
+function round(num)
+ return math.floor(num + 0.5)
+end
+
+minetest.register_on_joinplayer(function(player)
+ local player_name = player:get_player_name()
+ table.insert(players, player_name)
+ last_wielded[player_name] = player:get_wielded_item():get_name()
+ local pos = player:getpos()
+ local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
+ local wielded_item = player:get_wielded_item():get_name()
+ if flashlight_weared(player)==true then
+ -- Neuberechnung des Lichts erzwingen
+ minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
+ minetest.env:add_node(rounded_pos,{type="node",name="air"})
+ end
+ player_positions[player_name] = {}
+ player_positions[player_name]["x"] = rounded_pos.x;
+ player_positions[player_name]["y"] = rounded_pos.y;
+ player_positions[player_name]["z"] = rounded_pos.z;
+end)
+
+minetest.register_on_leaveplayer(function(player)
+ local player_name = player:get_player_name()
+ for i,v in ipairs(players) do
+ if v == player_name then
+ table.remove(players, i)
+ last_wielded[player_name] = nil
+ -- Neuberechnung des Lichts erzwingen
+ local pos = player:getpos()
+ local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
+ minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
+ minetest.env:add_node(rounded_pos,{type="node",name="air"})
+ player_positions[player_name]["x"] = nil
+ player_positions[player_name]["y"] = nil
+ player_positions[player_name]["z"] = nil
+ player_positions[player_name]["m"] = nil
+ player_positions[player_name] = nil
+ end
+ end
+end)
+
+minetest.register_globalstep(function(dtime)
+ for i,player_name in ipairs(players) do
+ local player = minetest.env:get_player_by_name(player_name)
+ if flashlight_weared(player)==true then
+ -- Fackel ist in der Hand
+ local pos = player:getpos()
+ local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
+ if (last_wielded[player_name] ~= "technic:flashlight") 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
+ -- Fackel gerade in die Hand genommen oder zu neuem Node bewegt
+ local is_air = minetest.env:get_node_or_nil(rounded_pos)
+ if is_air == nil or (is_air ~= nil and (is_air.name == "air" or is_air.name == "technic:light")) then
+ -- wenn an aktueller Position "air" ist, Fackellicht setzen
+ minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
+ end
+ 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
+ -- wenn Position geänder, dann altes Licht löschen
+ local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
+ -- Neuberechnung des Lichts erzwingen
+ local is_light = minetest.env:get_node_or_nil(old_pos)
+ if is_light ~= nil and is_light.name == "technic:light" then
+ minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
+ minetest.env:add_node(old_pos,{type="node",name="air"})
+ end
+ end
+ -- gemerkte Position ist nun die gerundete neue Position
+ player_positions[player_name]["x"] = rounded_pos.x
+ player_positions[player_name]["y"] = rounded_pos.y
+ player_positions[player_name]["z"] = rounded_pos.z
+ end
+
+ last_wielded[player_name] = "technic:flashlight";
+ elseif last_wielded[player_name] == "technic:flashlight" then
+ -- Fackel nicht in der Hand, aber beim letzten Durchgang war die Fackel noch in der Hand
+ local pos = player:getpos()
+ local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
+ repeat
+ local is_light = minetest.env:get_node_or_nil(rounded_pos)
+ if is_light ~= nil and is_light.name == "technic:light" then
+ -- minetest.env:remove_node(rounded_pos)
+ -- Erzwinge Neuberechnung des Lichts
+ minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
+ minetest.env:add_node(rounded_pos,{type="node",name="air"})
+ end
+ until minetest.env:get_node_or_nil(rounded_pos) ~= "technic:light"
+ local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
+ repeat
+ is_light = minetest.env:get_node_or_nil(old_pos)
+ if is_light ~= nil and is_light.name == "technic:light" then
+ -- minetest.env:remove_node(old_pos)
+ -- Erzwinge Neuberechnung des Lichts
+ minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
+ minetest.env:add_node(old_pos,{type="node",name="air"})
+ end
+ until minetest.env:get_node_or_nil(old_pos) ~= "technic:light"
+ last_wielded[player_name] = wielded_item
+ end
+ end
+end)
+
+minetest.register_node("technic:light", {
+ drawtype = "glasslike",
+ tile_images = {"technic_light.png"},
+ paramtype = "light",
+ walkable = false,
+ is_ground_content = true,
+ light_propagates = true,
+ sunlight_propagates = true,
+ light_source = 15,
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0},
+ },
+})
+minetest.register_node("technic:light_off", {
+ drawtype = "glasslike",
+ tile_images = {"technic_light.png"},
+ paramtype = "light",
+ walkable = false,
+ is_ground_content = true,
+ light_propagates = true,
+ sunlight_propagates = true,
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0},
+ },
+})
+
+function flashlight_weared (player)
+flashlight_on=false
+local inv = player:get_inventory()
+local hotbar=inv:get_list("main")
+ for i=1,8,1 do
+
+ if hotbar[i]:get_name() == "technic:flashlight" then
+ item=hotbar[i]:to_table()
+ local charge=tonumber((item["wear"]))
+ if charge ==0 then charge =65535 end
+ charge=get_RE_item_load(charge,flashlight_max_charge)
+ if charge-2>0 then
+ flashlight_on=true
+ charge =charge-2;
+ charge=set_RE_item_load(charge,flashlight_max_charge)
+ item["wear"]=tostring(charge)
+ hotbar[i]:replace(item)
+ inv:set_stack("main",i,hotbar[i])
+ end
+ return flashlight_on
+ end
+ end
+return flashlight_on
+end \ No newline at end of file