From ac6064c376193b4480b50e2b76ff9bba9b149074 Mon Sep 17 00:00:00 2001 From: thunderdog1138 Date: Mon, 12 Oct 2020 15:24:53 +0000 Subject: [PATCH] Upload files to 'mods/rangedweapons' --- mods/rangedweapons/settings.lua | 20 + mods/rangedweapons/shurikens.lua | 877 +++++++++++++++++++++++++++++++ mods/rangedweapons/spas12.lua | 197 +++++++ mods/rangedweapons/svd.lua | 205 ++++++++ mods/rangedweapons/taurus.lua | 214 ++++++++ 5 files changed, 1513 insertions(+) create mode 100644 mods/rangedweapons/settings.lua create mode 100644 mods/rangedweapons/shurikens.lua create mode 100644 mods/rangedweapons/spas12.lua create mode 100644 mods/rangedweapons/svd.lua create mode 100644 mods/rangedweapons/taurus.lua diff --git a/mods/rangedweapons/settings.lua b/mods/rangedweapons/settings.lua new file mode 100644 index 00000000..d1ef7e6c --- /dev/null +++ b/mods/rangedweapons/settings.lua @@ -0,0 +1,20 @@ +-- change "true" to "false" in order to disable a feature, or +-- "false" to "true" to enable it + +explosives = true +javelins = true +shurikens = true +handguns = true +shotguns = true +rifles = true +magnums_and_revolvers = true +machine_pistols = true +sub_machineguns = true +assault_rifles = true +power_weapons = true +glass_breaking = true +door_breaking = true +heavy_machineguns = true +minigun_aswell = true + + \ No newline at end of file diff --git a/mods/rangedweapons/shurikens.lua b/mods/rangedweapons/shurikens.lua new file mode 100644 index 00000000..4b2d2933 --- /dev/null +++ b/mods/rangedweapons/shurikens.lua @@ -0,0 +1,877 @@ +---wooden--- + + +minetest.register_craftitem("rangedweapons:shuriken_wooden", { + wield_scale = {x=0.5,y=0.5,z=0.20}, + inventory_image = "rangedweapons_wooden_shuriken.png", +}) + +minetest.register_craftitem("rangedweapons:wooden_shuriken", { + description = "" ..core.colorize("#35cdff","Wooden shuriken\n") ..core.colorize("#FFFFFF", "Ranged damage: 1-3\n") ..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 4\n") ..core.colorize("#FFFFFF", "Critical chance: 4%\n") ..core.colorize("#FFFFFF", "Critical damage: 2-5\n") ..core.colorize("#FFFFFF", "Shuriken survival rate: 10%\n")..core.colorize("#FFFFFF", "Projectile gravity: 8\n") ..core.colorize("#FFFFFF", "Projectile velocity: 12"), + range = 0, + stack_max= 100, + inventory_image = "rangedweapons_wooden_shuriken.png", + on_use = function(itemstack, user, pointed_thing) + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() + end + if pointed_thing.type ~= "nothing" then + local pointed = minetest.get_pointed_thing_position(pointed_thing) + if vector.distance(user:getpos(), pointed) < 8 then + return itemstack + end + end + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir then + pos.y = pos.y + 1.5 + local obj = minetest.add_entity(pos, "rangedweapons:woodensr") + if obj then + minetest.sound_play("rangedweapons_throw", {object=obj}) + obj:setvelocity({x=dir.x * 12, y=dir.y * 12, z=dir.z * 12}) + obj:setacceleration({x=dir.x * -1, y=-8, z=dir.z * -1}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + end + end + end + return itemstack + end, +}) + +local rangedweapons_woodensr = { + physical = false, + timer = 0, + visual = "wielditem", + visual_size = {x=0.33, y=0.33,}, + textures = {"rangedweapons:shuriken_wooden"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_woodensr.on_step = function(self, dtime) + self.timer = self.timer + dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.25 then + 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 obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:woodensr" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 4 then + local damage = math.random(2,5) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=8}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(1,3) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=4}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + + if math.random(1, 100) <= 4 then + local damage = math.random(2,5) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(1,3) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end +end +end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") and math.random(1, 100) <= 10 then + minetest.add_item(self.lastpos, "rangedweapons:wooden_shuriken") + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end + +minetest.register_entity("rangedweapons:woodensr", rangedweapons_woodensr) + +minetest.register_craft({ + output = 'rangedweapons:wooden_shuriken 20', + recipe = { + {'', 'group:wood', ''}, + {'group:wood', '', 'group:wood'}, + {'', 'group:wood', ''}, + } +}) + + +---stone--- + + +minetest.register_craftitem("rangedweapons:shuriken_stone", { + wield_scale = {x=0.5,y=0.5,z=0.20}, + inventory_image = "rangedweapons_stone_shuriken.png", +}) + +minetest.register_craftitem("rangedweapons:stone_shuriken", { + description = "" ..core.colorize("#35cdff","stone shuriken\n") ..core.colorize("#FFFFFF", "Ranged damage: 2-5\n") ..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 7\n") ..core.colorize("#FFFFFF", "Critical chance: 5%\n") ..core.colorize("#FFFFFF", "Critical damage: 4-8\n") ..core.colorize("#FFFFFF", "Shuriken survival rate: 15%\n")..core.colorize("#FFFFFF", "Projectile gravity: 9\n") ..core.colorize("#FFFFFF", "Projectile velocity: 10"), + range = 0, + stack_max= 125, + inventory_image = "rangedweapons_stone_shuriken.png", + on_use = function(itemstack, user, pointed_thing) + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() + end + if pointed_thing.type ~= "nothing" then + local pointed = minetest.get_pointed_thing_position(pointed_thing) + if vector.distance(user:getpos(), pointed) < 8 then + return itemstack + end + end + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir then + pos.y = pos.y + 1.5 + local obj = minetest.add_entity(pos, "rangedweapons:stonesr") + if obj then + minetest.sound_play("rangedweapons_throw", {object=obj}) + obj:setvelocity({x=dir.x * 10, y=dir.y * 10, z=dir.z * 10}) + obj:setacceleration({x=dir.x * -1, y=-9, z=dir.z * -1}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + end + end + end + return itemstack + end, +}) + +local rangedweapons_stonesr = { + physical = false, + timer = 0, + visual = "wielditem", + visual_size = {x=0.33, y=0.33,}, + textures = {"rangedweapons:shuriken_stone"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_stonesr.on_step = function(self, dtime) + self.timer = self.timer + dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.30 then + 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 obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:stonesr" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 5 then + local damage = math.random(4,8) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=14}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(2,5) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=7}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + + if math.random(1, 100) <= 5 then + local damage = math.random(4,8) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(2,5) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end +end +end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") and math.random(1, 100) <= 15 then + minetest.add_item(self.lastpos, "rangedweapons:stone_shuriken") + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end + +minetest.register_entity("rangedweapons:stonesr", rangedweapons_stonesr) + +minetest.register_craft({ + output = 'rangedweapons:stone_shuriken 10', + recipe = { + {'', 'default:cobble', ''}, + {'default:cobble', '', 'default:cobble'}, + {'', 'default:cobble', ''}, + } +}) + +---steel--- + + +minetest.register_craftitem("rangedweapons:shuriken_steel", { + wield_scale = {x=0.5,y=0.5,z=0.20}, + inventory_image = "rangedweapons_steel_shuriken.png", +}) + +minetest.register_craftitem("rangedweapons:steel_shuriken", { + description = "" ..core.colorize("#35cdff","steel shuriken\n") ..core.colorize("#FFFFFF", "Ranged damage: 3-8\n") ..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 2\n") ..core.colorize("#FFFFFF", "Critical chance: 6%\n") ..core.colorize("#FFFFFF", "Critical damage: 7-16\n") ..core.colorize("#FFFFFF", "Shuriken survival rate: 25%\n")..core.colorize("#FFFFFF", "Projectile gravity: 6\n") ..core.colorize("#FFFFFF", "Projectile velocity: 15"), + range = 0, + stack_max= 175, + inventory_image = "rangedweapons_steel_shuriken.png", + on_use = function(itemstack, user, pointed_thing) + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() + end + if pointed_thing.type ~= "nothing" then + local pointed = minetest.get_pointed_thing_position(pointed_thing) + if vector.distance(user:getpos(), pointed) < 8 then + return itemstack + end + end + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir then + pos.y = pos.y + 1.5 + local obj = minetest.add_entity(pos, "rangedweapons:steelsr") + if obj then + minetest.sound_play("rangedweapons_throw", {object=obj}) + obj:setvelocity({x=dir.x * 15, y=dir.y * 15, z=dir.z * 15}) + obj:setacceleration({x=dir.x * -1, y=-6, z=dir.z * -1}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + end + end + end + return itemstack + end, +}) + +local rangedweapons_steelsr = { + physical = false, + timer = 0, + visual = "wielditem", + visual_size = {x=0.33, y=0.33,}, + textures = {"rangedweapons:shuriken_steel"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_steelsr.on_step = function(self, dtime) + self.timer = self.timer + dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.17 then + 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 obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:steelsr" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 6 then + local damage = math.random(7,16) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=4}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(3,8) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=2}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + + if math.random(1, 100) <= 6 then + local damage = math.random(7,16) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(3,8) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end +end +end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") and math.random(1, 100) <= 25 then + minetest.add_item(self.lastpos, "rangedweapons:steel_shuriken") + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end + +minetest.register_entity("rangedweapons:steelsr", rangedweapons_steelsr) + +minetest.register_craft({ + output = 'rangedweapons:steel_shuriken 30', + recipe = { + {'', 'default:steel_ingot', ''}, + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'', 'default:steel_ingot', ''}, + } +}) + +---bronze--- + + +minetest.register_craftitem("rangedweapons:shuriken_bronze", { + wield_scale = {x=0.5,y=0.5,z=0.20}, + inventory_image = "rangedweapons_bronze_shuriken.png", +}) + +minetest.register_craftitem("rangedweapons:bronze_shuriken", { + description = "" ..core.colorize("#35cdff","bronze shuriken\n") ..core.colorize("#FFFFFF", "Ranged damage: 3-8\n") ..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 2\n") ..core.colorize("#FFFFFF", "Critical chance: 6%\n") ..core.colorize("#FFFFFF", "Critical damage: 7-16\n") ..core.colorize("#FFFFFF", "Shuriken survival rate: 30%\n")..core.colorize("#FFFFFF", "Projectile gravity: 6\n") ..core.colorize("#FFFFFF", "Projectile velocity: 15"), + range = 0, + stack_max= 200, + inventory_image = "rangedweapons_bronze_shuriken.png", + on_use = function(itemstack, user, pointed_thing) + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() + end + if pointed_thing.type ~= "nothing" then + local pointed = minetest.get_pointed_thing_position(pointed_thing) + if vector.distance(user:getpos(), pointed) < 8 then + return itemstack + end + end + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir then + pos.y = pos.y + 1.5 + local obj = minetest.add_entity(pos, "rangedweapons:bronzesr") + if obj then + minetest.sound_play("rangedweapons_throw", {object=obj}) + obj:setvelocity({x=dir.x * 15, y=dir.y * 15, z=dir.z * 15}) + obj:setacceleration({x=dir.x * -1, y=-6, z=dir.z * -1}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + end + end + end + return itemstack + end, +}) + +local rangedweapons_bronzesr = { + physical = false, + timer = 0, + visual = "wielditem", + visual_size = {x=0.33, y=0.33,}, + textures = {"rangedweapons:shuriken_bronze"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_bronzesr.on_step = function(self, dtime) + self.timer = self.timer + dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.17 then + 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 obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:bronzesr" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 6 then + local damage = math.random(7,16) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=4}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(3,8) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=2}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + + if math.random(1, 100) <= 6 then + local damage = math.random(7,16) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(3,8) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end +end +end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") and math.random(1, 100) <= 30 then + minetest.add_item(self.lastpos, "rangedweapons:bronze_shuriken") + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end + +minetest.register_entity("rangedweapons:bronzesr", rangedweapons_bronzesr) + +minetest.register_craft({ + output = 'rangedweapons:bronze_shuriken 35', + recipe = { + {'', 'default:bronze_ingot', ''}, + {'default:bronze_ingot', '', 'default:bronze_ingot'}, + {'', 'default:bronze_ingot', ''}, + } +}) + +---golden--- + + +minetest.register_craftitem("rangedweapons:shuriken_golden", { + wield_scale = {x=0.5,y=0.5,z=0.20}, + inventory_image = "rangedweapons_golden_shuriken.png", +}) + +minetest.register_craftitem("rangedweapons:golden_shuriken", { + description = "" ..core.colorize("#35cdff","golden shuriken\n") ..core.colorize("#FFFFFF", "Ranged damage: 4-10\n") ..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 4\n") ..core.colorize("#FFFFFF", "Critical chance: 7%\n") ..core.colorize("#FFFFFF", "Critical damage: 10-22\n") ..core.colorize("#FFFFFF", "Shuriken survival rate: 36%\n")..core.colorize("#FFFFFF", "Projectile gravity: 7\n") ..core.colorize("#FFFFFF", "Projectile velocity: 12"), + range = 0, + stack_max= 275, + inventory_image = "rangedweapons_golden_shuriken.png", + on_use = function(itemstack, user, pointed_thing) + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() + end + if pointed_thing.type ~= "nothing" then + local pointed = minetest.get_pointed_thing_position(pointed_thing) + if vector.distance(user:getpos(), pointed) < 8 then + return itemstack + end + end + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir then + pos.y = pos.y + 1.5 + local obj = minetest.add_entity(pos, "rangedweapons:goldensr") + if obj then + minetest.sound_play("rangedweapons_throw", {object=obj}) + obj:setvelocity({x=dir.x * 12, y=dir.y * 12, z=dir.z * 12}) + obj:setacceleration({x=dir.x * -1, y=-7, z=dir.z * -1}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + end + end + end + return itemstack + end, +}) + +local rangedweapons_goldensr = { + physical = false, + timer = 0, + visual = "wielditem", + visual_size = {x=0.33, y=0.33,}, + textures = {"rangedweapons:shuriken_golden"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_goldensr.on_step = function(self, dtime) + self.timer = self.timer + dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.24 then + 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 obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:goldensr" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 7 then + local damage = math.random(10,22) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=8}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(4,10) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=4}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + + if math.random(1, 100) <= 7 then + local damage = math.random(10,22) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(4,10) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end +end +end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") and math.random(1, 100) <= 36 then + minetest.add_item(self.lastpos, "rangedweapons:golden_shuriken") + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end + +minetest.register_entity("rangedweapons:goldensr", rangedweapons_goldensr) + +minetest.register_craft({ + output = 'rangedweapons:golden_shuriken 42', + recipe = { + {'', 'default:gold_ingot', ''}, + {'default:gold_ingot', '', 'default:gold_ingot'}, + {'', 'default:gold_ingot', ''}, + } +}) + +---mese--- + + +minetest.register_craftitem("rangedweapons:shuriken_mese", { + wield_scale = {x=0.5,y=0.5,z=0.20}, + inventory_image = "rangedweapons_mese_shuriken.png", +}) + +minetest.register_craftitem("rangedweapons:mese_shuriken", { + description = "" ..core.colorize("#35cdff","mese shuriken\n") ..core.colorize("#FFFFFF", "Ranged damage: 5-12\n") ..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 1\n") ..core.colorize("#FFFFFF", "Critical chance: 8%\n") ..core.colorize("#FFFFFF", "Critical damage: 13-28\n") ..core.colorize("#FFFFFF", "Shuriken survival rate: 45%\n")..core.colorize("#FFFFFF", "Projectile gravity: 5\n") ..core.colorize("#FFFFFF", "Projectile velocity: 20"), + range = 0, + stack_max= 340, + inventory_image = "rangedweapons_mese_shuriken.png", + on_use = function(itemstack, user, pointed_thing) + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() + end + if pointed_thing.type ~= "nothing" then + local pointed = minetest.get_pointed_thing_position(pointed_thing) + if vector.distance(user:getpos(), pointed) < 8 then + return itemstack + end + end + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir then + pos.y = pos.y + 1.5 + local obj = minetest.add_entity(pos, "rangedweapons:mesesr") + if obj then + minetest.sound_play("rangedweapons_throw", {object=obj}) + obj:setvelocity({x=dir.x * 20, y=dir.y * 20, z=dir.z * 20}) + obj:setacceleration({x=dir.x * -1, y=-5, z=dir.z * -1}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + end + end + end + return itemstack + end, +}) + +local rangedweapons_mesesr = { + physical = false, + timer = 0, + visual = "wielditem", + visual_size = {x=0.33, y=0.33,}, + textures = {"rangedweapons:shuriken_mese"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_mesesr.on_step = function(self, dtime) + self.timer = self.timer + dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.15 then + 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 obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:mesesr" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 8 then + local damage = math.random(13,28) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=2}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(5,12) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=1}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + + if math.random(1, 100) <= 8 then + local damage = math.random(13,28) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(5,12) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end +end +end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") and math.random(1, 100) <= 45 then + minetest.add_item(self.lastpos, "rangedweapons:mese_shuriken") + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end + +minetest.register_entity("rangedweapons:mesesr", rangedweapons_mesesr) + +minetest.register_craft({ + output = 'rangedweapons:mese_shuriken 55', + recipe = { + {'', 'default:mese_crystal', ''}, + {'default:mese_crystal', '', 'default:mese_crystal'}, + {'', 'default:mese_crystal', ''}, + } +}) + +---diamond--- + + +minetest.register_craftitem("rangedweapons:shuriken_diamond", { + wield_scale = {x=0.5,y=0.5,z=0.20}, + inventory_image = "rangedweapons_diamond_shuriken.png", +}) + +minetest.register_craftitem("rangedweapons:diamond_shuriken", { + description = "" ..core.colorize("#35cdff","diamond shuriken\n") ..core.colorize("#FFFFFF", "Ranged damage: 6-15\n") ..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 1\n") ..core.colorize("#FFFFFF", "Critical chance: 9%\n") ..core.colorize("#FFFFFF", "Critical damage: 18-35\n") ..core.colorize("#FFFFFF", "Shuriken survival rate: 60%\n")..core.colorize("#FFFFFF", "Projectile gravity: 4\n") ..core.colorize("#FFFFFF", "Projectile velocity: 25"), + range = 0, + stack_max= 420, + inventory_image = "rangedweapons_diamond_shuriken.png", + on_use = function(itemstack, user, pointed_thing) + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() + end + if pointed_thing.type ~= "nothing" then + local pointed = minetest.get_pointed_thing_position(pointed_thing) + if vector.distance(user:getpos(), pointed) < 8 then + return itemstack + end + end + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir then + pos.y = pos.y + 1.5 + local obj = minetest.add_entity(pos, "rangedweapons:diamondsr") + if obj then + minetest.sound_play("rangedweapons_throw", {object=obj}) + obj:setvelocity({x=dir.x * 25, y=dir.y * 25, z=dir.z * 25}) + obj:setacceleration({x=dir.x * -1, y=-4, z=dir.z * -1}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + end + end + end + return itemstack + end, +}) + +local rangedweapons_diamondsr = { + physical = false, + timer = 0, + visual = "wielditem", + visual_size = {x=0.33, y=0.33,}, + textures = {"rangedweapons:shuriken_diamond"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_diamondsr.on_step = function(self, dtime) + self.timer = self.timer + dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.12 then + 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 obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:diamondsr" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 9 then + local damage = math.random(18,35) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=2}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(6,15) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=1}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + + if math.random(1, 100) <= 9 then + local damage = math.random(18,35) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(6,15) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end +end +end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") and math.random(1, 100) <= 60 then + minetest.add_item(self.lastpos, "rangedweapons:diamond_shuriken") + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end + +minetest.register_entity("rangedweapons:diamondsr", rangedweapons_diamondsr) + +minetest.register_craft({ + output = 'rangedweapons:diamond_shuriken 69', + recipe = { + {'', 'default:diamond', ''}, + {'default:diamond', '', 'default:diamond'}, + {'', 'default:diamond', ''}, + } +}) + + diff --git a/mods/rangedweapons/spas12.lua b/mods/rangedweapons/spas12.lua new file mode 100644 index 00000000..ad0d9b49 --- /dev/null +++ b/mods/rangedweapons/spas12.lua @@ -0,0 +1,197 @@ +minetest.register_craft({ + output = "rangedweapons:spas12_uld", + recipe = { + {"", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese", "default:diamond"}, + {"rangedweapons:plastic_sheet", "default:diamond", "default:steel_ingot"}, + } +}) + +minetest.register_craftitem("rangedweapons:spas12_uld", { + stack_max= 1, + wield_scale = {x=2.1,y=2.1,z=1.25}, + range = 0, + description = "" ..core.colorize("#35cdff","Franchi SPAS-12\n") ..core.colorize("#FFFFFF", "Ranged damage: 4-10 X 12\n") ..core.colorize("#FFFFFF", "Accuracy: 67%\n") ..core.colorize("#FFFFFF", "Mob knockback: 7\n") ..core.colorize("#FFFFFF", "Critical chance: 5%\n") ..core.colorize("#FFFFFF", "Critical damage: 10-22 X 12\n") ..core.colorize("#FFFFFF", "Ammunition: 12 gauge shells\n") ..core.colorize("#FFFFFF", "Reload time: 0.45\n") ..core.colorize("#be0d00", "The gun is NOT loaded! (Right-click to load)\n")..core.colorize("#FFFFFF", "Gun type: shotgun\n") ..core.colorize("#FFFFFF", "Bullet velocity: 20"), + inventory_image = "rangedweapons_spas12.png", + on_use = function(user) + minetest.sound_play("rangedweapons_empty", {user}) + end, + on_secondary_use = function(itemstack, player, pointed_thing) + local inv = player:get_inventory() + if inv:contains_item("main", "rangedweapons:shell") then + inv:remove_item("main", "rangedweapons:shell") + local pos = player:getpos() + local dir = player:get_look_dir() + local yaw = player:get_look_yaw() + local wield_index = player:get_wield_index() + if pos and dir and yaw then + pos.y = pos.y + 1.6 + local obj = minetest.add_entity(pos, "rangedweapons:empty_shell_shotgun") + minetest.sound_play("", {object=obj}) + obj:setvelocity({x=dir.x * -10, y=dir.y * -10, z=dir.z * -10}) + obj:setacceleration({x=dir.x * -5, y= -10, z=dir.z * -5}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or player + end + end + minetest.sound_play("rangedweapons_shotgun_reload_a", {player}) + + minetest.after(0.45, + function(player, wield_index) + player:get_inventory():set_stack("main", wield_index, "rangedweapons:spas12") + minetest.sound_play("rangedweapons_shotgun_reload_b", {player}) + end, + player, wield_index + ) + return ItemStack("rangedweapons:spas12_rld") + end + end +}) + + +minetest.register_craftitem("rangedweapons:spas12_rld", { + stack_max= 1, + range = 0, + wield_scale = {x=2.1,y=2.1,z=1.25}, + description = "**RELOADING FRANCHI SPAS-12**", + groups = {not_in_creative_inventory = 1}, + inventory_image = "rangedweapons_spas12_rld.png", +}) + + +minetest.register_tool("rangedweapons:spas12", { + description = "" ..core.colorize("#35cdff","Franchi SPAS-12\n") ..core.colorize("#FFFFFF", "Ranged damage: 4-10 X 12\n") ..core.colorize("#FFFFFF", "Accuracy: 67%\n")..core.colorize("#FFFFFF", "Mob knockback: 7\n") ..core.colorize("#FFFFFF", "Critical chance: 5%\n") ..core.colorize("#FFFFFF", "Critical damage: 10-22 X 12\n") ..core.colorize("#FFFFFF", "Ammunition: 12 gauge shells\n") ..core.colorize("#FFFFFF", "Reload time: 0.45\n") ..core.colorize("#27a600", "The gun is loaded!\n")..core.colorize("#FFFFFF", "Gun type: shotgun\n") ..core.colorize("#FFFFFF", "Bullet velocity: 20"), + range = 0, + groups = {not_in_creative_inventory = 1}, + wield_scale = {x=2.1,y=2.1,z=1.25}, + inventory_image = "rangedweapons_spas12.png", + on_use = function(itemstack, user, pointed_thing) + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir and yaw then + pos.y = pos.y + 1.6 + local obj = minetest.add_entity(pos, "rangedweapons:spas12shot") + if obj then + minetest.sound_play("rangedweapons_shotgun_shot", {object=obj}) + obj:setvelocity({x=dir.x * math.random(18,22), y=dir.y * math.random(18,22), z=dir.z * math.random(18,22)}) + obj:setacceleration({x=dir.x * math.random(-3.3,3.3), y=math.random(-3.3,3.3), z=dir.z * math.random(-3.3,3.3)}) + for i=1,11 do + local obj = minetest.add_entity(pos, "rangedweapons:spas12shot") + obj:setvelocity({x=dir.x * math.random(18,22), y=dir.y * math.random(18,22), z=dir.z * math.random(18,22)}) + obj:setacceleration({x=dir.x * math.random(-3.3,3.3), y=math.random(-3.3,3.3), z=dir.z * math.random(-3.3,3.3)}) + end + + minetest.add_particle({ + pos = pos, + velocity = {x=dir.x * 3, y=dir.y * 3, z=dir.z * 3} , + acceleration = {x=dir.x * -4, y=2, z=dir.z * -4}, + expirationtime = 1.25, + size = 10, + collisiondetection = false, + vertical = false, + texture = "tnt_smoke.png", + glow = 5, + }) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + itemstack = "rangedweapons:spas12_uld" + end + end + end + return itemstack + end, +}) + +local rangedweapons_spas12shot = { + physical = false, + timer = 0, + visual = "sprite", + visual_size = {x=0.1, y=0.1}, + textures = {"rangedweapons_buckball.png"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_spas12shot.on_step = function(self, dtime, node, pos) + self.timer = self.timer + dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.225 then + local objs = minetest.get_objects_inside_radius({x = pos.x, y = pos.y, z = pos.z}, 1.25) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:spas12shot" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 5 then + local damage = math.random(10,22) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 14}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(4,10) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 7}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + if math.random(1, 100) <= 5 then + local damage = math.random(10,22) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(4,10) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + if self.timer >= 4.0 then + self.object:remove() + end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") then + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + if node.name == "rangedweapons:barrel" or + node.name == "doors:door_wood_a" or + node.name == "doors:door_wood_b" or + node.name == "doors:door_glass_a" or + node.name == "doors:door_glass_b" or + node.name == "xpanes:pane" or + node.name == "xpanes:pane_flat" or + node.name == "vessels:drinking_glass" or + node.name == "vessels:glass_bottle" or + node.name == "default:glass" then + minetest.get_node_timer(pos):start(0) + end + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end +end +end + + + +minetest.register_entity("rangedweapons:spas12shot", rangedweapons_spas12shot ) + + diff --git a/mods/rangedweapons/svd.lua b/mods/rangedweapons/svd.lua new file mode 100644 index 00000000..c4b9792a --- /dev/null +++ b/mods/rangedweapons/svd.lua @@ -0,0 +1,205 @@ +minetest.register_craft({ + output = 'rangedweapons:svd_uld', + recipe = { + {'default:steel_ingot', 'default:diamondblock', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:tree', 'default:diamond', 'default:tree'}, + } +}) + +minetest.register_craftitem("rangedweapons:svd_uld", { + stack_max= 1, + wield_scale = {x=1.9,y=1.9,z=1.1}, + range = 0, + description = "" ..core.colorize("#35cdff","S.V.D \n") ..core.colorize("#FFFFFF", "Ranged damage: 80/sec of bullet lifetime\n") ..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 14\n") ..core.colorize("#FFFFFF", "Critical chance: 42%\n") ..core.colorize("#FFFFFF", "Critical damage: 200/sec of bullet lifetime\n") ..core.colorize("#FFFFFF", "Ammunition: 308.Winchester rounds\n") ..core.colorize("#FFFFFF", "Reload time: 1.15\n") ..core.colorize("#be0d00", "The gun is NOT loaded! (Right-click to load)\n")..core.colorize("#FFFFFF", "Gun type: Rifle\n") ..core.colorize("#FFFFFF", "Bullet velocity: 60"), + inventory_image = "rangedweapons_svd.png", + on_use = function(user) + minetest.sound_play("rangedweapons_empty", {user}) + end, + on_secondary_use = function(itemstack, player, pointed_thing) + local inv = player:get_inventory() + if inv:contains_item("main", "rangedweapons:308winchester") then + inv:remove_item("main", "rangedweapons:308winchester") + local pos = player:getpos() + local dir = player:get_look_dir() + local yaw = player:get_look_yaw() + local wield_index = player:get_wield_index() + if pos and dir and yaw then + pos.y = pos.y + 1.6 + local obj = minetest.add_entity(pos, "rangedweapons:empty_shell") + minetest.sound_play("", {object=obj}) + obj:setvelocity({x=dir.x * -10, y=dir.y * -10, z=dir.z * -10}) + obj:setacceleration({x=dir.x * -5, y= -10, z=dir.z * -5}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or player + end + end + minetest.sound_play("rangedweapons_reload_a", {player}) + + minetest.after(1.15, + function(player, wield_index) + player:get_inventory():set_stack("main", wield_index, "rangedweapons:svd") + minetest.sound_play("rangedweapons_reload_b", {player}) + end, + player, wield_index + ) + return ItemStack("rangedweapons:svd_rld") + end + end +}) + + +minetest.register_craftitem("rangedweapons:svd_rld", { + stack_max= 1, + range = 0, + wield_scale = {x=1.9,y=1.9,z=1.1}, + description = "**RELOADING S.V.D.**", + groups = {not_in_creative_inventory = 1}, + inventory_image = "rangedweapons_svd_rld.png", +}) + + +minetest.register_tool("rangedweapons:svd", { + description = "" ..core.colorize("#35cdff","S.V.D. \n") ..core.colorize("#FFFFFF", "Ranged damage: 80/sec of bullet lifetime\n")..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 14\n") ..core.colorize("#FFFFFF", "Critical chance: 42%\n") ..core.colorize("#FFFFFF", "Critical damage: 200/sec of bullet lifetime\n") ..core.colorize("#FFFFFF", "Ammunition: 308.Winchester rounds\n") ..core.colorize("#FFFFFF", "Reload time: 1.15\n") ..core.colorize("#27a600", "The gun is loaded!\n")..core.colorize("#FFFFFF", "Gun type: Rifle\n") ..core.colorize("#FFFFFF", "Bullet velocity: 60"), + range = 0, + groups = {not_in_creative_inventory = 1}, + wield_scale = {x=1.9,y=1.9,z=1.1}, + inventory_image = "rangedweapons_svd.png", + on_use = function(itemstack, user, pointed_thing) + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir and yaw then + pos.y = pos.y + 1.6 + local obj = minetest.add_entity(pos, "rangedweapons:svdshot") + if obj then + minetest.sound_play("rangedweapons_rifle_a", {object=obj}) + obj:setvelocity({x=dir.x * 60, y=dir.y * 60, z=dir.z * 60}) + obj:setacceleration({x=dir.x * 0, y=0, z=dir.z * 0}) + obj:setyaw(yaw + math.pi) + minetest.add_particle({ + pos = pos, + velocity = {x=dir.x * 3, y=dir.y * 3, z=dir.z * 3} , + acceleration = {x=dir.x * -4, y=2, z=dir.z * -4}, + expirationtime = 1.5, + size = 8, + collisiondetection = false, + vertical = false, + texture = "tnt_smoke.png", + glow = 5, + }) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + itemstack = "rangedweapons:svd_uld" + end + end + end + return itemstack + end, +}) + +local rangedweapons_svdshot = { + physical = false, + timer = 0, + visual = "sprite", + visual_size = {x=0.3, y=0.3}, + textures = {"rangedweapons_invisible.png"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_svdshot.on_step = function(self, dtime, node, pos) + self.timer = self.timer + dtime + local tiem = 0.002 + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.05 then + local objs = minetest.get_objects_inside_radius({x = pos.x, y = pos.y, z = pos.z}, 1.5) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:svdshot" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 80) <= 42 then + local damage = 200 * self.timer + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 28}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = 80 * self.timer + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 14}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + if math.random(1, 100) <= 42 then + local damage = 200 * self.timer + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = 80 * self.timer + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + if self.timer >= 0.002 + tiem then + minetest.add_particle({ + pos = pos, + velocity = 0, + acceleration = {x=0, y=0, z=0}, + expirationtime = 0.06, + size = 3, + collisiondetection = false, + vertical = false, + texture = "rangedweapons_bullet_fly.png", + glow = 15, + }) + tiem = tiem + 0.002 + end + if self.timer >= 4.0 then + self.object:remove() + end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") then + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + if node.name == "rangedweapons:barrel" or + node.name == "doors:door_glass_a" or + node.name == "doors:door_glass_b" or + node.name == "xpanes:pane" or + node.name == "xpanes:pane_flat" or + node.name == "vessels:drinking_glass" or + node.name == "vessels:glass_bottle" or + node.name == "default:glass" then + minetest.get_node_timer(pos):start(0) + end + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end +end +end + + + +minetest.register_entity("rangedweapons:svdshot", rangedweapons_svdshot ) + + diff --git a/mods/rangedweapons/taurus.lua b/mods/rangedweapons/taurus.lua new file mode 100644 index 00000000..088e1a1a --- /dev/null +++ b/mods/rangedweapons/taurus.lua @@ -0,0 +1,214 @@ +minetest.register_craft({ + output = 'rangedweapons:taurus_uld', + recipe = { +{'rangedweapons:gunsteel_ingot', 'default:mese_crystal', 'default:mese_crystal_fragment'}, +{'rangedweapons:gunsteel_ingot', 'default:diamondblock', 'rangedweapons:gunsteel_ingot'}, + {'', 'rangedweapons:gunsteel_ingot', 'rangedweapons:plastic_sheet'}, + } +}) + +minetest.register_craft({ + output = 'rangedweapons:taurus_uld', + recipe = { +{'moreores:silver_ingot', 'default:mese_crystal', 'default:mese_crystal_fragment'}, +{'moreores:silver_ingot', 'default:diamondblock', 'moreores:silver_ingot'}, + {'', 'moreores:silver_ingot', 'rangedweapons:plastic_sheet'}, + } +}) + +minetest.register_craftitem("rangedweapons:taurus_uld", { + stack_max= 1, + wield_scale = {x=1.25,y=1.25,z=1.1}, + range = 0, + description = "" ..core.colorize("#35cdff","Taurus\n") ..core.colorize("#FFFFFF", "Ranged damage: 14-24\n") ..core.colorize("#FFFFFF", "Accuracy: 95%\n") ..core.colorize("#FFFFFF", "Mob knockback: 10\n") ..core.colorize("#FFFFFF", "Critical chance: 36%\n") ..core.colorize("#FFFFFF", "Critical damage: 30-50\n") ..core.colorize("#FFFFFF", "Ammunition: .357 Magnum rounds\n") ..core.colorize("#FFFFFF", "Reload time: 0.35\n") ..core.colorize("#be0d00", "The gun is NOT loaded! (Right-click to load)\n")..core.colorize("#FFFFFF", "Gun type: Revolver\n") ..core.colorize("#FFFFFF", "Bullet velocity: 55"), + inventory_image = "rangedweapons_taurus.png", + on_use = function(user) + minetest.sound_play("rangedweapons_empty", {user}) + end, + on_secondary_use = function(itemstack, player, pointed_thing) + local inv = player:get_inventory() + if inv:contains_item("main", "rangedweapons:357") then + inv:remove_item("main", "rangedweapons:357") + local pos = player:getpos() + local dir = player:get_look_dir() + local yaw = player:get_look_yaw() + local wield_index = player:get_wield_index() + if pos and dir and yaw then + pos.y = pos.y + 1.6 + local obj = minetest.add_entity(pos, "rangedweapons:empty_shell") + minetest.sound_play("", {object=obj}) + obj:setvelocity({x=dir.x * -10, y=dir.y * -10, z=dir.z * -10}) + obj:setacceleration({x=dir.x * -5, y= -10, z=dir.z * -5}) + obj:setyaw(yaw + math.pi) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or player + end + end + minetest.sound_play("rangedweapons_reload_b", {player}) + + minetest.after(0.35, + function(player, wield_index) + player:get_inventory():set_stack("main", wield_index, "rangedweapons:taurus") + minetest.sound_play("rangedweapons_reload_a", {player}) + end, + player, wield_index + ) + return ItemStack("rangedweapons:taurus_rld") + end + end +}) + + +minetest.register_craftitem("rangedweapons:taurus_rld", { + stack_max= 1, + range = 0, + wield_scale = {x=1.25,y=1.25,z=1.1}, + description = "**RELOADING COLT taurus**", + groups = {not_in_creative_inventory = 1}, + inventory_image = "rangedweapons_taurus_rld.png", +}) + + +minetest.register_tool("rangedweapons:taurus", { + description = "" ..core.colorize("#35cdff","Taurus \n") ..core.colorize("#FFFFFF", "Ranged damage: 14-24\n")..core.colorize("#FFFFFF", "Accuracy: 95%\n") ..core.colorize("#FFFFFF", "Mob knockback: 10\n") ..core.colorize("#FFFFFF", "Critical chance: 36%\n") ..core.colorize("#FFFFFF", "Critical damage: 30-50\n") ..core.colorize("#FFFFFF", "Ammunition: .357 Magnum rounds\n") ..core.colorize("#FFFFFF", "Reload time: 0.35\n") ..core.colorize("#27a600", "The gun is loaded!\n")..core.colorize("#FFFFFF", "Gun type: Revolver\n") ..core.colorize("#FFFFFF", "Bullet velocity: 55"), + range = 0, + groups = {not_in_creative_inventory = 1}, + wield_scale = {x=1.25,y=1.25,z=1.1}, + inventory_image = "rangedweapons_taurus.png", + on_use = function(itemstack, user, pointed_thing) + local pos = user:getpos() + local dir = user:get_look_dir() + local yaw = user:get_look_yaw() + if pos and dir and yaw then + pos.y = pos.y + 1.6 + local obj = minetest.add_entity(pos, "rangedweapons:taurusshot") + if obj then + minetest.sound_play("rangedweapons_revolver", {object=obj}) + obj:setvelocity({x=dir.x * 55, y=dir.y * 55, z=dir.z * 55}) + obj:setacceleration({x=dir.x * math.random(-0.5,0.5), y=math.random(-0.5,0.5), z=dir.z * math.random(-0.5,0.5)}) + obj:setyaw(yaw + math.pi) + minetest.add_particle({ + pos = pos, + velocity = {x=dir.x * 3, y=dir.y * 3, z=dir.z * 3} , + acceleration = {x=dir.x * -4, y=2, z=dir.z * -4}, + expirationtime = 1.5, + size = 8, + collisiondetection = false, + vertical = false, + texture = "tnt_smoke.png", + glow = 5, + }) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or user + itemstack = "rangedweapons:taurus_uld" + end + end + end + return itemstack + end, +}) + +local rangedweapons_taurusshot = { + physical = false, + timer = 0, + visual = "sprite", + visual_size = {x=0.3, y=0.3}, + textures = {"rangedweapons_invisible.png"}, + lastpos= {}, + collisionbox = {0, 0, 0, 0, 0, 0}, +} +rangedweapons_taurusshot.on_step = function(self, dtime, node, pos) + self.timer = self.timer + dtime + local tiem = 0.002 + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer > 0.06 then + local objs = minetest.get_objects_inside_radius({x = pos.x, y = pos.y, z = pos.z}, 1.5) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "rangedweapons:taurusshot" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 36 then + local damage = math.random(30,50) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 20}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(14,24) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 10}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + if math.random(1, 100) <= 36 then + local damage = math.random(30,50) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(14,24) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + if self.timer >= 0.002 + tiem then + minetest.add_particle({ + pos = pos, + velocity = 0, + acceleration = {x=0, y=0, z=0}, + expirationtime = 0.06, + size = 3, + collisiondetection = false, + vertical = false, + texture = "rangedweapons_bullet_fly.png", + glow = 15, + }) + tiem = tiem + 0.002 + end + if self.timer >= 4.0 then + self.object:remove() + end + if self.lastpos.x ~= nil then + if minetest.registered_nodes[node.name].walkable then + if not minetest.setting_getbool("creative_mode") then + end + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + if node.name == "rangedweapons:barrel" or + node.name == "doors:door_glass_a" or + node.name == "doors:door_glass_b" or + node.name == "xpanes:pane" or + node.name == "xpanes:pane_flat" or + node.name == "vessels:drinking_glass" or + node.name == "vessels:glass_bottle" or + node.name == "default:glass" then + minetest.get_node_timer(pos):start(0) + end + self.object:remove() + end + end + self.lastpos= {x = pos.x, y = pos.y, z = pos.z} +end +end +end + + + +minetest.register_entity("rangedweapons:taurusshot", rangedweapons_taurusshot ) + +