Page 1 of 1

Mod giving Nil error/not working

Posted: Tue Feb 09, 2021 5:06 pm
by MrAlwaysAwesome
Hi everyone, my friend and I revived an old mod called KS Combat... We got permissions from the owner and updated it. the problem is that when the mod was released there was no capsules in the game, so we started and managed to write some code. Iam not a professional coder. can someone please help us out? Url for the mod working but without capsules. (https://mods.factorio.com/mod/KS_Combat_Updated) and this is the code that is not working with image of error(Check Below).

Code: Select all

--Make capsules/grenades throw in an arc!

local old_posion =
{
  type = "capsule",
  name = "poison-capsule",
  icon = "__base__/graphics/icons/poison-capsule.png",
  icon_size = 32,
  capsule_action =
  {
    type = "throw",
    attack_parameters =
    {
      type = "projectile",
      ammo_category = "capsule",
      cooldown = 30,
      projectile_creation_distance = 0.6,
      range = 25,
      ammo_type =
      {
        category = "capsule",
        target_type = "position",
        action =
        {
          type = "direct",
          action_delivery =
          {
            type = "projectile",
            projectile = "poison-capsule",
            starting_speed = 0.3
          }
        }
      }
    }
  },
  subgroup = "capsule",
  order = "b[poison-capsule]",
  stack_size = 100
}

local fire_stream ={
  type = "stream",
  name = "flamethrower-fire-stream",
  flags = {"not-on-map"},
  stream_light = {intensity = 1, size = 4},
  ground_light = {intensity = 0.8, size = 4},

  smoke_sources =
  {
    {
      name = "soft-fire-smoke",
      frequency = 0.05, --0.25,
      position = {0.0, 0}, -- -0.8},
      starting_frame_deviation = 60
    }
  },
  particle_buffer_size = 90,
  particle_spawn_interval = 2,
  particle_spawn_timeout = 8,
  particle_vertical_acceleration = 0.005 * 0.60,
  particle_horizontal_speed = 0.2* 0.75 * 1.5,
  particle_horizontal_speed_deviation = 0.005 * 0.70,
  particle_start_alpha = 0.5,
  particle_end_alpha = 1,
  particle_start_scale = 0.2,
  particle_loop_frame_count = 3,
  particle_fade_out_threshold = 0.9,
  particle_loop_exit_threshold = 0.25,
  action =
  {
    {
      type = "area",
      radius = 2.5,
      action_delivery =
      {
        type = "instant",
        target_effects =
        {
          {
            type = "create-sticker",
            sticker = "fire-sticker"
          },
          {
            type = "damage",
            damage = { amount = 3, type = "fire" },
            apply_damage_to_trees = false
          }
        }
      }
    },
    {
      type = "direct",
      action_delivery =
      {
        type = "instant",
        target_effects =
        {
          {
            type = "create-fire",
            entity_name = "fire-flame",
            show_in_tooltip = true
          }
        }
      }
    }
  },

  spine_animation =
  {
    filename = "__base__/graphics/entity/flamethrower-fire-stream/flamethrower-fire-stream-spine.png",
    blend_mode = "additive",
    --tint = {r=1, g=1, b=1, a=0.5},
    line_length = 4,
    width = 32,
    height = 18,
    frame_count = 32,
    axially_symmetrical = false,
    direction_count = 1,
    animation_speed = 2,
    shift = {0, 0}
  },

  shadow =
  {
    filename = "__base__/graphics/entity/acid-projectile/projectile-shadow.png",
    line_length = 5,
    width = 28,
    height = 16,
    frame_count = 33,
    priority = "high",
    shift = {-0.09, 0.395}
  },

  particle =
  {
    filename = "__base__/graphics/entity/flamethrower-fire-stream/flamethrower-explosion.png",
    priority = "extra-high",
    width = 64,
    height = 64,
    frame_count = 32,
    line_length = 8
  }
}

local stream_ammo_type =
{
  category = "flamethrower",
  action =
  {
    type = "direct",
    action_delivery =
    {
      type = "stream",
      stream = "flamethrower-fire-stream",
      source_offset = {0.15, -0.5}
    }
  }
}


attack_parameters =
{
  type = "projectile",
  ammo_category = "capsule",
  cooldown = 30,
  projectile_creation_distance = 0.6,
  range = 25,
  ammo_type =
  {
    category = "capsule",
    target_type = "position",
    action =
    {
      type = "direct",
      action_delivery =
      {
        type = "projectile",
        projectile = "poison-capsule",
        starting_speed = 0.3
      }
    }
  }
}

