diff --git a/mods/rangedweapons/aa12.lua b/mods/rangedweapons/aa12.lua new file mode 100644 index 00000000..81544b77 --- /dev/null +++ b/mods/rangedweapons/aa12.lua @@ -0,0 +1,207 @@ +minetest.register_craft({ + output = 'rangedweapons:aa12', + recipe = { + {'rangedweapons:gunsteel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:diamondblock', 'default:steel_ingot', 'rangedweapons:plastic_sheet'}, + {'default:steel_ingot', 'dye:black', 'rangedweapons:plastic_sheet'}, + } +}) + +minetest.register_craft({ + output = 'rangedweapons:aa12', + recipe = { + {'moreores:silver_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:diamondblock', 'default:steel_ingot', 'rangedweapons:plastic_sheet'}, + {'default:steel_ingot', 'dye:black', 'rangedweapons:plastic_sheet'}, + } +}) + + minetest.register_craftitem("rangedweapons:aa12", { + stack_max= 1, + wield_scale = {x=1.75,y=1.75,z=1.3}, + description = "" ..core.colorize("#35cdff","AA-12\n") ..core.colorize("#FFFFFF", "Ranged damage: 2-6 X 10\n") ..core.colorize("#FFFFFF", "Accuracy: 65%\n") ..core.colorize("#FFFFFF", "Mob knockback: 2\n")..core.colorize("#FFFFFF", "Critical chance: 3%\n") ..core.colorize("#FFFFFF", "Critical damage: 8-16 X 10\n") ..core.colorize("#FFFFFF", "Ammunition: 12 gauge shells\n") ..core.colorize("#FFFFFF", "Rate of fire: 0.2\n") ..core.colorize("#FFFFFF", "Gun type: Auto-shotgun\n") ..core.colorize("#FFFFFF", "Bullet velocity: 20"), + range = 0, + inventory_image = "rangedweapons_aa12.png", +}) + +local timer = 0 +minetest.register_globalstep(function(dtime, player) + timer = timer + dtime; + if timer >= 0.2 then + for _, player in pairs(minetest.get_connected_players()) do + local inv = player:get_inventory() + local controls = player:get_player_control() + if controls.LMB then + timer = 0 + local wielded_item = player:get_wielded_item():get_name() + if wielded_item == "rangedweapons:aa12" then + if not inv:contains_item("main", "rangedweapons:shell") then +minetest.sound_play("rangedweapons_empty", {object=player}) + else + if wielded_item == "rangedweapons:aa12" then + inv:remove_item("main", "rangedweapons:shell") + local pos = player:getpos() + local dir = player:get_look_dir() + local yaw = player:get_look_yaw() + if pos and dir and yaw then + pos.y = pos.y + 1.6 + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) +------------------------------------------------------------ + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) +------------------------------------------------------------ + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) +------------------------------------------------------------ + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) +------------------------------------------------------------ + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) +------------------------------------------------------------ + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) +------------------------------------------------------------ + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) +------------------------------------------------------------ + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) +------------------------------------------------------------ + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) +------------------------------------------------------------ + local obj = minetest.add_entity(pos, "rangedweapons:aa12shot") + 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.5,3.5), y=math.random(-3.5,3.5), z=dir.z * math.random(-3.5,3.5)}) + pos.y = pos.y + 0 + 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) + 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 = 0.5, + size = 6, + collisiondetection = false, + vertical = false, + texture = "tnt_smoke.png", + glow = 5, + }) + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or player + end + end + end + end +end + +end + end + end + end + end) + +local rangedweapons_aa12shot = { + 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_aa12shot.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.20 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:aa12shot" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 3 then + local damage = math.random(8,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(2,6) + 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) <= 3 then + local damage = math.random(8,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(2,6) + 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:aa12shot", rangedweapons_aa12shot ) \ No newline at end of file diff --git a/mods/rangedweapons/ak47.lua b/mods/rangedweapons/ak47.lua new file mode 100644 index 00000000..b3ee74b0 --- /dev/null +++ b/mods/rangedweapons/ak47.lua @@ -0,0 +1,177 @@ +minetest.register_craft({ + output = 'rangedweapons:ak47', + recipe = { + {'default:diamond', 'default:steel_ingot', 'default:tree'}, + {'default:tree', 'default:mese', 'default:steel_ingot'}, + {'default:steel_ingot', '', 'default:tree'}, + } +}) + + minetest.register_craftitem("rangedweapons:ak47", { + stack_max= 1, + wield_scale = {x=1.75,y=1.75,z=1.3}, + description = "" ..core.colorize("#35cdff","AK-47\n") ..core.colorize("#FFFFFF", "Ranged damage: 6-16\n") ..core.colorize("#FFFFFF", "Accuracy: 77%\n") ..core.colorize("#FFFFFF", "Mob knockback: 5\n")..core.colorize("#FFFFFF", "Critical chance: 16%\n") ..core.colorize("#FFFFFF", "Critical damage: 17-26\n") ..core.colorize("#FFFFFF", "Ammunition: 7.26mm rounds\n") ..core.colorize("#FFFFFF", "Rate of fire: 0.165\n") ..core.colorize("#FFFFFF", "Gun type: Assault rifle\n") ..core.colorize("#FFFFFF", "Bullet velocity: 40"), + range = 0, + inventory_image = "rangedweapons_ak47.png", +}) + +local timer = 0 +minetest.register_globalstep(function(dtime, player) + timer = timer + dtime; + if timer >= 0.165 then + for _, player in pairs(minetest.get_connected_players()) do + local inv = player:get_inventory() + local controls = player:get_player_control() + if controls.LMB then + timer = 0 + local wielded_item = player:get_wielded_item():get_name() + if wielded_item == "rangedweapons:ak47" then + if not inv:contains_item("main", "rangedweapons:726mm") then +minetest.sound_play("rangedweapons_empty", {object=player}) + else + if wielded_item == "rangedweapons:ak47" then + inv:remove_item("main", "rangedweapons:726mm") + local pos = player:getpos() + local dir = player:get_look_dir() + local yaw = player:get_look_yaw() + if pos and dir and yaw then + pos.y = pos.y + 1.6 + local obj = minetest.add_entity(pos, "rangedweapons:ak47shot") + if obj then + minetest.sound_play("rangedweapons_ak", {object=obj}) + obj:setvelocity({x=dir.x * 40, y=dir.y * 40, z=dir.z * 40}) + obj:setacceleration({x=dir.x * math.random(-2.3,2.3), y=math.random(-2.3,2.3), z=dir.z * math.random(-2.3,2.3)}) + obj:setyaw(yaw + math.pi) + pos.y = pos.y + 0 + 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) + 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 = 0.5, + size = 4, + collisiondetection = false, + vertical = false, + texture = "tnt_smoke.png", + glow = 5, + }) + + local ent = obj:get_luaentity() + if ent then + ent.player = ent.player or player + end + end + end + end +end + +end + end + end + end + end) + +local rangedweapons_ak47shot = { + 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_ak47shot.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.08 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:ak47shot" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 16 then + local damage = math.random(17,26) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback=10}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(6,16) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 5}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + if math.random(1, 100) <= 16 then + local damage = math.random(17,26) + 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,16) + 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 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:ak47shot", rangedweapons_ak47shot ) \ No newline at end of file diff --git a/mods/rangedweapons/ammo.lua b/mods/rangedweapons/ammo.lua new file mode 100644 index 00000000..3729f0f4 --- /dev/null +++ b/mods/rangedweapons/ammo.lua @@ -0,0 +1,154 @@ + +minetest.register_craftitem("rangedweapons:9mm", { + stack_max= 10000, + wield_scale = {x=0.4,y=0.4,z=1.2}, + description = "" ..core.colorize("#35cdff","9mm round\n")..core.colorize("#FFFFFF", "Ammunition for handguns, machine-pistols and rarely sub-machineguns"), + inventory_image = "rangedweapons_9mm.png", +}) + + +minetest.register_craft({ + output = 'rangedweapons:9mm 30', + recipe = { + {'default:steel_ingot', '', ''}, + {'tnt:gunpowder', '', ''}, + {'default:copper_ingot', '', ''}, + } +}) + +minetest.register_craftitem("rangedweapons:10mm", { + stack_max= 1500, + wield_scale = {x=0.4,y=0.4,z=1.2}, + description = "" ..core.colorize("#35cdff","10mm round\n")..core.colorize("#FFFFFF", "Ammunition for sub-machineguns"), + inventory_image = "rangedweapons_10mm.png", +}) + + +minetest.register_craft({ + output = 'rangedweapons:10mm 60', + recipe = { + {'', 'default:bronze_ingot', ''}, + {'default:steel_ingot', 'tnt:gunpowder', 'default:steel_ingot'}, + {'default:steel_ingot', 'tnt:gunpowder', 'default:steel_ingot'}, + } +}) + + +minetest.register_craftitem("rangedweapons:357", { + stack_max= 250, + wield_scale = {x=0.4,y=0.4,z=1.2}, + description = "" ..core.colorize("#35cdff",".357 magnum round\n")..core.colorize("#FFFFFF", "Ammunition for magnums/revolvers"), + inventory_image = "rangedweapons_357.png", +}) + + +minetest.register_craft({ + output = 'rangedweapons:357 15', + recipe = { + {'default:copper_ingot', '', ''}, + {'tnt:gunpowder', '', ''}, + {'default:gold_ingot', '', ''}, + } +}) + +minetest.register_craftitem("rangedweapons:726mm", { + stack_max= 2000, + wield_scale = {x=0.4,y=0.4,z=1.2}, + description = "" ..core.colorize("#35cdff","7.26mm round\n")..core.colorize("#FFFFFF", "Ammunition for Heavy machineguns and some assault rifles"), + inventory_image = "rangedweapons_762mm.png", +}) + + +minetest.register_craft({ + output = 'rangedweapons:726mm 50', + recipe = { + {'default:bronze_ingot', 'tnt:gunpowder', 'default:bronze_ingot'}, + {'default:gold_ingot', 'tnt:gunpowder', 'default:gold_ingot'}, + {'default:gold_ingot', 'tnt:gunpowder', 'default:gold_ingot'}, + } +}) + +minetest.register_craftitem("rangedweapons:556mm", { + stack_max= 1000, + wield_scale = {x=0.4,y=0.4,z=1.2}, + description = "" ..core.colorize("#35cdff","5.56mm round\n")..core.colorize("#FFFFFF", "Ammunition for most assault rifles"), + inventory_image = "rangedweapons_556mm.png", +}) + + +minetest.register_craft({ + output = 'rangedweapons:556mm 75', + recipe = { + {'', 'default:gold_ingot', ''}, + {'default:gold_ingot', 'tnt:gunpowder', 'default:gold_ingot'}, + {'default:gold_ingot', 'tnt:gunpowder', 'default:gold_ingot'}, + } +}) + +minetest.register_craftitem("rangedweapons:shell", { + stack_max= 84, + wield_scale = {x=0.4,y=0.4,z=1.2}, + description = "" ..core.colorize("#35cdff","12 gauge shell\n")..core.colorize("#FFFFFF", "Ammunition for shotguns"), + inventory_image = "rangedweapons_shell.png", +}) + + +minetest.register_craft({ + output = 'rangedweapons:shell 12', + recipe = { + {'default:bronze_ingot', 'default:steel_ingot', 'default:bronze_ingot'}, + {'default:bronze_ingot', 'tnt:gunpowder', 'default:bronze_ingot'}, + {'default:gold_ingot', 'tnt:gunpowder', 'default:gold_ingot'}, + } +}) + +minetest.register_craftitem("rangedweapons:308winchester", { + stack_max= 120, + wield_scale = {x=0.4,y=0.4,z=1.2}, + description = "" ..core.colorize("#35cdff","308.winchester round\n")..core.colorize("#FFFFFF", "Ammunition for rifles"), + inventory_image = "rangedweapons_308winchester.png", +}) + + +minetest.register_craft({ + output = 'rangedweapons:308winchester 15', + recipe = { + {'', 'default:steel_ingot', ''}, + {'default:bronze_ingot', 'tnt:gunpowder', 'default:bronze_ingot'}, + {'default:gold_ingot', 'tnt:gunpowder', 'default:gold_ingot'}, + } +}) + +minetest.register_craftitem("rangedweapons:40mm", { + stack_max= 48, + wield_scale = {x=0.8,y=0.8,z=2.4}, + description = "" ..core.colorize("#35cdff","40mm grenade\n")..core.colorize("#FFFFFF", "Ammunition for grenade launchers"), + inventory_image = "rangedweapons_40mm.png", +}) + + +minetest.register_craft({ + output = 'rangedweapons:40mm 6', + recipe = { + {'', 'default:gold_ingot', ''}, + {'default:steel_ingot', 'tnt:gunpowder', 'default:steel_ingot'}, + {'tnt:gunpowder', 'default:bronze_ingot', 'tnt:gunpowder'}, + } +}) + +minetest.register_craftitem("rangedweapons:rocket", { + stack_max= 25, + wield_scale = {x=1.2,y=1.2,z=2.4}, + description = "" ..core.colorize("#35cdff","Rocket\n")..core.colorize("#FFFFFF", "Ammunition for rocket launchers"), + inventory_image = "rangedweapons_rocket.png", +}) + + +minetest.register_craft({ + output = 'rangedweapons:rocket 1', + recipe = { + {'', '', 'rangedweapons:40mm'}, + {'', 'tnt:gunpowder', ''}, + {'default:steel_ingot', '', ''}, + } +}) \ No newline at end of file diff --git a/mods/rangedweapons/awp.lua b/mods/rangedweapons/awp.lua new file mode 100644 index 00000000..92eaa8ab --- /dev/null +++ b/mods/rangedweapons/awp.lua @@ -0,0 +1,205 @@ +minetest.register_craft({ + output = 'rangedweapons:awp_uld', + recipe = { + {'rangedweapons:gunsteel_ingot', 'default:diamondblock', 'rangedweapons:gunsteel_ingot'}, + {'rangedweapons:gunsteel_ingot', 'rangedweapons:gunsteel_ingot', 'rangedweapons:gunsteel_ingot'}, + {'dye:dark_green', 'default:diamond', 'rangedweapons:plastic_sheet'}, + } +}) + +minetest.register_craftitem("rangedweapons:awp_uld", { + stack_max= 1, + wield_scale = {x=1.9,y=1.9,z=1.1}, + range = 0, + description = "" ..core.colorize("#35cdff","A.W.P. \n") ..core.colorize("#FFFFFF", "Ranged damage: 100/sec of bullet lifetime\n") ..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 15\n") ..core.colorize("#FFFFFF", "Critical chance: 45%\n") ..core.colorize("#FFFFFF", "Critical damage: 250/sec of bullet lifetime\n") ..core.colorize("#FFFFFF", "Ammunition: 308.Winchester rounds\n") ..core.colorize("#FFFFFF", "Reload time: 1.5\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_awp.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() + local controls = player:get_player_control() + 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.5, + function(player, wield_index) + player:get_inventory():set_stack("main", wield_index, "rangedweapons:awp") + minetest.sound_play("rangedweapons_reload_b", {player}) + end, + player,wield_index + ) + return ItemStack("rangedweapons:awp_rld") + end + + end +}) + +minetest.register_craftitem("rangedweapons:awp_rld", { + stack_max= 1, + range = 0, + wield_scale = {x=1.9,y=1.9,z=1.1}, + description = "**RELOADING A.W.P.**", + groups = {not_in_creative_inventory = 1}, + inventory_image = "rangedweapons_awp_rld.png", +}) + + +minetest.register_tool("rangedweapons:awp", { + description = "" ..core.colorize("#35cdff","A.W.P. \n") ..core.colorize("#FFFFFF", "Ranged damage: 100/sec of bullet lifetime\n")..core.colorize("#FFFFFF", "Accuracy: 100%\n") ..core.colorize("#FFFFFF", "Mob knockback: 15\n") ..core.colorize("#FFFFFF", "Critical chance: 45%\n") ..core.colorize("#FFFFFF", "Critical damage: 250/sec of bullet lifetime\n") ..core.colorize("#FFFFFF", "Ammunition: 308.Winchester rounds\n") ..core.colorize("#FFFFFF", "Reload time: 1.5\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_awp.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:awpshot") + 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:awp_uld" + end + end + end + return itemstack + end, +}) + +local rangedweapons_awpshot = { + 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_awpshot.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:awpshot" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 45 then + local damage = 250 * self.timer + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 30}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = 100 * self.timer + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 15}, + }, nil) + minetest.sound_play("default_dig_cracky", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + end + end + else + if math.random(1, 100) <= 45 then + local damage = 250 * 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 = 100 * 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:awpshot", rangedweapons_awpshot ) + + diff --git a/mods/rangedweapons/benelli.lua b/mods/rangedweapons/benelli.lua new file mode 100644 index 00000000..ee09a97f --- /dev/null +++ b/mods/rangedweapons/benelli.lua @@ -0,0 +1,195 @@ +minetest.register_craft({ + output = "rangedweapons:benelli_uld", + recipe = { + {"rangedweapons:gunsteel_ingot", "default:diamond", "default:steelblock"}, + {"rangedweapons:plastic_sheet", "default:diamond", "default:steel_ingot"}, + } +}) + +minetest.register_craftitem("rangedweapons:benelli_uld", { + stack_max= 1, + wield_scale = {x=2.0,y=2.0,z=1.20}, + range = 0, + description = "" ..core.colorize("#35cdff","Benelli M3\n") ..core.colorize("#FFFFFF", "Ranged damage: 3-9 X 12\n") ..core.colorize("#FFFFFF", "Accuracy: 62%\n") ..core.colorize("#FFFFFF", "Mob knockback: 6\n") ..core.colorize("#FFFFFF", "Critical chance: 4%\n") ..core.colorize("#FFFFFF", "Critical damage: 9-19 X 12\n") ..core.colorize("#FFFFFF", "Ammunition: 12 gauge shells\n") ..core.colorize("#FFFFFF", "Reload time: 0.60\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_benelli.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.60, + function(player, wield_index) + player:get_inventory():set_stack("main", wield_index, "rangedweapons:benelli") + minetest.sound_play("rangedweapons_shotgun_reload_b", {player}) + end, + player, wield_index + ) + return ItemStack("rangedweapons:benelli_rld") + end + end +}) + +minetest.register_craftitem("rangedweapons:benelli_rld", { + stack_max= 1, + range = 0, + wield_scale = {x=2.0,y=2.0,z=1.20}, + description = "**RELOADING BENELLI M3**", + groups = {not_in_creative_inventory = 1}, + inventory_image = "rangedweapons_benelli_rld.png", +}) + + +minetest.register_tool("rangedweapons:benelli", { + description = "" ..core.colorize("#35cdff","Benelli M3\n") ..core.colorize("#FFFFFF", "Ranged damage: 3-9 X 12\n") ..core.colorize("#FFFFFF", "Accuracy: 62%\n")..core.colorize("#FFFFFF", "Mob knockback: 6\n") ..core.colorize("#FFFFFF", "Critical chance: 4%\n") ..core.colorize("#FFFFFF", "Critical damage: 9-19 X 12\n") ..core.colorize("#FFFFFF", "Ammunition: 12 gauge shells\n") ..core.colorize("#FFFFFF", "Reload time: 0.60\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.0,y=2.0,z=1.20}, + inventory_image = "rangedweapons_benelli.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:benellishot") + 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.8,3.8), y=math.random(-3.8,3.8), z=dir.z * math.random(-3.8,3.8)}) +for i=1,11 do + local obj = minetest.add_entity(pos, "rangedweapons:benellishot") + 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.8,3.8), y=math.random(-3.8,3.8), z=dir.z * math.random(-3.8,3.8)}) +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:benelli_uld" + end + end + end + return itemstack + end, +}) + +local rangedweapons_benellishot = { + 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_benellishot.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:benellishot" and obj:get_luaentity().name ~= "__builtin:item" then + if math.random(1, 100) <= 4 then + local damage = math.random(9,19) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 12}, + }, nil) + minetest.sound_play("crit", {pos = self.lastpos, gain = 0.8}) + self.object:remove() + else + local damage = math.random(3,9) + obj:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups= {fleshy = damage, knockback = 6}, + }, 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(9,19) + 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,9) + 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:benellishot", rangedweapons_benellishot ) + +