Hey, I'm trying to write a mod and want to create a turret that has an indicator for where it's going to shoot, see the sketch below. Is something like this possible with factorio modding?
If I can not do it with the attack_parameters, maybe I can create the target marker entity it during on_tick (Turrets do not fire an event when they shoot afaik). Is there some better documentation on attack_parameters and projectiles than the wiki? (since I have a hard time understanding it)
Also, unrelated question: Am I right to ask mod-making questions here or is there a better place?
[mod-making] Target marker for turrets
Re: [mod-making] Target marker for turrets
Moved to modding help
It should be possible with the attack parameters and trigger system, it can create entities and things.
You can add a script-trigger trigger effect to the turret, that way it will fire an event when it shoots
Re: [mod-making] Target marker for turrets
Hi Klonan, thank you for your answer! I played around with the attack parameters and actions and managed to get half-way there:
Currently (see 1) I am able to spawn a target indicator at the predicted target position. The predicted target position is computed the usual way - taking in account the projectile speed and the target movement. What currently does not work:
Thank you for your help - Aphlax
(1)
Currently (see 1) I am able to spawn a target indicator at the predicted target position. The predicted target position is computed the usual way - taking in account the projectile speed and the target movement. What currently does not work:
- The indicator spawns at the same time that the projectile is shot. I tried setting a warmup time, but the indicator does not spawn before that is completed.
- The projectile speed is currently slow, but eventually I want to have it fast. With the current implementation this would make it impossible to evade.
- The indicator should spawn exactly 1 second before the projectile arrives at the predicted target location (currently it spawns too fast to evade if you are close to the tower and too easy to evade if you are far away).
- Instead of firing a projectile, the tower just fires a script trigger. I get the source_entity and target_entity in on_script_trigger_effect.
- I can not use the target prediction of the tower since there is no way of telling it that I want the target at exactly 1s from now, so I'll have to compute it myself, which is easier since I assume the projectile speed is infinite.
- I spawn an indicator right away and then wait for 1s to spawn the projectile. (How do I wait for 1s?)
- There is no way with this method to animate the tower shooting (I want to add a powering-up animation for each shot).
Thank you for your help - Aphlax
(1)
Code: Select all
local tower = {
type = "turret",
name = "tower",
...,
attack_parameters = {
type = "projectile",
range = 16,
cooldown = 120,
lead_target_for_projectile_speed = 0.5,
ammo_type = {
category = "laser",
target_type = "position",
clamp_position = true,
action = {
type = "direct",
action_delivery = {
type = "projectile",
projectile = "tower-projectile",
starting_speed = 0.5,
target_effects = {
type = "create-entity",
entity_name = "tower-target-indicator"
}
},
}
}
}
}
local projectile = {
type = "projectile",
name = "tower-projectile",
...,
action = {
{
type = "direct",
action_delivery = {
type = "instant",
target_effects = {
{
type = "create-entity",
entity_name = "explosion"
}
}
}
},
{
type = "area",
radius = 2,
perimeter = 2,
action_delivery = {
type = "instant",
target_effects = {
{
type = "damage",
damage = {amount = 1, type = "explosion"}
}
}
}
}
}
}
local indicator = {
type = "corpse",
name = "tower-target-indicator",
time_before_removed = 120,
time_before_shading_off = 60,
...
}
data:extend({tower, projectile, indicator})
Re: [mod-making] Target marker for turrets
I moved now to a solution using script-triggers. I also changed to projectile to a beam, since create_entity with a projectile was not able to target a position (only entities with health are possible). Here is the final code if someone is interested:
data.lua
control.lua
data.lua
Code: Select all
local tower = {
type = "turret",
name = "tower",
...,
attack_parameters = {
type = "beam",
range = 16,
cooldown = 120,
ammo_type = {
category = "laser",
target_type = "entity",
action = {
type = "direct",
action_delivery = {
type = "instant",
target_effects = {
type = "script",
effect_id = "tower-shot"
}
},
}
}
}
}
local beam = {
type = "beam",
name = "tower-beam",
...,
action = {
{
type = "direct",
action_delivery = {
type = "instant",
target_effects = {
{
type = "create-entity",
entity_name = "explosion"
}
}
}
},
{
type = "area",
radius = 2,
perimeter = 2,
action_delivery = {
type = "instant",
target_effects = {
{
type = "damage",
damage = {amount = 1, type = "explosion"}
}
}
}
}
}
}
local indicator = {
type = "corpse",
name = "tower-target-indicator",
...,
time_before_removed = 120,
time_before_shading_off = 60
}
data:extend({tower, beam, indicator})
Code: Select all
script.on_event(defines.events.on_script_trigger_effect,
function (event)
if event.effect_id == "tower-shot" and event.target_entity ~= nil then
local first_position = event.target_entity.position
onTick(event.tick + 2, function(new_tick)
local second_position = event.target_entity.position
local target = v_add(first_position, v_scale(v_sub(second_position, first_position), 60))
game.get_surface(event.surface_index).create_entity({
name = "tower-target-indicator",
force = 'neutral',
position = target
})
onTick(new_tick + 60, function()
game.get_surface(event.surface_index).create_entity({
name = "tower-beam",
force = event.source_entity.force,
source = event.source_entity,
position = event.source_entity.position,
target_position = target,
source_offset = { x = 0, y = -3 },
duration = 10,
max_length = 16
})
end)
end)
end
end)