149 lines
5.0 KiB
Lua

local this = {}
local util = scripts.util
local metatables = scripts.metatables
local config = require("config")
local helpers = scripts.helpers
local _ = helpers.on
local function getSprite(item)
return "item/"..item
end
local function getShortCount(count)
if count == nil then return 0 end
if count >= 1000000000 then return (math.floor(count / 1000000) / 10).."G" end
if count >= 1000000 then return (math.floor(count / 10000) / 10).."M" end
if count >= 1000 then return (math.floor(count / 100) / 10).."K" end
return count
end
local function getCountColor(count)
if count == 0 or count == nil then
return config.colors.insufficientItems
else
return config.colors.default
end
end
function helpers:mark(player, item, count) -- create highlight-box marker with item and count
if item ~= nil then
local box = _(self.selection_box)
local width = box:boxwidth()
local height = box:boxheight()
local scale = 0.63 * math.min(width, height)
return {
box = self.surface.create_entity{
name = "highlight-box",
position = self.position,
source = self:toPlain(),
render_player_index = player and player.index,
box_type = "electricity",
blink_interval = 0,
},
bg = rendering.draw_sprite{
sprite = "utility/entity_info_dark_background",
render_layer = "selection-box",
target = self:toPlain(),
target_offset = self.type == "spider-vehicle" and {0,-box:boxheight()*3/4} or nil,
players = player and {player:toPlain()},
surface = self.surface,
x_scale = scale,
y_scale = scale,
},
icon = rendering.draw_sprite{
sprite = getSprite(item),
render_layer = "selection-box",
target = self:toPlain(),
target_offset = self.type == "spider-vehicle" and {0,-box:boxheight()*3/4} or nil,
players = player and {player:toPlain()},
surface = self.surface,
x_scale = scale,
y_scale = scale,
},
text = rendering.draw_text({
text = getShortCount(count),
target = self:toPlain(),
target_offset = self.type == "spider-vehicle" and {0,-box:boxheight()*3/4} or nil,
--target_offset = { -0.9 * width * 0.5, -0.9 * height * 0.5 },
players = player and {player:toPlain()},
surface = self.surface,
alignment = "center",
color = getCountColor(count),
})
}
else
-- blink animation
self.surface.create_entity{
name = "highlight-box",
position = self.position,
source = self:toPlain(),
render_player_index = player and player.index,
box_type = "electricity",
blink_interval = 6,
time_to_live = 60 * 1,
}
end
end
function this.update(marker, item, count, color)
if marker then
rendering.set_sprite(marker.icon, getSprite(item))
rendering.set_text(marker.text, getShortCount(count))
rendering.set_color(marker.text, color or getCountColor(count))
end
end
function helpers:unmark() -- destroy distribution marker of entity
if self:is("object") then return self:is("valid") and self.destroy() end
local source, player
self:where("table", function(__, marker)
marker.destroy()
end)
:where("number", function(__, id)
if rendering.is_valid(id) then
if not source and rendering.get_target(id) then source = _(rendering.get_target(id).entity) end
if not player and rendering.get_players(id) then player = _(rendering.get_players(id)[1]) end
rendering.destroy(id)
end
end)
if source and player and source:is("valid") and player:is("valid player") then source:mark(player) end
end
function this.unmark(cache) -- destroy all distribution markers of a player (using cache)
_(cache.markers):each(function(markers)
_(markers):unmark()
end)
cache.markers = metatables.new("entityAsIndex")
end
function helpers:destroyTransferText() -- remove flying text from stack transfer
local surface = self.surface
local pos = self.position
util.destroyIfValid(surface.find_entities_filtered{
name = "flying-text",
area = {{pos.x, pos.y-1}, {pos.x, pos.y+0.5}},
limit = 1
}[1])
end
function helpers:spawnDistributionText(item, amount, offY, color) -- spawn distribution text on entity
local surface = self.surface
local pos = self.position
surface.create_entity{ -- spawn text
name = "distribution-text",
position = { pos.x - 0.5, pos.y + (offY or 0) },
text = {"", " ", -amount, " ", game.item_prototypes[item].localised_name},
color = color or config.colors.default
}
end
return this