From 5fcb2bd3e825f7bf829386248e819aeb45a2124f Mon Sep 17 00:00:00 2001 From: stub Date: Wed, 27 Sep 2017 18:08:49 +0300 Subject: [PATCH] initial commit --- README.md | 11 + build_arrow.lua | 117 ++++++++ defaults.lua | 25 ++ depends.txt | 6 + description.txt | 1 + dig_arrow.lua | 109 +++++++ fire_arrow.lua | 145 +++++++++ fireworks_arrows.lua | 197 ++++++++++++ functions.lua | 191 ++++++++++++ init.lua | 67 +++++ shell_arrow.lua | 126 ++++++++ sounds/throwing_bow_sound.ogg | Bin 0 -> 4701 bytes sounds/throwing_crossbow_sound.ogg | Bin 0 -> 5364 bytes sounds/throwing_firework_boom.ogg | Bin 0 -> 8622 bytes sounds/throwing_firework_launch.ogg | Bin 0 -> 10125 bytes sounds/throwing_shell_explode.ogg | Bin 0 -> 6751 bytes standard_arrows.lua | 131 ++++++++ teleport_arrow.lua | 96 ++++++ textures/.directory | 4 + textures/throwing_arbalest.png | Bin 0 -> 760 bytes textures/throwing_arbalest_auto.png | Bin 0 -> 739 bytes textures/throwing_arbalest_auto_loaded.png | Bin 0 -> 798 bytes textures/throwing_arbalest_loaded.png | Bin 0 -> 807 bytes textures/throwing_arrow_build.png | Bin 0 -> 217 bytes textures/throwing_arrow_build_2.png | Bin 0 -> 224 bytes textures/throwing_arrow_build_back.png | Bin 0 -> 213 bytes textures/throwing_arrow_build_front.png | Bin 0 -> 188 bytes textures/throwing_arrow_diamond.png | Bin 0 -> 213 bytes textures/throwing_arrow_diamond_2.png | Bin 0 -> 217 bytes textures/throwing_arrow_diamond_back.png | Bin 0 -> 210 bytes textures/throwing_arrow_diamond_front.png | Bin 0 -> 191 bytes textures/throwing_arrow_dig.png | Bin 0 -> 229 bytes textures/throwing_arrow_dig_2.png | Bin 0 -> 221 bytes textures/throwing_arrow_dig_back.png | Bin 0 -> 215 bytes textures/throwing_arrow_dig_front.png | Bin 0 -> 190 bytes textures/throwing_arrow_fire.png | Bin 0 -> 262 bytes textures/throwing_arrow_fire_2.png | Bin 0 -> 271 bytes textures/throwing_arrow_fire_back.png | Bin 0 -> 268 bytes textures/throwing_arrow_fire_front.png | Bin 0 -> 306 bytes textures/throwing_arrow_fireworks_blue.png | Bin 0 -> 222 bytes textures/throwing_arrow_fireworks_blue_2.png | Bin 0 -> 223 bytes .../throwing_arrow_fireworks_blue_back.png | Bin 0 -> 232 bytes .../throwing_arrow_fireworks_blue_front.png | Bin 0 -> 207 bytes textures/throwing_arrow_fireworks_red.png | Bin 0 -> 235 bytes textures/throwing_arrow_fireworks_red_2.png | Bin 0 -> 223 bytes .../throwing_arrow_fireworks_red_back.png | Bin 0 -> 234 bytes .../throwing_arrow_fireworks_red_front.png | Bin 0 -> 203 bytes textures/throwing_arrow_obsidian.png | Bin 0 -> 213 bytes textures/throwing_arrow_obsidian_2.png | Bin 0 -> 216 bytes textures/throwing_arrow_obsidian_back.png | Bin 0 -> 204 bytes textures/throwing_arrow_obsidian_front.png | Bin 0 -> 188 bytes textures/throwing_arrow_shell.png | Bin 0 -> 243 bytes textures/throwing_arrow_shell_2.png | Bin 0 -> 252 bytes textures/throwing_arrow_shell_back.png | Bin 0 -> 204 bytes textures/throwing_arrow_shell_front.png | Bin 0 -> 228 bytes textures/throwing_arrow_steel.png | Bin 0 -> 230 bytes textures/throwing_arrow_steel_2.png | Bin 0 -> 227 bytes textures/throwing_arrow_steel_back.png | Bin 0 -> 209 bytes textures/throwing_arrow_steel_front.png | Bin 0 -> 189 bytes textures/throwing_arrow_stone.png | Bin 0 -> 224 bytes textures/throwing_arrow_stone_2.png | Bin 0 -> 219 bytes textures/throwing_arrow_stone_back.png | Bin 0 -> 213 bytes textures/throwing_arrow_stone_front.png | Bin 0 -> 190 bytes textures/throwing_arrow_teleport.png | Bin 0 -> 220 bytes textures/throwing_arrow_teleport_2.png | Bin 0 -> 228 bytes textures/throwing_arrow_teleport_back.png | Bin 0 -> 212 bytes textures/throwing_arrow_teleport_front.png | Bin 0 -> 189 bytes textures/throwing_arrow_tnt.png | Bin 0 -> 241 bytes textures/throwing_arrow_tnt_2.png | Bin 0 -> 241 bytes textures/throwing_arrow_tnt_back.png | Bin 0 -> 211 bytes textures/throwing_arrow_tnt_front.png | Bin 0 -> 224 bytes textures/throwing_arrow_torch.png | Bin 0 -> 224 bytes textures/throwing_arrow_torch_2.png | Bin 0 -> 228 bytes textures/throwing_arrow_torch_back.png | Bin 0 -> 228 bytes textures/throwing_arrow_torch_front.png | Bin 0 -> 178 bytes textures/throwing_bow_composite.png | Bin 0 -> 646 bytes textures/throwing_bow_composite_loaded.png | Bin 0 -> 692 bytes textures/throwing_bow_royal.png | Bin 0 -> 617 bytes textures/throwing_bow_royal_loaded.png | Bin 0 -> 660 bytes textures/throwing_bow_steel.png | Bin 0 -> 633 bytes textures/throwing_bow_steel_loaded.png | Bin 0 -> 683 bytes textures/throwing_bow_wood.png | Bin 0 -> 581 bytes textures/throwing_bow_wood_loaded.png | Bin 0 -> 622 bytes textures/throwing_crossbow.png | Bin 0 -> 673 bytes textures/throwing_crossbow_loaded.png | Bin 0 -> 677 bytes textures/throwing_empty.png | Bin 0 -> 178 bytes textures/throwing_longbow.png | Bin 0 -> 661 bytes textures/throwing_longbow_loaded.png | Bin 0 -> 674 bytes textures/throwing_sparkle.png | Bin 0 -> 190 bytes textures/throwing_sparkle_blue.png | Bin 0 -> 261 bytes textures/throwing_sparkle_red.png | Bin 0 -> 240 bytes throwing.conf | 33 ++ tnt_arrow.lua | 284 ++++++++++++++++++ tools.lua | 65 ++++ torch_arrow.lua | 140 +++++++++ 95 files changed, 1748 insertions(+) create mode 100644 README.md create mode 100755 build_arrow.lua create mode 100755 defaults.lua create mode 100755 depends.txt create mode 100755 description.txt create mode 100755 dig_arrow.lua create mode 100755 fire_arrow.lua create mode 100755 fireworks_arrows.lua create mode 100755 functions.lua create mode 100755 init.lua create mode 100755 shell_arrow.lua create mode 100755 sounds/throwing_bow_sound.ogg create mode 100755 sounds/throwing_crossbow_sound.ogg create mode 100755 sounds/throwing_firework_boom.ogg create mode 100755 sounds/throwing_firework_launch.ogg create mode 100755 sounds/throwing_shell_explode.ogg create mode 100755 standard_arrows.lua create mode 100755 teleport_arrow.lua create mode 100644 textures/.directory create mode 100644 textures/throwing_arbalest.png create mode 100644 textures/throwing_arbalest_auto.png create mode 100644 textures/throwing_arbalest_auto_loaded.png create mode 100644 textures/throwing_arbalest_loaded.png create mode 100644 textures/throwing_arrow_build.png create mode 100644 textures/throwing_arrow_build_2.png create mode 100644 textures/throwing_arrow_build_back.png create mode 100644 textures/throwing_arrow_build_front.png create mode 100644 textures/throwing_arrow_diamond.png create mode 100644 textures/throwing_arrow_diamond_2.png create mode 100644 textures/throwing_arrow_diamond_back.png create mode 100644 textures/throwing_arrow_diamond_front.png create mode 100644 textures/throwing_arrow_dig.png create mode 100644 textures/throwing_arrow_dig_2.png create mode 100644 textures/throwing_arrow_dig_back.png create mode 100644 textures/throwing_arrow_dig_front.png create mode 100644 textures/throwing_arrow_fire.png create mode 100644 textures/throwing_arrow_fire_2.png create mode 100644 textures/throwing_arrow_fire_back.png create mode 100644 textures/throwing_arrow_fire_front.png create mode 100644 textures/throwing_arrow_fireworks_blue.png create mode 100644 textures/throwing_arrow_fireworks_blue_2.png create mode 100644 textures/throwing_arrow_fireworks_blue_back.png create mode 100644 textures/throwing_arrow_fireworks_blue_front.png create mode 100644 textures/throwing_arrow_fireworks_red.png create mode 100644 textures/throwing_arrow_fireworks_red_2.png create mode 100644 textures/throwing_arrow_fireworks_red_back.png create mode 100644 textures/throwing_arrow_fireworks_red_front.png create mode 100644 textures/throwing_arrow_obsidian.png create mode 100644 textures/throwing_arrow_obsidian_2.png create mode 100644 textures/throwing_arrow_obsidian_back.png create mode 100644 textures/throwing_arrow_obsidian_front.png create mode 100644 textures/throwing_arrow_shell.png create mode 100644 textures/throwing_arrow_shell_2.png create mode 100644 textures/throwing_arrow_shell_back.png create mode 100644 textures/throwing_arrow_shell_front.png create mode 100644 textures/throwing_arrow_steel.png create mode 100644 textures/throwing_arrow_steel_2.png create mode 100644 textures/throwing_arrow_steel_back.png create mode 100644 textures/throwing_arrow_steel_front.png create mode 100644 textures/throwing_arrow_stone.png create mode 100644 textures/throwing_arrow_stone_2.png create mode 100644 textures/throwing_arrow_stone_back.png create mode 100644 textures/throwing_arrow_stone_front.png create mode 100644 textures/throwing_arrow_teleport.png create mode 100644 textures/throwing_arrow_teleport_2.png create mode 100644 textures/throwing_arrow_teleport_back.png create mode 100644 textures/throwing_arrow_teleport_front.png create mode 100644 textures/throwing_arrow_tnt.png create mode 100644 textures/throwing_arrow_tnt_2.png create mode 100644 textures/throwing_arrow_tnt_back.png create mode 100644 textures/throwing_arrow_tnt_front.png create mode 100644 textures/throwing_arrow_torch.png create mode 100644 textures/throwing_arrow_torch_2.png create mode 100644 textures/throwing_arrow_torch_back.png create mode 100644 textures/throwing_arrow_torch_front.png create mode 100644 textures/throwing_bow_composite.png create mode 100644 textures/throwing_bow_composite_loaded.png create mode 100644 textures/throwing_bow_royal.png create mode 100644 textures/throwing_bow_royal_loaded.png create mode 100644 textures/throwing_bow_steel.png create mode 100644 textures/throwing_bow_steel_loaded.png create mode 100644 textures/throwing_bow_wood.png create mode 100644 textures/throwing_bow_wood_loaded.png create mode 100644 textures/throwing_crossbow.png create mode 100644 textures/throwing_crossbow_loaded.png create mode 100644 textures/throwing_empty.png create mode 100644 textures/throwing_longbow.png create mode 100644 textures/throwing_longbow_loaded.png create mode 100644 textures/throwing_sparkle.png create mode 100644 textures/throwing_sparkle_blue.png create mode 100644 textures/throwing_sparkle_red.png create mode 100755 throwing.conf create mode 100755 tnt_arrow.lua create mode 100755 tools.lua create mode 100755 torch_arrow.lua diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c1fc9e --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ + ## Throwing mod reloaded + + #### This is a mirror of throwing mod for minetest by Echoes91, which was further improved by MinetestForFun team. + * Being an excellent ranged weapons mod for minetest already, it was further improved by MinetestForFun team, enabling PvP-damage, mob anger towards the attacker, resolved many bugs and optimized the code. It's fully suited and ready for survival and pvp gameplay. Since MinetestForFun didn't have separate repo for this mod (it only exists as a part of their server modpack), I decided to fork it (so it would be easily accesible for git clone) and make some changes to have less dependencies. + * Changes: I restored original, low-res textures by Echoes91, changed parameters of bows to shoot further and removed some items to not depend on some mods (minotaur horn bow and mithril arrows). + #### Credits + All copyright belongs to MinetestForFun team, Echoes91, PilzAdam and Jeija. + Sourcecode: LGPLv2.1 (see http://www.gnu.org/licenses/lgpl-2.1.html) + Grahpics & sounds: CC-BY 3.0 (see http://creativecommons.org/licenses/by/3.0/legalcode) + + diff --git a/build_arrow.lua b/build_arrow.lua new file mode 100755 index 0000000..6c66828 --- /dev/null +++ b/build_arrow.lua @@ -0,0 +1,117 @@ +minetest.register_craftitem("throwing:arrow_build", { + description = "Build Arrow", + inventory_image = "throwing_arrow_build.png", +}) + +minetest.register_node("throwing:arrow_build_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 = {"throwing_arrow_build.png", "throwing_arrow_build.png", "throwing_arrow_build_back.png", "throwing_arrow_build_front.png", "throwing_arrow_build_2.png", "throwing_arrow_build.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_build_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + node = "", + player = "", + inventory = false, + stack = false, + bow_damage = 0, +} + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local newpos = self.object:getpos() + if self.lastpos.x ~= nil then + for _, pos in pairs(throwing_get_trajectoire(self, newpos)) do + local node = minetest.get_node(pos) + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 1) + for k, obj in pairs(objs) do + if throwing_is_player(self.player, obj) or throwing_is_entity(obj) then + if self.inventory and self.stack and not minetest.setting_getbool("creative_mode") then + self.inventory:remove_item("main", {name=self.stack:get_name()}) + end + if self.stack then + minetest.add_item(pos, {name=self.stack:get_name()}) + end + local toughness = 0.95 + if math.random() < toughness then + minetest.add_item(pos, 'throwing:arrow_build') + else + minetest.add_item(pos, 'default:stick') + end + self.object:remove() + return + end + end + + if node.name ~= "air" + and not string.find(node.name, "water_") + and not (string.find(node.name, 'grass') and not string.find(node.name, 'dirt')) + and not (string.find(node.name, 'farming:') and not string.find(node.name, 'soil')) + and not string.find(node.name, 'flowers:') + and not string.find(node.name, 'fire:') then + if node.name ~= "ignore" and self.inventory and self.stack then + if not minetest.is_protected(self.lastpos, "") + and not string.find(node.name, "lava") + and not string.find(node.name, "torch") + and self.stack:get_definition().type == "node" + and self.stack:get_name() ~= "default:torch" then + minetest.place_node(self.lastpos, {name=self.stack:get_name()}) + else + minetest.add_item(self.lastpos, {name=self.stack:get_name()}) + end + if not minetest.setting_getbool("creative_mode") then + self.inventory:remove_item("main", {name=self.stack:get_name()}) + end + end + minetest.add_item(self.lastpos, 'default:shovel_steel') + self.object:remove() + return + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + end + end + self.lastpos={x=newpos.x, y=newpos.y, z=newpos.z} +end + +minetest.register_entity("throwing:arrow_build_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_build', + recipe = { + {'default:stick', 'default:stick', 'default:shovel_steel'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_build', + recipe = { + {'default:shovel_steel', 'default:stick', 'default:stick'}, + } +}) diff --git a/defaults.lua b/defaults.lua new file mode 100755 index 0000000..90518fa --- /dev/null +++ b/defaults.lua @@ -0,0 +1,25 @@ +DISABLE_WOODEN_BOW = false +DISABLE_LONGBOW = false +DISABLE_COMPOSITE_BOW = false +DISABLE_STEEL_BOW = false +DISABLE_ROYAL_BOW = false +DISABLE_CROSSBOW = false +DISABLE_ARBALEST = false +DISABLE_AUTOMATED_ARBALEST = false + +DISABLE_TELEPORT_ARROW = true +DISABLE_DIG_ARROW = true +DISABLE_BUILD_ARROW = true +DISABLE_TNT_ARROW = true +DISABLE_FIRE_ARROW = true +DISABLE_TORCH_ARROW = false +DISABLE_SHELL_ARROW = false + +DISABLE_FIREWORKS_BLUE_ARROW = false +DISABLE_FIREWORKS_RED_ARROW = false + +DISABLE_STONE_ARROW = false +DISABLE_STEEL_ARROW = false +DISABLE_DIAMOND_ARROW = false +DISABLE_OBSIDIAN_ARROW = false + diff --git a/depends.txt b/depends.txt new file mode 100755 index 0000000..db178d1 --- /dev/null +++ b/depends.txt @@ -0,0 +1,6 @@ +default +farming +dye +bucket? +fire? +tnt? diff --git a/description.txt b/description.txt new file mode 100755 index 0000000..ee25fb4 --- /dev/null +++ b/description.txt @@ -0,0 +1 @@ +This mod adds many bows and arrows to Minetest. diff --git a/dig_arrow.lua b/dig_arrow.lua new file mode 100755 index 0000000..0a676b5 --- /dev/null +++ b/dig_arrow.lua @@ -0,0 +1,109 @@ +minetest.register_craftitem("throwing:arrow_dig", { + description = "Dig Arrow", + inventory_image = "throwing_arrow_dig.png", +}) + +minetest.register_node("throwing:arrow_dig_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 = {"throwing_arrow_dig.png", "throwing_arrow_dig.png", "throwing_arrow_dig_back.png", "throwing_arrow_dig_front.png", "throwing_arrow_dig_2.png", "throwing_arrow_dig.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_dig_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + player = "", + bow_damage = 0, +} + + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + local newpos = self.object:getpos() + if self.lastpos.x ~= nil then + for _, pos in pairs(throwing_get_trajectoire(self, newpos)) do + local node = minetest.get_node(pos) + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 1) + for k, obj in pairs(objs) do + if throwing_is_player(self.player, obj) or throwing_is_entity(obj) then + if throwing_touch(pos, obj:getpos()) then + local puncher = self.object + if self.player and minetest.get_player_by_name(self.player) then + puncher = minetest.get_player_by_name(self.player) + end + local damage = 1.5 + if self.bow_damage and self.bow_damage > 0 then + damage = damage + (self.bow_damage/12) + end + obj:punch(puncher, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + if math.random(0,100) % 2 == 0 then -- 50% of chance to drop //MFF (Mg|07/27/15) + minetest.add_item(pos, "throwing:arrow_dig") + end + self.object:remove() + return + end + end + end + if node.name ~= "air" + and not string.find(node.name, "water_") + and not (string.find(node.name, 'grass') and not string.find(node.name, 'dirt')) + and not (string.find(node.name, 'farming:') and not string.find(node.name, 'soil')) + and not string.find(node.name, 'flowers:') + and not string.find(node.name, 'fire:') then + if node.name ~= "ignore" and minetest.get_item_group(node.name, "unbreakable") == 0 + and not minetest.is_protected(pos, self.player) + and node.diggable ~= false then + minetest.set_node(pos, {name = "air"}) + minetest.add_item(pos, node.name) + end + self.object:remove() + return + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + end + end + self.lastpos={x=newpos.x, y=newpos.y, z=newpos.z} +end + +minetest.register_entity("throwing:arrow_dig_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_dig', + recipe = { + {'default:stick', 'default:stick', 'default:pick_steel'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_dig', + recipe = { + {'default:pick_steel', 'default:stick', 'default:stick'}, + } +}) diff --git a/fire_arrow.lua b/fire_arrow.lua new file mode 100755 index 0000000..424d81c --- /dev/null +++ b/fire_arrow.lua @@ -0,0 +1,145 @@ +minetest.register_craftitem("throwing:arrow_fire", { + description = "Fire Arrow", + inventory_image = "throwing_arrow_fire.png", +}) + +minetest.register_node("throwing:arrow_fire_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 = {"throwing_arrow_fire.png", "throwing_arrow_fire.png", "throwing_arrow_fire_back.png", "throwing_arrow_fire_front.png", "throwing_arrow_fire_2.png", "throwing_arrow_fire.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_fire_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + player = "", + bow_damage = 0, +} + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + local newpos = self.object:getpos() + if self.lastpos.x ~= nil then + for _, pos in pairs(throwing_get_trajectoire(self, newpos)) do + local node = minetest.get_node(pos) + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + local objpos = obj:getpos() + if throwing_is_player(self.player, obj) or throwing_is_entity(obj) then + if throwing_touch(pos, objpos) then + local puncher = self.object + if self.player and minetest.get_player_by_name(self.player) then + puncher = minetest.get_player_by_name(self.player) + end + local damage = 4 + if self.bow_damage and self.bow_damage > 0 then + damage = damage + (self.bow_damage/12) + end + obj:punch(puncher, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + if math.random(0,100) % 2 == 0 then -- 50% of chance to drop //MFF (Mg|07/27/15) + minetest.add_item(pos, 'default:stick') + end + self.object:remove() + return + end + end + end + + if node.name ~= "air" + and node.name ~= "throwing:light" + and node.name ~= "fire:basic_flame" + and not (string.find(node.name, 'grass') and not string.find(node.name, 'dirt')) + and not (string.find(node.name, 'farming:') and not string.find(node.name, 'soil')) + and not string.find(node.name, 'flowers:') + and not string.find(node.name, 'fire:') then + if node.name ~= "ignore" then + minetest.set_node(self.lastpos, {name="fire:basic_flame"}) + end + self.object:remove() + return + end + + if minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name="throwing:light"}) + end + if minetest.get_node(self.lastpos).name == "throwing:light" then + minetest.remove_node(self.lastpos) + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + end + end + self.lastpos={x=newpos.x, y=newpos.y, z=newpos.z} +end + + +minetest.register_entity("throwing:arrow_fire_entity", THROWING_ARROW_ENTITY) + +minetest.register_node("throwing:light", { + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + tiles = {"throwing_empty.png"}, + light_source = default.LIGHT_MAX-4, + selection_box = { + type = "fixed", + fixed = { + {0,0,0,0,0,0} + } + }, + groups = {not_in_creative_inventory=1} +}) + +minetest.register_abm({ + nodenames = {"throwing:light"}, + interval = 10, + chance = 1, + action = function(pos, node) + minetest.remove_node(pos) + end +}) + +minetest.register_craft({ + output = 'throwing:arrow_fire 4', + recipe = { + {'default:stick', 'default:stick', 'bucket:bucket_lava'}, + }, + replacements = { + {"bucket:bucket_lava", "bucket:bucket_empty"} + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_fire 4', + recipe = { + {'bucket:bucket_lava', 'default:stick', 'default:stick'}, + }, + replacements = { + {"bucket:bucket_lava", "bucket:bucket_empty"} + } +}) diff --git a/fireworks_arrows.lua b/fireworks_arrows.lua new file mode 100755 index 0000000..167f8b8 --- /dev/null +++ b/fireworks_arrows.lua @@ -0,0 +1,197 @@ +local function throwing_register_fireworks(color, desc) + minetest.register_craftitem("throwing:arrow_fireworks_" .. color, { + description = desc .. "fireworks arrow", + inventory_image = "throwing_arrow_fireworks_" .. color .. ".png", + }) + + minetest.register_node("throwing:arrow_fireworks_" .. color .. "_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 = {"throwing_arrow_fireworks_" .. color .. ".png", "throwing_arrow_fireworks_" .. color .. ".png", "throwing_arrow_fireworks_" .. color .. "_back.png", "throwing_arrow_fireworks_" .. color .. "_front.png", "throwing_arrow_fireworks_" .. color .. "_2.png", "throwing_arrow_fireworks_" .. color .. ".png"}, + groups = {not_in_creative_inventory=1}, + }) + + local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_fireworks_" .. color .. "_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + player = "", + bow_damage = 0, + } + + local radius = 0.5 + + local function add_effects(pos, radius) + minetest.add_particlespawner({ + amount = 256, + time = 0.2, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x=-5, y=-5, z=-5}, + maxvel = {x=5, y=5, z=5}, + minacc = {x=0, y=-8, z=0}, + --~ maxacc = {x=-20, y=-50, z=-50}, + minexptime = 2.5, + maxexptime = 3, + minsize = 1, + maxsize = 2.5, + texture = "throwing_sparkle_" .. color .. ".png", + }) + end + + + local function boom(pos) + minetest.sound_play("throwing_firework_boom", {pos=pos, gain=1, max_hear_distance=2*64}) + if minetest.get_node(pos).name == 'air' or minetest.get_node(pos).name == 'throwing:firework_trail' then + minetest.add_node(pos, {name="throwing:firework_boom"}) + minetest.get_node_timer(pos):start(0.2) + end + add_effects(pos, radius) + end + + -- Back to the arrow + + THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local newpos = self.object:getpos() + if self.timer < 0.07 then + minetest.sound_play("throwing_firework_launch", {pos=newpos, gain=0.8, max_hear_distance=2*64}) + end + minetest.add_particlespawner({ + amount = 16, + time = 0.1, + minpos = newpos, + maxpos = newpos, + minvel = {x=-5, y=-5, z=-5}, + maxvel = {x=5, y=5, z=5}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 0.3, + maxexptime = 0.5, + minsize = 0.5, + maxsize = 1, + texture = "throwing_sparkle.png", + }) + if self.lastpos.x ~= nil then + for _, pos in pairs(throwing_get_trajectoire(self, newpos)) do + 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 throwing_is_player(self.player, obj) or throwing_is_entity(obj) then + local damage = 2 + if self.bow_damage and self.bow_damage > 0 then + damage = damage + (self.bow_damage/12) + end + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + boom(pos) + self.object:remove() + return + end + end + end + local node = minetest.get_node(newpos) + if self.timer > 2 or node.name ~= "air" and node.name ~= "throwing:firework_trail" then + boom(self.lastpos) + self.object:remove() + return + end + if node.name == 'air' then + minetest.add_node(newpos, {name="throwing:firework_trail"}) + minetest.get_node_timer(newpos):start(0.1) + end + end + self.lastpos={x=newpos.x, y=newpos.y, z=newpos.z} + end + + + minetest.register_entity("throwing:arrow_fireworks_" .. color .. "_entity", THROWING_ARROW_ENTITY) + + minetest.register_craft({ + output = 'throwing:arrow_fireworks_' .. color .. ' 8', + recipe = { + {'default:stick', 'tnt:gunpowder', 'dye:' .. color}, + } + }) + + minetest.register_craft({ + output = 'throwing:arrow_fireworks_' .. color .. ' 8', + recipe = { + {'dye:' .. color, 'tnt:gunpowder', 'default:stick'}, + } + }) +end + +--~ Arrows + +if not DISABLE_FIREWORKS_BLUE_ARROW then + throwing_register_fireworks('blue', 'Blue') +end + +if not DISABLE_FIREWORKS_RED_ARROW then + throwing_register_fireworks('red', 'Red') +end + +--~ Nodes + +minetest.register_node("throwing:firework_trail", { + drawtype = "airlike", + light_source = 9, + walkable = false, + drop = "", + groups = {dig_immediate=3}, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, +}) + +minetest.register_node("throwing:firework_boom", { + drawtype = "plantlike", + tiles = {"throwing_sparkle.png"}, + light_source = default.LIGHT_MAX, + walkable = false, + drop = "", + groups = {dig_immediate=3}, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name="throwing:firework_light"}) + minetest.get_node_timer(pos):start(3) + end, +}) + +minetest.register_node("throwing:firework_light", { + drawtype = "airlike", + light_source = default.LIGHT_MAX, + walkable = false, + drop = "", + groups = {dig_immediate=3}, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, +}) diff --git a/functions.lua b/functions.lua new file mode 100755 index 0000000..0deb46f --- /dev/null +++ b/functions.lua @@ -0,0 +1,191 @@ +--~ +--~ Shot and reload system +--~ + +local players = {} + +minetest.register_on_joinplayer(function(player) + local playerName = player:get_player_name() + players[playerName] = { + reloading=false, + } +end) + +minetest.register_on_leaveplayer(function(player) + local playerName = player:get_player_name() + players[playerName] = nil +end) + +function throwing_is_player(name, obj) + return (obj:is_player() and obj:get_player_name() ~= name) +end + +function throwing_is_entity(obj) + return (obj:get_luaentity() ~= nil + and not string.find(obj:get_luaentity().name, "throwing:") + and obj:get_luaentity().name ~= "__builtin:item" + and obj:get_luaentity().name ~= "gauges:hp_bar" + and obj:get_luaentity().name ~= "signs:text") +end + +function throwing_get_trajectoire(self, newpos) + if self.lastpos.x == nil then + return {newpos} + end + local coord = {} + local nx = (newpos["x"] - self.lastpos["x"])/3 + local ny = (newpos["y"] - self.lastpos["y"])/3 + local nz = (newpos["z"] - self.lastpos["z"])/3 + + if nx and ny and nz then + table.insert(coord, {x=self.lastpos["x"]+nx, y=self.lastpos["y"]+ny ,z=self.lastpos["z"]+nz }) + table.insert(coord, {x=newpos["x"]-nx, y=newpos["y"]-ny ,z=newpos["z"]-nz }) + end + table.insert(coord, newpos) + return coord +end + +function throwing_touch(pos, objpos) + local rx = pos.x - objpos.x + local ry = pos.y - (objpos.y+1) + local rz = pos.z - objpos.z + if (ry < 1 and ry > -1) and (rx < 1 and rx > -1) and (rz < 1 and rz > -1) then + return true + end + return false +end + +function throwing_shoot_arrow (itemstack, player, stiffness, is_cross) + if not player then return end + local arrow = itemstack:get_metadata() + itemstack:set_metadata("") + player:set_wielded_item(itemstack) + local playerpos = player:getpos() + local obj = minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, arrow) + if not obj then return end + local dir = player:get_look_dir() + obj:setvelocity({x=dir.x*stiffness, y=dir.y*stiffness, z=dir.z*stiffness}) + obj:setacceleration({x=dir.x*-3, y=-10, z=dir.z*-3}) + obj:setyaw(player:get_look_yaw()+math.pi) + if is_cross then + minetest.sound_play("throwing_crossbow_sound", {pos=playerpos}) + else + minetest.sound_play("throwing_bow_sound", {pos=playerpos}) + end + if obj:get_luaentity() then + obj:get_luaentity().player = player:get_player_name() + obj:get_luaentity().inventory = player:get_inventory() + obj:get_luaentity().stack = player:get_inventory():get_stack("main", player:get_wield_index()-1) + obj:get_luaentity().lastpos = {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z} + obj:get_luaentity().bow_damage = stiffness + end + return true +end + +function throwing_unload (itemstack, player, unloaded, wear) + if itemstack:get_metadata() then + for _,arrow in ipairs(throwing_arrows) do + if itemstack:get_metadata() == arrow[2] then + if not minetest.setting_getbool("creative_mode") then + player:get_inventory():add_item("main", arrow[1]) + end + break + end + end + end + if wear >= 65535 then + player:set_wielded_item({}) + else + player:set_wielded_item({name=unloaded, wear=wear}) + end +end + +function throwing_reload (itemstack, player, pos, is_cross, loaded) + local playerName = player:get_player_name() + players[playerName]['reloading'] = false + if itemstack:get_name() == player:get_wielded_item():get_name() then + if (pos.x == player:getpos().x and pos.y == player:getpos().y and pos.z == player:getpos().z) or not is_cross then + local wear = itemstack:get_wear() + for _,arrow in ipairs(throwing_arrows) do + if player:get_inventory():get_stack("main", player:get_wield_index()+1):get_name() == arrow[1] then + if not minetest.setting_getbool("creative_mode") then + player:get_inventory():remove_item("main", arrow[1]) + end + local meta = arrow[2] + player:set_wielded_item({name=loaded, wear=wear, metadata=meta}) + break + end + end + end + end +end + +-- Bows and crossbows + +function throwing_register_bow (name, desc, scale, stiffness, reload_time, toughness, is_cross, craft) + minetest.register_tool("throwing:" .. name, { + description = desc, + inventory_image = "throwing_" .. name .. ".png", + wield_scale = scale, + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + local pos = user:getpos() + local playerName = user:get_player_name() + if not players[playerName]['reloading'] then + players[playerName]['reloading'] = true + minetest.after(reload_time, throwing_reload, itemstack, user, pos, is_cross, "throwing:" .. name .. "_loaded") + end + return itemstack + end, + }) + + minetest.register_tool("throwing:" .. name .. "_loaded", { + description = desc, + inventory_image = "throwing_" .. name .. "_loaded.png", + wield_scale = scale, + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + local wear = itemstack:get_wear() + if not minetest.setting_getbool("creative_mode") then + wear = wear + (65535/toughness) + end + local unloaded = "throwing:" .. name + throwing_shoot_arrow(itemstack, user, stiffness, is_cross) + minetest.after(0, throwing_unload, itemstack, user, unloaded, wear) + return itemstack + end, + on_drop = function(itemstack, dropper, pointed_thing) + local wear = itemstack:get_wear() + local unloaded = "throwing:" .. name + minetest.after(0, throwing_unload, itemstack, dropper, unloaded, wear) + end, + groups = {not_in_creative_inventory=1}, + }) + + minetest.register_craft({ + output = 'throwing:' .. name, + recipe = craft + }) + + local craft_width = 1 + -- Since # isn't stable especially when there are nils in the table, count by hand + for _,v in ipairs(craft) do + for i,__ in ipairs(v) do + if i > craft_width then + craft_width = i + end + end + end + local rev_craft = {} + for i,y in ipairs(craft) do + rev_craft[i] = {} + for j,x in ipairs(y) do + rev_craft[i][craft_width-j+1] = x + end + end + minetest.register_craft({ + output = 'throwing:' .. name, + recipe = rev_craft + }) +end + diff --git a/init.lua b/init.lua new file mode 100755 index 0000000..162af8e --- /dev/null +++ b/init.lua @@ -0,0 +1,67 @@ +throwing_arrows = { + {"throwing:arrow_steel", "throwing:arrow_steel_entity"}, + {"throwing:arrow_stone", "throwing:arrow_stone_entity"}, + {"throwing:arrow_obsidian", "throwing:arrow_obsidian_entity"}, + {"throwing:arrow_diamond", "throwing:arrow_diamond_entity"}, + {"throwing:arrow_fire", "throwing:arrow_fire_entity"}, + {"throwing:arrow_teleport", "throwing:arrow_teleport_entity"}, + {"throwing:arrow_dig", "throwing:arrow_dig_entity"}, + {"throwing:arrow_build", "throwing:arrow_build_entity"}, + {"throwing:arrow_tnt", "throwing:arrow_tnt_entity"}, + {"throwing:arrow_torch", "throwing:arrow_torch_entity"}, + {"throwing:arrow_shell", "throwing:arrow_shell_entity"}, + {"throwing:arrow_fireworks_blue", "throwing:arrow_fireworks_blue_entity"}, + {"throwing:arrow_fireworks_red", "throwing:arrow_fireworks_red_entity"}, +} + +dofile(minetest.get_modpath("throwing").."/defaults.lua") + +local input = io.open(minetest.get_modpath("throwing").."/throwing.conf", "r") +if input then + dofile(minetest.get_modpath("throwing").."/throwing.conf") + input:close() + input = nil +end + +dofile(minetest.get_modpath("throwing").."/functions.lua") + +dofile(minetest.get_modpath("throwing").."/tools.lua") + +dofile(minetest.get_modpath("throwing").."/standard_arrows.lua") + + +if minetest.get_modpath('fire') and minetest.get_modpath('bucket') and not DISABLE_FIRE_ARROW then + dofile(minetest.get_modpath("throwing").."/fire_arrow.lua") +end + +if not DISABLE_TELEPORT_ARROW then + dofile(minetest.get_modpath("throwing").."/teleport_arrow.lua") +end + +if not DISABLE_DIG_ARROW then + dofile(minetest.get_modpath("throwing").."/dig_arrow.lua") +end + +if not DISABLE_BUILD_ARROW then + dofile(minetest.get_modpath("throwing").."/build_arrow.lua") +end + +if minetest.get_modpath('fire') and minetest.get_modpath('tnt') and not DISABLE_TNT_ARROW then + dofile(minetest.get_modpath("throwing").."/tnt_arrow.lua") +end + +if not DISABLE_TORCH_ARROW then + dofile(minetest.get_modpath("throwing").."/torch_arrow.lua") +end + +if minetest.get_modpath('tnt') and not DISABLE_SHELL_ARROW then + dofile(minetest.get_modpath("throwing").."/shell_arrow.lua") +end + +if minetest.get_modpath('tnt') then + dofile(minetest.get_modpath("throwing").."/fireworks_arrows.lua") +end + +if minetest.setting_get("log_mods") then + minetest.log("action", "throwing loaded") +end diff --git a/shell_arrow.lua b/shell_arrow.lua new file mode 100755 index 0000000..f652a6b --- /dev/null +++ b/shell_arrow.lua @@ -0,0 +1,126 @@ +minetest.register_craftitem("throwing:arrow_shell", { + description = "Shell arrow", + inventory_image = "throwing_arrow_shell.png", +}) + +minetest.register_node("throwing:arrow_shell_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 = {"throwing_arrow_shell.png", "throwing_arrow_shell.png", "throwing_arrow_shell_back.png", "throwing_arrow_shell_front.png", "throwing_arrow_shell_2.png", "throwing_arrow_shell.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_shell_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + player = "", + bow_damage = 0, +} + +local radius = 1 + +local function add_effects(pos, radius) + minetest.add_particlespawner({ + amount = 8, + time = 0.5, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x=-10, y=-10, z=-10}, + maxvel = {x=10, y=10, z=10}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 0.5, + maxexptime = 1, + minsize = 0.5, + maxsize = 1, + texture = "tnt_smoke.png", + }) +end + + +local function boom(pos) + minetest.sound_play("shell_explode", {pos=pos, gain=1.5, max_hear_distance=2*64}) + minetest.set_node(pos, {name="tnt:boom"}) + minetest.get_node_timer(pos):start(0.1) + add_effects(pos, radius) +end + +-- Back to the arrow + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + local newpos = self.object:getpos() + if self.lastpos.x ~= nil then + for _, pos in pairs(throwing_get_trajectoire(self, newpos)) do + local node = minetest.get_node(pos) + 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 throwing_is_player(self.player, obj) or throwing_is_entity(obj) then + local speed = vector.length(self.object:getvelocity()) + local damage = ((speed + 5)^1.2)/10 + 12 + if self.bow_damage and self.bow_damage > 0 then + damage = damage + (self.bow_damage/12) + end + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + boom(pos) + self.object:remove() + return + end + end + + if node.name ~= "air" + and not (string.find(node.name, 'grass') and not string.find(node.name, 'dirt')) + and not (string.find(node.name, 'farming:') and not string.find(node.name, 'soil')) + and not string.find(node.name, 'flowers:') + and not string.find(node.name, 'fire:') then + boom(self.lastpos) + self.object:remove() + return + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + end + end + self.lastpos={x=newpos.x, y=newpos.y, z=newpos.z} +end + +minetest.register_entity("throwing:arrow_shell_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_shell 8', + recipe = { + {'default:stick', 'tnt:gunpowder', 'default:bronze_ingot'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_shell 8', + recipe = { + {'default:bronze_ingot', 'tnt:gunpowder', 'default:stick'}, + } +}) diff --git a/sounds/throwing_bow_sound.ogg b/sounds/throwing_bow_sound.ogg new file mode 100755 index 0000000000000000000000000000000000000000..20a51dabf49157e4bc7fcd22fe47916cb23d2e0a GIT binary patch literal 4701 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 literal 0 HcmV?d00001 diff --git a/sounds/throwing_firework_boom.ogg b/sounds/throwing_firework_boom.ogg new file mode 100755 index 0000000000000000000000000000000000000000..5db91006eed5b070b65b588e4b8c46851afb3425 GIT binary patch literal 8622 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 literal 0 HcmV?d00001 diff --git a/sounds/throwing_shell_explode.ogg b/sounds/throwing_shell_explode.ogg new file mode 100755 index 0000000000000000000000000000000000000000..38b8e9357c1f62fc9dd5687e1d713abbced6e0bb GIT binary patch literal 6751 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 literal 0 HcmV?d00001 diff --git a/standard_arrows.lua b/standard_arrows.lua new file mode 100755 index 0000000..8ac6a99 --- /dev/null +++ b/standard_arrows.lua @@ -0,0 +1,131 @@ +function throwing_register_arrow_standard (kind, desc, eq, toughness, craft) + minetest.register_craftitem("throwing:arrow_" .. kind, { + description = desc .. " arrow", + inventory_image = "throwing_arrow_" .. kind .. ".png", + }) + + minetest.register_node("throwing:arrow_" .. kind .. "_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 = {"throwing_arrow_" .. kind .. ".png", "throwing_arrow_" .. kind .. ".png", "throwing_arrow_" .. kind .. "_back.png", "throwing_arrow_" .. kind .. "_front.png", + "throwing_arrow_" .. kind .. "_2.png", "throwing_arrow_" .. kind .. ".png"}, + groups = {not_in_creative_inventory=1}, + }) + + local THROWING_ARROW_ENTITY={ + physical = false, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_" .. kind .. "_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + player = "", + bow_damage = 0, + } + + THROWING_ARROW_ENTITY.on_step = function(self, dtime) + local newpos = self.object:getpos() + if self.lastpos.x ~= nil then + for _, pos in pairs(throwing_get_trajectoire(self, newpos)) do + local node = minetest.get_node(pos) + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + local objpos = obj:getpos() + if throwing_is_player(self.player, obj) or throwing_is_entity(obj) then + if throwing_touch(pos, objpos) then + local puncher = self.object + if self.player and minetest.get_player_by_name(self.player) then + puncher = minetest.get_player_by_name(self.player) + end + local damage = eq + if self.bow_damage and self.bow_damage > 0 then + damage = damage + (self.bow_damage/12) + end + obj:punch(puncher, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + if math.random() < toughness then + if math.random(0,100) % 2 == 0 then + minetest.add_item(self.lastpos, 'throwing:arrow_' .. kind) + end + else + minetest.add_item(self.lastpos, 'default:stick') + end + self.object:remove() + return + end + end + end + if node.name ~= "air" + and not string.find(node.name, 'water_') + and not (string.find(node.name, 'grass') and not string.find(node.name, 'dirt')) + and not (string.find(node.name, 'farming:') and not string.find(node.name, 'soil')) + and not string.find(node.name, 'flowers:') + and not string.find(node.name, 'fire:') then + if math.random() < toughness then + minetest.add_item(self.lastpos, 'throwing:arrow_' .. kind) + else + minetest.add_item(self.lastpos, 'default:stick') + end + self.object:remove() + return + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + end + end + self.lastpos={x=newpos.x, y=newpos.y, z=newpos.z} + end + + minetest.register_entity("throwing:arrow_" .. kind .. "_entity", THROWING_ARROW_ENTITY) + + minetest.register_craft({ + output = 'throwing:arrow_' .. kind .. ' 16', + recipe = { + {'default:stick', 'default:stick', craft}, + } + }) + + minetest.register_craft({ + output = 'throwing:arrow_' .. kind .. ' 16', + recipe = { + {craft, 'default:stick', 'default:stick'}, + } + }) +end + +if not DISABLE_STONE_ARROW then + throwing_register_arrow_standard ('stone', 'Stone', 4, 0.40, 'group:stone') +end + +if not DISABLE_STEEL_ARROW then + throwing_register_arrow_standard ('steel', 'Steel', 5, 0.50, 'default:steel_ingot') +end + +if not DISABLE_OBSIDIAN_ARROW then + throwing_register_arrow_standard ('obsidian', 'Obsidian', 6, 0.60, 'default:obsidian') +end + +if not DISABLE_DIAMOND_ARROW then + throwing_register_arrow_standard ('diamond', 'Diamond', 7, 0.70, 'default:diamond') +end + diff --git a/teleport_arrow.lua b/teleport_arrow.lua new file mode 100755 index 0000000..927681f --- /dev/null +++ b/teleport_arrow.lua @@ -0,0 +1,96 @@ +minetest.register_craftitem("throwing:arrow_teleport", { + description = "Teleport Arrow", + inventory_image = "throwing_arrow_teleport.png", +}) + +minetest.register_node("throwing:arrow_teleport_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 = {"throwing_arrow_teleport.png", "throwing_arrow_teleport.png", "throwing_arrow_teleport_back.png", "throwing_arrow_teleport_front.png", "throwing_arrow_teleport_2.png", "throwing_arrow_teleport.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_teleport_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + player = "", + bow_damage = 0, +} + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + local newpos = self.object:getpos() + if self.lastpos.x ~= nil then + for _, pos in pairs(throwing_get_trajectoire(self, newpos)) do + local node = minetest.get_node(pos) + 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 throwing_is_player(self.player, obj) or throwing_is_entity(obj) then + if self.player ~= "" then + local player = minetest.get_player_by_name(self.player) + if player then + player:setpos(self.lastpos) + end + end + self.object:remove() + return + end + end + + if node.name ~= "air" + and not (string.find(node.name, 'grass') and not string.find(node.name, 'dirt')) + and not (string.find(node.name, 'farming:') and not string.find(node.name, 'soil')) + and not string.find(node.name, 'flowers:') + and not string.find(node.name, 'fire:') then + if self.player ~= "" then + local player = minetest.get_player_by_name(self.player) + if player then + player:setpos(self.lastpos) + end + end + self.object:remove() + return + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + end + end + self.lastpos={x=newpos.x, y=newpos.y, z=newpos.z} +end + +minetest.register_entity("throwing:arrow_teleport_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_teleport', + recipe = { + {'default:stick', 'default:stick', 'default:mese_crystal_fragment'} + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_teleport', + recipe = { + {'default:mese_crystal_fragment', 'default:stick', 'default:stick'} + } +}) diff --git a/textures/.directory b/textures/.directory new file mode 100644 index 0000000..5c39294 --- /dev/null +++ b/textures/.directory @@ -0,0 +1,4 @@ +[Dolphin] +PreviewsShown=true +Timestamp=2017,9,27,1,19,11 +Version=4 diff --git a/textures/throwing_arbalest.png b/textures/throwing_arbalest.png new file mode 100644 index 0000000000000000000000000000000000000000..f53e3772ec4c17c88ade1277503a209f34a905a6 GIT binary patch literal 760 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 literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_build.png b/textures/throwing_arrow_build.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b40625a54b2fabc42632dc914cd0076482fd80 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRK#Xv^Dm(}6;1o-U3d7N?UFBv_k;bMEc=Y2Wr> zj!E19B~k~Pe2W|HxE-74L|-$0vz9X@0R-kq^k;tFYOLc@o&M~qeUHyiZb^yH;zkB_ zzmFbZI2>Oue9TVvwdB5k#}bRGRbD1K&AuVYdWDf8`KIN8LKkKOpp6Wku6{1-oD!M< Daa%~U literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_build_2.png b/textures/throwing_arrow_build_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1e178e4fdc871bd01cce3501d7ad49d0412ed1fb GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRK_{O+9WNT5)zr;B5V#p&b(3Dzx)v(5AW`Ik38 zTVj~7A~hu;AwlCp`p@@wHqA@S_f>FoE;;l6z)j7~3cn;JB_t#+ZH??G>zsB{p2tv( zjg75s{eDS_L)F)f*XXFdnUud@;LWM00`3!J)ZR{-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnN!6nSPaaYEwh3G6qJ5Jxq%ZJUcu4 zzw+nh=Q9s#@o`7E)v(=-e$4$`yEP~6!`H7zm(82VI$iPmwI4-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnK!z;mDy`fndDCFts;uvCaIyqs1jDeA157VLp&(6;N zKUv}2iH_3?EHil|q=M264KC@FMHG0}{PkpY-uGAOR?mN*X4Nt_ehC-J2@@IQv!^WL aW?*PMEgB+He)-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRK5OS+uv7*Ht5)5S5w;&gI?1Z%T!&b>W9?b{w~ z`CtEUaux%(*;&?KIxM_Jd6DNgY*(Am2m*$z-Dl5O$+%RfKf7w*qf;yqDIqBV1QU3= xfBHrgSG=!kn|id-BIP89@U0`~G#2nNFg%ddl(fh#76;nK;OXk;vd$@?2>|pBLK^@8 literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_diamond_2.png b/textures/throwing_arrow_diamond_2.png new file mode 100644 index 0000000000000000000000000000000000000000..485b12fa73128d46ee3a5ebe5501f7fe7a3624a0 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJQJ6uj`22d!?)5S5w;&gI?1nU;Y+2;BG{L7n{ z{r%s(aN5Mi#>RyX^Plc7K3&ze*R+v^H*og{=5yzgQW9IFC#^f{w8i^h+|NeEV}}kL zIPl@CIkR)c`>M97M_Xbyu^g2bm_9*nN5r9)s*T26EBG1qJXd}hQ)F-oXd{ECtDnm{ Hr-UW|`+-d7 literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_diamond_back.png b/textures/throwing_arrow_diamond_back.png new file mode 100644 index 0000000000000000000000000000000000000000..0c92fba4377999cbc69b0ad55972132e895623a3 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnNE~F!Iz~sEwh3G6qJ5Jxq%ZJUcu4 zzw+nh=Q9s#@o`7|Vf*`^`M3p70tg(*J@w!I|K(DP2X|(M*BKZXY%;i{)3s5GiJMvJ vV0~5#XW>R?kD3b&j#C&VJN*t-ED~Y(AZjMrboualpj8Z>u6{1-oD!M<<~>GI literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_diamond_front.png b/textures/throwing_arrow_diamond_front.png new file mode 100644 index 0000000000000000000000000000000000000000..6e545df27b9fd4a587c24cc2fabf07f870ced46e GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnK!z*d*Qq*(~DCFbm;uvCaIyqs1jDeA157VLp&(6;N zKUv}2iH_3?GXMWi$T*RdlDH)D&4ve)EZn`E4r(?ZwdT38_wWIeh@|un4USV7B|H0y dmYi@G2f8m-)ajy*SR~L~22WQ%mvv4FO#llJK4t&_ literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_dig.png b/textures/throwing_arrow_dig.png new file mode 100644 index 0000000000000000000000000000000000000000..6a1d443f5cd656f4816ad18aad532c686d91f7e8 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJ^D~;h_Gf=3=)5S5w;&gI?1Z%T!&b>W9?b{w4 z?H2z(Ig5eY>@4dq9TwiAyvXw#wyRBO1c9eVI)(pBN=QiTtN+gz{^2iwVtCFP;vB literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_dig_2.png b/textures/throwing_arrow_dig_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d9d1b3abce6a03b36d224a934964cfb48a7fea GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJ^S^kcjI#4Lf)5S5w;&gI?1nU;Y+2;BG{L7p5 z;`VeboYvad*qE5_t8n<)+1dZ!ujN!ZsZd*6>&6BIAfl}#S8P%2B#ZAH%wf}O{+>M` zaBug##8ksXAm^9pxw5jdG!<>1Z}0B@o?o`nm}><;Lw$#)Ucrr`w?JDNJYD@<);T3K F0RUa@Nkjku literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_dig_back.png b/textures/throwing_arrow_dig_back.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc4a60798522186545374507984362ca8d9d217 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnN!6nY*y~&IdD3s#q;uvCaIyqs1jDeA157VLp&(6;N zul#xW`OJe_eB2RkHEf+-U59?IkKdp6;p^9<%jQjFovyfO(ITGDlXD;ZIkMBeVAmY2 zz@DoD5fTEN|ALi$I=W?@9yPP^EaExg(a>+|b&-`}O}?_i3Yl9Ufc7zXy85}Sb4q9e E09(XKivR!s literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_dig_front.png b/textures/throwing_arrow_dig_front.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7ff2e13a471370c467af4e415006108285b84e GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnK!z*pYKO^D=P{`ZU#WBRp{rLCS`e|Fu-(OQBjQ<()PP-v#lOT}l;Ko$5 dCa_D7fuYYu!b-bpjS|pU22WQ%mvv4FO#lJ1KQjOT literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_fire.png b/textures/throwing_arrow_fire.png new file mode 100644 index 0000000000000000000000000000000000000000..fd3a9d579f424ea42c5c983ad9e6f8c697063a35 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7ls%HH3k-Y-t>P!5zYdS z$YKTtZeb8+WSBKa0w~B{;_2(kexH+Dz=*fXD{C51XtJk^V~EA+x~7D*vY<@-1qNT;^FghfB%cHYF$lA7YSfzVBnkJ6wGnq>s_Gp7(8A5T-G@yGywoV C1Y4B= literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_fire_2.png b/textures/throwing_arrow_fire_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f86579a8962f058285e29b6f29e5d098b0852d60 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7lr}`eFhejxARJXBAf*t zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{XQqRfU(fK$S@_K&>T+}#}JFt$q5pyTNr1X=l}CB zZfIUxzC z?#I9O#zb#dg~Q+Nd00N$`^vGYO`Ffd)HH|Zd%5k;^9N3So!{En*!b{uK3m&|dtZ69 zyE%71d3&Fq=l}ozNfXRN6MrP0ICA3H=lNd@e%@UCe}36UW3Cna3}sawhi*DfzX5b7 NgQu&X%Q~loCIFf%X1xFa literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_fire_back.png b/textures/throwing_arrow_fire_back.png new file mode 100644 index 0000000000000000000000000000000000000000..8a7d99306fee4e38782e07eebb99f431d6fc500e GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}Y)RhkE(~88 zW-;h19ZJy!if|TqL>4nJ2!SzUkJ3(dpdfpRr>`sf9S%W$W%j6?6$U_|9#0p?5R22v z2@7Nlj0}6279DtYcJ_be&&$te9@OIFj@ZNYcmCsl|I_>4{GV_8>wlrd0TAf8JcYY# z&;RB7|MERI_YFuBDBpY1BS?gsqiE5GqiaG6c1f*Py!?EN!HL;gi#z^SsWqMM`CoDP zN&3QH|E2Q|{r@kX^@v;eQBwPa9}5_pHJFWr=C*uv(PWsdVZQm_niZ))cQJUn`njxg HN@xNAjoD_% literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_fire_front.png b/textures/throwing_arrow_fire_front.png new file mode 100644 index 0000000000000000000000000000000000000000..3994257d15c3e6b7026d44e765ad54e7909382be GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co#^NA%Cx&(BWL^R}Y)RhkE(~88 zW-;h19ZJy!if|TqL>4nJ2!SzUkJ3(dpdfpRr>`sf9S%W$B_)nxUo)W4CQlc~5R22v z2@7Nlj0}6279DtYcJ}|t3g=FAoL<0Pw&%a-Qx{1Kmq^KX@wJB+tkXSq;6}ad>?$|0 zm^KcMA|r#1e^L@APfnZg^kLGEb$SO594L@o9W^IVCx6wM4-fzAv$4$!=ZSx_&+t#( zHFVdQ&MBb@01jDi#sB~S literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_fireworks_blue.png b/textures/throwing_arrow_fireworks_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..71d4ec8d253e3be4477cb763d70d614e9ae9207a GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJU-Rj8X?LeVyPZ!4!i_^&o60FU_IrsMbv~OFm z?DzlwOQa4o`4%_YaXU88iN0q1W-Vt*0tkp0I%m|?3OS{}*dX+F?#%H221a`=kDmDP zOhozd>~bESo>c;WzM3b#xx8`S!`JySZmTEAscq?;8|Wa*z_8EVva#&KF`%ss44$rj JF6*2UngC8LO;!K^ literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_fireworks_blue_2.png b/textures/throwing_arrow_fireworks_blue_2.png new file mode 100644 index 0000000000000000000000000000000000000000..51b055c4a62521aa6cfdc20204f49ff1778550bd GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJM$UTZB94M6I>Eak-aXL9cf^`eyZ1eno{^iXk zcmF4^NKHvdNYJ>D{`38vP4g1-eH9#?%e?-yZC?LAC8b4r(z>%wTfEa^8YPsn`UH{_ zfogyJn%$_lr`-1NsiZ@Ci6O3!?lkUb`EnriAdm2?qvtdh*a6+_q-^}N^6FWjy$qhN KelF{r5}E+wH%$-# literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_fireworks_blue_back.png b/textures/throwing_arrow_fireworks_blue_back.png new file mode 100644 index 0000000000000000000000000000000000000000..85956a63c5603b419594e37a5396b466489774a6 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnN$FHJ(y;jN-C{*g{;uvCaIyqs1jDeA157VLp&(6;N zul#xW`OJe_eB2R#*jE1e4+cD1|NlQWXlMii!R?wr&hpKh5A8Ir|Cg4qqdC;}oyNa< zX?uCe1k;pXbHv!(LQP(W6wdlMUnTkI{FF8&kf O00vK2KbLh*2~7Y6wNpI+ literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_fireworks_blue_front.png b/textures/throwing_arrow_fireworks_blue_front.png new file mode 100644 index 0000000000000000000000000000000000000000..8674cc8c191a45e04fe93566c6ae754e7f1e2927 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnK!z(9x({ADypiqpbi(`nz>Ewh3G6qJ5Jxq%ZJUcu4 z|73-8Cpu0m_gbSYxYdTj@t5liv v!DFfNmlHbY9%N<gTe~DWM4faq&iI literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_fireworks_red.png b/textures/throwing_arrow_fireworks_red.png new file mode 100644 index 0000000000000000000000000000000000000000..9b13fcdceaa524d29e79bc32e6916d15e9a241a0 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJct^Vu5#XzA7PZ!4!i_^&o60FU_IrsMbv~PP* zAAkS<5~%}CzQv7p+>Xt2qOTdhS<9J{00MvV6B{oS{IOsL0_Qe9?ThzjR(|DI7Jl3* z+|#4(XJAzG|J;FugaaV_;j1~b-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJctIWB#11OZ^>Eak-aXL9cf^`eyZ1eno{^ia8 ze*a2Zk(!c_kf3oP{pb5To8~3v`zkm(|9Wa8ILkagtwnm$y0cDOywhTS@+L+^9Xc8z z0R;R0r6q8@k3GL((~J$?5-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvlXA!H^t|8~#;pisG|i(`nz>Ewh3G6qJ5Jxq%ZJUcu4 zzw+nh=Q9s#@o`7&Vf%ai`hN)c`t|=~gN8;R5L~YLAIMApvy-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnK!z-^>sOLEmC=}u8;uvCaIyqs1jDeA157VLp&(6;N zKUv}2iH_3?{_oo-z&qQ_(BQ{U$B_JcXFUGj_{q;KCRU)fuH;bDWf5j(j@pMzO}&Th qmK_wbZf56M#B;)-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJ@@tN=J4?v+LPZ!4!i_^&o60FU_IrsMbv~OE5 zWy+QMAl`(7%XT`-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJ@onO!HC{QTX)5S5w;&gI?1nU;Y+2;BG{L7n{ zELmc3#mLCOz(C~1=0D|mk>@vTSDUavadlkx!JFsj*(SG0Pg-}@X^ZzX+eb$Pk`ogW z5`O%e-Ke;y-1hLPq(gc?|NJy=^FP6P=l_=Oxq%L~3=A{9lomUeoSqJ}kipZ{&t;uc GLK6V-4NDyW literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_obsidian_back.png b/textures/throwing_arrow_obsidian_back.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1232fe8891b328e32a4b5a7ab0a67f68101bbb GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnN&c|t5p&}9t6pHk8aSX9Iot&^h#=yw1hiTD)XJ=>s zSN^>GeC9zdKJEx7wu6Rz%n~3V`O)G<{Vp@^ImVw~$;WI9Qt#R*#l+35bg(|Fg|l#@ ovq#N^2FEFklAV5sDi(<_wDD`0UoH3@0JMa`)78&qol`;+02kRjq5uE@ literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_obsidian_front.png b/textures/throwing_arrow_obsidian_front.png new file mode 100644 index 0000000000000000000000000000000000000000..2cbed4ce28b54fef854769b2579aab6da050b10c GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnK!>c0tXS#ncP{`BM#WBRaJNf2Tg_sxj}h8IH2dDJ`4Q23j^>bP0l+XkK*K0dC literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_shell.png b/textures/throwing_arrow_shell.png new file mode 100644 index 0000000000000000000000000000000000000000..d100424102511bfdb911b8c10964c67e6c301155 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRK;*u3$#AyBBn)5S5w;&gI?1Z%T!&b>W9?b{Yi znR2B*h&RFU+Mg{S?VC$%nVlQ$xE-74L|-$0vz9X@0R$dCefszOfddCV{QR8G);7Oh z!md6o@rRzr4bf;VriVGp&d;|ub}~Hte0~qleEa&eAHQZdDtvnxasI-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRK;U|q+mZlF-7r;B5V#p$;b4Y>|E2)N!qvF&!$ zn)VL@+st-$E^Sq4YE9qhxpAA^@mw8yM<=G_#7sfKX zWxNTSdG=Xdiz&al;7QH=Vrz@;y@6ha4GbS%JlwR_ZkLPD7TX|&V=owt8Ip3C-+sZ>%V^P$oopBKW-it3vcom03F5P>FVdQ&MBb@0D%u&fB*mh literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_shell_back.png b/textures/throwing_arrow_shell_back.png new file mode 100644 index 0000000000000000000000000000000000000000..4b64eaf4b26191122067d1de496928f0421cb24e GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnNBg`zr+;(|7P$<&V#WBR-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnK!>g*ZtMl6tpirTwi(`nz>Ewh3G6qJ5Jxq%ZJUcu4 z|73-8Cpu0mXliQm@SdM%dwAKriLCRx=b0&;nYiwFrabdGjemcB8Z#e0&(Bli8ZRMH zSJ&|2q~Vj#{%&o{dFv(Z{-+#CKT+>yv+tl($Cj?S2btLd*-})LzZf!!GqgO?jm(tK RsRdfj;OXk;vd$@?2>_BsP96XN literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_steel.png b/textures/throwing_arrow_steel.png new file mode 100644 index 0000000000000000000000000000000000000000..99325908fbbfde637e2138f959c37f34537db57d GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJP&CcM~J)lsrr;B5V#p&b(3D#!eoO^qI+P6LU z4+N957`V;Ovi{Ox;VsIGJilSP+Jr_Bc>4SM`~Q*>5)yTPelUiA_{*Odp0kppW%Eo6 zOG`;hAg=%S=On}7_N literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_steel_2.png b/textures/throwing_arrow_steel_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c0401a6ff27678090aea2f36d2630ec2f12bd21c GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglZRJPcjY7IFrZL@r;B5V#p$;bH*z*O2(Uaq@+51c z=;ZZ>)b=qrTO01U!Kd@gk!K$Nxid!`SWSx(CMQQui~do`Zv6Rt^PRsB)-o=WFfg8< zv_n)yiAjMWHaI@d=*;PdVT@~7Z`Gyf&e3|l$2-(D^yxSMAg_P-tnANkW@KFJAnz=b Rr318^!PC{xWt~$(69B(wO7{Q& literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_steel_back.png b/textures/throwing_arrow_steel_back.png new file mode 100644 index 0000000000000000000000000000000000000000..c7edf5652e0f09b65e58524d5f22c5f3b063e27b GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7a$D;Kb?2i11Zh|kH}&M z1|cwJ>`~gu4iscB@$_|Nzt7Arq^P$`L6Z?E6zA#U7-DfcIbnf}fstVk)1m{<&d&a? z{CWBL%!68d+!1@&6q#k%3_#$K$Es!lm#ftNBXAnc~1Y6Zty9_o0ZDR0r^>bP0l+XkK?Pfh3 literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_steel_front.png b/textures/throwing_arrow_steel_front.png new file mode 100644 index 0000000000000000000000000000000000000000..ff22af0ab8f8fc3b0587030c837120fa801ad0bf GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnK!>h!&LENScDCFho;uvCaIyqs1jDeA157VLp&(6;N zKUv}2iH_3?{sY1Bkls++(xi6Q=|}qI?KRAwJU>7G$gGd^GdCPL_kgikgV{*vL2_?U b2_wUfwGy5;j{af+n#$nm>gTe~DWM4fvS>h( literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_stone.png b/textures/throwing_arrow_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..b563af6abf536b89df96575f8d31bd021d34b456 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglSfoXR%5~bdZ19Qr;B5V#p&b(3D#!eoO^qI+P5V* zIv%VK;!QZXY^THg)&-8|bYDw;yT)Q<00bMBEMNXVJs~0C$G^YUPDkYrt-BE<$dPV* zNW#$2kmI)hT7?XciuYA*Q;#uxF0L(x^8*Os^Oi?(NXzopr07M2&MgRZ+ literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_stone_2.png b/textures/throwing_arrow_stone_2.png new file mode 100644 index 0000000000000000000000000000000000000000..20182bc472f759c106827ab2bc2a48dc45eb3b5c GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglSfoXm0=P4L!eNGr;B5V#p&b(3Dzx)v(5AW`Ik3y zad8=3F)}hRFc5jM`A>OX-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnNE~KoIad^>Opiq*hi(`nz>Ewh3G6qJ5Jxq%ZJUcu4 zzw+nh=Q9s#@o`7E)v)Qt?~^&#-_w)w;p^9<%jQjFovwI#x_6OL5GooGNau!4Oejn1`9J4)}V`0TY-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnKBdVjxDdK$!DCF(w;uvCaIyqs1jDeA157VLp&(6;N zKUv}2iH_3?nwpq+c!kw`5|%{1+3;Y}kAHuypSIQf{WUeh_@6QFv>TE(2?D7OZcH_6 c0=x7W7|J^&tUQ$KK*ln7y85}Sb4q9e04nJ`cK`qY literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_teleport.png b/textures/throwing_arrow_teleport.png new file mode 100644 index 0000000000000000000000000000000000000000..584735b4698e73c3d13ef84a91cfea383476abd9 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglSfonS3GIoB%n~Hr;B5V#p&b(3D#!eoO^qI+P6LU z`2W~{Ptyk0+0U42#hTbGx35XR5iNY;00`{(Y|q@*R%)f=Ql0+ns(p{oyB?k%5VqfM zXmH@e_4_Rw{f}3*t>0fbW6w+N!}VQEQ?oW2bFE-zxS415NX>I8$hi!ju6{1-oD!M< DJgHAf literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_teleport_2.png b/textures/throwing_arrow_teleport_2.png new file mode 100644 index 0000000000000000000000000000000000000000..56192c8d58b8e0589777967fa98e13c10275703b GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglSfontCLOJ5GYjW>Eak-aXL9cf^`eyZ1eno{^iYm z|ILpDoIZ5mz<~|h)g~l-Twh>||d{?)#Uf&{1FKoKWt@=2q_3;q1XR**9MD-(|frH^#4w4Et-WwWGpcr2{Qz N@O1TaS?83{1OPt;NB{r; literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_teleport_back.png b/textures/throwing_arrow_teleport_back.png new file mode 100644 index 0000000000000000000000000000000000000000..325c20378ab53283474d3c86855a861a55366ba0 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnNCCp*kzWVGNpirWxi(`nz>Ewh3G6qJ5Jxq%ZJUcu4 zzw+nh=Q9s#@o`7&VSD@MJi~Ddo&*p$l6mUff1dx>Uv4-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnKBdV+ZeS3HhP{_;E#WBRp{WwxEt;o5qPWe{Pf1hU6GB$n*7s&||8RWC4 cEaGNhcq=QWqWMiM3ur2Xr>mdKI;Vst0H91gFaQ7m literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_tnt.png b/textures/throwing_arrow_tnt.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ee8f1e38ca1d65a258df9cf28e365f4d0f9739 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglSkB0r%mW`Bv7c%)5S5w;&gI?1Z%T!&b>W9?b{yI zmwx@fMCw4(qMyfj+1Pk_+n8#_n%FG2uSvfVEqvkt2>h7e$hhv|?d$7#V(#4Gk-Vkj zQl0+ns(p`74-Zcd2;Y~Gkl0uI``Cxx#>R)Q^AFuvo@{&g`h5$Ze_c literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_tnt_2.png b/textures/throwing_arrow_tnt_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3b53ece0ae6ab2720e3dd4d046273073ed2c48dc GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglSkChWNMu^KTxR7)5S5w;`G~z8#!ATcwFO;c(DiW z2+f&uNLA*5;GIWZSNaNDn^ictHU_NQ>BN6-bTvsmp4;EscDnTu|Niv1(i#d`~JG#G<)LHpViYDZt#SDKa$3GoU#14IrGHWC#z>m g94WoO^QWzLSeRY?y(+N-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnN&S%ER=y&QCP$DO>Xh@b}GXQ}{CQt2|5C7-M6|<;6cGaGz=SJ>QKapfp7BM!L vrvFzsgdZifPx!Hbu~~!JNN8@$M;A?oTl)Hj^V~~8)-!mz`njxgN@xNA(*{9( literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_tnt_front.png b/textures/throwing_arrow_tnt_front.png new file mode 100644 index 0000000000000000000000000000000000000000..b7252ac4c2154f143c90084019cc3e41ed52ca7e GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_mK8X6#Yg$qp1`FY)wsWxvnKBWh^*`n>rjpir)-i(`nz>9><@`5F{>TH||Xvmg9j zENQ`9d_T(FG-!&1Fx&p6OBdR2VXf%*`BCZ8bJ6OJQk(+!!$%61*WaDKqocVrHvalQ zb;*QPS?(|2c1CkDPGIq7JdtL%T|MgL9)?d>OO7Qj;MXuuPj5Y!6DXjw>#yt)kXsl$ MUHx3vIVCg!0FL=f?f?J) literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_torch.png b/textures/throwing_arrow_torch.png new file mode 100644 index 0000000000000000000000000000000000000000..1c424e416f9c911e627682a337f8ff0b2ec3b978 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglSkA@%Oys2Jy0mu)5S5w;&gI?1Z%T!&b>W9?b{L> z?M~MR@g}Ia7yoa)&l9~ZC-Fn&i_-^Y96oSj(mLLYfBy1+jQjEJt#tGH_4 zeP(sNgrtOoMADUx@{`;1?@O5F-#c^Q!v*o(OhG({rB;M=&kb~tWnf6(s-G2cowj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwglSkA@W$_b^6+odvPZ!4!i_^&o60BPoXPf8$^Dl4a z`Vwhy#mLCOz~ImPLm%q9|D>_W%geVpF^4VEonP>gU-{64vpoMLYb7Q2)%`sckaEm_ zlYfK+2*?>3UMa0@J*I5J!7yi?oAKVD`tjiVj5ZgUBBgk PmNR&|`njxgN@xNAO@T>E literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_torch_back.png b/textures/throwing_arrow_torch_back.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9fd111386465d9795aeac577d0d34fe365c0a6 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7lr}`eFhejxARJXBAf*t zk;M!QLSW3;qqLJ9D9B#o>FdgVpOagViO=?U`U{{?p{I*uh{fsTgatANMut61iw-o UR+a5ffR;0Oy85}Sb4q9e05EAz{Qv*} literal 0 HcmV?d00001 diff --git a/textures/throwing_arrow_torch_front.png b/textures/throwing_arrow_torch_front.png new file mode 100644 index 0000000000000000000000000000000000000000..764a2632dca508d26cef29cb6e18fa7420e02aed GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2cowj^(N7l!`~2N@U^do{EGMK}vQ zB8wRqgus}wM`{XE)7O>#KC`?Kw~}YTwIZO9y{C&~h{fsTgatANMut61iw-xr5PA@3Q731MGUjHv~N#q+IDd&I2ywh$-+9U|1I=C^_tO@MWV_?{~NT}#K S=Mih5Q4F50elF{r5}E)8*fT%? literal 0 HcmV?d00001 diff --git a/textures/throwing_bow_composite.png b/textures/throwing_bow_composite.png new file mode 100644 index 0000000000000000000000000000000000000000..630af5a282c832513753ee5e1b5a8e7484e4459b GIT binary patch literal 646 zcmV;10(t$3P)L}000McNliru-vbj85&=5lv7i6|0uxC@ zK~y-)ZIZof6j2n#e|Iv2F$?KaB!yyNrWIsSAuwc!on4fS$*?#d*J7N>Y?23$_lkSYJ@=d|stSPPIC!2%vubhs z^+%?rrT|!(6Dq^#NgsZnP@L^O8vw}(E+YB<{tke;iygLJTmhgPAOJUJ>HvyrcH=lk zRk7`ixmmS%`wZ=LI=VEA>Mu|qjt^jSwa(^hT~+l|fru1JY}>~3JbJyJ`o7P^h$EFz z`10*Dhr1sD^hsk)0L&bus)z{llW=+5V{FXTAP87raOAjkiH*O1INW_c08Wx*P=Tt_ zxG($+;74>_!!V@XZVSNHT4Mkl$1$d9VkSw#(9jUgs>RBj;Ki;UMMs2T$j#J~G=+C> z8s|Fa1hQO%%5XNt!&g0mAYgiWnp?Ur2m8w7)%pNfRY}tn!!Rg&pzdM^-}hNxaHQSN z#yTrIiXtq_8Zh0c44>vaG2+NrU|k4)AfuS3N$yz`MOo|R8b!{{s)ec!L}000McNliru-vbvGCmZeAwdVi;0zpYc zK~y-)ZIVA|6JZ#KpV!`zYOzj2JLpiQa#83|kfK865FJ9np@SgUQiozMLPcr?1v^x5 zaL^{{pe_jo5phyMqAfbB-k|#iq|HTl3=R$gFgGf6w4>!M_+2JC&%Rg~QbX#1|3Q8{Jq@7tbb;KB9st%o1mO6P z1E3Kg2m;#L+L|C;eYHq@=MjPrC|)X07N9J#Ih`0*QHb{X|Y)3;GVd2bi#+_ z_pGfv2jEgNO)i~OBSNVnB8>II?gK8}-L`t3M`kiEoB0@zs~fDXT#Ljs3hPy0ylNH*nYwOU10 z*;U>m^7+99lUpCFRQdHC>Ff!0 zlrNpfxIz4fwG0w#+55@O=VzF4$yNEQ2 a0saC7NkFSVtHVnG0000L}000McNliru-vbsC6*+6Z1^fU20rp8m zK~y-)b&@e?6hRb*zgc#3g(lcu5fH?{F4$OT5J7UvA(&M55rT*4US}(*QrO>_{=`nL z6b{Z1wX?BNxWgcUK(N#ha^tx(yU${7mOC#l47=w}u7)_H7J+@&zV~>`De8ds_1#KL;o9Xw|{aApBMe)+(` z*Ow&>5O~NJ+E{|x;s7jQpxJ=*d;696+0(;-moL!mxCLtii2

