Commit Graph
113 Commits
Author SHA1 Message Date
phidias 496e867ff8 . 2026-11-12 15:30:06 +09:00
phidias cf02987fb9 . 2026-11-12 15:25:27 +09:00
phidias ccb3ba6d20 . 2026-11-12 14:17:37 +09:00
phidias 17bb1ffee9 s 2026-11-12 14:15:02 +09:00
phidias a6fa3a50dc s 2026-11-12 14:13:11 +09:00
phidias e1d806a77f . 2026-11-12 14:09:07 +09:00
phidias 015eb360cc . 2026-11-12 14:06:14 +09:00
phidias 0d9d8cbb45 . 2026-11-12 00:26:57 +09:00
phidias 7a6e0a1d0a . 2026-11-12 00:24:06 +09:00
phidias 9aa46eb812 . 2026-11-11 23:50:00 +09:00
phidias 1fa41500bd . 2026-11-11 23:47:43 +09:00
phidias c0d91811d4 . 2026-11-11 23:47:04 +09:00
phidias fe2c939f32 ctrl 2026-11-11 23:39:22 +09:00
phidias 4e80fccb69 feat 2026-11-11 20:05:19 +09:00
phidias cf156b41ca gui 2026-11-11 19:43:51 +09:00
phidias dfc173aff6 tooltip 2026-11-11 02:03:42 +09:00
phidias a549332a71 player 2026-11-11 01:51:42 +09:00
phidias abe11ae7ff comma 2026-11-11 01:47:43 +09:00
phidias f329ad0f3d . 2026-11-11 01:47:06 +09:00
phidias 876fe576da . 2026-11-11 01:42:21 +09:00
phidias 8b91fdc5cc . 2026-11-11 01:40:59 +09:00
phidias ae32c60b86 format 2026-11-11 01:38:57 +09:00
phidias e494cc878a less satisfaction 2026-11-11 01:33:42 +09:00
phidias 4c0eea6a50 gui % 2026-11-11 01:30:22 +09:00
phidias 681a908939 insert 2026-11-11 01:16:33 +09:00
phidias 9f6da77b6e elem data 2026-11-11 01:05:04 +09:00
phidias 81d89683c7 view 2026-11-11 00:47:58 +09:00
phidias 1e395f5893 e 2026-11-10 02:19:11 +09:00
phidias 52416e82c5 comma 2026-11-10 02:18:25 +09:00
phidias 131d3e41f2 . 2026-11-10 02:11:24 +09:00
phidias b34a183410 Merge branch 'main' into dev3 2026-11-10 00:12:52 +09:00
phidias 2ab8b0003e comma 2026-11-10 00:12:34 +09:00
phidias 66722c8291 vlayer surface and quality draft 2026-11-09 23:57:57 +09:00
phidias 26512eeb06 tick instead of second (#521) 2026-11-09 09:22:27 +00:00
phidias ce29218f14 Research Milestone (#517)
* new research milestone

* energy

* revert

* minute

* moving

* config
2026-11-07 15:19:42 +00:00
phidias 637e47bf8c Quick Action Locale (#518)
* quick action locale

* remove marking

* new ln
2026-11-07 15:18:47 +00:00
phidias d59e246278 fullscreen mode (#519) 2026-11-04 15:58:43 +00:00
BastiaanandClaude Opus 5.5 472db1e22a Fix unknown sprite on the readme join button (#510)
utility/downloading_white was a 1.1 sprite. Neither 2.0 nor 2.1 has it,
so drawing the readme for a modded server crashed on_player_created.
utility/downloading exists in both, so no version check is needed.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 16:14:40 +01:00
Cooldude2606 a7e66ccdd4 Remove collection of player locale (#508) 2026-10-16 13:55:06 +01:00
Bastiaan 55bdf72fff Merge pull request #504 from bbassie/refactor/remove-exp-legacy
Remove the exp_legacy plugin
2026-10-15 14:07:01 +01:00
bbassieandClaude Opus 5.5 ad1c83def8 Address review on the statistics plugin
The plugin is now exp_player_statistics (@expcluster/player-statistics),
with the module, global, permission, route and database directory
renamed to match. The exp-statistics locale section keeps its name.

Every statistic is tracked unconditionally, so the enable flags are gone
from config.lua. Playtime and JoinCount are no longer counted in game:
clusterio already keeps online time and joins for each user, so the
controller fills them in from the user when a player's totals are
requested, and the web page does the same from the user list. They are
not stored or adjusted by the plugin.

The web table has a column picker, a multiple select with check boxes,
Select all and Reset buttons, showing "N statistics selected". The
choice is kept in local storage. The user page shows the statistics of
the player in a grid like the core player stats.

The readme statistics table drops its second title and uses the short
time format.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 23:36:00 +00:00
bbassieandClaude Opus 5.5 27456e368c Show only statistics on the readme data tab
The tab listed the legacy player data, its required, settings and misc
groups and the data saving preference. None of that is synced or
relevant any more, so the tab is now Statistics and lists the totals
from exp_statistics in display order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:45:24 +00:00
bbassieandClaude Opus 5.5 237200e6c8 Use exp_statistics in place of the legacy statistics
Remove the tracking and config from exp_legacy along with its
exp-statistics locale, which now ships with exp_statistics.

The player stats GUI stays in exp_scenario and reads the new module. It
uses the online player dropdown from exp_scenario's elements, so moving
it would make exp_statistics depend on exp_scenario, and its
exp_scenario.gui.playerdata permission is already in the seeded roles.

The readme data tab shows the statistics from the new module above the
remaining PlayerData.Statistics children, which is only LocalLanguage
now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:45:15 +00:00
bbassieandClaude Opus 5.5 a6c453a88e Add a community_details feature for the community name and links
The community name, Discord, website, status, GitHub, and Patreon links
lived in exp_legacy/config/server_detail.lua, so changing them meant
editing the scenario. They are now the community_details feature and can
be edited from the Scenario Features page.

Chat auto reply, help bubbles, and the readme read the live config
instead of copying the values when the file loads, so an edit shows up
without a restart. Help bubbles store the location name in their task
and build the messages each cycle; the readme tab tooltip can be a
function which is called when the readme opens.

Every feature gets an enabled switch from the framework. There is no
sensible meaning for a disabled community name, so the values are
always used and the feature description says the switch does nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:10:22 +00:00
bbassieandClaude Opus 5.5 c0289ed8a7 Address review on exp_server_list
The controller and instance plugins are init functions with closures.
The controller batches refreshes with setMany and deleteMany, and the
instance gates updates on its status instead of a started flag.

short_name is now display_name. New always_on_top field sorts servers
first in get_servers. The record carries has_password from the game
password in factorio.settings, never the password itself, and the
description falls back to the one in factorio.settings. A controller
welcome is used when the instance has none, and the readme falls back
to a default welcome from the locale.

Lua gets is_synced for connect.lua. The readme passes an empty detail
instead of nil to the join tooltip so the player count stays in __2__,
restores the Password status, shows the welcome title as a centered
label and shortens long descriptions with the full text as a tooltip.

The Lua tests assert the lookups they index, which fixes the lint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:35:33 +00:00
bbassieandClaude Opus 5.5 4d136853c9 Add exp_server_list to replace expcore/external
The controller keeps a record per instance with its name, mod pack,
Factorio version, players online, status and address, and the instance
plugin pushes the list into lua over rcon. The readme and the connect
commands read it through modules/exp_server_list, so expcore/external
and its hardcoded server fallback are removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:35:33 +00:00
phidias 3ad9932f90 Update caption keys to use 'exp-gui_readme.data-format' (#495) 2026-10-13 10:05:48 +01:00
Bastiaan 757a36fc03 Merge pull request #486 from bbassie/feature/convert-configs
Convert the remaining scenario configs into features
2026-10-05 00:33:36 +01:00
bbassieandClaude Opus 5.5 628e4df514 Rework features into a Feature class with per field events
Review points from Cooldude:

- Feature.register(name[, config]) is required again and returns a
  feature object. Each feature has its config, its fields, and its
  overrides, so one registry holds all the data. Only the overrides are
  stored. On load each feature points at its own stored table again.
- The methods are feature:guard(lib), feature:update_config(enabled,
  values), and feature:is_enabled(). Feature.get(name) looks up a
  feature, and commands flag the feature object.
- update_config raises on_config_updated once per changed value, with
  the feature name, path, old value, and new value. The gui refresh only
  reacts to the "enabled" path.
- apply only sets values. on_apply is gone. Lookup sets built from
  lists use Feature.to_set, which is cached by the list itself. A
  replaced list gets a new set, so the sets are also correct after a
  load. Protection exposes getters for its protected names and types.

Web: settings use small inputs, the same size as the config pages.
Fields are shaped like clusterio config field definitions. A field
with an inputComponent renders the component registered with the web
interface, so the role setting now uses core's role input, and other
plugin inputs can be used later.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 13:03:11 +00:00
bbassieandClaude Opus 5.5 69e9f172a3 Cover guis, commands, and intervals in the features framework
Review feedback from Cooldude on the first version.

Features.register is renamed to Features.config, and guard also takes a
feature name so a feature without settings needs no config call.
Autofill uses this. Small configs now live at the top of the file that
uses them: death markers, mine depletion, station auto name, and
lawnmower. AFK kick and chat auto reply keep separate files because
they contain functions.

Periods no longer need a restart. A lib can list intervals, which map a
config key to a handler that runs every config[key] seconds. They are
checked once a second with a stateless tick check. AFK kick and death
markers use this and expose their periods on the page.

Guis: receive_update raises on_feature_changed, and control/features.lua
refreshes every player's gui when it fires. Autofill's toolbar button
checks Features.is_enabled, and hiding the button also hides its left
element. Quick actions refresh on the event too.

Commands: add_flags{ feature = ... } ties a command to a feature, and a
new authority denies it while the feature is disabled. The custom help
and quick actions already leave out denied commands. Lawnmower uses this
and is now added as a lib, so its destroy_decoratives handlers are
actually registered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 18:43:31 +00:00