Yes, stickers can be applied multiple times - there's no deduplication. The functions just call surface.create_entity without checking for existing stickers:
local function apply_frozen_sticker(entity)
if entity and entity.valid then
entity.surface.create_entity{
name = "frozen-sticker",
target = entity,
position = entity.position
}
end
end
The tracking tables (frozen_entities, spotlight_frozen, thawing_entities) prevent the same entity from being re-frozen multiple times in normal gameplay, but the sticker refresh paths (on_configuration_changed, on_player_joined_game) will blindly reapply stickers.
In practice, Factorio generally handles this gracefully - applying the same sticker type to an entity that already has one typically refreshes/extends the duration rather than creating visual duplicates. But you're right that there's no explicit check. If you wanted to be defensive, you could check entity.stickers before applying:
local function has_sticker(entity, sticker_name)
if entity.stickers then
for _, sticker in pairs(entity.stickers) do
if sticker.valid and sticker.name == sticker_name then
return true
end
end
end
return false
end
But given Factorio's behavior, it's probably not necessary (at least for now! might change in a future Factorio update)