technic-cd2025/technic/tools/flashlight.lua
RealBadAngel 3bc6cad671 Remove lv, mv, and hv tiers from power tools.
Theyre already tiered with Mk1-3 (at least drill is, more in the future).
Tools can be considered as designed for different tiers of circuits thx to their power needs.
For example Mk3 will require ages to load in LV batbox.
Batboxes load tools timining: LV standard (1000EU), MV 4x faster (4000EU), HV 16x faster (16000EU)
Also since 1EU is the same in any circuit it is possible to move energy from one to another with portable devices like crystals.

Other changes:
- moved charge/discharge functions to battery_boxes_commons.lua
- added UI style backgrounds for all the batboxes
2013-07-17 19:14:01 +02:00

175 lines
5.4 KiB
Lua

-- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621
local flashlight_max_charge=30000
technic.register_power_tool ("technic:flashlight",flashlight_max_charge)
minetest.register_tool("technic:flashlight", {
description = "Flashlight",
inventory_image = "technic_flashlight.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
end,
})
minetest.register_craft({
output = "technic:flashlight",
recipe = {
{"technic:rubber","glass","technic:rubber"},
{"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"},
{"","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)
local pos = player:getpos()
local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
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 player then
flashlight_weared=check_for_flashlight(player)
local pos = player:getpos()
local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
if last_wielded[player_name] and not flashlight_weared then --remove light, flashlight weared out or was removed from hotbar
local node=minetest.env:get_node_or_nil(old_pos)
if node then
if node.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"})
last_wielded[player_name]=false
end
end
end
player_moved=not(old_pos.x==rounded_pos.x and old_pos.y==rounded_pos.y and old_pos.z==rounded_pos.z)
if player_moved and last_wielded[player_name] and flashlight_weared then
local node=minetest.env:get_node_or_nil(rounded_pos)
if node then
if node.name=="air" then
minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
end
end
local node=minetest.env:get_node_or_nil(old_pos)
if node then
if node.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
player_positions[player_name]["x"] = rounded_pos.x
player_positions[player_name]["y"] = rounded_pos.y
player_positions[player_name]["z"] = rounded_pos.z
else if not last_wielded[player_name] and flashlight_weared then
local node=minetest.env:get_node_or_nil(rounded_pos)
if node then
if node.name=="air" then
minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
end
end
player_positions[player_name]["x"] = rounded_pos.x
player_positions[player_name]["y"] = rounded_pos.y
player_positions[player_name]["z"] = rounded_pos.z
last_wielded[player_name]=true
end
end
end
end
end)
minetest.register_node("technic:light", {
drawtype = "glasslike",
tile_images = {"technic_light.png"},
paramtype = "light",
walkable = false,
buildable_to = true,
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,
buildable_to = true,
is_ground_content = true,
light_propagates = true,
sunlight_propagates = true,
selection_box = {
type = "fixed",
fixed = {0, 0, 0, 0, 0, 0},
},
})
function check_for_flashlight (player)
if player==nil then return false end
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
local item=hotbar[i]:to_table()
local meta=get_item_meta(item["metadata"])
if meta==nil then return false end --flashlight not charghed
if meta["charge"]==nil then return false end
charge=meta["charge"]
if charge-2>0 then
charge =charge-2;
technic.set_RE_wear(item,charge,flashlight_max_charge)
meta["charge"]=charge
item["metadata"]=set_item_meta(meta)
hotbar[i]:replace(item)
inv:set_stack("main",i,hotbar[i])
return true
end
end
end
return false
end