local make_capsule_stream = function(attack_parameters)
  local ammo_type = attack_parameters.ammo_type
  local root_projectile
  local root_speed
  if ammo_type and ammo_type.action and ammo_type.action.action_delivery.type == "projectile" then
    root_projectile = ammo_type.action.action_delivery.projectile
    root_speed = ammo_type.action.action_delivery.starting_speed
  end
  if not root_projectile and root_speed then return end
  local projectile_prototype = data.raw.projectile[root_projectile]
  if not projectile_prototype then return end

  root_speed = math.max(root_speed, 0.1)
  --root_speed = root_speed + (300 * root_speed * (projectile_prototype.acceleration or 0))
  if projectile_prototype.max_speed then
    root_speed = math.min(root_speed, projectile_prototype.max_speed)
  end

  local stream =
  {
    type = "stream",
    name = projectile_prototype.name.."-stream",
    particle = (projectile_prototype.animation and projectile_prototype.animation[1]) or projectile_prototype.animation,
    shadow = (projectile_prototype.shadow and projectile_prototype.shadow[1]) or projectile_prototype.shadow,
    particle_buffer_size = 1,
    particle_spawn_interval = 0,
    particle_spawn_timeout = 1,
    particle_vertical_acceleration = 0.981 / 60,
    particle_horizontal_speed = root_speed,
    particle_horizontal_speed_deviation = root_speed * 0.1,
    particle_start_alpha = 1,
    particle_end_alpha = 1,
    particle_start_scale = 1,
    particle_loop_frame_count = 1,
    particle_fade_out_threshold = 1,
    particle_loop_exit_threshold = 1,
    smoke_sources = projectile_prototype.smoke,
    action = projectile_prototype.action,
    progress_to_create_smoke = 0,
    oriented_particle = true,
    stream_light = projectile_prototype.light
  }

  data:extend{stream}

  attack_parameters.ammo_type.action =
  {
    type = "direct",
    action_delivery =
    {
      type = "stream",
      stream = stream.name,
      source_offset = {0, -(projectile_prototype.height or 1)}
    }
  }

  return attack_parameters
end

local make_capsule_throw = function(capsule_item)
  local action = capsule_item.capsule_action
  local attack_parameters = make_capsule_stream(action.attack_parameters)
  if not attack_parameters then return end
  --error(serpent.block(attack_parameters))
  capsule_item.capsule_action.attack_parameters = attack_parameters

end

make_capsule_throw(data.raw.capsule["poison-capsule"])
make_capsule_throw(data.raw.capsule["slowdown-capsule"])
make_capsule_throw(data.raw.capsule["grenade"])
make_capsule_throw(data.raw.capsule["cluster-grenade"])
make_capsule_throw(data.raw.capsule["defender-capsule"])
make_capsule_throw(data.raw.capsule["distractor-capsule"])
make_capsule_throw(data.raw.capsule["destroyer-capsule"])
make_capsule_throw(data.raw.capsule["cliff-explosives"])

--for k, capsule in pairs (data.raw.capsule) do
  --if capsule.capsule_action.type == "throw" then
    --make_capsule_throw(capsule)
  --end
--end

Re: Mod giving Nil error/not working

Posted: Tue Feb 09, 2021 6:35 pm
by DaveMcW

Code: Select all

local make_capsule_stream = function(attack_parameters)
  local ammo_type = attack_parameters.ammo_type
  local root_projectile
  local root_speed
  if ammo_type and ammo_type.action and ammo_type.action.action_delivery.type == "projectile" then
You are validating ammo_type.action.action_delivery.type at levels 1, 2, and 4, but you forgot to validate it at level 3.

It should be:

Code: Select all

if ammo_type and ammo_type.action and ammo_type.action.action_delivery and ammo_type.action.action_delivery.type == "projectile" then

Re: Mod giving Nil error/not working

Posted: Tue Feb 09, 2021 8:14 pm
by Klonan
MrAlwaysAwesome wrote: Tue Feb 09, 2021 5:06 pm the problem is that when the mod was released there was no capsules in the game,
The original mod worked with grenades and capsules no problem, capsules have been in the game long before the mod was written

Re: Mod giving Nil error/not working

Posted: Wed Feb 10, 2021 5:46 am
by MrAlwaysAwesome
Klonan wrote: Tue Feb 09, 2021 8:14 pm
MrAlwaysAwesome wrote: Tue Feb 09, 2021 5:06 pm the problem is that when the mod was released there was no capsules in the game,
The original mod worked with grenades and capsules no problem, capsules have been in the game long before the mod was written
My Apologies Klonan I just added the message from our discord group XD didnt check it... Its for GreenLegoMan. Just helping him out.

Re: Mod giving Nil error/not working

Posted: Wed Feb 10, 2021 5:47 am
by MrAlwaysAwesome
DaveMcW wrote: Tue Feb 09, 2021 6:35 pm

Code: Select all

local make_capsule_stream = function(attack_parameters)
  local ammo_type = attack_parameters.ammo_type
  local root_projectile
  local root_speed
  if ammo_type and ammo_type.action and ammo_type.action.action_delivery.type == "projectile" then
You are validating ammo_type.action.action_delivery.type at levels 1, 2, and 4, but you forgot to validate it at level 3.

It should be:

Code: Select all

if ammo_type and ammo_type.action and ammo_type.action.action_delivery and ammo_type.action.action_delivery.type == "projectile" then
Thank you DaveMcW Ill test it out and check if things work out better this time. Thanks for your time :D