From 359af1e57a44a7f8805187d78b7c0668e0b98c5a Mon Sep 17 00:00:00 2001 From: mrkubax10 Date: Sat, 20 Jan 2024 14:35:14 +0100 Subject: [PATCH] Implement Mining Laser Mining Laser allows for quick node mining via shooting the beam. It comes with following modes: - normal range - short range - horizontal direction - explosion --- api.lua | 3 +- compatibility.lua | 4 +- init.lua | 1 + tools/mining_laser.lua | 202 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 tools/mining_laser.lua 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"} + } +})