Upload files to 'mods/rangedweapons'
This commit is contained in:
parent
af6b27407a
commit
f3f1e15a9f
|
@ -0,0 +1,31 @@
|
|||
minetest.register_craftitem("rangedweapons:glass_shards", {
|
||||
description = "" ..core.colorize("#35cdff","Glass shards\n")..core.colorize("#FFFFFF", "3 of those, can be crafted into a file of glass fragments"),
|
||||
inventory_image = "rangedweapons_glass_shards.png",
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "vessels:glass_fragments",
|
||||
recipe = {
|
||||
{"rangedweapons:glass_shards", "rangedweapons:glass_shards", "rangedweapons:glass_shards"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node("rangedweapons:broken_glass", {
|
||||
description = "Broken glass",
|
||||
drawtype = "glasslike",
|
||||
tiles = {
|
||||
"rangedweapons_broken_glass.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
is_ground_content = false,
|
||||
liquidtype = "source",
|
||||
liquid_alternative_flowing = "rangedweapons:broken_glass",
|
||||
liquid_alternative_source = "rangedweapons:broken_glass",
|
||||
liquid_viscosity = 7,
|
||||
alpha = 160,
|
||||
liquid_range= 0,
|
||||
liquid_renewable = false,
|
||||
damage_per_second = 2,
|
||||
groups = {oddly_breakable_by_hand = 3},
|
||||
})
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
|
||||
|
||||
minetest.register_tool("rangedweapons:glock17_rld", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=1.1,y=1.1,z=1.05},
|
||||
description = "",
|
||||
loaded_gun = "rangedweapons:glock17",
|
||||
range = 0,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
inventory_image = "rangedweapons_glock17_rld.png",
|
||||
})
|
||||
|
||||
|
||||
minetest.register_tool("rangedweapons:glock17_r", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=1.2,y=1.2,z=1.2},
|
||||
description = "",
|
||||
rw_next_reload = "rangedweapons:glock17_rr",
|
||||
load_sound = "rangedweapons_handgun_mag_in",
|
||||
range = 0,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
inventory_image = "rangedweapons_glock17.png",
|
||||
})
|
||||
|
||||
minetest.register_tool("rangedweapons:glock17_rr", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=1.2,y=1.2,z=1.2},
|
||||
description = "",
|
||||
rw_next_reload = "rangedweapons:glock17_rrr",
|
||||
load_sound = "rangedweapons_reload_a",
|
||||
range = 0,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
inventory_image = "rangedweapons_glock17.png",
|
||||
})
|
||||
|
||||
minetest.register_tool("rangedweapons:glock17_rrr", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=1.2,y=1.2,z=1.2},
|
||||
description = "",
|
||||
rw_next_reload = "rangedweapons:glock17",
|
||||
load_sound = "rangedweapons_reload_b",
|
||||
range = 0,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
inventory_image = "rangedweapons_glock17_rld.png",
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
minetest.register_tool("rangedweapons:glock17", {
|
||||
description = "" ..core.colorize("#35cdff","Glock 17\n") ..core.colorize("#FFFFFF", "Gun damage: 5\n") ..core.colorize("#FFFFFF", "Accuracy: 96%\n") ..core.colorize("#FFFFFF", "Gun knockback: 4\n") ..core.colorize("#FFFFFF", "Gun Critical chance: 15%\n") ..core.colorize("#FFFFFF", "Gun Critical efficiency: 2.2x\n") ..core.colorize("#FFFFFF", "Reload delay: 0.9\n")..core.colorize("#FFFFFF", "Clip size: 17/17/17\n") ..core.colorize("#FFFFFF", "Ammunition: 9x19mm Parabellum/10mm Auto/.45acp\n") ..core.colorize("#FFFFFF", "Rate of fire: 0.35\n") ..core.colorize("#FFFFFF", "Gun type: Handgun\n") ..core.colorize("#FFFFFF", "Bullet velocity: 30"),
|
||||
wield_scale = {x=1.2,y=1.2,z=1.2},
|
||||
range = 0,
|
||||
inventory_image = "rangedweapons_glock17.png",
|
||||
RW_gun_capabilities = {
|
||||
gun_damage = {fleshy=5,knockback=4},
|
||||
gun_crit = 15,
|
||||
gun_critEffc = 2.2,
|
||||
suitable_ammo = {{"rangedweapons:9mm",17},{"rangedweapons:10mm",17},{"rangedweapons:45acp",17}},
|
||||
gun_skill = {"handgun_skill",45},
|
||||
gun_magazine = "rangedweapons:handgun_mag_black",
|
||||
gun_icon = "rangedweapons_glock17_icon.png",
|
||||
gun_unloaded = "rangedweapons:glock17_r",
|
||||
gun_cooling = "rangedweapons:glock17_rld",
|
||||
gun_velocity = 30,
|
||||
gun_accuracy = 96,
|
||||
gun_cooldown = 0.35,
|
||||
gun_reload = 0.9/4,
|
||||
gun_projectiles = 1,
|
||||
has_shell = 1,
|
||||
gun_durability = 1400,
|
||||
gun_smokeSize = 5,
|
||||
gun_unload_sound = "rangedweapons_handgun_mag_out",
|
||||
gun_sound = "rangedweapons_glock",
|
||||
},
|
||||
on_secondary_use = function(itemstack, user, pointed_thing)
|
||||
rangedweapons_reload_gun(itemstack, user)
|
||||
return itemstack
|
||||
end,
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
rangedweapons_shoot_gun(itemstack, user)
|
||||
return itemstack
|
||||
end,
|
||||
})
|
|
@ -0,0 +1,149 @@
|
|||
|
||||
|
||||
minetest.register_craftitem("rangedweapons:pin", {
|
||||
wield_scale = {x=2.5,y=2.5,z=1.0},
|
||||
inventory_image = "rangedweapons_pin.png",
|
||||
})
|
||||
local rangedweapons_grenade_pin = {
|
||||
physical = false,
|
||||
timer = 0,
|
||||
visual = "wielditem",
|
||||
visual_size = {x=0.15, y=0.15},
|
||||
textures = {"rangedweapons:pin"},
|
||||
lastpos= {},
|
||||
collisionbox = {0, 0, 0, 0, 0, 0},
|
||||
}
|
||||
rangedweapons_grenade_pin.on_step = function(self, dtime, pos)
|
||||
self.timer = self.timer + dtime
|
||||
local pos = self.object:get_pos()
|
||||
local node = minetest.get_node(pos)
|
||||
if self.lastpos.x ~= nil then
|
||||
if minetest.registered_nodes[node.name].walkable then
|
||||
self.object:remove()
|
||||
minetest.sound_play("rangedweapons_bulletdrop", {pos = self.lastpos, gain = 0.8})
|
||||
end
|
||||
end
|
||||
self.lastpos= {x = pos.x, y = pos.y, z = pos.z}
|
||||
end
|
||||
|
||||
|
||||
|
||||
minetest.register_entity("rangedweapons:grenade_pin", rangedweapons_grenade_pin)
|
||||
|
||||
local grenade_boom = {
|
||||
name = "rangedweapons:grenade_explosion",
|
||||
--description = "DuN mInD mEh...",
|
||||
radius = 3,
|
||||
tiles = {
|
||||
side = "rangedweapons_invisible.png",
|
||||
top = "rangedweapons_invisible.png",
|
||||
bottom = "rangedweapons_invisible.png",
|
||||
burning = "rangedweapons_invisible.png"
|
||||
},
|
||||
}
|
||||
local gtimer = 0
|
||||
minetest.register_craftitem("rangedweapons:hand_grenade", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=1.1,y=1.1,z=1.05},
|
||||
description = "" ..core.colorize("#35cdff","Hand grenade\n") ..core.colorize("#FFFFFF", "Explosion radius: 3\n")..core.colorize("#FFFFFF", "Throw force: 12\n") ..core.colorize("#FFFFFF", "Grenade gravitational pull: 6\n") ..core.colorize("#ffc000", "Right-click to unpin, Left click to throw after unpinning\n") ..core.colorize("#ffc000", "Thrown or not, it will explode after 3 secons from unpinning, be careful!"),
|
||||
range = 0,
|
||||
inventory_image = "rangedweapons_hand_grenade.png",
|
||||
on_secondary_use = function(itemstack, user, pointed_thing)
|
||||
if minetest.find_node_near(user:get_pos(), 10,"rangedweapons:antigun_block")
|
||||
then
|
||||
minetest.chat_send_player(user:get_player_name(), "" ..core.colorize("#ff0000","Grenades are prohibited in this area!"))
|
||||
return itemstack
|
||||
end
|
||||
|
||||
gtimer = 0
|
||||
minetest.sound_play("rangedweapons_reload_a", {user})
|
||||
itemstack = "rangedweapons:hand_grenade_nopin"
|
||||
local pos = user:get_pos()
|
||||
pos.y = pos.y + 1.5
|
||||
local pinEnt = minetest.add_entity(pos, "rangedweapons:grenade_pin")
|
||||
if pinEnt then
|
||||
local dir = user:get_look_dir()
|
||||
local yaw = user:get_look_yaw()
|
||||
local svertical = user:get_look_vertical()
|
||||
pinEnt:setvelocity({x=dir.x * -10, y=dir.y * -10, z=dir.z * -10})
|
||||
pinEnt:setacceleration({x=dir.x * -5, y= -10, z=dir.z * -5})
|
||||
pinEnt:set_rotation({x=0,y=yaw + math.pi,z=-svertical})
|
||||
end
|
||||
return itemstack end,
|
||||
})
|
||||
|
||||
|
||||
minetest.register_craftitem("rangedweapons:hand_grenade_nopin", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=1.1,y=1.1,z=1.05},
|
||||
description = "***HURRY UP AND THROW IT!!!***",
|
||||
range = 0,
|
||||
inventory_image = "rangedweapons_hand_grenade_nopin.png",
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
local pos = user:get_pos()
|
||||
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:grenade")
|
||||
if obj then
|
||||
obj:set_velocity({x=dir.x * 12, y=dir.y * 12, z=dir.z * 12})
|
||||
obj:set_acceleration({x=0, y=-6, z=0})
|
||||
obj:set_yaw(yaw + math.pi)
|
||||
btimer = gtimer
|
||||
local ent = obj:get_luaentity()
|
||||
if ent then
|
||||
ent.player = ent.player or user
|
||||
itemstack = ""
|
||||
end
|
||||
end
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
tnt.register_tnt(grenade_boom)
|
||||
|
||||
|
||||
minetest.register_globalstep(function(dtime, player, pos)
|
||||
gtimer = gtimer + dtime;
|
||||
if gtimer >= 3.0 then
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
local pos = player:get_pos()
|
||||
if player:get_wielded_item():get_name() == "rangedweapons:hand_grenade_nopin" then
|
||||
player:set_wielded_item("")
|
||||
gtimer = 0
|
||||
tnt.boom(pos, grenade_boom)
|
||||
end end end end)
|
||||
|
||||
local rangedweapons_grenade = {
|
||||
physical = true,
|
||||
btimer = 0,
|
||||
timer = 0,
|
||||
hp_max = 420,
|
||||
visual = "sprite",
|
||||
visual_size = {x=0.5, y=0.5},
|
||||
textures = {"rangedweapons_hand_grenade_nopin.png"},
|
||||
lastpos= {},
|
||||
collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1},
|
||||
}
|
||||
rangedweapons_grenade.on_step = function(self, dtime, pos)
|
||||
local pos = self.object:get_pos()
|
||||
local node = minetest.get_node(pos)
|
||||
local btimer = btimer or 0
|
||||
self.timer = self.timer + dtime
|
||||
if self.timer > (3.0 - btimer) then
|
||||
tnt.boom(pos, grenade_boom)
|
||||
self.object:remove()
|
||||
end
|
||||
self.lastpos= {x = pos.x, y = pos.y, z = pos.z}
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
minetest.register_entity("rangedweapons:grenade", rangedweapons_grenade)
|
||||
|
||||
|
|
@ -0,0 +1,982 @@
|
|||
|
||||
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
if minetest.global_exists("armor") and armor.attributes then
|
||||
table.insert(armor.attributes, "bullet_res")
|
||||
end
|
||||
if minetest.global_exists("armor") and armor.attributes then
|
||||
table.insert(armor.attributes, "ammo_save")
|
||||
end
|
||||
if minetest.global_exists("armor") and armor.attributes then
|
||||
table.insert(armor.attributes, "ranged_dmg")
|
||||
end
|
||||
|
||||
minetest.register_node("rangedweapons:antigun_block", {
|
||||
description = "" ..core.colorize("#35cdff","Anti-gun block\n")..core.colorize("#FFFFFF", "Prevents people from using guns, in 10 node radius to each side from this block"),
|
||||
tiles = {"rangedweapons_antigun_block.png"},
|
||||
groups = {choppy = 3, oddly_breakable_by_hand = 3},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
----
|
||||
---- gun_funcs
|
||||
----
|
||||
|
||||
make_sparks = function(pos)
|
||||
minetest.sound_play("rengedweapons_ricochet", {pos, gain = 0.75})
|
||||
for i=1,9 do
|
||||
minetest.add_particle({
|
||||
pos = pos,
|
||||
velocity = {x=math.random(-6.0,6.0), y=math.random(-10.0,15.0), z=math.random(-6.0,6.0)},
|
||||
acceleration = {x=math.random(-9.0,9.0), y=math.random(-15.0,-3.0), z=math.random(-9.0,9.0)},
|
||||
expirationtime = 1.0,
|
||||
size = math.random(1,2),
|
||||
collisiondetection = true,
|
||||
vertical = false,
|
||||
texture = "rangedweapons_spark.png",
|
||||
glow = 25,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
rangedweapons_gain_skill = function(player,skill,chance)
|
||||
|
||||
if math.random(1, chance) == 1 then
|
||||
local p_meta = player:get_meta()
|
||||
local skill_num = p_meta:get_int(skill)
|
||||
if skill_num < rweapons_max_gun_efficiency then
|
||||
p_meta:set_int(skill, skill_num + 1)
|
||||
minetest.chat_send_player(player:get_player_name(), "" ..core.colorize("#25c200","You've improved your skill with this type of gun!"))
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
rangedweapons_reload_gun = function(itemstack, player)
|
||||
|
||||
GunCaps = itemstack:get_definition().RW_gun_capabilities
|
||||
|
||||
if GunCaps ~= nil then
|
||||
gun_unload_sound = GunCaps.gun_unload_sound or ""
|
||||
end
|
||||
|
||||
minetest.sound_play(gun_unload_sound, {player})
|
||||
|
||||
|
||||
local gun_reload = 0.25
|
||||
|
||||
if GunCaps ~= nil then
|
||||
gun_reload = GunCaps.gun_reload or 0.25
|
||||
end
|
||||
|
||||
local playerMeta = player:get_meta()
|
||||
local gunMeta = itemstack:get_meta()
|
||||
|
||||
gunMeta:set_float("RW_reload_delay",gun_reload)
|
||||
|
||||
playerMeta:set_float("rw_cooldown",gun_reload)
|
||||
|
||||
local player_has_ammo = 0
|
||||
local clipSize = 0
|
||||
local reload_ammo = ""
|
||||
|
||||
if GunCaps.suitable_ammo ~= nil then
|
||||
local inv = player:get_inventory()
|
||||
for i = 1,inv:get_size("main") do
|
||||
|
||||
for _, ammo in pairs(GunCaps.suitable_ammo) do
|
||||
if inv:get_stack("main",i):get_name() == ammo[1] then
|
||||
reload_ammo = inv:get_stack("main",i)
|
||||
clipSize = ammo[2]
|
||||
|
||||
player_has_ammo = 1
|
||||
break
|
||||
end end
|
||||
|
||||
if player_has_ammo == 1 then
|
||||
break
|
||||
end
|
||||
|
||||
end end
|
||||
|
||||
if player_has_ammo == 1 then
|
||||
local gun_icon = "rangedweapons_emergency_gun_icon.png"
|
||||
|
||||
if GunCaps.gun_icon ~= nil then
|
||||
gun_icon = GunCaps.gun_icon
|
||||
end
|
||||
|
||||
local ammo_icon = "rangedweapons_emergency_ammo_icon.png"
|
||||
|
||||
if reload_ammo:get_definition().inventory_image ~= nil then
|
||||
ammo_icon = reload_ammo:get_definition().inventory_image
|
||||
end
|
||||
|
||||
player:hud_change(gunimg, "text", gun_icon)
|
||||
player:hud_change(ammoimg, "text", ammo_icon)
|
||||
|
||||
local gunMeta = itemstack:get_meta()
|
||||
local ammoCount = gunMeta:get_int("RW_bullets")
|
||||
local ammoName = gunMeta:get_string("RW_ammo_name")
|
||||
local inv = player:get_inventory()
|
||||
|
||||
inv:add_item("main",ammoName.." "..ammoCount)
|
||||
|
||||
|
||||
if inv:contains_item("main",reload_ammo:get_name().." "..clipSize) then
|
||||
inv:remove_item("main",reload_ammo:get_name().." "..clipSize)
|
||||
gunMeta:set_int("RW_bullets",clipSize)
|
||||
else
|
||||
gunMeta:set_int("RW_bullets",reload_ammo:get_count())
|
||||
inv:remove_item("main",reload_ammo:get_name().." "..reload_ammo:get_count())
|
||||
end
|
||||
|
||||
gunMeta:set_string("RW_ammo_name",reload_ammo:get_name())
|
||||
|
||||
player:hud_change(gunammo, "text", gunMeta:get_int("RW_bullets"))
|
||||
|
||||
if GunCaps.gun_magazine ~= nil then
|
||||
local pos = player:get_pos()
|
||||
local dir = player:get_look_dir()
|
||||
local yaw = player:get_look_yaw()
|
||||
if pos and dir and yaw then
|
||||
pos.y = pos.y + 1.4
|
||||
local obj = minetest.add_entity(pos,"rangedweapons:mag")
|
||||
if obj then
|
||||
obj:set_properties({textures = {GunCaps.gun_magazine}})
|
||||
obj:set_velocity({x=dir.x*2, y=dir.y*2, z=dir.z*2})
|
||||
obj:set_acceleration({x=0, y=-5, z=0})
|
||||
obj:set_rotation({x=0,y=yaw+math.pi,z=0})
|
||||
end end end
|
||||
|
||||
if GunCaps.gun_unloaded ~= nil then
|
||||
itemstack:set_name(GunCaps.gun_unloaded)
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
rangedweapons_single_load_gun = function(itemstack, player)
|
||||
|
||||
GunCaps = itemstack:get_definition().RW_gun_capabilities
|
||||
|
||||
if GunCaps ~= nil then
|
||||
gun_unload_sound = GunCaps.gun_unload_sound or ""
|
||||
end
|
||||
|
||||
minetest.sound_play(gun_unload_sound, {player})
|
||||
|
||||
local gun_reload = 0.25
|
||||
|
||||
if GunCaps ~= nil then
|
||||
gun_reload = GunCaps.gun_reload or 0.25
|
||||
end
|
||||
|
||||
local playerMeta = player:get_meta()
|
||||
local gunMeta = itemstack:get_meta()
|
||||
|
||||
gunMeta:set_float("RW_reload_delay",gun_reload)
|
||||
|
||||
playerMeta:set_float("rw_cooldown",gun_reload)
|
||||
|
||||
local player_has_ammo = 0
|
||||
local clipSize = 0
|
||||
local reload_ammo = ""
|
||||
|
||||
if GunCaps.suitable_ammo ~= nil then
|
||||
local inv = player:get_inventory()
|
||||
for i = 1,inv:get_size("main") do
|
||||
|
||||
for _, ammo in pairs(GunCaps.suitable_ammo) do
|
||||
if inv:get_stack("main",i):get_name() == ammo[1] then
|
||||
reload_ammo = inv:get_stack("main",i)
|
||||
clipSize = ammo[2]
|
||||
|
||||
player_has_ammo = 1
|
||||
break
|
||||
end end
|
||||
|
||||
if player_has_ammo == 1 then
|
||||
break
|
||||
end
|
||||
|
||||
end end
|
||||
|
||||
if player_has_ammo == 1 then
|
||||
local gun_icon = "rangedweapons_emergency_gun_icon.png"
|
||||
|
||||
if GunCaps.gun_icon ~= nil then
|
||||
gun_icon = GunCaps.gun_icon
|
||||
end
|
||||
|
||||
local ammo_icon = "rangedweapons_emergency_ammo_icon.png"
|
||||
|
||||
if reload_ammo:get_definition().inventory_image ~= nil then
|
||||
ammo_icon = reload_ammo:get_definition().inventory_image
|
||||
end
|
||||
|
||||
player:hud_change(gunimg, "text", gun_icon)
|
||||
player:hud_change(ammoimg, "text", ammo_icon)
|
||||
|
||||
local gunMeta = itemstack:get_meta()
|
||||
local ammoCount = gunMeta:get_int("RW_bullets")
|
||||
local ammoName = gunMeta:get_string("RW_ammo_name")
|
||||
local inv = player:get_inventory()
|
||||
|
||||
if ammoName ~= reload_ammo:get_name() then
|
||||
inv:add_item("main",ammoName.." "..ammoCount)
|
||||
gunMeta:set_int("RW_bullets",0)
|
||||
end
|
||||
|
||||
if inv:contains_item("main",reload_ammo:get_name()) and
|
||||
gunMeta:get_int("RW_bullets") < clipSize then
|
||||
inv:remove_item("main",reload_ammo:get_name())
|
||||
gunMeta:set_int("RW_bullets",gunMeta:get_int("RW_bullets")+1)
|
||||
end
|
||||
|
||||
gunMeta:set_string("RW_ammo_name",reload_ammo:get_name())
|
||||
|
||||
player:hud_change(gunammo, "text", gunMeta:get_int("RW_bullets"))
|
||||
|
||||
if GunCaps.gun_unloaded ~= nil then
|
||||
itemstack:set_name(GunCaps.gun_unloaded)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
rangedweapons_yeet = function(itemstack, player)
|
||||
|
||||
if minetest.find_node_near(player:getpos(), 10,"rangedweapons:antigun_block")
|
||||
then
|
||||
minetest.chat_send_player(player:get_player_name(), "" ..core.colorize("#ff0000","throwable weapons are prohibited in this area!"))
|
||||
else
|
||||
|
||||
ThrowCaps = itemstack:get_definition().RW_throw_capabilities
|
||||
playerMeta = player:get_meta()
|
||||
|
||||
if ThrowCaps ~= nil then
|
||||
throw_cooldown = ThrowCaps.throw_cooldown or 0
|
||||
end
|
||||
|
||||
if playerMeta:get_float("rw_cooldown") <= 0 then
|
||||
|
||||
playerMeta:set_float("rw_cooldown", throw_cooldown)
|
||||
|
||||
local throw_damage = {fleshy=1}
|
||||
local throw_sound = "rangedweapons_throw"
|
||||
local throw_velocity = 20
|
||||
local throw_accuracy = 100
|
||||
local throw_cooling = 0
|
||||
local throw_crit = 0
|
||||
local throw_critEffc = 1
|
||||
local throw_mobPen = 0
|
||||
local throw_nodePen = 0
|
||||
local throw_dps = 0
|
||||
local throw_gravity = 0
|
||||
local throw_door_breaking = 0
|
||||
local throw_skill = ""
|
||||
local throw_skillChance = 0
|
||||
local throw_smokeSize = 0
|
||||
local throw_ent = "rangedweapons:shot_bullet"
|
||||
local throw_visual = "wielditem"
|
||||
local throw_texture = "rangedweapons:shot_bullet_visual"
|
||||
local throw_glass_breaking = 0
|
||||
local throw_particles = {}
|
||||
local throw_sparks = 0
|
||||
local throw_bomb_ignite = 0
|
||||
local throw_size = 0
|
||||
local throw_glow = 0
|
||||
|
||||
if ThrowCaps ~= nil then
|
||||
throw_damage = ThrowCaps.throw_damage or {fleshy=1}
|
||||
throw_sound = ThrowCaps.throw_sound or "rangedweapons_glock"
|
||||
throw_velocity = ThrowCaps.throw_velocity or 20
|
||||
throw_accuracy = ThrowCaps.throw_accuracy or 100
|
||||
throw_cooling = ThrowCaps.throw_cooling or itemstack:get_name()
|
||||
throw_crit = ThrowCaps.throw_crit or 0
|
||||
throw_critEffc = ThrowCaps.throw_critEffc or 1
|
||||
throw_projectiles = ThrowCaps.throw_projectiles or 1
|
||||
throw_mobPen = ThrowCaps.throw_mob_penetration or 0
|
||||
throw_nodePen = ThrowCaps.throw_node_penetration or 0
|
||||
throw_dps = ThrowCaps.throw_dps or 0
|
||||
throw_gravity = ThrowCaps.throw_gravity or 0
|
||||
throw_door_breaking = ThrowCaps.throw_door_breaking or 0
|
||||
throw_ent = ThrowCaps.throw_entity or "rangedweapons:shot_bullet"
|
||||
throw_visual = ThrowCaps.throw_visual or "wielditem"
|
||||
throw_texture = ThrowCaps.throw_texture or "rangedweapons:shot_bullet_visual"
|
||||
throw_glass_breaking = ThrowCaps.throw_glass_breaking or 0
|
||||
throw_particles = ThrowCaps.throw_particles or nil
|
||||
throw_sparks = ThrowCaps.throw_sparks or 0
|
||||
throw_bomb_ignite = ThrowCaps.ignites_explosives or 0
|
||||
throw_size = ThrowCaps.throw_projectile_size or 0
|
||||
throw_glow = ThrowCaps.throw_projectile_glow or 0
|
||||
OnCollision = ThrowCaps.OnCollision or function()end
|
||||
|
||||
if ThrowCaps.throw_skill ~= nil then
|
||||
throw_skill = ThrowCaps.throw_skill[1] or ""
|
||||
throw_skillChance = ThrowCaps.throw_skill[2] or 0
|
||||
else
|
||||
throw_skill = ""
|
||||
throw_skillChance = 0
|
||||
end
|
||||
end
|
||||
|
||||
if throw_skillChance > 0 and throw_skill ~= "" then
|
||||
rangedweapons_gain_skill(player,throw_skill,throw_skillChance)
|
||||
end
|
||||
|
||||
if throw_skill ~= "" then
|
||||
skill_value = playerMeta:get_int(throw_skill)/100
|
||||
else
|
||||
skill_value = 1
|
||||
end
|
||||
|
||||
rangedweapons_launch_projectile(player,throw_projectiles,throw_damage,throw_ent,throw_visual,throw_texture,throw_sound,throw_velocity,throw_accuracy,skill_value,OnCollision,throw_crit,throw_critEffc,throw_mobPen,throw_nodePen,0,"","","",throw_dps,throw_gravity,throw_door_breaking,throw_glass_breaking,throw_particles,throw_sparks,throw_bomb_ignite,throw_size,0,itemstack:get_wear(),throw_glow)
|
||||
|
||||
itemstack:take_item()
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
rangedweapons_shoot_gun = function(itemstack, player)
|
||||
|
||||
if minetest.find_node_near(player:getpos(), 10,"rangedweapons:antigun_block")
|
||||
then
|
||||
minetest.sound_play("rangedweapons_empty", {player})
|
||||
minetest.chat_send_player(player:get_player_name(), "" ..core.colorize("#ff0000","Guns are prohibited in this area!"))
|
||||
|
||||
else
|
||||
|
||||
local gun_cooldown = 0
|
||||
local GunCaps = itemstack:get_definition().RW_gun_capabilities
|
||||
local gun_ammo_save = 0
|
||||
|
||||
if GunCaps ~= nil then
|
||||
gun_cooldown = GunCaps.gun_cooldown or 0
|
||||
gun_ammo_save = GunCaps.ammo_saving or 0
|
||||
end
|
||||
|
||||
local gunMeta = itemstack:get_meta()
|
||||
local playerMeta = player:get_meta()
|
||||
|
||||
if gunMeta:get_int("RW_bullets") > 0 and
|
||||
playerMeta:get_float("rw_cooldown") <= 0 then
|
||||
|
||||
playerMeta:set_float("rw_cooldown", gun_cooldown)
|
||||
|
||||
if math.random(1,100) > gun_ammo_save then
|
||||
gunMeta:set_int("RW_bullets",gunMeta:get_int("RW_bullets")-1)
|
||||
end
|
||||
|
||||
player:hud_change(gunammo, "text", gunMeta:get_int("RW_bullets"))
|
||||
|
||||
local gun_icon = "rangedweapons_emergency_gun_icon.png"
|
||||
if GunCaps.gun_icon ~= nil then
|
||||
gun_icon = GunCaps.gun_icon
|
||||
end
|
||||
player:hud_change(gunimg, "text", gun_icon)
|
||||
|
||||
local OnCollision = function() end
|
||||
|
||||
local bulletStack = ItemStack({name = gunMeta:get_string("RW_ammo_name")})
|
||||
AmmoCaps = bulletStack:get_definition().RW_ammo_capabilities
|
||||
|
||||
local gun_damage = {fleshy=1}
|
||||
local gun_sound = "rangedweapons_glock"
|
||||
local gun_velocity = 20
|
||||
local gun_accuracy = 100
|
||||
local gun_cooling = 0
|
||||
local gun_crit = 0
|
||||
local gun_critEffc = 1
|
||||
local gun_mobPen = 0
|
||||
local gun_nodePen = 0
|
||||
local gun_shell = 0
|
||||
local gun_durability = 0
|
||||
local gun_dps = 0
|
||||
local gun_gravity = 0
|
||||
local gun_door_breaking = 0
|
||||
local gun_skill = ""
|
||||
local gun_skillChance = 0
|
||||
local gun_smokeSize = 0
|
||||
|
||||
local bullet_damage = {fleshy=0}
|
||||
local bullet_velocity = 0
|
||||
local bullet_ent = "rangedweapons:shot_bullet"
|
||||
local bullet_visual = "wielditem"
|
||||
local bullet_texture = "rangedweapons:shot_bullet_visual"
|
||||
local bullet_crit = 0
|
||||
local bullet_critEffc = 0
|
||||
local bullet_projMult = 1
|
||||
local bullet_mobPen = 0
|
||||
local bullet_nodePen = 0
|
||||
local bullet_shell_ent = "rangedweapons:empty_shell"
|
||||
local bullet_shell_visual = "wielditem"
|
||||
local bullet_shell_texture = "rangedweapons:shelldrop"
|
||||
local bullet_dps = 0
|
||||
local bullet_gravity = 0
|
||||
local bullet_glass_breaking = 0
|
||||
local bullet_particles = {}
|
||||
local bullet_sparks = 0
|
||||
local bullet_bomb_ignite = 0
|
||||
local bullet_size = 0
|
||||
local bullet_glow = 20
|
||||
|
||||
|
||||
|
||||
if GunCaps ~= nil then
|
||||
gun_damage = GunCaps.gun_damage or {fleshy=1}
|
||||
gun_sound = GunCaps.gun_sound or "rangedweapons_glock"
|
||||
gun_velocity = GunCaps.gun_velocity or 20
|
||||
gun_accuracy = GunCaps.gun_accuracy or 100
|
||||
gun_cooling = GunCaps.gun_cooling or itemstack:get_name()
|
||||
gun_crit = GunCaps.gun_crit or 0
|
||||
gun_critEffc = GunCaps.gun_critEffc or 1
|
||||
gun_projectiles = GunCaps.gun_projectiles or 1
|
||||
gun_mobPen = GunCaps.gun_mob_penetration or 0
|
||||
gun_nodePen = GunCaps.gun_node_penetration or 0
|
||||
gun_shell = GunCaps.has_shell or 0
|
||||
gun_durability = GunCaps.gun_durability or 0
|
||||
gun_dps = GunCaps.gun_dps or 0
|
||||
gun_ammo_save = GunCaps.ammo_saving or 0
|
||||
gun_gravity = GunCaps.gun_gravity or 0
|
||||
gun_door_breaking = GunCaps.gun_door_breaking or 0
|
||||
gun_smokeSize = GunCaps.gun_smokeSize or 0
|
||||
|
||||
if GunCaps.gun_skill ~= nil then
|
||||
gun_skill = GunCaps.gun_skill[1] or ""
|
||||
gun_skillChance = GunCaps.gun_skill[2] or 0
|
||||
else
|
||||
gun_skill = ""
|
||||
gun_skillChance = 0
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if gun_skillChance > 0 and gun_skill ~= "" then
|
||||
rangedweapons_gain_skill(player,gun_skill,gun_skillChance)
|
||||
end
|
||||
|
||||
local ammo_icon = "rangedweapons_emergency_ammo_icon.png"
|
||||
if bulletStack:get_definition().inventory_image ~= nil then
|
||||
ammo_icon = bulletStack:get_definition().inventory_image
|
||||
end
|
||||
player:hud_change(ammoimg, "text", ammo_icon)
|
||||
|
||||
if AmmoCaps ~= nil then
|
||||
|
||||
OnCollision = AmmoCaps.OnCollision or function()end
|
||||
bullet_damage = AmmoCaps.ammo_damage or {fleshy=1}
|
||||
bullet_velocity = AmmoCaps.ammo_velocity or 0
|
||||
bullet_ent = AmmoCaps.ammo_entity or "rangedweapons:shot_bullet"
|
||||
bullet_visual = AmmoCaps.ammo_visual or "wielditem"
|
||||
bullet_texture = AmmoCaps.ammo_texture or "rangedweapons:shot_bullet_visual"
|
||||
bullet_crit = AmmoCaps.ammo_crit or 0
|
||||
bullet_critEffc = AmmoCaps.ammo_critEffc or 0
|
||||
bullet_projMult = AmmoCaps.ammo_projectile_multiplier or 1
|
||||
bullet_mobPen = AmmoCaps.ammo_mob_penetration or 0
|
||||
bullet_nodePen = AmmoCaps.ammo_node_penetration or 0
|
||||
bullet_shell_ent = AmmoCaps.shell_entity or "rangedweapons:empty_shell"
|
||||
bullet_shell_visual = AmmoCaps.shell_visual or "wielditem"
|
||||
bullet_shell_texture = AmmoCaps.shell_texture or "rangedweapons:shelldrop"
|
||||
bullet_dps = AmmoCaps.ammo_dps or 0
|
||||
bullet_gravity = AmmoCaps.ammo_gravity or 0
|
||||
bullet_glass_breaking = AmmoCaps.ammo_glass_breaking or 0
|
||||
bullet_particles = AmmoCaps.ammo_particles or nil
|
||||
bullet_sparks = AmmoCaps.has_sparks or 0
|
||||
bullet_bomb_ignite = AmmoCaps.ignites_explosives or 0
|
||||
bullet_size = AmmoCaps.ammo_projectile_size or 0.0025
|
||||
bullet_glow = AmmoCaps.ammo_projectile_glow or 20
|
||||
end
|
||||
|
||||
|
||||
local combined_crit = gun_crit + bullet_crit
|
||||
local combined_critEffc = gun_critEffc + bullet_critEffc
|
||||
local combined_velocity = gun_velocity + bullet_velocity
|
||||
local combined_projNum = math.ceil(gun_projectiles * bullet_projMult)
|
||||
local combined_mobPen = gun_mobPen + bullet_mobPen
|
||||
local combined_nodePen = gun_nodePen + bullet_nodePen
|
||||
local combined_dps = gun_dps + bullet_dps
|
||||
local combined_dmg = {}
|
||||
local combined_gravity = gun_gravity + bullet_gravity
|
||||
|
||||
for _, gunDmg in pairs(gun_damage) do
|
||||
if bullet_damage[_] ~= nil then
|
||||
combined_dmg[_] = gun_damage[_] + bullet_damage[_]
|
||||
else
|
||||
combined_dmg[_] = gun_damage[_]
|
||||
end
|
||||
end
|
||||
for _, bulletDmg in pairs(bullet_damage) do
|
||||
if gun_damage[_] == nil then
|
||||
combined_dmg[_] = bullet_damage[_]
|
||||
end
|
||||
end
|
||||
|
||||
--minetest.chat_send_all(minetest.serialize(combined_dmg))
|
||||
|
||||
if gun_skill ~= "" then
|
||||
skill_value = playerMeta:get_int(gun_skill)/100
|
||||
else
|
||||
skill_value = 1
|
||||
end
|
||||
|
||||
rangedweapons_launch_projectile(player,combined_projNum,combined_dmg,bullet_ent,bullet_visual,bullet_texture,gun_sound,combined_velocity,gun_accuracy,skill_value,OnCollision,combined_crit,combined_critEffc,combined_mobPen,combined_nodePen,gun_shell,bullet_shell_ent,bullet_shell_texture,bullet_shell_visual,combined_dps,combined_gravity,gun_door_breaking,bullet_glass_breaking,bullet_particles,bullet_sparks,bullet_bomb_ignite,bullet_size,gun_smokeSize,0,bullet_glow)
|
||||
|
||||
if rweapons_gun_durability == "true" then
|
||||
itemstack:add_wear(65535/gun_durability)
|
||||
end
|
||||
itemstack:set_name(gun_cooling)
|
||||
|
||||
end
|
||||
end end
|
||||
|
||||
|
||||
|
||||
|
||||
rangedweapons_shoot_powergun = function(itemstack, player)
|
||||
|
||||
if minetest.find_node_near(player:getpos(), 10,"rangedweapons:antigun_block")
|
||||
then
|
||||
minetest.sound_play("rangedweapons_empty", {player})
|
||||
minetest.chat_send_player(player:get_player_name(), "" ..core.colorize("#ff0000","Guns are prohibited in this area!"))
|
||||
else
|
||||
local power_cooldown = 0
|
||||
|
||||
PowerCaps = itemstack:get_definition().RW_powergun_capabilities
|
||||
|
||||
if PowerCaps ~= nil then
|
||||
power_cooldown = PowerCaps.power_cooldown or 0
|
||||
power_consumption = PowerCaps.power_consumption or 0
|
||||
end
|
||||
|
||||
local inv = player:get_inventory()
|
||||
local playerMeta = player:get_meta()
|
||||
|
||||
if inv:contains_item("main", "rangedweapons:power_particle "..PowerCaps.power_consumption) and
|
||||
playerMeta:get_float("rw_cooldown") <= 0 then
|
||||
playerMeta:set_float("rw_cooldown", power_cooldown)
|
||||
|
||||
local OnCollision = function() end
|
||||
|
||||
local power_damage = {fleshy=1}
|
||||
local power_sound = "rangedweapons_laser"
|
||||
local power_velocity = 20
|
||||
local power_accuracy = 100
|
||||
local power_cooling = 0
|
||||
local power_crit = 0
|
||||
local power_critEffc = 1
|
||||
local power_mobPen = 0
|
||||
local power_nodePen = 0
|
||||
local power_durability = 0
|
||||
local power_dps = 0
|
||||
local power_gravity = 0
|
||||
local power_door_breaking = 0
|
||||
local power_skill = ""
|
||||
local power_skillChance = 0
|
||||
local power_ent = "rangedweapons:shot_bullet"
|
||||
local power_visual = "wielditem"
|
||||
local power_texture = "rangedweapons:shot_bullet_visual"
|
||||
local power_glass_breaking = 0
|
||||
local power_particles = {}
|
||||
local power_sparks = 0
|
||||
local power_bomb_ignite = 0
|
||||
local power_size = 0
|
||||
local power_glow = 20
|
||||
|
||||
if PowerCaps ~= nil then
|
||||
power_damage = PowerCaps.power_damage or {fleshy=1}
|
||||
power_sound = PowerCaps.power_sound or "rangedweapons_glock"
|
||||
power_velocity = PowerCaps.power_velocity or 20
|
||||
power_accuracy = PowerCaps.power_accuracy or 100
|
||||
power_cooling = PowerCaps.power_cooling or itemstack:get_name()
|
||||
power_crit = PowerCaps.power_crit or 0
|
||||
power_critEffc = PowerCaps.power_critEffc or 1
|
||||
power_projectiles = PowerCaps.power_projectiles or 1
|
||||
power_mobPen = PowerCaps.power_mob_penetration or 0
|
||||
power_nodePen = PowerCaps.power_node_penetration or 0
|
||||
power_durability = PowerCaps.power_durability or 0
|
||||
power_dps = PowerCaps.power_dps or 0
|
||||
power_gravity = PowerCaps.power_gravity or 0
|
||||
power_door_breaking = PowerCaps.power_door_breaking or 0
|
||||
OnCollision = PowerCaps.OnCollision or function()end
|
||||
power_ent = PowerCaps.power_entity or "rangedweapons:shot_bullet"
|
||||
power_visual = PowerCaps.power_visual or "wielditem"
|
||||
power_texture = PowerCaps.power_texture or "rangedweapons:shot_bullet_visual"
|
||||
power_glass_breaking = PowerCaps.power_glass_breaking or 0
|
||||
power_particles = PowerCaps.power_particles or nil
|
||||
power_sparks = PowerCaps.has_sparks or 0
|
||||
power_bomb_ignite = PowerCaps.ignites_explosives or 0
|
||||
power_size = PowerCaps.power_projectile_size or 0.0025
|
||||
power_glow = PowerCaps.power_projectile_glow or 20
|
||||
|
||||
if PowerCaps.power_skill ~= nil then
|
||||
power_skill = PowerCaps.power_skill[1] or ""
|
||||
power_skillChance = PowerCaps.power_skill[2] or 0
|
||||
else
|
||||
power_skill = ""
|
||||
power_skillChance = 0
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if power_skillChance > 0 and power_skill ~= "" then
|
||||
rangedweapons_gain_skill(player,power_skill,power_skillChance)
|
||||
end
|
||||
|
||||
if power_skill ~= "" then
|
||||
skill_value = playerMeta:get_int(power_skill)/100
|
||||
else
|
||||
skill_value = 1
|
||||
end
|
||||
|
||||
rangedweapons_launch_projectile(player,power_projectiles,power_damage,power_ent,power_visual,power_texture,power_sound,power_velocity,power_accuracy,skill_value,OnCollision,power_crit,power_critEffc,power_mobPen,power_nodePen,0,"","","",power_dps,power_gravity,power_door_breaking,power_glass_breaking,power_particles,power_sparks,power_bomb_ignite,power_size,0,0,power_glow)
|
||||
|
||||
if rweapons_gun_durability == "true" then
|
||||
itemstack:add_wear(65535/power_durability)
|
||||
end
|
||||
itemstack:set_name(power_cooling)
|
||||
|
||||
inv:remove_item("main", "rangedweapons:power_particle "..PowerCaps.power_consumption)
|
||||
|
||||
end
|
||||
end end
|
||||
|
||||
rangedweapons_launch_projectile = function(player,projNum,projDmg,projEnt,visualType,texture,shoot_sound,combined_velocity,accuracy,skill_value,ColResult,projCrit,projCritEffc,mobPen,nodePen,has_shell,shellEnt,shellTexture,shellVisual,dps,gravity,door_break,glass_break,bullet_particles,sparks,ignite,size,smokeSize,proj_wear,proj_glow)
|
||||
|
||||
--minetest.chat_send_all(accuracy)
|
||||
|
||||
----------------------------------
|
||||
local pos = player:get_pos()
|
||||
local dir = player:get_look_dir()
|
||||
local yaw = player:get_look_yaw()
|
||||
local svertical = player:get_look_vertical()
|
||||
|
||||
if pos and dir and yaw then
|
||||
minetest.sound_play(shoot_sound, {player})
|
||||
pos.y = pos.y + 1.45
|
||||
|
||||
if has_shell > 0 then
|
||||
local shl = minetest.add_entity(pos, shellEnt)
|
||||
shl:setvelocity({x=dir.x * -10, y=dir.y * -10, z=dir.z * -10})
|
||||
shl:setacceleration({x=dir.x * -5, y= -10, z=dir.z * -5})
|
||||
shl:set_rotation({x=0,y=yaw + math.pi,z=-svertical})
|
||||
shl:set_properties({
|
||||
textures = {shellTexture},
|
||||
visual = shellVisual,})
|
||||
end
|
||||
if smokeSize > 0 then
|
||||
minetest.add_particle({
|
||||
pos = pos,
|
||||
velocity = {x=(dir.x*3)+(math.random(-10,10)/10), y=(dir.y*3)+(math.random(-10,10)/10), z=(dir.z*3)+(math.random(-10,10)/10)} ,
|
||||
acceleration = {x=dir.x * -3, y=2, z=dir.z * -3},
|
||||
expirationtime = math.random(5,10)/10,
|
||||
size = smokeSize,
|
||||
collisiondetection = false,
|
||||
vertical = false,
|
||||
texture = "tnt_smoke.png",
|
||||
glow = 5,
|
||||
})
|
||||
end
|
||||
|
||||
projectiles = projNum or 1
|
||||
for i=1,projectiles do
|
||||
rndacc = (100 - accuracy) or 0
|
||||
local spawnpos_x = pos.x + (math.random(-rndacc,rndacc)/100)
|
||||
local spawnpos_y = pos.y + (math.random(-rndacc,rndacc)/100)
|
||||
local spawnpos_z = pos.z + (math.random(-rndacc,rndacc)/100)
|
||||
|
||||
local obj = minetest.add_entity({x=spawnpos_x,y=spawnpos_y,z=spawnpos_z}, projEnt)
|
||||
local ent = obj:get_luaentity()
|
||||
|
||||
obj:set_properties(
|
||||
{textures = {texture},
|
||||
visual = visualType,
|
||||
collisionbox = {-size,-size,-size, size,size,size},
|
||||
glow = proj_glow,}
|
||||
)
|
||||
ent.owner = player:get_player_name()
|
||||
if obj then
|
||||
ent.damage = projDmg
|
||||
ent.crit = projCrit
|
||||
ent.critEffc = projCritEffc
|
||||
ent.OnCollision = ColResult
|
||||
ent.mobPen = mobPen
|
||||
ent.nodePen = nodePen
|
||||
ent.dps = dps
|
||||
ent.door_break = door_break
|
||||
ent.glass_break = glass_break
|
||||
ent.skill_value = skill_value
|
||||
ent.bullet_particles = bullet_particles
|
||||
ent.sparks = sparks
|
||||
ent.ignite = ignite
|
||||
ent.size = size
|
||||
ent.timer = 0 + (combined_velocity/2000)
|
||||
ent.wear = proj_wear
|
||||
obj:set_velocity({x=dir.x * combined_velocity, y=dir.y * combined_velocity, z=dir.z * combined_velocity})
|
||||
acc = ((( 100 - accuracy ) / 10) / skill_value ) or 0
|
||||
obj:set_acceleration({x=math.random(-acc,acc), y=math.random(-acc,acc)-gravity, z=math.random(-acc,acc)})
|
||||
obj:set_rotation({x=0,y=yaw + math.pi,z=-svertical})
|
||||
end end end
|
||||
|
||||
|
||||
end
|
||||
|
||||
eject_shell = function(itemstack,player,rld_item,rld_time,rldsound,shell)
|
||||
itemstack:set_name(rld_item)
|
||||
local meta = player:get_meta()
|
||||
meta:set_float("rw_cooldown", rld_time)
|
||||
|
||||
local gunMeta = itemstack:get_meta()
|
||||
|
||||
local bulletStack = ItemStack({name = gunMeta:get_string("RW_ammo_name")})
|
||||
|
||||
minetest.sound_play(rldsound, {player})
|
||||
local pos = player:get_pos()
|
||||
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:empty_shell")
|
||||
|
||||
if AmmoCaps and bulletStack ~= "" then
|
||||
AmmoCaps = bulletStack:get_definition().RW_ammo_capabilities
|
||||
|
||||
local bullet_shell_visual = "wielditem"
|
||||
local bullet_shell_texture = "rangedweapons:shelldrop"
|
||||
|
||||
bullet_shell_visual = AmmoCaps.shell_visual or "wielditem"
|
||||
bullet_shell_texture = AmmoCaps.shell_texture or "rangedweapons:shelldrop"
|
||||
|
||||
obj:set_properties({textures = {bullet_shell_texture}})
|
||||
obj:set_properties({visual = bullet_shell_visual})
|
||||
|
||||
end
|
||||
if obj then
|
||||
obj:set_velocity({x=dir.x*-10, y=dir.y*-10, z=dir.z*-10})
|
||||
obj:set_acceleration({x=dir.x*-5, y=-10, z=dir.z*-5})
|
||||
obj:set_yaw(yaw + math.pi)
|
||||
end end end
|
||||
---------------------------------------------------
|
||||
|
||||
|
||||
|
||||
dofile(modpath.."/settings.lua")
|
||||
dofile(modpath.."/cooldown_stuff.lua")
|
||||
dofile(modpath.."/skills.lua")
|
||||
dofile(modpath.."/misc.lua")
|
||||
dofile(modpath.."/bullet_knockback.lua")
|
||||
dofile(modpath.."/ammo.lua")
|
||||
dofile(modpath.."/crafting.lua")
|
||||
|
||||
if rweapons_shurikens == "true" then
|
||||
dofile(modpath.."/shurikens.lua")
|
||||
end
|
||||
|
||||
if rweapons_handguns == "true" then
|
||||
dofile(modpath.."/makarov.lua")
|
||||
dofile(modpath.."/luger.lua")
|
||||
dofile(modpath.."/beretta.lua")
|
||||
dofile(modpath.."/m1991.lua")
|
||||
dofile(modpath.."/glock17.lua")
|
||||
dofile(modpath.."/deagle.lua")
|
||||
end
|
||||
|
||||
if rweapons_forceguns == "true" then
|
||||
dofile(modpath.."/forcegun.lua")
|
||||
end
|
||||
|
||||
if rweapons_javelins == "true" then
|
||||
dofile(modpath.."/javelin.lua")
|
||||
end
|
||||
|
||||
if rweapons_power_weapons == "true" then
|
||||
dofile(modpath.."/generator.lua")
|
||||
dofile(modpath.."/laser_blaster.lua")
|
||||
dofile(modpath.."/laser_rifle.lua")
|
||||
dofile(modpath.."/laser_shotgun.lua")
|
||||
end
|
||||
|
||||
if rweapons_machine_pistols == "true" then
|
||||
dofile(modpath.."/tmp.lua")
|
||||
dofile(modpath.."/tec9.lua")
|
||||
dofile(modpath.."/uzi.lua")
|
||||
dofile(modpath.."/kriss_sv.lua")
|
||||
end
|
||||
if rweapons_shotguns == "true" then
|
||||
dofile(modpath.."/remington.lua")
|
||||
dofile(modpath.."/spas12.lua")
|
||||
dofile(modpath.."/benelli.lua")
|
||||
end
|
||||
if rweapons_auto_shotguns == "true" then
|
||||
dofile(modpath.."/jackhammer.lua")
|
||||
dofile(modpath.."/aa12.lua")
|
||||
end
|
||||
if rweapons_smgs == "true" then
|
||||
dofile(modpath.."/mp5.lua")
|
||||
dofile(modpath.."/ump.lua")
|
||||
dofile(modpath.."/mp40.lua")
|
||||
dofile(modpath.."/thompson.lua")
|
||||
end
|
||||
if rweapons_rifles == "true" then
|
||||
dofile(modpath.."/awp.lua")
|
||||
dofile(modpath.."/svd.lua")
|
||||
dofile(modpath.."/m200.lua")
|
||||
end
|
||||
if rweapons_heavy_machineguns == "true" then
|
||||
dofile(modpath.."/m60.lua")
|
||||
dofile(modpath.."/rpk.lua")
|
||||
dofile(modpath.."/minigun.lua")
|
||||
end
|
||||
if rweapons_revolvers == "true" then
|
||||
dofile(modpath.."/python.lua")
|
||||
dofile(modpath.."/taurus.lua")
|
||||
end
|
||||
if rweapons_assault_rifles == "true" then
|
||||
dofile(modpath.."/m16.lua")
|
||||
dofile(modpath.."/g36.lua")
|
||||
dofile(modpath.."/ak47.lua")
|
||||
dofile(modpath.."/scar.lua")
|
||||
end
|
||||
|
||||
if rweapons_explosives == "true" then
|
||||
dofile(modpath.."/explosives.lua")
|
||||
dofile(modpath.."/m79.lua")
|
||||
dofile(modpath.."/milkor.lua")
|
||||
dofile(modpath.."/rpg.lua")
|
||||
dofile(modpath.."/hand_grenade.lua")
|
||||
end
|
||||
|
||||
|
||||
if rweapons_glass_breaking == "true" then
|
||||
dofile(modpath.."/glass_breaking.lua")
|
||||
end
|
||||
if not minetest.settings:get_bool("glass_breaking") then
|
||||
minetest.register_abm({
|
||||
nodenames = {"rangedweapons:broken_glass"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node)
|
||||
if minetest.get_node(pos).name == "rangedweapons:broken_glass" then
|
||||
node.name = "default:glass"
|
||||
minetest.set_node(pos, node)
|
||||
end
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
local rangedweapons_empty_shell = {
|
||||
physical = false,
|
||||
timer = 0,
|
||||
visual = "wielditem",
|
||||
visual_size = {x=0.3, y=0.3},
|
||||
textures = {"rangedweapons:shelldrop"},
|
||||
lastpos= {},
|
||||
collisionbox = {0, 0, 0, 0, 0, 0},
|
||||
}
|
||||
rangedweapons_empty_shell.on_step = function(self, dtime, pos)
|
||||
self.timer = self.timer + dtime
|
||||
local pos = self.object:get_pos()
|
||||
local node = minetest.get_node(pos)
|
||||
if self.lastpos.y ~= nil then
|
||||
if minetest.registered_nodes[node.name]~= nil then
|
||||
if minetest.registered_nodes[node.name].walkable then
|
||||
local vel = self.object:get_velocity()
|
||||
local acc = self.object:get_acceleration()
|
||||
self.object:set_velocity({x=vel.x*-0.3, y=vel.y*-0.75, z=vel.z*-0.3})
|
||||
minetest.sound_play("rangedweapons_shellhit", {pos = self.lastpos, gain = 0.8})
|
||||
self.object:set_acceleration({x=acc.x, y=acc.y, z=acc.z})
|
||||
end end
|
||||
end
|
||||
if self.timer > 1.69 then
|
||||
minetest.sound_play("rangedweapons_bulletdrop", {pos = self.lastpos, gain = 0.8})
|
||||
self.object:remove()
|
||||
|
||||
end
|
||||
self.lastpos= {x = pos.x, y = pos.y, z = pos.z}
|
||||
end
|
||||
|
||||
minetest.register_entity("rangedweapons:empty_shell", rangedweapons_empty_shell )
|
||||
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"doors:hidden"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node)
|
||||
pos.y = pos.y-1
|
||||
if minetest.get_node(pos).name == "air" then
|
||||
pos.y = pos.y+1
|
||||
node.name = "air"
|
||||
minetest.set_node(pos, node)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
gunammo =
|
||||
player:hud_add({
|
||||
hud_elem_type = "text",
|
||||
name = "gunammo",
|
||||
text = "",
|
||||
number = 0xFFFFFF,
|
||||
scale = {x = 100, y = 20},
|
||||
position = {x = 0.7, y = 0.1},
|
||||
offset = {x = 30, y = 100},
|
||||
alignment = {x = 0, y = -1}
|
||||
})
|
||||
gunimg =
|
||||
player:hud_add({
|
||||
hud_elem_type = "image",
|
||||
text = "rangedweapons_empty_icon.png",
|
||||
scale = {x = 2, y = 2},
|
||||
position = {x = 0.7, y = 0.065},
|
||||
offset = {x = 30, y = 100},
|
||||
alignment = {x = 0, y = -1}
|
||||
})
|
||||
ammoimg =
|
||||
player:hud_add({
|
||||
hud_elem_type = "image",
|
||||
text = "rangedweapons_empty_icon.png",
|
||||
scale = {x = 1.5, y = 1.5},
|
||||
position = {x = 0.725, y = 0.1},
|
||||
offset = {x = 30, y = 100},
|
||||
alignment = {x = 0, y = -1}
|
||||
})
|
||||
hit =
|
||||
player:hud_add({
|
||||
hud_elem_type = "image",
|
||||
text = "rangedweapons_empty_icon.png",
|
||||
scale = {x = 2, y = 2},
|
||||
position = {x = 0.5, y = 0.5},
|
||||
offset = {x = 0, y = 0},
|
||||
alignment = {x = 0, y = 0}
|
||||
})
|
||||
scope_hud =
|
||||
player:hud_add({
|
||||
hud_elem_type = "image",
|
||||
position = { x=0.5, y=0.5 },
|
||||
scale = { x=-100, y=-100 },
|
||||
text = "rangedweapons_empty_icon.png",
|
||||
})
|
||||
end)
|
||||
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime, player)
|
||||
timer = timer + dtime;
|
||||
if timer >= 1.0 then
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
player:hud_change(hit, "text", "rangedweapons_empty_icon.png")
|
||||
timer = 0
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
|
||||
|
||||
minetest.register_tool("rangedweapons:jackhammer_r", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=2.6,y=2.6,z=1.8},
|
||||
description = "",
|
||||
rw_next_reload = "rangedweapons:jackhammer_rr",
|
||||
load_sound = "rangedweapons_rifle_clip_in",
|
||||
range = 0,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
inventory_image = "rangedweapons_jackhammer_rld.png",
|
||||
})
|
||||
minetest.register_tool("rangedweapons:jackhammer_rr", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=2.6,y=2.6,z=1.8},
|
||||
description = "",
|
||||
rw_next_reload = "rangedweapons:jackhammer_rrr",
|
||||
load_sound = "rangedweapons_reload_a",
|
||||
range = 0,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
inventory_image = "rangedweapons_jackhammer.png",
|
||||
})
|
||||
minetest.register_tool("rangedweapons:jackhammer_rrr", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=2.6,y=2.6,z=1.8},
|
||||
description = "",
|
||||
rw_next_reload = "rangedweapons:jackhammer",
|
||||
load_sound = "rangedweapons_reload_b",
|
||||
range = 0,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
inventory_image = "rangedweapons_jackhammer.png",
|
||||
})
|
||||
-------------------------------------------
|
||||
|
||||
minetest.register_tool("rangedweapons:jackhammer", {
|
||||
stack_max= 1,
|
||||
wield_scale = {x=2.6,y=2.6,z=1.8},
|
||||
description = "" ..core.colorize("#35cdff","Jackhammer\n") ..core.colorize("#FFFFFF", "Ranged damage: 3\n") ..core.colorize("#FFFFFF", "projectiles: 8\n") ..core.colorize("#FFFFFF", "Gun gravity: 3\n") ..core.colorize("#FFFFFF", "accuracy: 35%\n") ..core.colorize("#FFFFFF", "knockback: 6\n") ..core.colorize("#FFFFFF", "Reload delay: 1.6\n") ..core.colorize("#FFFFFF", "Clip size: 10\n") ..core.colorize("#FFFFFF", "Critical chance: 7%\n") ..core.colorize("#FFFFFF", "Critical efficiency: 2.2x\n") ..core.colorize("#FFFFFF", "Ammunition: 12 gauge shell\n") ..core.colorize("#FFFFFF", "Rate of fire: 0.25 (full-auto)\n") ..core.colorize("#FFFFFF", "Gun type: shotgun\n") ..core.colorize("#FFFFFF", "Bullet velocity: 30"),
|
||||
range = 0,
|
||||
inventory_image = "rangedweapons_jackhammer.png",
|
||||
RW_gun_capabilities = {
|
||||
automatic_gun = 1,
|
||||
gun_damage = {fleshy=3,knockback=6},
|
||||
gun_crit = 7,
|
||||
gun_critEffc = 2.2,
|
||||
suitable_ammo = {{"rangedweapons:shell",10}},
|
||||
gun_skill = {"shotgun_skill",35},
|
||||
gun_magazine = "rangedweapons:drum_mag",
|
||||
gun_icon = "rangedweapons_jackhammer_icon.png",
|
||||
gun_unloaded = "rangedweapons:jackhammer_r",
|
||||
gun_velocity = 30,
|
||||
gun_accuracy = 35,
|
||||
gun_cooldown = 0.25,
|
||||
gun_reload = 1.6/4,
|
||||
gun_projectiles = 1,
|
||||
has_shell = 1,
|
||||
gun_durability = 825,
|
||||
gun_smokeSize = 9,
|
||||
gun_door_breaking = 1,
|
||||
gun_projectiles = 8,
|
||||
gun_gravity = 3,
|
||||
gun_unload_sound = "rangedweapons_rifle_clip_out",
|
||||
gun_sound = "rangedweapons_shotgun_shot",
|
||||
},
|
||||
on_secondary_use = function(itemstack, user, pointed_thing)
|
||||
rangedweapons_reload_gun(itemstack, user)
|
||||
return itemstack
|
||||
end,
|
||||
})
|
Loading…
Reference in New Issue