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
This commit is contained in:
parent
e95a2a7cc1
commit
359af1e57a
3
api.lua
3
api.lua
|
@ -92,7 +92,8 @@ end
|
||||||
industrialtest.api.updateItemPowerText=function(itemstack)
|
industrialtest.api.updateItemPowerText=function(itemstack)
|
||||||
local meta=itemstack:get_meta()
|
local meta=itemstack:get_meta()
|
||||||
local def=minetest.registered_tools[itemstack:get_name()]
|
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)
|
itemstack:set_wear(65535-meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*65534)
|
||||||
end
|
end
|
||||||
-- \brief Adds power storage to item depending on it's definition
|
-- \brief Adds power storage to item depending on it's definition
|
||||||
|
|
|
@ -70,7 +70,9 @@ if industrialtest.mclAvailable then
|
||||||
end
|
end
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
industrialtest.internal.explode=mcl_explosions.explode
|
industrialtest.internal.explode=function(pos,radius,dropChance)
|
||||||
|
mcl_explosions.explode(pos,radius,{drop_chance=dropChance})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- compatibilty that adds not existing elements
|
-- compatibilty that adds not existing elements
|
||||||
|
|
1
init.lua
1
init.lua
|
@ -58,6 +58,7 @@ dofile(modpath.."/tools/electric_drill.lua")
|
||||||
dofile(modpath.."/tools/electric_hoe.lua")
|
dofile(modpath.."/tools/electric_hoe.lua")
|
||||||
dofile(modpath.."/tools/electric_saber.lua")
|
dofile(modpath.."/tools/electric_saber.lua")
|
||||||
dofile(modpath.."/tools/jetpack.lua")
|
dofile(modpath.."/tools/jetpack.lua")
|
||||||
|
dofile(modpath.."/tools/mining_laser.lua")
|
||||||
dofile(modpath.."/tools/solar_helmet.lua")
|
dofile(modpath.."/tools/solar_helmet.lua")
|
||||||
dofile(modpath.."/tools/static_boots.lua")
|
dofile(modpath.."/tools/static_boots.lua")
|
||||||
dofile(modpath.."/tools/treetap.lua")
|
dofile(modpath.."/tools/treetap.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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
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")<opPower then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
minetest.add_entity(pos+vector.new(0,1.5,0),"industrialtest:mining_laser_beam",minetest.serialize({
|
||||||
|
direction=dir,
|
||||||
|
energy=energy,
|
||||||
|
distance=distance,
|
||||||
|
mode=miningLaser.getMode(itemstack),
|
||||||
|
user=user:get_player_name()
|
||||||
|
}))
|
||||||
|
industrialtest.api.addPowerToItem(itemstack,-opPower)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
miningLaser.onUse=function(itemstack,user)
|
||||||
|
if not user:is_player() then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
local mode=miningLaser.getMode(itemstack)
|
||||||
|
local control=user:get_player_control()
|
||||||
|
if control.sneak then
|
||||||
|
mode=mode+1
|
||||||
|
if mode>=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"}
|
||||||
|
}
|
||||||
|
})
|
Loading…
Reference in New Issue