diff --git a/tools/electric_tool.lua b/tools/electric_tool.lua index 0b84166..80ad47b 100644 --- a/tools/electric_tool.lua +++ b/tools/electric_tool.lua @@ -46,6 +46,13 @@ end function industrialtest.ElectricTool.onUse(self,itemstack,user,pointed) self:prepare(itemstack) + if user:is_player() then + local controls=user:get_player_control() + if controls.sneak and self:changeMode(itemstack) then + return true + end + end + local meta=itemstack:get_meta() local opPower=self:getOpPower(itemstack) if meta:get_int("industrialtest.powerAmount"). local S=minetest.get_translator("industrialtest") +industrialtest.MiningLaserBeam={} -local beam={} - -beam.onActivate=function(self,staticdata) +function industrialtest.MiningLaserBeam.onActivate(self,staticdata) local data=minetest.deserialize(staticdata) self.direction=data.direction self.energy=data.energy @@ -28,11 +27,11 @@ beam.onActivate=function(self,staticdata) self.user=data.user end -beam.onPunch=function() +function industrialtest.MiningLaserBeam.onPunch() return true end -beam.onNodeBreak=function(pos,node,user) +function industrialtest.MiningLaserBeam.onNodeBreak(pos,node,user) if industrialtest.mclAvailable then local drops=minetest.get_node_drops(node.name,"") for _, val in ipairs(drops) do @@ -45,7 +44,7 @@ beam.onNodeBreak=function(pos,node,user) minetest.node_dig(pos,node,user) end -beam.onStep=function(self,dtime,moveresult) +function industrialtest.MiningLaserBeam.onStep(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() @@ -67,7 +66,7 @@ beam.onStep=function(self,dtime,moveresult) self.object:remove() return else - beam.onNodeBreak(val.node_pos,node,minetest.get_player_by_name(self.user)) + industrialtest.MiningLaserBeam.onNodeBreak(val.node_pos,node,minetest.get_player_by_name(self.user)) self.energy=self.energy-1 end elseif self.mode==4 then @@ -80,6 +79,7 @@ beam.onStep=function(self,dtime,moveresult) end end +-- Note: If there are more entities registered then replace manual registration with proper pseudo-OOP minetest.register_entity("industrialtest:mining_laser_beam",{ initial_properties={ physical=true, @@ -103,18 +103,77 @@ minetest.register_entity("industrialtest:mining_laser_beam",{ static_save=false, shaded=false, }, - on_activate=beam.onActivate, - on_punch=beam.onPunch, - on_step=beam.onStep + on_activate=industrialtest.MiningLaserBeam.onActivate, + on_punch=industrialtest.MiningLaserBeam.onPunch, + on_step=industrialtest.MiningLaserBeam.onStep }) -local miningLaser={} -miningLaser.mode1OpPower=1250 -miningLaser.mode2OpPower=100 -miningLaser.mode4OpPower=5000 -miningLaser.modeCount=4 +industrialtest.MiningLaser=table.copy(industrialtest.ElectricTool) +industrialtest.internal.unpackTableInto(industrialtest.MiningLaser,{ + name="industrialtest:mining_laser", + description=S("Mining Laser (Mode 1)"), + inventoryImage="industrialtest_mining_laser.png", + capacity=300000, + flow=industrialtest.api.hvPowerFlow, + define={onUse=true}, + _modeCount=4 +}) -miningLaser.getMode=function(itemstack) +function industrialtest.MiningLaser.hitUse(self,itemstack,user,pointed) + if not user:is_player() then + return false + end + local control=user:get_player_control() + if control.sneak then + end + local mode=self.getMode(itemstack) + local meta=itemstack:get_meta() + if mode==1 then + if not self:spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),10,64) then + return false + end + elseif mode==2 then + if not self:spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),3,2) then + return false + end + elseif mode==3 then + local yaw=user:get_look_horizontal() + local dir=vector.new(-math.sin(yaw),0,math.cos(yaw)) + if not self:spawnBeam(itemstack,user,user:get_pos(),dir,10,64) then + return false + end + elseif mode==4 then + if not self:spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),1,64) then + return false + end + end + return true +end + +function industrialtest.MiningLaser.changeMode(self,itemstack) + local mode=self.getMode(itemstack) + mode=mode+1 + if mode>=self._modeCount+1 then + mode=1 + end + self.setMode(itemstack,mode) + return true +end + +function industrialtest.MiningLaser.getOpPower(self,itemstack) + local mode=self.getMode(itemstack) + if mode==1 then + return 1250 + elseif mode==2 or mode==3 then + return 100 + elseif mode==4 then + return 5000 + end + -- assert not reached + assert(false) +end + +function industrialtest.MiningLaser.getMode(itemstack) local meta=itemstack:get_meta() if not meta:contains("mode") then meta:set_int("mode",1) @@ -123,74 +182,26 @@ miningLaser.getMode=function(itemstack) return meta:get_int("mode") end -miningLaser.setMode=function(itemstack,mode) +function industrialtest.MiningLaser.setMode(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 +industrialtest.MiningLaser:register() -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",