diff options
Diffstat (limited to 'castle/arrow.lua')
-rw-r--r-- | castle/arrow.lua | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/castle/arrow.lua b/castle/arrow.lua new file mode 100644 index 0000000..c135f5f --- /dev/null +++ b/castle/arrow.lua @@ -0,0 +1,92 @@ +minetest.register_craftitem("castle:arrow", { + description = "Arrow", + inventory_image = "castle_arrow.png", +}) + +minetest.register_node("castle:arrow_box", { + drawtype = "nodebox", + 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}, + } + }, + tiles = {"castle_arrow.png", "castle_arrow.png", "castle_arrow_back.png", "castle_arrow_front.png", "castle_arrow_2.png", "castle_arrow.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local castle_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"castle:arrow_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, +} + +castle_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "castle:arrow_entity" and obj:get_luaentity().name ~= "__builtin:item" then + local damage = 3 + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + groupcaps={ + fleshy={times={[1]=1/(damage-2), [2]=1/(damage-1), [3]=1/damage}}, + snappy={times={[1]=1/(damage-2), [2]=1/(damage-1), [3]=1/damage}}, + } + }, nil) + self.object:remove() + end + else + local damage = 3 + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + groupcaps={ + fleshy={times={[1]=1/(damage-2), [2]=1/(damage-1), [3]=1/damage}}, + snappy={times={[1]=1/(damage-2), [2]=1/(damage-1), [3]=1/damage}}, + } + }, nil) + self.object:remove() + end + end + end + + if self.lastpos.x~=nil then + if node.name ~= "air" then + minetest.add_item(self.lastpos, 'castle:arrow') + self.object:remove() + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +minetest.register_entity("castle:arrow_entity", castle_ARROW_ENTITY) + +minetest.register_craft({ + output = 'castle:arrow 16', + recipe = { + {'default:stick', 'default:stick', 'default:steel_ingot'}, + } +}) |