I created a different branch for development progress... Please try the current dev branch out... you will see that we blow up in an environment_Step (perhaps this is why we break?) Anyway, I hunted down quite a good deal of warnings and most of them could be easily fixed just by making whatever variable it was into local. (I also littered the code with comments stating the exact WARNING I got from the client)
1006 lines
31 KiB
Lua
1006 lines
31 KiB
Lua
|
|
|
|
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)
|
|
|
|
-- WARNING: Assignment to undeclared global "GunCaps" inside a function at mods/rangedweapons/init.lua:59.
|
|
-- I think GunCaps needs to be local
|
|
local 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")})
|
|
-- WARNING: Assignment to undeclared global "AmmoCaps" inside a function at mods/rangedweapons/init.lua:391.
|
|
-- Solution, Make local
|
|
local 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
|
|
-- Potential Warnings, see line 448
|
|
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
|
|
-- WARNING: Assignment to undeclared global "gun_projectiles" inside a function at mods/rangedweapons/init.lua:443.
|
|
local 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))
|
|
|
|
-- WARNING: Assignment to undeclared global "skill_value" inside a function at mods/rangedweapons/init.lua:527.
|
|
-- Solution, making a local with a default
|
|
|
|
local skill_value = 1 -- Defaulting to 1
|
|
|
|
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
|
|
local projectiles = 1 -- Defaults
|
|
local rndacc = 0 -- Defaults
|
|
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
|
|
-- WARNING: Assignment to undeclared global "projectiles" inside a function at mods/rangedweapons/init.lua:690.
|
|
-- I will add a local above this so it "exists"
|
|
projectiles = projNum or 1
|
|
for i=1,projectiles do
|
|
-- Reacurring Warning on line 701
|
|
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})
|
|
-- WARNING: Assignment to undeclared global "acc" inside a function at mods/rangedweapons/init.lua:725.
|
|
-- Making local
|
|
local 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)
|
|
-- WARNING: Assignment to undeclared global "gunammo" inside a function at mods/rangedweapons/init.lua:935
|
|
-- Solution, make it local... not global
|
|
local 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}
|
|
})
|
|
-- Reaccuring Warning see Line 927
|
|
local 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}
|
|
})
|
|
-- Reaccuring Warning see Line 927
|
|
local 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}
|
|
})
|
|
-- Reaccuring Warning see Line 927
|
|
local 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}
|
|
})
|
|
-- Reaccuring Warning see Line 927
|
|
local 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)
|
|
|