diff --git a/api.lua b/api.lua
index 5aeb188..197c840 100644
--- a/api.lua
+++ b/api.lua
@@ -92,7 +92,8 @@ end
industrialtest.api.updateItemPowerText=function(itemstack)
local meta=itemstack:get_meta()
local def=minetest.registered_tools[itemstack:get_name()]
- meta:set_string("description",S("@1\n@2 / @3 EU",def.description,meta:get_int("industrialtest.powerAmount"),meta:get_int("industrialtest.powerCapacity")))
+ local desc=meta:contains("industrialtest.descriptionOverride") and meta:get_string("industrialtest.descriptionOverride") or def.description
+ meta:set_string("description",S("@1\n@2 / @3 EU",desc,meta:get_int("industrialtest.powerAmount"),meta:get_int("industrialtest.powerCapacity")))
itemstack:set_wear(65535-meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*65534)
end
-- \brief Adds power storage to item depending on it's definition
diff --git a/compatibility.lua b/compatibility.lua
index 201ad76..acedbd9 100644
--- a/compatibility.lua
+++ b/compatibility.lua
@@ -70,7 +70,9 @@ if industrialtest.mclAvailable then
end
return itemstack
end
- industrialtest.internal.explode=mcl_explosions.explode
+ industrialtest.internal.explode=function(pos,radius,dropChance)
+ mcl_explosions.explode(pos,radius,{drop_chance=dropChance})
+ end
end
-- compatibilty that adds not existing elements
diff --git a/init.lua b/init.lua
index 8f8a981..6e7d6cd 100644
--- a/init.lua
+++ b/init.lua
@@ -58,6 +58,7 @@ dofile(modpath.."/tools/electric_drill.lua")
dofile(modpath.."/tools/electric_hoe.lua")
dofile(modpath.."/tools/electric_saber.lua")
dofile(modpath.."/tools/jetpack.lua")
+dofile(modpath.."/tools/mining_laser.lua")
dofile(modpath.."/tools/solar_helmet.lua")
dofile(modpath.."/tools/static_boots.lua")
dofile(modpath.."/tools/treetap.lua")
diff --git a/tools/mining_laser.lua b/tools/mining_laser.lua
new file mode 100644
index 0000000..d6b84d8
--- /dev/null
+++ b/tools/mining_laser.lua
@@ -0,0 +1,202 @@
+-- IndustrialTest
+-- Copyright (C) 2024 mrkubax10
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local S=minetest.get_translator("industrialtest")
+
+local beam={}
+
+beam.onActivate=function(self,staticdata)
+ local data=minetest.deserialize(staticdata)
+ self.direction=data.direction
+ self.energy=data.energy
+ self.distance=data.distance
+ self.startPos=self.object:get_pos()
+ self.mode=data.mode
+ self.user=data.user
+end
+
+beam.onPunch=function()
+ return true
+end
+
+beam.onNodeBreak=function(pos,node,user)
+ if industrialtest.mclAvailable then
+ local drops=minetest.get_node_drops(node.name,"")
+ for _, val in ipairs(drops) do
+ if type(val)~="string" then
+ val=val:get_name()..val:get_count()
+ end
+ minetest.add_item(pos,val)
+ end
+ end
+ minetest.node_dig(pos,node,user)
+end
+
+beam.onStep=function(self,dtime,moveresult)
+ local pos=self.object:get_pos()
+ if vector.distance(self.startPos,pos)>=self.distance or self.energy<=0 then
+ self.object:remove()
+ return
+ end
+ local speed=400*dtime
+ self.object:set_velocity(vector.multiply(self.direction,vector.new(speed,speed,speed)))
+ if moveresult.collides then
+ for _,val in ipairs(moveresult.collisions) do
+ if val.type=="node" then
+ if self.mode>=1 and self.mode<=3 then
+ local nodeUnbreakable=false
+ local node=minetest.get_node(val.node_pos)
+ local def=minetest.registered_nodes[node.name]
+ if industrialtest.mclAvailable then
+ nodeUnbreakable=def._mcl_hardness==-1
+ end
+ if nodeUnbreakable then
+ self.object:remove()
+ return
+ else
+ beam.onNodeBreak(val.node_pos,node,minetest.get_player_by_name(self.user))
+ self.energy=self.energy-1
+ end
+ elseif self.mode==4 then
+ industrialtest.internal.explode(pos,4,1)
+ self.object:remove()
+ return
+ end
+ end
+ end
+ end
+end
+
+minetest.register_entity("industrialtest:mining_laser_beam",{
+ initial_properties={
+ physical=true,
+ collide_with_objects=false,
+ collisionbox={
+ -0.25,-0.25,-0.25,
+ 0.25,0.25,0.25
+ },
+ pointable=false,
+ visual="cube",
+ visual_size={x=0.25,y=0.25,z=0.25},
+ textures={
+ "industrialtest_mining_laser_beam.png",
+ "industrialtest_mining_laser_beam.png",
+ "industrialtest_mining_laser_beam.png",
+ "industrialtest_mining_laser_beam.png",
+ "industrialtest_mining_laser_beam.png",
+ "industrialtest_mining_laser_beam.png"
+ },
+ glow=-1,
+ static_save=false,
+ shaded=false,
+ },
+ on_activate=beam.onActivate,
+ on_punch=beam.onPunch,
+ on_step=beam.onStep
+})
+
+local miningLaser={}
+miningLaser.mode1OpPower=1250
+miningLaser.mode2OpPower=100
+miningLaser.mode4OpPower=5000
+miningLaser.modeCount=4
+
+miningLaser.getMode=function(itemstack)
+ local meta=itemstack:get_meta()
+ if not meta:contains("mode") then
+ meta:set_int("mode",1)
+ return 1
+ end
+ return meta:get_int("mode")
+end
+
+miningLaser.setMode=function(itemstack,mode)
+ local meta=itemstack:get_meta()
+ meta:set_int("mode",mode)
+ meta:set_string("industrialtest.descriptionOverride",S("Mining Laser (Mode @1)",mode))
+ industrialtest.api.updateItemPowerText(itemstack)
+end
+
+miningLaser.spawnBeam=function(itemstack,user,pos,dir,opPower,energy,distance)
+ local meta=itemstack:get_meta()
+ if meta:get_int("industrialtest.powerAmount")=miningLaser.modeCount+1 then
+ mode=1
+ end
+ miningLaser.setMode(itemstack,mode)
+ return itemstack
+ end
+ local meta=itemstack:get_meta()
+ if mode==1 then
+ if not miningLaser.spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),miningLaser.mode1OpPower,10,64) then
+ return nil
+ end
+ elseif mode==2 then
+ if not miningLaser.spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),miningLaser.mode2OpPower,3,2) then
+ return nil
+ end
+ elseif mode==3 then
+ local yaw=user:get_look_horizontal()
+ local dir=vector.new(-math.sin(yaw),0,math.cos(yaw))
+ if not miningLaser.spawnBeam(itemstack,user,user:get_pos(),dir,miningLaser.mode1OpPower,10,64) then
+ return nil
+ end
+ elseif mode==4 then
+ if not miningLaser.spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),miningLaser.mode4OpPower,1,64) then
+ return nil
+ end
+ end
+ return itemstack
+end
+
+minetest.register_tool("industrialtest:mining_laser",{
+ description=S("Mining Laser (Mode 1)"),
+ inventory_image="industrialtest_mining_laser.png",
+ on_use=miningLaser.onUse,
+ _industrialtest_powerStorage=true,
+ _industrialtest_powerCapacity=300000,
+ _industrialtest_powerFlow=industrialtest.api.hvPowerFlow
+})
+minetest.register_craft({
+ type="shaped",
+ output="industrialtest:mining_laser",
+ recipe={
+ {industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.powerCarrier,"industrialtest:energy_crystal"},
+ {"industrialtest:advanced_alloy","industrialtest:advanced_alloy","industrialtest:advanced_electronic_circuit"},
+ {"","industrialtest:advanced_alloy","industrialtest:advanced_alloy"}
+ }
+})