mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2026-11-12 23:54:53 +09:00
Framework: - Intervals are gone. Update periods are hardcoded on_nth_tick values again, since nobody has needed to change them. - apply is a single loop over the declared fields and logs a warning when an override is invalid. receive_update also warns about unknown keys. - Nested tables are addressed as "section.key". Lists of strings can be overridden. Features.optional declares a value with no default. - Features.on_apply rebuilds values derived from the config, such as lookup sets. It also runs during on_load. exp_roles is assumed to be present: - AFK Kick picks a role (active_role_id) instead of a custom check function. - Chat Auto Reply, Protection, and Nuke Protection no longer take a permission as a setting. New features, each chosen for an edge case: - Discord Alerts: conditional handlers, and a command map that becomes a list. - Entity Protection: lists turned into sets at load, and bookkeeping that must keep running while disabled. - Nuke Protection: config keyed by defines, flattened to a banned items list. - Popups: one config shared by two control files. - Spawn Area: nested sections, and settings that only apply when the map is created. Page: now laid out like the role page. It has a search across every setting, one long list with a sticky sidebar to jump between sections, and the enabled switch separated at the front of each header with Reset to defaults on the right. Changed rows are highlighted, and a bottom bar offers Revert and Apply. Role settings use a role picker and lists use a tag select. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 lines
1.8 KiB
Lua
53 lines
1.8 KiB
Lua
--[[-- Control - Damage PopUps
|
|
Displays the amount of dmg that is done by players to entities;
|
|
also shows player health when a player is attacked
|
|
]]
|
|
|
|
local FlyingText = require("modules/exp_util/flying_text")
|
|
local Features = require("modules/exp_scenario/features")
|
|
local config = require("modules/exp_scenario/config/popups")
|
|
|
|
local random = math.random
|
|
local floor = math.floor
|
|
local max = math.max
|
|
|
|
--- Called when entity entity is damaged including the player character
|
|
--- @param event EventData.on_entity_damaged
|
|
local function on_entity_damaged(event)
|
|
local message
|
|
local cause = event.cause
|
|
local entity = event.entity
|
|
|
|
-- Check which message to display
|
|
if config.show_player_health and entity.name == "character" then
|
|
message = { "exp_damage-popup.flying-text-health", floor(entity.health) }
|
|
elseif config.show_player_damage and entity.name ~= "character" and cause and cause.name == "character" then
|
|
message = { "exp_damage-popup.flying-text-damage", floor(event.original_damage_amount) }
|
|
end
|
|
|
|
-- Outputs the message as floating text
|
|
if message then
|
|
local entity_position = entity.position
|
|
local entity_radius = max(1, entity.get_radius())
|
|
local offset = (random() - 0.5) * entity_radius * config.damage_location_variance
|
|
local position = { x = entity_position.x + offset, y = entity_position.y - entity_radius }
|
|
|
|
local health_percentage = assert(entity.get_health_ratio())
|
|
local color = { r = 1 - health_percentage, g = health_percentage, b = 0 }
|
|
|
|
FlyingText.create{
|
|
text = message,
|
|
position = position,
|
|
color = color,
|
|
}
|
|
end
|
|
end
|
|
|
|
local e = defines.events
|
|
|
|
return Features.guard(config, {
|
|
events = {
|
|
[e.on_entity_damaged] = on_entity_damaged,
|
|
},
|
|
})
|