2017-01-16 22:11:04 +00:00
minetest.register_craftitem ( " mcl_throwing:arrow " , {
2015-06-29 17:55:56 +00:00
description = " Arrow " ,
2017-03-18 16:52:41 +00:00
_doc_items_longdesc = " Arrows are ammunition for bows and dispensers. " ,
_doc_items_usagehelp = " To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. " ,
2017-01-16 22:11:04 +00:00
inventory_image = " mcl_throwing_arrow_inv.png " ,
2017-01-16 13:29:41 +00:00
groups = { ammo = 1 , ammo_bow = 1 } ,
2015-06-29 17:55:56 +00:00
} )
2017-01-16 22:11:04 +00:00
minetest.register_node ( " mcl_throwing:arrow_box " , {
2015-06-29 17:55:56 +00:00
drawtype = " nodebox " ,
2017-01-04 21:36:51 +00:00
is_ground_content = false ,
2015-06-29 17:55:56 +00:00
node_box = {
type = " fixed " ,
fixed = {
-- Shaft
{ - 6.5 / 17 , - 1.5 / 17 , - 1.5 / 17 , 6.5 / 17 , 1.5 / 17 , 1.5 / 17 } ,
--Spitze
{ - 4.5 / 17 , 2.5 / 17 , 2.5 / 17 , - 3.5 / 17 , - 2.5 / 17 , - 2.5 / 17 } ,
{ - 8.5 / 17 , 0.5 / 17 , 0.5 / 17 , - 6.5 / 17 , - 0.5 / 17 , - 0.5 / 17 } ,
--Federn
{ 6.5 / 17 , 1.5 / 17 , 1.5 / 17 , 7.5 / 17 , 2.5 / 17 , 2.5 / 17 } ,
{ 7.5 / 17 , - 2.5 / 17 , 2.5 / 17 , 6.5 / 17 , - 1.5 / 17 , 1.5 / 17 } ,
{ 7.5 / 17 , 2.5 / 17 , - 2.5 / 17 , 6.5 / 17 , 1.5 / 17 , - 1.5 / 17 } ,
{ 6.5 / 17 , - 1.5 / 17 , - 1.5 / 17 , 7.5 / 17 , - 2.5 / 17 , - 2.5 / 17 } ,
{ 7.5 / 17 , 2.5 / 17 , 2.5 / 17 , 8.5 / 17 , 3.5 / 17 , 3.5 / 17 } ,
{ 8.5 / 17 , - 3.5 / 17 , 3.5 / 17 , 7.5 / 17 , - 2.5 / 17 , 2.5 / 17 } ,
{ 8.5 / 17 , 3.5 / 17 , - 3.5 / 17 , 7.5 / 17 , 2.5 / 17 , - 2.5 / 17 } ,
{ 7.5 / 17 , - 2.5 / 17 , - 2.5 / 17 , 8.5 / 17 , - 3.5 / 17 , - 3.5 / 17 } ,
}
} ,
2017-01-16 22:11:04 +00:00
tiles = { " mcl_throwing_arrow.png " , " mcl_throwing_arrow.png " , " mcl_throwing_arrow_back.png " , " mcl_throwing_arrow_front.png " , " mcl_throwing_arrow_2.png " , " mcl_throwing_arrow.png " } ,
2015-06-29 17:55:56 +00:00
groups = { not_in_creative_inventory = 1 } ,
} )
local THROWING_ARROW_ENTITY = {
physical = false ,
visual = " wielditem " ,
visual_size = { x = 0.4 , y = 0.4 } ,
2017-01-16 22:11:04 +00:00
textures = { " mcl_throwing:arrow_box " } ,
2015-06-29 17:55:56 +00:00
collisionbox = { 0 , 0 , 0 , 0 , 0 , 0 } ,
2017-02-21 21:51:07 +00:00
_timer = 0 ,
_lastpos = { } ,
2017-03-06 00:02:30 +00:00
_startpos = nil ,
2017-02-21 21:51:07 +00:00
_damage = 1 , -- Damage on impact
_shooter = nil , -- ObjectRef of player or mob who shot it
2015-06-29 17:55:56 +00:00
}
THROWING_ARROW_ENTITY.on_step = function ( self , dtime )
2017-02-21 21:51:07 +00:00
self._timer = self._timer + dtime
2015-06-29 17:55:56 +00:00
local pos = self.object : getpos ( )
2017-01-11 17:21:46 +00:00
local node = minetest.get_node ( pos )
2015-06-29 17:55:56 +00:00
2017-02-21 21:51:07 +00:00
if self._timer > 0.2 then
2017-01-11 17:21:46 +00:00
local objs = minetest.get_objects_inside_radius ( { x = pos.x , y = pos.y , z = pos.z } , 2 )
2015-06-29 17:55:56 +00:00
for k , obj in pairs ( objs ) do
if obj : get_luaentity ( ) ~= nil then
2017-03-06 00:02:30 +00:00
local entity_name = obj : get_luaentity ( ) . name
if obj ~= self._shooter and entity_name ~= " mcl_throwing:arrow_entity " and entity_name ~= " __builtin:item " then
2015-06-29 17:55:56 +00:00
obj : punch ( self.object , 1.0 , {
full_punch_interval = 1.0 ,
2017-02-21 21:51:07 +00:00
damage_groups = { fleshy = self._damage } ,
2015-06-29 17:55:56 +00:00
} , nil )
2017-05-21 03:55:55 +00:00
if obj : is_player ( ) then
mcl_hunger.exhaust ( obj : get_player_name ( ) , mcl_hunger.EXHAUST_DAMAGE )
end
2017-03-06 00:02:30 +00:00
-- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away
-- TODO: This achievement should be given for the kill, not just a hit
if self._shooter and self._shooter : is_player ( ) and vector.distance ( pos , self._startpos ) >= 50 then
if ( entity_name == " mobs_mc:skeleton " or entity_name == " mobs_mc:skeleton2 " ) then
awards.unlock ( self._shooter : get_player_name ( ) , " mcl:snipeSkeleton " )
end
end
2015-06-29 17:55:56 +00:00
self.object : remove ( )
end
2017-02-21 21:51:07 +00:00
elseif obj ~= self._shooter then
2015-06-29 17:55:56 +00:00
obj : punch ( self.object , 1.0 , {
full_punch_interval = 1.0 ,
2017-02-21 21:51:07 +00:00
damage_groups = { fleshy = self._damage } ,
2015-06-29 17:55:56 +00:00
} , nil )
2017-05-21 03:55:55 +00:00
if obj : is_player ( ) then
mcl_hunger.exhaust ( obj : get_player_name ( ) , mcl_hunger.EXHAUST_DAMAGE )
end
2015-06-29 17:55:56 +00:00
self.object : remove ( )
end
end
end
2017-02-21 21:51:07 +00:00
if self._lastpos . x ~= nil then
2017-01-26 18:05:25 +00:00
local def = minetest.registered_nodes [ node.name ]
if ( def and def.walkable ) or not def then
2017-02-21 21:51:07 +00:00
minetest.add_item ( self._lastpos , ' mcl_throwing:arrow ' )
2015-06-29 17:55:56 +00:00
self.object : remove ( )
end
end
2017-02-21 21:51:07 +00:00
self._lastpos = { x = pos.x , y = pos.y , z = pos.z }
2015-06-29 17:55:56 +00:00
end
2017-01-16 22:11:04 +00:00
minetest.register_entity ( " mcl_throwing:arrow_entity " , THROWING_ARROW_ENTITY )
2015-06-29 17:55:56 +00:00
2017-01-12 02:04:58 +00:00
minetest.register_craft ( {
2017-01-16 22:11:04 +00:00
output = ' mcl_throwing:arrow 4 ' ,
2017-01-12 02:04:58 +00:00
recipe = {
2017-01-31 22:32:56 +00:00
{ ' mcl_core:flint ' } ,
{ ' mcl_core:stick ' } ,
2017-01-16 16:40:08 +00:00
{ ' mcl_mobitems:feather ' }
2017-01-12 02:04:58 +00:00
}
} )