diff options
Diffstat (limited to 'mining_laser_mk1.lua')
-rw-r--r-- | mining_laser_mk1.lua | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/mining_laser_mk1.lua b/mining_laser_mk1.lua new file mode 100644 index 0000000..a2569e3 --- /dev/null +++ b/mining_laser_mk1.lua @@ -0,0 +1,153 @@ +laser_mk1_max_charge=40000 + +local laser_shoot = function(itemstack, player, pointed_thing) + local playerpos=player:getpos() + local dir=player:get_look_dir() + direction_y=math.abs(math.floor(dir.y*100)) + print (direction_y) + if direction_y>50 then entity_name="technic:laser_beam_entityV" + else entity_name="technic:laser_beam_entity" end + local obj=minetest.env:add_entity({x=playerpos.x,y=playerpos.y+1.6,z=playerpos.z},entity_name) + if obj:get_luaentity().player == nil then + obj:get_luaentity().player = player + end + obj:setvelocity({x=dir.x*19, y=dir.y*19, z=dir.z*19}) + obj:setacceleration({x=dir.x*-2, y=0, z=dir.z*-2}) + obj:setyaw(player:get_look_yaw()+math.pi) + if obj:get_luaentity().player == nil then + obj:get_luaentity().player = player + end + obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name() + minetest.sound_play("technic_laser", {pos = playerpos, gain = 1.0, max_hear_distance = 10,}) + return true +end + + +minetest.register_tool("technic:laser_mk1", { + description = "Mining Laser MK1", + inventory_image = "technic_mining_laser_mk1.png", + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + item=itemstack:to_table() + local charge=tonumber((item["wear"])) + if charge ==0 then charge =65535 end + charge=get_RE_item_load(charge,laser_mk1_max_charge) + if charge-400>0 then + laser_shoot(item, user, pointed_thing) + charge =charge-400; + charge=set_RE_item_load(charge,laser_mk1_max_charge) + item["wear"]=tostring(charge) + itemstack:replace(item) + end + return itemstack + end, +}) + +minetest.register_craft({ + output = 'technic:laser_mk1', + recipe = { + {'technic:diamond', 'default:steel_ingot', 'technic:battery'}, + {'', 'default:steel_ingot', 'technic:battery'}, + {'', '', 'moreores:copper_ingot'}, + } +}) + + + +minetest.register_node("technic:laser_beam_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -0.5 , -0.1, -0.1 , 0.1 , 0.1 , 0.1 }, + { -0.1 , -0.1 , -0.1 , 0.5, 0.1 , 0.1 }, + } + }, + tiles = {"technic_laser_beam.png"}, + groups = {not_in_creative_inventory=1}, +}) + +minetest.register_node("technic:laser_beam_boxV", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -0.1 , -0.1 , -0.1 , 0.1 , 0.5, 0.1 }, + { -0.1 , -0.5, -0.1 , 0.1 , 0.1 , 0.1 }, + + } + }, + tiles = {"technic_laser_beam.png"}, + groups = {not_in_creative_inventory=1}, +}) + +LASER_BEAM_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.2, y=0.2}, + textures = {"technic:laser_beam_box"}, + lastpos={}, + max_range=15, + count=0, +-- digger=nil, + collisionbox = {0,0,0,0,0,0}, +} + +LASER_BEAM_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.env:get_node(pos) + if self.lastpos.x~=nil then lazer_it (pos, node, self.player) end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + self.count=self.count+1 + if self.count>=self.max_range then self.object:remove() end +end + +LASER_BEAM_ENTITYV={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.2, y=0.2}, + textures = {"technic:laser_beam_boxV"}, + lastpos={}, + max_range=15, + count=0, + collisionbox = {0,0,0,0,0,0}, +} + +LASER_BEAM_ENTITYV.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.env:get_node(pos) + if self.lastpos.x~=nil then lazer_it (pos, node, self.player,self.count) end + + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + self.count=self.count+1 + if self.count==self.max_range then self.object:remove() end +end + + +minetest.register_entity("technic:laser_beam_entity", LASER_BEAM_ENTITY) +minetest.register_entity("technic:laser_beam_entityV", LASER_BEAM_ENTITYV) + +function lazer_it (pos, node, player,count) + if node.name == "air" then return end + if node.name == "default:lava_source" then return end + if node.name == "default:lava_flowing" then return end + if node.name == "default:water_source" then minetest.env:remove_node(pos) return end + if node.name == "default:water_flowing" then minetest.env:remove_node(pos) return end + if node.name == "ignore" then minetest.env:remove_node(pos) return end + + if player then + local drops = minetest.get_node_drops(node.name, "default:pick_mese") + if player:get_inventory() then + local _, dropped_item + for _, dropped_item in ipairs(drops) do + player:get_inventory():add_item("main", dropped_item) + end + end + minetest.env:remove_node(pos) + end + +end
\ No newline at end of file |