xJYi)TZ*sKF5?jnW))#C`5m3><+5Qbr?z?gBO z9$!TsUPk06Y%NEpcD@PR0vd5p7U*`n6h%Q$#?!)+Pv#WEU`K?-i>~3l3#!abuh%2= z@f>RCw9+XU+%1HmLPXeDQUv4VL{UVoRzs~{LguR|pKT8-rLfi#hG7{rrPS0LAlSDt z|H9s&Nz;7PC*jE`%iXnSrR*RG7>!2dL2u?{4*c^M@I7SKBpS8e00000NkvXXu0mjf DckK@B literal 0 HcmV?d00001 diff --git a/textures/throwing_bow_royal_loaded.png b/textures/throwing_bow_royal_loaded.png new file mode 100644 index 0000000000000000000000000000000000000000..3416f2e390ce1eda107781f79632c8383b330a23 GIT binary patch literal 660 zcmV;F0&D$=P)L}000McNliru-vbvGC^KL50nz{f0wGC6 zK~y-)ZIVA|Q&AMge&g0^&V=pcxS@}jOHQji8ILhG&wEr_Am7jdwiluix~1(n1) zr|6_k)}^*pCtU9jNdh3B&r`40xpO+p z;N4d=&z@l@>JcH#41*sgrx60cx5y=9A=YY;ZnB~PK&!sbMBEQsFgcpQy#pA)sS6%} zoE99%F|}Had_Ip4touIU_BQ+lz~+{K2pT>-f8n)1Z7VRd_ND8()IQY31`uKm!QMW2 z`{@m9pPvFSR;n;xDJj!}T8*Zsr&TymhX@FvR0Qu}j&NVl1(OC>6tJKGNqEB`AL%>N zm*ia%)v`ym?4@f-BJ-LMK5$87 zKLH>6_0_EZ2zor%4X0g`v?F(ONAeoU2r1b&M^LK{f@I7niaI0A3n>W)|qk zo?VbljhfC|ACBW7i6@V4=+eYJ1IYMc5)$^n{fk*{y$g2D{P87rV&u0bjyr9;mzS53 zlr(6BNl0$L5C5|;Sd#d$iuE08YW%RZbF;X(h|`K^!-s0w+vRh!365h(;>uC8{VoE? zX0sFu1#Ijj>K(v#vfYNwj3|n59EWPz>#QCazy7e3;6c|_ak5}(c)n8F1*Ge=l{V-e uQ*rWK`kl+y9#|AbL}000McNliru-vbj85-@8&v6=t?0tQJ$ zK~y-)ZIZof6j2n#e{V7qg-Ak53qg<+Q^_(x7PXL3T$_Mk7tz?*xZAIV194 z5y8SgAP^<2osBFgY=X!dOJxz>szY!-j>Tlhon0S19z5>3=iGA-l8{6gh5~3+JvyBZ zqyP0a7z_sL_xtL0yT$c=U%v0lNCIGad07h!3+(Ldm{!%}{DaqgetChb_XipdhgfR? zXg4bc;LJ)LKm}8hBm_aAaV6u-`T_b5zxH8sqt50=U6Lpi7-Ikkf}l{+@AqY`WofZu z=H}t;hYnvqz5>wA#$yBEaCkx2yVP zreu$HJsGs|R}#keecininn|~3XJ?DTk>iui#-prjD^H3l$8k6~IGAFa1Oxm9Bb9(< TEq{$900000NkvXXu0mjfJ#!WT literal 0 HcmV?d00001 diff --git a/textures/throwing_bow_steel_loaded.png b/textures/throwing_bow_steel_loaded.png new file mode 100644 index 0000000000000000000000000000000000000000..16150a6ba5e15d00d44f2c6416db395dd4d6aa21 GIT binary patch literal 683 zcmV;c0#yBpP)L}000McNliru-vbvGD;G%Gw!i=Y0ys%T zK~y-)Ws^N<6JZ#~e@}Zy1V4gcQB_nG+qM;8 zDr-`&*NN7rN1@ql>e||xHX4n%Tb8A#`}6@bCPK~1OA)M_=E%9>n!@}8eBFLV8I zQ`gtmaa|XHN+BZv=dL*bI|9D%Gc+`m5E+~Q6T@c@X9N#6Tk!gg!**P|02tIx=jQVk<9>cftB>-Z9D3dcAJ0h;@QYmD_Ig+BYug&kTuM%(!MzE^l zT!o2=2^|<1P|LD3+OHNJszrycxvDCL@B8%j_A-?kyFDPdiSIeMg0+^;rE|)_ZjfPeV8QHGw7#0yc&%-bbszqn#>4DMv z<@gJTWm)=g+)h|ETgvYOy64?iO22hN3*%S1_qlm*T0GAql}aVnMI-?OYyqm!ZBK55 RUS|LR002ovPDHLkV1j3JF`)ne literal 0 HcmV?d00001 diff --git a/textures/throwing_bow_wood.png b/textures/throwing_bow_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6c6da7db9217c7c80c16fb15c77de6cb4ad0fe GIT binary patch literal 581 zcmV-L0=oT)P)L}000McNliru-vbj869>wfCDZ@_0n$lC zK~y-)b&@}56hRb+zqdDQgv2O_5(_~P&ceb@6oivQh)pUjtTbF>aaY<|_y+|G3yCqk zHWtCkMotg3N-KJeU~>{|PDnV}W6A8?vzW}>uBX$?z|Qyf&G&wys+8B`iwC&$ z1Aw(vVg4XwIRLto`Fs6sze~A*bBzxW*6a~f@66YKMk1nLFtybZ~J208d z!p=F0q5zRO|S(zXW-{9a%5K+d;>Z5s{*Sks!E!s-d%7IgbhdkZ`)cM zK@kBU*$+vyePWdU6TT{o7-OPrYppMk_*Dnt-TreiU^M1+&*g%5sWePdOcJX z184||9JidD5e6SrY1Mtpw@yoZLbuz+guiEFc=^0tfx%C~7(e1xT}bwmlcp)nW)r!8 z9W7@&z#FNWEdBOlfueApt; Tsxn~P00000NkvXXu0mjfXvqFo literal 0 HcmV?d00001 diff --git a/textures/throwing_bow_wood_loaded.png b/textures/throwing_bow_wood_loaded.png new file mode 100644 index 0000000000000000000000000000000000000000..251e643ec618b149543430fd9e5199dc9695bf08 GIT binary patch literal 622 zcmV-!0+IcRP)L}000McNliru-vbvFJ3BIlb}Ik?0sBcr zK~y-)ZIeA{6JZ#~e^2tBQL0@WtRU!AH@is$C7MB8x<#ufS`|^ah>MvN{04`L(j;{d zhXlo;IH^lCV5d436$DX4aSJFWToQV@JPz^R+%?{EU(fIV{GX3kRF&v;XU{tJ-hE9b zlL26URv23kUKarU?G55S{v6yTDi8z#$z;-se0jDX0Ixd)0UAwY_p}S3Rv?6X-3ihB@FA3#s+Lv!ij|4PxNQgoy5s;Zc<_SOg?ub?5CqmhqI}ly_<}GopXl?e^BD13q0o^2S**QEU#KPw7v2QX?4(>M-tXSyL}000McNliru-vbvA3J2YP&-DNR0xn5J zK~y-)Ws@;T98nO4zgeGqC&|Hek|ISwxHJ|igbN540x3l>rNjghj^GJ4IjcZy(yVDr zJP!kD(xea)4!g+Jo}{pdg@vUlL_yKr^^VM) zAs@cph5=-4ZH**J)c1YDFl2vok+G3Xs~nwy|2xOiFK=$aNs?fy)hd8^o<|S_jE$gw z_MtEYM?S1?Dc@J-GT2%i#~5RfIF1<@7~tb$H!J(_6wWWwN6M2m`r(i1g3-rgd5k9i3X`@6TC=#}_G=%K~8Rrrm^X)1nAmS5Q@%eJ1*FVwt^- zdD=l;Jt^4D;qgWGHs-nesE)t0#EbDIHM<93KgLzov_Zz0ROe;K z0jbyP>hCOZegR>Rt1&*GXk?ij$D!NpW*t}6?Cg1-SQy|xs_Y^LGkeZ*00000NkvXX Hu0mjfE7Ua2 literal 0 HcmV?d00001 diff --git a/textures/throwing_crossbow_loaded.png b/textures/throwing_crossbow_loaded.png new file mode 100644 index 0000000000000000000000000000000000000000..5d2b0c7ed3941cf4794fdabed3fa6cecd5196ebe GIT binary patch literal 677 zcmV;W0$TlvP)L}000McNliru-vby7AS$|)73u&00y0TN zK~y-)Ws@;z6j2a{zu9})yF?FS6)Y@Logfx=Cj?G}lp&yH@D!9oatCR=s|3^7Y;2;J z91(16ECPz8Q?8D|B83rB1Z-jv5=cmPFL&%NW3hRgjhSX1%>4h%KQm8M6>Fa7F*-U* zsZ^p;sQ~cyiEyO=K|jek3=+S!n|NcvolZwx*Cmc)Ha0c{VCU043)aH`_KuQV$3doM z>HvtU(&=>6_k92XR8=MX@{(dHR9o>Z#(1T!_FZkXaXimsFc<(xtJR{{>v3>!kOj+& zH^{5^FkY#rY}H0P39hWH5XZ6lzE7{$V`OB6{O^|4D*MOaf6H_K-7|~TYNIUxaU5f6 zwHknUo<|S_T>CSxKX;%w4EsK;t}7qg4gR+%iZI3?Q52EO<#>J9P21i(f|JvPq&!`h z3{Ig64f6DGnzjKfW$$RTG<#w zx7$Tkk;TWb{TCe@MY4N_^RBD~xm*1DJj>X`Jmqp(0F1q~vkS{sm!ws2T|rfuofN$} zwaE6`9NnO)p67|Nw|(itM2MmY*G<0*V-xdiug!7wP7{A~fkzVyYPNR4ehdq?12V=W zI?pB!NVC~ge{+G8Q|JviU*p56rL>acIQ0AdbmFR-zCF(q3kLWH8#);e!ZRLq00000 LNkvXXu0mjfL7XWx literal 0 HcmV?d00001 diff --git a/textures/throwing_empty.png b/textures/throwing_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbd5547921ed6687c6d8163a55e6486df0df8d0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaOClDyqr7``&h zV$fGQl%fk1;VkfoEM{Qf76xHPhFNnYfP(BLp1!W^cQ^$3we>Er?+O75NtU=qlsM<- z=BDPAFgO>bCYGe8D3oWGWGJ|M`UZqI@`(c#@p`&AhHzX@P5=TRmz9Ar?z5H^kj3EX L>gTe~DWM4fuVE-u literal 0 HcmV?d00001 diff --git a/textures/throwing_longbow.png b/textures/throwing_longbow.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdae2f2afa98741e506cd36c052ee8348f65cc4 GIT binary patch literal 661 zcmV;G0&4wL}000McNliru-vbj86CF4E+^zrs0wPI7 zK~y-)Ws*-w6j2<O zeVrqL0Wx0@5e7S@fbZ)uTnl2|SD%#Uk4N@Z4uXKDrY79n+I_ygyT{F^mO?kQM{Rnd z<1k--l;!VdkfWO!II-9BJOJEtC*j7!*s7#qODiRrnO8WHg@Yi#bzM{y$8qAuH-_Zn zgH|2ukE;}?hAB=BYf|wnEm&)@))Iyx^?E%PYV^5MwT#Xw&!)3~J|jXzh3m%+B7!l7 z#l=Nb6_X@vd&hEqY+Z`Ey$yp8stk6y v3t%(X$K{JN>9ZZjp;oJ<7ZWFvedG8CkLGVDxYLSM00000NkvXXu0mjfs-`GP literal 0 HcmV?d00001 diff --git a/textures/throwing_longbow_loaded.png b/textures/throwing_longbow_loaded.png new file mode 100644 index 0000000000000000000000000000000000000000..e03299a56a52e99d05212f124414d08785aec615 GIT binary patch literal 674 zcmV;T0$u%yP)L}000McNliru-vbvGE+S(dhNb`j0xwBK zK~y-)Ws*-wR8bU%zcapvY2Zd^6QV=}}6ofDV?rHv^|E3s$!zPz8=SM7>?OAjC^Esx{2Nq*gt@SgW{j9 z54D=jdF&s0>{PemCnyvOl$Di*k_;}mK70g}|1~vYs#}(Yh~PL5(P)%Mt3`O@eXVZJ z)#&za9`DjCF>rS>1wcrGh;Z{9RMdg%!L8O})#bH}Jbe3?>6iB~@Kh?PfJB0@s!~x0 zl@}gpHir)n&1eWV(Va|T8STR{oADch>%q^}C;V|?d^RKRJ}XnHWC$)43VsqR-D`33 z1Pm_VYtH68#%D89TaCVco(ySLRo=X~t46*B_^UGT@>)h_z9>_vq^vKdb#z_@z;#`0 z+YZevGVrXl=b&cO_UOFI{Z`Rtslu`>%+Nb-KP@KN%ar!Ky_@Ii(04hi`HBb^ThP6) z5ox&7r+}O~+e$nhCt@6y&3Uvu{vpQ)2A@>@X1~ClV!>fw3<={b_#|($$D|Tt3ZC zb(;hn7J_>E(*z^r-u4)JtuqmPm(IR1^7%aF<>evJxHTC60H~Zs4ddAHz5oCK07*qo IM6N<$fk3n=96>Eak-aXL9cf^`e)|Nr9u{{P?q z!QReP=ZA^0!48L;JpUyne@k|nF)X~v?a8xS(Pv7P@M>-epxFQa=?pIa2@t literal 0 HcmV?d00001 diff --git a/textures/throwing_sparkle_blue.png b/textures/throwing_sparkle_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..d4710a313c8c761c82074fbbb3afb3673ce155c7 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE2qIq^80FVch%Gnd{gfK3GZ7|n{b%9oWt4ir|?4|kbf9FUHx3vIVCg!0HL&8 AO#lD@ literal 0 HcmV?d00001 diff --git a/textures/throwing_sparkle_red.png b/textures/throwing_sparkle_red.png new file mode 100644 index 0000000000000000000000000000000000000000..59ec68c88ef976282766589709ff199d525a527f GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4&H5&}ls&OZl=a29w( z7BesifiYu`(oS}uAbW|YuPgg~W(gs4>%;Q)Uw}fjo-U3d7N?UFBv>sPk4>A;^PiRF z-+ys|AN~Ha%6gsunV9}dCM7G*Iod5LVPA7#)il=S&n5}6vAGv_H0-cA{D0oO|2udN zUif2g{{8>|#k>C>K6vr2fT7O4#6>1+4E7xO@sRoP|D)aijXS!PS-#IdBFQJhuJrJO gfmdKI;Vst0Ms~FTmS$7 literal 0 HcmV?d00001 diff --git a/throwing.conf b/throwing.conf new file mode 100755 index 0000000..ed96896 --- /dev/null +++ b/throwing.conf @@ -0,0 +1,33 @@ + +-- Bows +DISABLE_WOODEN_BOW = false +DISABLE_LONGBOW = false +DISABLE_COMPOSITE_BOW = false +DISABLE_STEEL_BOW = false +DISABLE_ROYAL_BOW = false + +-- Crossbows +DISABLE_CROSSBOW = false +DISABLE_ARBALEST = false +DISABLE_AUTOMATED_ARBALEST = false + +-- Special Arrows +DISABLE_TELEPORT_ARROW = false +DISABLE_DIG_ARROW = true -- Deactivated to prevent griefing +DISABLE_BUILD_ARROW = true -- Deactivated to prevent griefing +DISABLE_TNT_ARROW = true -- Deactivated to prevent griefing +DISABLE_FIRE_ARROW = true -- Deactivated to prevent griefing +DISABLE_TORCH_ARROW = false +DISABLE_SHELL_ARROW = true -- Deactivated until crash bug related to this arrow is resolved + +-- Fireworks arrows +DISABLE_FIREWORKS_BLUE_ARROW = false +DISABLE_FIREWORKS_RED_ARROW = false + +-- Normal arrows +DISABLE_STONE_ARROW = false +DISABLE_STEEL_ARROW = false +DISABLE_OBSIDIAN_ARROW = false +DISABLE_DIAMOND_ARROW = false +-- lesser damages to better damages + diff --git a/tnt_arrow.lua b/tnt_arrow.lua new file mode 100755 index 0000000..fcabda9 --- /dev/null +++ b/tnt_arrow.lua @@ -0,0 +1,284 @@ +minetest.register_craftitem("throwing:arrow_tnt", { + description = "TNT arrow", + inventory_image = "throwing_arrow_tnt.png", +}) + +minetest.register_node("throwing:arrow_tnt_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 = {"throwing_arrow_tnt.png", "throwing_arrow_tnt.png", "throwing_arrow_tnt_back.png", "throwing_arrow_tnt_front.png", "throwing_arrow_tnt_2.png", "throwing_arrow_tnt.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_tnt_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, +} + +-- TNT functions copied, would be nice to directly call them through an API... + +-- loss probabilities array (one in X will be lost) +local loss_prob = {} + +loss_prob["default:cobble"] = 3 +loss_prob["default:dirt"] = 4 + +local radius = tonumber(minetest.setting_get("tnt_radius") or 3) + +-- Fill a list with data for content IDs, after all nodes are registered +local cid_data = {} +minetest.after(0, function() + for name, def in pairs(minetest.registered_nodes) do + cid_data[minetest.get_content_id(name)] = { + name = name, + drops = def.drops, + flammable = def.groups.flammable, + } + end +end) + +local function rand_pos(center, pos, radius) + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) +end + +local function eject_drops(drops, pos, radius) + local drop_pos = vector.new(pos) + for _, item in pairs(drops) do + local count = item:get_count() + local max = item:get_stack_max() + if count > max then + item:set_count(max) + end + while count > 0 do + if count < max then + item:set_count(count) + end + rand_pos(pos, drop_pos, radius) + local obj = minetest.add_item(drop_pos, item) + if obj then + obj:get_luaentity().collect = true + obj:setacceleration({x=0, y=-10, z=0}) + obj:setvelocity({x=math.random(-3, 3), y=10, + z=math.random(-3, 3)}) + end + count = count - max + end + end +end + +local function add_drop(drops, item) + item = ItemStack(item) + local name = item:get_name() + if loss_prob[name] ~= nil and math.random(1, loss_prob[name]) == 1 then + return + end + + local drop = drops[name] + if drop == nil then + drops[name] = item + else + drop:set_count(drop:get_count() + item:get_count()) + end +end + +local fire_node = {name="fire:basic_flame"} + +local function destroy(drops, pos, cid) + if minetest.is_protected(pos, "") then + return + end + local def = cid_data[cid] + if def and def.flammable then + minetest.set_node(pos, fire_node) + else + minetest.dig_node(pos) + if def then + local node_drops = minetest.get_node_drops(def.name, "") + for _, item in ipairs(node_drops) do + add_drop(drops, item) + end + end + end +end + + +local function calc_velocity(pos1, pos2, old_vel, power) + local vel = vector.direction(pos1, pos2) + vel = vector.normalize(vel) + vel = vector.multiply(vel, power) + + -- Divide by distance + local dist = vector.distance(pos1, pos2) + dist = math.max(dist, 1) + vel = vector.divide(vel, dist) + + -- Add old velocity + vel = vector.add(vel, old_vel) + return vel +end + +local function entity_physics(pos, radius) + -- Make the damage radius larger than the destruction radius + radius = radius * 2 + local objs = minetest.get_objects_inside_radius(pos, radius) + for _, obj in pairs(objs) do + local obj_pos = obj:getpos() + local obj_vel = obj:getvelocity() + local dist = math.max(1, vector.distance(pos, obj_pos)) + + if obj_vel ~= nil then + obj:setvelocity(calc_velocity(pos, obj_pos, + obj_vel, radius * 10)) + end + + local damage = (5 / dist) * radius + obj:set_hp(obj:get_hp() - damage) + end +end + +local function add_effects(pos, radius) + minetest.add_particlespawner({ + amount = 128, + time = 1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x=-20, y=-20, z=-20}, + maxvel = {x=20, y=20, z=20}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 3, + minsize = 8, + maxsize = 16, + texture = "tnt_smoke.png", + }) +end + + +local function explode(pos, radius) + local pos = vector.round(pos) + local vm = VoxelManip() + local pr = PseudoRandom(os.time()) + local p1 = vector.subtract(pos, radius) + local p2 = vector.add(pos, radius) + local minp, maxp = vm:read_from_map(p1, p2) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + local drops = {} + local p = {} + + local c_air = minetest.get_content_id("air") + local c_tnt = minetest.get_content_id("tnt:tnt") + local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning") + local c_gunpowder = minetest.get_content_id("tnt:gunpowder") + local c_gunpowder_burning = minetest.get_content_id("tnt:gunpowder_burning") + local c_boom = minetest.get_content_id("tnt:boom") + local c_fire = minetest.get_content_id("fire:basic_flame") + + for z = -radius, radius do + for y = -radius, radius do + local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) + for x = -radius, radius do + if (x * x) + (y * y) + (z * z) <= + (radius * radius) + pr:next(-radius, radius) then + local cid = data[vi] + p.x = pos.x + x + p.y = pos.y + y + p.z = pos.z + z + if cid == c_tnt or cid == c_gunpowder then + burn(p) + elseif cid ~= c_tnt_burning and + cid ~= c_gunpowder_burning and + cid ~= c_air and + cid ~= c_fire and + cid ~= c_boom then + destroy(drops, p, cid) + end + end + vi = vi + 1 + end + end + end + + return drops +end + + +local function boom(pos) + minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64}) + minetest.set_node(pos, {name="tnt:boom"}) + minetest.get_node_timer(pos):start(0.5) + + local drops = explode(pos, radius) + entity_physics(pos, radius) + eject_drops(drops, pos, radius) + add_effects(pos, radius) +end + +-- Back to the arrow + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + local newpos = self.object:getpos() + if self.lastpos.x ~= nil then + for _, pos in pairs(throwing_get_trajectoire(self, newpos)) do + local node = minetest.get_node(pos) + 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 throwing_is_player(self.player, obj) or throwing_is_entity(obj) then + boom(pos) + self.object:remove() + return + end + end + + if node.name ~= "air" then + boom(pos) + self.object:remove() + return + end + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +minetest.register_entity("throwing:arrow_tnt_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_tnt', + recipe = { + {'default:stick', 'tnt:tnt', 'default:bronze_ingot'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_tnt', + recipe = { + {'default:bronze_ingot', 'tnt:tnt', 'default:stick'}, + } +}) diff --git a/tools.lua b/tools.lua new file mode 100755 index 0000000..4eba3c9 --- /dev/null +++ b/tools.lua @@ -0,0 +1,65 @@ +if not DISABLE_WOODEN_BOW then + throwing_register_bow ('bow_wood', 'Wooden bow', {x=1, y=1, z=0.5}, 15, 1.5, 50, false, { + {'', 'default:stick', ''}, + {'farming:string', '', 'default:stick'}, + {'', 'default:stick', ''}, + }) +end + +if not DISABLE_LONGBOW then + throwing_register_bow ('longbow', 'Longbow', {x=1, y=2.5, z=0.5}, 20, 1.5, 100, false, { + {'farming:string', 'group:wood', ''}, + {'farming:string', '', 'group:wood'}, + {'farming:string', 'group:wood', ''}, + }) +end + +if not DISABLE_COMPOSITE_BOW then + throwing_register_bow ('bow_composite', 'Composite bow', {x=1, y=1.4, z=0.5}, 25, 2, 150, false, { + {'farming:string', 'group:wood', ''}, + {'farming:string', '', 'default:steel_ingot'}, + {'farming:string', 'group:wood', ''}, + }) +end + +if not DISABLE_STEEL_BOW then + throwing_register_bow ('bow_steel', 'Steel bow', {x=1, y=1.4, z=0.5}, 30, 2, 250, false, { + {'farming:string', 'default:steel_ingot', ''}, + {'farming:string', '', 'default:steel_ingot'}, + {'farming:string', 'default:steel_ingot', ''}, + }) +end + +if not DISABLE_ROYAL_BOW then + throwing_register_bow ('bow_royal', 'Royal bow', {x=1, y=1.5, z=0.5}, 35, 1, 750, false, { + {'farming:string', 'group:wood', 'default:diamond'}, + {'farming:string', '', 'default:gold_ingot'}, + {'farming:string', 'group:wood', 'default:diamond'}, + }) +end + +--function throwing_register_bow (name, desc, scale, stiffness, reload_time, toughness, is_cross, craft) + +if not DISABLE_CROSSBOW then + throwing_register_bow ('crossbow', 'Crossbow', {x=1, y=1.3, z=0.5}, 40, 5, 80, true, { + {'group:wood', 'farming:string', ''}, + {'default:steel_ingot', 'farming:string', 'group:wood'}, + {'group:wood', 'farming:string', ''}, + }) +end + +if not DISABLE_ARBALEST then + throwing_register_bow ('arbalest', 'Arbalest', {x=1, y=1.3, z=0.5}, 50, 5, 120, true, { + {'default:steel_ingot', 'farming:string', 'default:stick'}, + {'default:steel_ingot', 'farming:string', 'default:steel_ingot'}, + {'default:steel_ingot', 'farming:string', 'default:stick'}, + }) +end + +if not DISABLE_AUTOMATED_ARBALEST then + throwing_register_bow ('arbalest_auto', 'Automated arbalest', {x=1, y=1.3, z=0.5}, 50, 1.5, 60, true, { + {'default:steel_ingot', 'farming:string', 'default:mese_crystal'}, + {'default:steel_ingot', 'farming:string', 'default:steel_ingot'}, + {'default:steel_ingot', 'farming:string', 'default:mese_crystal'}, + }) +end diff --git a/torch_arrow.lua b/torch_arrow.lua new file mode 100755 index 0000000..50899cf --- /dev/null +++ b/torch_arrow.lua @@ -0,0 +1,140 @@ +minetest.register_craftitem("throwing:arrow_torch", { + description = "Torch Arrow", + inventory_image = "throwing_arrow_torch.png", +}) + +minetest.register_node("throwing:arrow_torch_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 = {"throwing_arrow_torch.png", "throwing_arrow_torch.png", "throwing_arrow_torch_back.png", "throwing_arrow_torch_front.png", "throwing_arrow_torch_2.png", "throwing_arrow_torch.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_torch_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + node = "", + player = "", + bow_damage = 0, +} + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + local newpos = self.object:getpos() + if self.lastpos.x~= nil then + for _, pos in pairs(throwing_get_trajectoire(self, newpos)) do + local node = minetest.get_node(pos) + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 0.5) + for k, obj in pairs(objs) do + local objpos = obj:getpos() + if throwing_is_player(self.player, obj) or throwing_is_entity(obj) then + if throwing_touch(pos, objpos) then + local puncher = self.object + if self.player and minetest.get_player_by_name(self.player) then + puncher = minetest.get_player_by_name(self.player) + end + local damage = 0.5 + if self.bow_damage and self.bow_damage > 0 then + damage = damage + (self.bow_damage/12) + end + obj:punch(puncher, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + local toughness = 0.9 + if math.random() < toughness then + if math.random(0,100) % 2 == 0 then -- 50% of chance to drop //MFF (Mg|07/27/15) + minetest.add_item(pos, 'throwing:arrow_torch') + end + else + minetest.add_item(pos, 'default:stick') + end + self.object:remove() + return + end + end + end + + + if node.name == 'air' then + minetest.add_node(pos, {name="throwing:torch_trail"}) + minetest.get_node_timer(pos):start(0.1) + elseif node.name ~= "air" + and not string.find(node.name, "trail") + and not (string.find(node.name, 'grass') and not string.find(node.name, 'dirt')) + and not (string.find(node.name, 'farming:') and not string.find(node.name, 'soil')) + and not string.find(node.name, 'flowers:') + and not string.find(node.name, 'fire:') then + local player = minetest.get_player_by_name(self.player) + if not player then self.object:remove() return end + if node.name ~= "ignore" and not string.find(node.name, "water_") and not string.find(node.name, "lava") + and not string.find(node.name, "torch") and minetest.get_item_group(node.name, "unbreakable") == 0 + and not minetest.is_protected(self.lastpos, self.player) and node.diggable ~= false then + local dir=vector.direction(self.lastpos, pos) + local wall=minetest.dir_to_wallmounted(dir) + minetest.add_node(self.lastpos, {name="default:torch", param2 = wall}) + else + local toughness = 0.9 + if math.random() < toughness then + minetest.add_item(self.lastpos, 'throwing:arrow_torch') + else + minetest.add_item(self.lastpos, 'default:stick') + end + end + self.object:remove() + return + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + end + end + self.lastpos={x=newpos.x, y=newpos.y, z=newpos.z} +end + +minetest.register_entity("throwing:arrow_torch_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_torch 4', + recipe = { + {'default:stick', 'default:stick', 'group:coal'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_torch 4', + recipe = { + {'group:coal', 'default:stick', 'default:stick'}, + } +}) + +minetest.register_node("throwing:torch_trail", { + drawtype = "airlike", + light_source = default.LIGHT_MAX-1, + walkable = false, + drop = "", + groups = {dig_immediate=3}, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, +})