From 1265f5d6051fbf7942be2a913870bdd1bd5f24fe Mon Sep 17 00:00:00 2001 From: Sho Sakuma Date: Mon, 23 Feb 2026 16:42:38 +0900 Subject: chore: Support folia debug-server --- docker/.gitignore | 2 - docker/bukkit.yml | 43 ------------- docker/compose.yaml | 130 --------------------------------------- docker/folia/.gitignore | 1 + docker/folia/bukkit.yml | 43 +++++++++++++ docker/folia/compose.yaml | 47 ++++++++++++++ docker/paper-global.yml | 8 --- docker/velocity.toml | 124 ------------------------------------- docker/velocity/.gitignore | 2 + docker/velocity/bukkit.yml | 43 +++++++++++++ docker/velocity/compose.yaml | 130 +++++++++++++++++++++++++++++++++++++++ docker/velocity/paper-global.yml | 8 +++ docker/velocity/velocity.toml | 124 +++++++++++++++++++++++++++++++++++++ x | 94 ++++++++++++++++++++++------ 14 files changed, 472 insertions(+), 327 deletions(-) delete mode 100644 docker/.gitignore delete mode 100644 docker/bukkit.yml delete mode 100644 docker/compose.yaml create mode 100644 docker/folia/.gitignore create mode 100644 docker/folia/bukkit.yml create mode 100644 docker/folia/compose.yaml delete mode 100644 docker/paper-global.yml delete mode 100644 docker/velocity.toml create mode 100644 docker/velocity/.gitignore create mode 100644 docker/velocity/bukkit.yml create mode 100644 docker/velocity/compose.yaml create mode 100644 docker/velocity/paper-global.yml create mode 100644 docker/velocity/velocity.toml diff --git a/docker/.gitignore b/docker/.gitignore deleted file mode 100644 index 4c0fc30..0000000 --- a/docker/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -plugins-paper-*/ -plugins-velocity/ diff --git a/docker/bukkit.yml b/docker/bukkit.yml deleted file mode 100644 index 2f44ae9..0000000 --- a/docker/bukkit.yml +++ /dev/null @@ -1,43 +0,0 @@ -# This is the Bukkit configuration file in Paper. -# As you can see, there's actually not that much to configure without any plugins. -# -# If you need help with the configuration or have any questions related to Paper, -# join us in our Discord or check the docs page. -# -# File Reference: https://docs.papermc.io/paper/reference/bukkit-configuration/ -# Docs: https://docs.papermc.io/ -# Discord: https://discord.gg/papermc -# Website: https://papermc.io/ - -spawn-limits: - monsters: 70 - animals: 10 - water-animals: 5 - water-ambient: 20 - water-underground-creature: 5 - axolotls: 5 - ambient: 15 -chunk-gc: - period-in-ticks: 600 -ticks-per: - animal-spawns: 400 - monster-spawns: 1 - water-spawns: 1 - water-ambient-spawns: 1 - water-underground-creature-spawns: 1 - axolotl-spawns: 1 - ambient-spawns: 1 - autosave: 6000 -aliases: now-in-commands.yml -settings: - warn-on-overload: true - permissions-file: permissions.yml - update-folder: update - plugin-profiling: false - connection-throttle: 4000 - query-plugins: true - deprecated-verbose: default - shutdown-message: Server closed - minimum-api: none - use-map-color-cache: true - allow-end: false diff --git a/docker/compose.yaml b/docker/compose.yaml deleted file mode 100644 index 2f3d5c9..0000000 --- a/docker/compose.yaml +++ /dev/null @@ -1,130 +0,0 @@ -services: - velocity: - image: itzg/mc-proxy:java21 - container_name: debug-velocity - ports: - - "25577:25577" - volumes: - - lunatic-debug-velocity-data:/server - - ./plugins-velocity:/server/plugins - - ./velocity.toml:/server/velocity.toml - environment: - TYPE: "VELOCITY" - MEMORY: "512M" - ONLINE_MODE: "false" - depends_on: - s1: - condition: service_healthy - s2: - condition: service_healthy - healthcheck: - test: mc-health - start_period: 60s - interval: 10s - timeout: 5s - retries: 3 - networks: - - minecraft-network - - s1: - image: itzg/minecraft-server:java21 - container_name: debug-server-s1 - expose: - - "25565" - ports: - - "25575:25575" - volumes: - - lunatic-debug-s1-data:/data - - ./plugins-paper-s1:/data/plugins - - ./bukkit.yml:/data/bukkit.yml - environment: - EULA: "TRUE" - TYPE: "PAPER" - VERSION: "1.21.11" - MEMORY: "1G" - - # デバッグ用高速化設定 - LEVEL_TYPE: "flat" - VIEW_DISTANCE: "3" - SIMULATION_DISTANCE: "3" - GENERATE_STRUCTURES: "false" - SPAWN_PROTECTION: "0" - ALLOW_NETHER: "false" - - # 権限関連 - OVERRIDE_SERVER_PROPERTIES: "true" - - ENABLE_RCON: "true" - RCON_PASSWORD: "minecraft" - RCON_PORT: 25575 - - DIFFICULTY: "peaceful" - MAX_PLAYERS: "3" - ONLINE_MODE: "false" - SYNC_SKIP_NEWER_IN_DESTINATION: "false" - networks: - - minecraft-network - healthcheck: - test: mc-health - start_period: 60s - interval: 10s - timeout: 5s - retries: 3 - tty: true - stdin_open: true - - s2: - image: itzg/minecraft-server:java21 - container_name: debug-server-s2 - expose: - - "25565" - ports: - - "25576:25575" - volumes: - - lunatic-debug-s2-data:/data - - ./plugins-paper-s2:/data/plugins - - ./bukkit.yml:/data/bukkit.yml - environment: - EULA: "TRUE" - TYPE: "PAPER" - VERSION: "1.21.11" - MEMORY: "1G" - - # デバッグ用高速化設定 - LEVEL_TYPE: "flat" - VIEW_DISTANCE: "3" - SIMULATION_DISTANCE: "3" - GENERATE_STRUCTURES: "false" - SPAWN_PROTECTION: "0" - ALLOW_NETHER: "false" - - # 権限関連 - OVERRIDE_SERVER_PROPERTIES: "true" - - ENABLE_RCON: "true" - RCON_PASSWORD: "minecraft" - RCON_PORT: 25575 - - DIFFICULTY: "peaceful" - MAX_PLAYERS: "3" - ONLINE_MODE: "false" - SYNC_SKIP_NEWER_IN_DESTINATION: "false" - networks: - - minecraft-network - healthcheck: - test: mc-health - start_period: 60s - interval: 10s - timeout: 5s - retries: 3 - tty: true - stdin_open: true - -networks: - minecraft-network: - driver: bridge - -volumes: - lunatic-debug-s1-data: - lunatic-debug-s2-data: - lunatic-debug-velocity-data: diff --git a/docker/folia/.gitignore b/docker/folia/.gitignore new file mode 100644 index 0000000..16873f6 --- /dev/null +++ b/docker/folia/.gitignore @@ -0,0 +1 @@ +plugins/ diff --git a/docker/folia/bukkit.yml b/docker/folia/bukkit.yml new file mode 100644 index 0000000..2f44ae9 --- /dev/null +++ b/docker/folia/bukkit.yml @@ -0,0 +1,43 @@ +# This is the Bukkit configuration file in Paper. +# As you can see, there's actually not that much to configure without any plugins. +# +# If you need help with the configuration or have any questions related to Paper, +# join us in our Discord or check the docs page. +# +# File Reference: https://docs.papermc.io/paper/reference/bukkit-configuration/ +# Docs: https://docs.papermc.io/ +# Discord: https://discord.gg/papermc +# Website: https://papermc.io/ + +spawn-limits: + monsters: 70 + animals: 10 + water-animals: 5 + water-ambient: 20 + water-underground-creature: 5 + axolotls: 5 + ambient: 15 +chunk-gc: + period-in-ticks: 600 +ticks-per: + animal-spawns: 400 + monster-spawns: 1 + water-spawns: 1 + water-ambient-spawns: 1 + water-underground-creature-spawns: 1 + axolotl-spawns: 1 + ambient-spawns: 1 + autosave: 6000 +aliases: now-in-commands.yml +settings: + warn-on-overload: true + permissions-file: permissions.yml + update-folder: update + plugin-profiling: false + connection-throttle: 4000 + query-plugins: true + deprecated-verbose: default + shutdown-message: Server closed + minimum-api: none + use-map-color-cache: true + allow-end: false diff --git a/docker/folia/compose.yaml b/docker/folia/compose.yaml new file mode 100644 index 0000000..dd3f38c --- /dev/null +++ b/docker/folia/compose.yaml @@ -0,0 +1,47 @@ +services: + folia: + image: itzg/minecraft-server:java21 + container_name: debug-folia + ports: + - "25565:25565" + - "25575:25575" + volumes: + - lunatic-debug-folia-data:/data + - ./plugins:/data/plugins + - ./bukkit.yml:/data/bukkit.yml + environment: + EULA: "TRUE" + TYPE: "FOLIA" + VERSION: "1.21.11" + MEMORY: "2G" + + # デバッグ用高速化設定 + LEVEL_TYPE: "flat" + VIEW_DISTANCE: "3" + SIMULATION_DISTANCE: "3" + GENERATE_STRUCTURES: "false" + SPAWN_PROTECTION: "0" + ALLOW_NETHER: "false" + + # 権限関連 + OVERRIDE_SERVER_PROPERTIES: "true" + + ENABLE_RCON: "true" + RCON_PASSWORD: "minecraft" + RCON_PORT: 25575 + + DIFFICULTY: "peaceful" + MAX_PLAYERS: "3" + ONLINE_MODE: "false" + SYNC_SKIP_NEWER_IN_DESTINATION: "false" + healthcheck: + test: mc-health + start_period: 90s + interval: 10s + timeout: 5s + retries: 3 + tty: true + stdin_open: true + +volumes: + lunatic-debug-folia-data: diff --git a/docker/paper-global.yml b/docker/paper-global.yml deleted file mode 100644 index 4c01c4e..0000000 --- a/docker/paper-global.yml +++ /dev/null @@ -1,8 +0,0 @@ -# Paper Global Configuration -# https://docs.papermc.io/paper/reference/global-configuration - -proxies: - velocity: - enabled: true - online-mode: false - secret: "" diff --git a/docker/velocity.toml b/docker/velocity.toml deleted file mode 100644 index 1b5b374..0000000 --- a/docker/velocity.toml +++ /dev/null @@ -1,124 +0,0 @@ -# Config version. Do not change this -config-version = "2.7" - -# What port should the proxy be bound to? By default, we'll bind to all addresses on port 25577. -bind = "0.0.0.0:25577" - -# What should be the MOTD? This gets displayed when the player adds your server to -# their server list. Only MiniMessage format is accepted. -motd = "<#09add3>LunaticChat Debug Server" - -# What should we display for the maximum number of players? (Velocity does not support a cap -# on the number of players online.) -show-max-players = 3 - -# Should we authenticate players with Mojang? By default, this is on. -online-mode = false - -# Should the proxy enforce the new public key security standard? By default, this is on. -force-key-authentication = false - -# If client's ISP/AS sent from this proxy is different from the one from Mojang's -# authentication server, the player is kicked. This disallows some VPN and proxy -# connections but is a weak form of protection. -prevent-client-proxy-connections = false - -# Should we forward IP addresses and other data to backend servers? -# Available options: -# - "none": No forwarding will be done. All players will appear to be connecting -# from the proxy and will have offline-mode UUIDs. -# - "legacy": Forward player IPs and UUIDs in a BungeeCord-compatible format. Use this -# if you run servers using Minecraft 1.12 or lower. -# - "bungeeguard": Forward player IPs and UUIDs in a format supported by the BungeeGuard -# plugin. Use this if you run servers using Minecraft 1.12 or lower, and are -# unable to implement network level firewalling (on a shared host). -# - "modern": Forward player IPs and UUIDs as part of the login process using -# Velocity's native forwarding. Only applicable for Minecraft 1.13 or higher. -player-info-forwarding-mode = "NONE" - -# If you are using modern or BungeeGuard IP forwarding, configure a file that contains a unique secret here. -# The file is expected to be UTF-8 encoded and not empty. -forwarding-secret-file = "forwarding.secret" - -# Announce whether or not your server supports Forge. If you run a modded server, we -# suggest turning this on. -# -# If your network runs one modpack consistently, consider using ping-passthrough = "mods" -# instead for a nicer display in the server list. -announce-forge = false - -[query] -# Should Query be enabled? Query allows clients to request information about the server. -enabled = false - -# This is the map name that is reported to the query services. -map = "Velocity" - -# Whether plugins should be shown in query response by default or not -show-plugins = false - -[servers] -# Configure your servers here. Each key represents the server's name, and the value -# represents the IP address of the server to connect to. -s1 = "s1:25565" -s2 = "s2:25565" - -# In what order we should try servers when a player logs in or is kicked from a server. -try = [ - "s1" -] - -[forced-hosts] -# Configure your forced hosts here. - -[advanced] -# How large a Minecraft packet has to be before we compress it. Setting this to zero will -# compress all packets, and setting it to -1 will disable compression entirely. -compression-threshold = 256 - -# How much compression should be done (from 0-9). The default is -1, which uses the -# default level of 6. -compression-level = -1 - -# How fast (in milliseconds) are clients allowed to connect after the last connection? By -# default, this is three seconds. Disable this by setting this to 0. -login-ratelimit = 3000 - -# Specify a custom timeout for connection timeouts here. The default is five seconds. -connection-timeout = 5000 - -# Specify a read timeout for connections here. The default is 30 seconds. -read-timeout = 30000 - -# Enables compatibility with HAProxy's PROXY protocol. If you don't know what this is for, then -# don't enable it. -haproxy-protocol = false - -# Enables TCP fast open support on the proxy. Requires the proxy to run on Linux. -tcp-fast-open = false - -# Enables BungeeCord plugin messaging channel support on Velocity. -bungee-plugin-message-channel = true - -# Shows ping requests to the proxy from clients. -show-ping-requests = false - -# By default, Velocity will attempt to gracefully handle situations where the user unexpectedly -# loses connection to the server without an explicit disconnect message by attempting to fall the -# user back, except in the case of read timeouts. BungeeCord will disconnect the user instead. You -# can disable this setting to use the BungeeCord behavior. -failover-on-unexpected-server-disconnect = true - -# Declares the proxy commands to 1.13+ clients. -announce-proxy-commands = true - -# Enables the logging of commands -log-command-executions = false - -# Enables logging of player connections when connecting to the proxy, switching servers -# and disconnecting from the proxy. -log-player-connections = true - -# Allows players transferred from other hosts via the -# Transfer packet (Minecraft 1.20.5) to be received. -accepts-transfers = false diff --git a/docker/velocity/.gitignore b/docker/velocity/.gitignore new file mode 100644 index 0000000..4c0fc30 --- /dev/null +++ b/docker/velocity/.gitignore @@ -0,0 +1,2 @@ +plugins-paper-*/ +plugins-velocity/ diff --git a/docker/velocity/bukkit.yml b/docker/velocity/bukkit.yml new file mode 100644 index 0000000..2f44ae9 --- /dev/null +++ b/docker/velocity/bukkit.yml @@ -0,0 +1,43 @@ +# This is the Bukkit configuration file in Paper. +# As you can see, there's actually not that much to configure without any plugins. +# +# If you need help with the configuration or have any questions related to Paper, +# join us in our Discord or check the docs page. +# +# File Reference: https://docs.papermc.io/paper/reference/bukkit-configuration/ +# Docs: https://docs.papermc.io/ +# Discord: https://discord.gg/papermc +# Website: https://papermc.io/ + +spawn-limits: + monsters: 70 + animals: 10 + water-animals: 5 + water-ambient: 20 + water-underground-creature: 5 + axolotls: 5 + ambient: 15 +chunk-gc: + period-in-ticks: 600 +ticks-per: + animal-spawns: 400 + monster-spawns: 1 + water-spawns: 1 + water-ambient-spawns: 1 + water-underground-creature-spawns: 1 + axolotl-spawns: 1 + ambient-spawns: 1 + autosave: 6000 +aliases: now-in-commands.yml +settings: + warn-on-overload: true + permissions-file: permissions.yml + update-folder: update + plugin-profiling: false + connection-throttle: 4000 + query-plugins: true + deprecated-verbose: default + shutdown-message: Server closed + minimum-api: none + use-map-color-cache: true + allow-end: false diff --git a/docker/velocity/compose.yaml b/docker/velocity/compose.yaml new file mode 100644 index 0000000..2f3d5c9 --- /dev/null +++ b/docker/velocity/compose.yaml @@ -0,0 +1,130 @@ +services: + velocity: + image: itzg/mc-proxy:java21 + container_name: debug-velocity + ports: + - "25577:25577" + volumes: + - lunatic-debug-velocity-data:/server + - ./plugins-velocity:/server/plugins + - ./velocity.toml:/server/velocity.toml + environment: + TYPE: "VELOCITY" + MEMORY: "512M" + ONLINE_MODE: "false" + depends_on: + s1: + condition: service_healthy + s2: + condition: service_healthy + healthcheck: + test: mc-health + start_period: 60s + interval: 10s + timeout: 5s + retries: 3 + networks: + - minecraft-network + + s1: + image: itzg/minecraft-server:java21 + container_name: debug-server-s1 + expose: + - "25565" + ports: + - "25575:25575" + volumes: + - lunatic-debug-s1-data:/data + - ./plugins-paper-s1:/data/plugins + - ./bukkit.yml:/data/bukkit.yml + environment: + EULA: "TRUE" + TYPE: "PAPER" + VERSION: "1.21.11" + MEMORY: "1G" + + # デバッグ用高速化設定 + LEVEL_TYPE: "flat" + VIEW_DISTANCE: "3" + SIMULATION_DISTANCE: "3" + GENERATE_STRUCTURES: "false" + SPAWN_PROTECTION: "0" + ALLOW_NETHER: "false" + + # 権限関連 + OVERRIDE_SERVER_PROPERTIES: "true" + + ENABLE_RCON: "true" + RCON_PASSWORD: "minecraft" + RCON_PORT: 25575 + + DIFFICULTY: "peaceful" + MAX_PLAYERS: "3" + ONLINE_MODE: "false" + SYNC_SKIP_NEWER_IN_DESTINATION: "false" + networks: + - minecraft-network + healthcheck: + test: mc-health + start_period: 60s + interval: 10s + timeout: 5s + retries: 3 + tty: true + stdin_open: true + + s2: + image: itzg/minecraft-server:java21 + container_name: debug-server-s2 + expose: + - "25565" + ports: + - "25576:25575" + volumes: + - lunatic-debug-s2-data:/data + - ./plugins-paper-s2:/data/plugins + - ./bukkit.yml:/data/bukkit.yml + environment: + EULA: "TRUE" + TYPE: "PAPER" + VERSION: "1.21.11" + MEMORY: "1G" + + # デバッグ用高速化設定 + LEVEL_TYPE: "flat" + VIEW_DISTANCE: "3" + SIMULATION_DISTANCE: "3" + GENERATE_STRUCTURES: "false" + SPAWN_PROTECTION: "0" + ALLOW_NETHER: "false" + + # 権限関連 + OVERRIDE_SERVER_PROPERTIES: "true" + + ENABLE_RCON: "true" + RCON_PASSWORD: "minecraft" + RCON_PORT: 25575 + + DIFFICULTY: "peaceful" + MAX_PLAYERS: "3" + ONLINE_MODE: "false" + SYNC_SKIP_NEWER_IN_DESTINATION: "false" + networks: + - minecraft-network + healthcheck: + test: mc-health + start_period: 60s + interval: 10s + timeout: 5s + retries: 3 + tty: true + stdin_open: true + +networks: + minecraft-network: + driver: bridge + +volumes: + lunatic-debug-s1-data: + lunatic-debug-s2-data: + lunatic-debug-velocity-data: diff --git a/docker/velocity/paper-global.yml b/docker/velocity/paper-global.yml new file mode 100644 index 0000000..4c01c4e --- /dev/null +++ b/docker/velocity/paper-global.yml @@ -0,0 +1,8 @@ +# Paper Global Configuration +# https://docs.papermc.io/paper/reference/global-configuration + +proxies: + velocity: + enabled: true + online-mode: false + secret: "" diff --git a/docker/velocity/velocity.toml b/docker/velocity/velocity.toml new file mode 100644 index 0000000..1b5b374 --- /dev/null +++ b/docker/velocity/velocity.toml @@ -0,0 +1,124 @@ +# Config version. Do not change this +config-version = "2.7" + +# What port should the proxy be bound to? By default, we'll bind to all addresses on port 25577. +bind = "0.0.0.0:25577" + +# What should be the MOTD? This gets displayed when the player adds your server to +# their server list. Only MiniMessage format is accepted. +motd = "<#09add3>LunaticChat Debug Server" + +# What should we display for the maximum number of players? (Velocity does not support a cap +# on the number of players online.) +show-max-players = 3 + +# Should we authenticate players with Mojang? By default, this is on. +online-mode = false + +# Should the proxy enforce the new public key security standard? By default, this is on. +force-key-authentication = false + +# If client's ISP/AS sent from this proxy is different from the one from Mojang's +# authentication server, the player is kicked. This disallows some VPN and proxy +# connections but is a weak form of protection. +prevent-client-proxy-connections = false + +# Should we forward IP addresses and other data to backend servers? +# Available options: +# - "none": No forwarding will be done. All players will appear to be connecting +# from the proxy and will have offline-mode UUIDs. +# - "legacy": Forward player IPs and UUIDs in a BungeeCord-compatible format. Use this +# if you run servers using Minecraft 1.12 or lower. +# - "bungeeguard": Forward player IPs and UUIDs in a format supported by the BungeeGuard +# plugin. Use this if you run servers using Minecraft 1.12 or lower, and are +# unable to implement network level firewalling (on a shared host). +# - "modern": Forward player IPs and UUIDs as part of the login process using +# Velocity's native forwarding. Only applicable for Minecraft 1.13 or higher. +player-info-forwarding-mode = "NONE" + +# If you are using modern or BungeeGuard IP forwarding, configure a file that contains a unique secret here. +# The file is expected to be UTF-8 encoded and not empty. +forwarding-secret-file = "forwarding.secret" + +# Announce whether or not your server supports Forge. If you run a modded server, we +# suggest turning this on. +# +# If your network runs one modpack consistently, consider using ping-passthrough = "mods" +# instead for a nicer display in the server list. +announce-forge = false + +[query] +# Should Query be enabled? Query allows clients to request information about the server. +enabled = false + +# This is the map name that is reported to the query services. +map = "Velocity" + +# Whether plugins should be shown in query response by default or not +show-plugins = false + +[servers] +# Configure your servers here. Each key represents the server's name, and the value +# represents the IP address of the server to connect to. +s1 = "s1:25565" +s2 = "s2:25565" + +# In what order we should try servers when a player logs in or is kicked from a server. +try = [ + "s1" +] + +[forced-hosts] +# Configure your forced hosts here. + +[advanced] +# How large a Minecraft packet has to be before we compress it. Setting this to zero will +# compress all packets, and setting it to -1 will disable compression entirely. +compression-threshold = 256 + +# How much compression should be done (from 0-9). The default is -1, which uses the +# default level of 6. +compression-level = -1 + +# How fast (in milliseconds) are clients allowed to connect after the last connection? By +# default, this is three seconds. Disable this by setting this to 0. +login-ratelimit = 3000 + +# Specify a custom timeout for connection timeouts here. The default is five seconds. +connection-timeout = 5000 + +# Specify a read timeout for connections here. The default is 30 seconds. +read-timeout = 30000 + +# Enables compatibility with HAProxy's PROXY protocol. If you don't know what this is for, then +# don't enable it. +haproxy-protocol = false + +# Enables TCP fast open support on the proxy. Requires the proxy to run on Linux. +tcp-fast-open = false + +# Enables BungeeCord plugin messaging channel support on Velocity. +bungee-plugin-message-channel = true + +# Shows ping requests to the proxy from clients. +show-ping-requests = false + +# By default, Velocity will attempt to gracefully handle situations where the user unexpectedly +# loses connection to the server without an explicit disconnect message by attempting to fall the +# user back, except in the case of read timeouts. BungeeCord will disconnect the user instead. You +# can disable this setting to use the BungeeCord behavior. +failover-on-unexpected-server-disconnect = true + +# Declares the proxy commands to 1.13+ clients. +announce-proxy-commands = true + +# Enables the logging of commands +log-command-executions = false + +# Enables logging of player connections when connecting to the proxy, switching servers +# and disconnecting from the proxy. +log-player-connections = true + +# Allows players transferred from other hosts via the +# Transfer packet (Minecraft 1.20.5) to be received. +accepts-transfers = false diff --git a/x b/x index d8c998a..a1b5f29 100755 --- a/x +++ b/x @@ -2,51 +2,105 @@ set -e -DOCKER_COMPOSE="docker compose -f docker/compose.yaml" +DC_VELOCITY="docker compose -f docker/velocity/compose.yaml" +DC_FOLIA="docker compose -f docker/folia/compose.yaml" help() { cat < [options] -Commands: - start Build with gradlew and start docker compose +Velocity environment (Paper s1 + s2 + Velocity proxy): + start Build Paper+Velocity and start all containers start-s1 Build Paper and start only s1 container restart Restart s1, s2 and velocity containers - stop Stop docker compose - clean Stop docker compose and remove volumes + stop Stop velocity environment + clean Stop velocity environment and remove volumes rcon [server] Open rcon-cli for server container (default: s1) Available servers: s1, s2 logs [server] Show server container logs (default: s1) Available servers: s1, s2 - vlogs Show velocity container logs + vlogs Show velocity proxy container logs + +Folia environment (single Folia server): + folia start Build Paper and start Folia server + folia restart Restart Folia server + folia stop Stop Folia server + folia clean Stop Folia server and remove volumes + folia rcon Open rcon-cli for Folia server + folia logs Show Folia server logs + +General: help Show this help message EOF } +ensure_plugin_dir() { + mkdir -p "$1" +} + +# --- Folia commands --- +folia_cmd() { + case "${1:-}" in + start) + ./gradlew :platform-paper:clean :platform-paper:shadowJar + ensure_plugin_dir docker/folia/plugins + cp platform-paper/build/libs/*.jar docker/folia/plugins/ + $DC_FOLIA up + ;; + restart) + $DC_FOLIA restart folia + ;; + stop) + $DC_FOLIA down + ;; + clean) + $DC_FOLIA down -v + ;; + rcon) + $DC_FOLIA exec folia rcon-cli + ;; + logs) + $DC_FOLIA logs -f folia + ;; + *) + echo "Unknown folia command: ${1:-}" + echo "" + help + exit 1 + ;; + esac +} + +# --- Main --- case "${1:-}" in + folia) + folia_cmd "${2:-}" + ;; start) ./gradlew :platform-paper:clean :platform-paper:shadowJar :platform-velocity:clean :platform-velocity:shadowJar - # Copy built JARs to plugin directories - cp platform-paper/build/libs/*.jar docker/plugins-paper-s1/ - cp platform-paper/build/libs/*.jar docker/plugins-paper-s2/ - cp platform-velocity/build/libs/*.jar docker/plugins-velocity/ - $DOCKER_COMPOSE up + ensure_plugin_dir docker/velocity/plugins-paper-s1 + ensure_plugin_dir docker/velocity/plugins-paper-s2 + ensure_plugin_dir docker/velocity/plugins-velocity + cp platform-paper/build/libs/*.jar docker/velocity/plugins-paper-s1/ + cp platform-paper/build/libs/*.jar docker/velocity/plugins-paper-s2/ + cp platform-velocity/build/libs/*.jar docker/velocity/plugins-velocity/ + $DC_VELOCITY up ;; start-s1) ./gradlew :platform-paper:clean :platform-paper:shadowJar - # Copy built JAR to s1 plugin directory - cp platform-paper/build/libs/*.jar docker/plugins-paper-s1/ - $DOCKER_COMPOSE up s1 + ensure_plugin_dir docker/velocity/plugins-paper-s1 + cp platform-paper/build/libs/*.jar docker/velocity/plugins-paper-s1/ + $DC_VELOCITY up s1 ;; restart) - $DOCKER_COMPOSE restart s1 s2 velocity + $DC_VELOCITY restart s1 s2 velocity ;; stop) - $DOCKER_COMPOSE down + $DC_VELOCITY down ;; clean) - $DOCKER_COMPOSE down -v + $DC_VELOCITY down -v ;; rcon) SERVER="${2:-s1}" @@ -54,7 +108,7 @@ case "${1:-}" in echo "Error: Invalid server '$SERVER'. Available servers: s1, s2" exit 1 fi - $DOCKER_COMPOSE exec $SERVER rcon-cli + $DC_VELOCITY exec "$SERVER" rcon-cli ;; logs) SERVER="${2:-s1}" @@ -62,10 +116,10 @@ case "${1:-}" in echo "Error: Invalid server '$SERVER'. Available servers: s1, s2" exit 1 fi - $DOCKER_COMPOSE logs -f $SERVER + $DC_VELOCITY logs -f "$SERVER" ;; vlogs) - $DOCKER_COMPOSE logs -f velocity + $DC_VELOCITY logs -f velocity ;; help|"") help -- cgit v1.2.1 From ea90554c8b3c92699e903d492de1a67cfb4d5ec5 Mon Sep 17 00:00:00 2001 From: Sho Sakuma Date: Mon, 23 Feb 2026 16:43:04 +0900 Subject: feat: Support Folia platform --- .../m1sk9/lunaticChat/paper/ServiceInitializer.kt | 25 ++++++----- .../paper/chat/channel/ChannelMessageLogger.kt | 50 ++++++++++++---------- .../paper/chat/channel/ChannelStorage.kt | 19 ++++---- .../lunaticChat/paper/converter/ConversionCache.kt | 9 ++-- .../paper/settings/YamlPlayerSettingsStorage.kt | 9 ++-- platform-paper/src/main/resources/paper-plugin.yml | 1 + 6 files changed, 61 insertions(+), 52 deletions(-) diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceInitializer.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceInitializer.kt index 0af6ed8..73657a1 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceInitializer.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceInitializer.kt @@ -23,6 +23,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.plugin.java.JavaPlugin +import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean import java.util.logging.Logger import kotlin.time.Duration.Companion.milliseconds @@ -337,12 +338,13 @@ class ServiceInitializer( // Only perform handshake once if (!handshakeCompleted.getAndSet(true)) { // Schedule handshake 1 second after first player joins - plugin.server.scheduler.runTaskLater( + plugin.server.asyncScheduler.runDelayed( plugin, - Runnable { + { performVelocityHandshake(event.player, manager) }, - 20L, + 1, + TimeUnit.SECONDS, ) } } @@ -408,17 +410,20 @@ class ServiceInitializer( /** * Schedules periodic tasks such as cache saving. + * Uses Folia-compatible AsyncScheduler API. */ fun schedulePeriodicTasks() { if (configuration.features.japaneseConversion.enabled && conversionCache != null) { - val saveInterval = configuration.features.japaneseConversion.cacheSaveIntervalSeconds * 20L - plugin.server.scheduler.runTaskTimerAsynchronously( + val intervalSeconds = + configuration.features.japaneseConversion + .cacheSaveIntervalSeconds + .toLong() + plugin.server.asyncScheduler.runAtFixedRate( plugin, - Runnable { - conversionCache?.saveToDisk() - }, - saveInterval, - saveInterval, + { conversionCache?.saveToDisk() }, + intervalSeconds, + intervalSeconds, + TimeUnit.SECONDS, ) } } diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelMessageLogger.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelMessageLogger.kt index 206968c..a100d93 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelMessageLogger.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelMessageLogger.kt @@ -2,6 +2,7 @@ package dev.m1sk9.lunaticChat.paper.chat.channel import dev.m1sk9.lunaticChat.engine.chat.channel.ChannelMessageLogEntry import io.ktor.util.logging.Logger +import io.papermc.paper.threadedregions.scheduler.ScheduledTask import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import org.bukkit.plugin.Plugin @@ -13,6 +14,7 @@ import java.time.LocalDate import java.time.ZoneOffset import java.time.format.DateTimeFormatter import java.util.concurrent.ConcurrentLinkedQueue +import java.util.concurrent.TimeUnit import kotlin.io.path.deleteIfExists import kotlin.io.path.fileSize import kotlin.io.path.listDirectoryEntries @@ -39,16 +41,16 @@ class ChannelMessageLogger( ) { private val pendingEntries = ConcurrentLinkedQueue() private val json = Json { encodeDefaults = true } - private var flushTaskId: Int? = null - private var cleanupTaskId: Int? = null + private var flushTask: ScheduledTask? = null + private var cleanupTask: ScheduledTask? = null companion object { private const val LOG_FILE_PREFIX = "channel-messages-" private const val LOG_FILE_EXTENSION = ".json" private val DATE_FORMATTER: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - private const val FLUSH_INTERVAL_TICKS = 20L // 1 second - private const val CLEANUP_INTERVAL_TICKS = 24 * 60 * 60 * 20L // 24 hours - private const val CLEANUP_INITIAL_DELAY_TICKS = 5 * 60 * 20L // 5 minutes + private const val FLUSH_INTERVAL_SECONDS = 1L + private const val CLEANUP_INTERVAL_SECONDS = 24 * 60 * 60L // 24 hours + private const val CLEANUP_INITIAL_DELAY_SECONDS = 5 * 60L // 5 minutes } init { @@ -74,20 +76,22 @@ class ChannelMessageLogger( /** * Schedules periodic flushing of pending log entries. + * Uses Folia-compatible AsyncScheduler API. */ private fun schedulePeriodicFlush() { - flushTaskId = - plugin.server.scheduler - .runTaskTimerAsynchronously( - plugin, - Runnable { flushPendingEntries() }, - FLUSH_INTERVAL_TICKS, - FLUSH_INTERVAL_TICKS, - ).taskId + flushTask = + plugin.server.asyncScheduler.runAtFixedRate( + plugin, + { flushPendingEntries() }, + FLUSH_INTERVAL_SECONDS, + FLUSH_INTERVAL_SECONDS, + TimeUnit.SECONDS, + ) } /** * Schedules periodic cleanup of old log files. + * Uses Folia-compatible AsyncScheduler API. */ private fun schedulePeriodicCleanup() { if (retentionDays <= 0) { @@ -95,14 +99,14 @@ class ChannelMessageLogger( return } - cleanupTaskId = - plugin.server.scheduler - .runTaskTimerAsynchronously( - plugin, - Runnable { cleanupOldLogs(retentionDays) }, - CLEANUP_INITIAL_DELAY_TICKS, - CLEANUP_INTERVAL_TICKS, - ).taskId + cleanupTask = + plugin.server.asyncScheduler.runAtFixedRate( + plugin, + { cleanupOldLogs(retentionDays) }, + CLEANUP_INITIAL_DELAY_SECONDS, + CLEANUP_INTERVAL_SECONDS, + TimeUnit.SECONDS, + ) logger.info("Scheduled log cleanup task (retention: $retentionDays days)") } @@ -159,8 +163,8 @@ class ChannelMessageLogger( */ fun shutdown() { // Cancel scheduled tasks - flushTaskId?.let { plugin.server.scheduler.cancelTask(it) } - cleanupTaskId?.let { plugin.server.scheduler.cancelTask(it) } + flushTask?.cancel() + cleanupTask?.cancel() // Flush remaining entries flushPendingEntries() diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelStorage.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelStorage.kt index 7176014..7a0c3c8 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelStorage.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelStorage.kt @@ -84,16 +84,13 @@ class ChannelStorage( * @throws ChannelStorageSaveException if there is an error saving the data. */ fun queueAsyncSave(data: ChannelData) { - plugin.server.scheduler.runTaskAsynchronously( - plugin, - Runnable { - try { - saveToDisk(data) - } catch (e: ChannelStorageSaveException) { - logger.severe("Error saving channel data asynchronously: ${e.message}") - e.printStackTrace() - } - }, - ) + plugin.server.asyncScheduler.runNow(plugin) { + try { + saveToDisk(data) + } catch (e: ChannelStorageSaveException) { + logger.severe("Error saving channel data asynchronously: ${e.message}") + e.printStackTrace() + } + } } } diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/converter/ConversionCache.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/converter/ConversionCache.kt index da79cfa..bab4e8d 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/converter/ConversionCache.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/converter/ConversionCache.kt @@ -2,10 +2,10 @@ package dev.m1sk9.lunaticChat.paper.converter import dev.m1sk9.lunaticChat.engine.converter.CacheData import kotlinx.serialization.json.Json -import org.bukkit.Bukkit import org.bukkit.plugin.java.JavaPlugin import java.nio.file.Path import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean import java.util.logging.Logger import kotlin.io.path.bufferedReader @@ -110,13 +110,14 @@ class ConversionCache( private fun queueSaveToDisk() { if (conversionSaveQueue.compareAndSet(false, true)) { - Bukkit.getScheduler().runTaskLaterAsynchronously( + plugin.server.asyncScheduler.runDelayed( plugin, - Runnable { + { conversionSaveQueue.set(false) saveToDisk() }, - 100L, // 5 seconds = 100 ticks + 5, + TimeUnit.SECONDS, ) } } diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/settings/YamlPlayerSettingsStorage.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/settings/YamlPlayerSettingsStorage.kt index 0aa8eef..5a2c8e2 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/settings/YamlPlayerSettingsStorage.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/settings/YamlPlayerSettingsStorage.kt @@ -2,9 +2,9 @@ package dev.m1sk9.lunaticChat.paper.settings import com.charleskorn.kaml.Yaml import dev.m1sk9.lunaticChat.engine.settings.PlayerSettingsData -import org.bukkit.Bukkit import org.bukkit.plugin.java.JavaPlugin import java.nio.file.Path +import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean import java.util.logging.Logger import kotlin.io.path.bufferedReader @@ -87,13 +87,14 @@ class YamlPlayerSettingsStorage( */ fun queueAsyncSave(data: PlayerSettingsData) { if (saveFlag.compareAndSet(false, true)) { - Bukkit.getScheduler().runTaskLaterAsynchronously( + plugin.server.asyncScheduler.runDelayed( plugin, - Runnable { + { saveFlag.set(false) saveToDisk(data) }, - 100L, // 5 seconds = 100 ticks + 5, + TimeUnit.SECONDS, ) } } diff --git a/platform-paper/src/main/resources/paper-plugin.yml b/platform-paper/src/main/resources/paper-plugin.yml index f8a804b..cd37c13 100644 --- a/platform-paper/src/main/resources/paper-plugin.yml +++ b/platform-paper/src/main/resources/paper-plugin.yml @@ -2,6 +2,7 @@ name: LunaticChat version: ${version} main: dev.m1sk9.lunaticChat.paper.LunaticChat api-version: '1.21' +folia-supported: true prefix: LunaticChat load: STARTUP authors: [ m1sk9 ] -- cgit v1.2.1 From 8013a65eb770c7eb7fcab7376fd7cdea4413b630 Mon Sep 17 00:00:00 2001 From: Sho Sakuma Date: Mon, 23 Feb 2026 17:43:48 +0900 Subject: fix: Fix debug-server script --- x | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/x b/x index a1b5f29..a52964c 100755 --- a/x +++ b/x @@ -45,6 +45,7 @@ folia_cmd() { start) ./gradlew :platform-paper:clean :platform-paper:shadowJar ensure_plugin_dir docker/folia/plugins + rm -f docker/folia/plugins/*.jar cp platform-paper/build/libs/*.jar docker/folia/plugins/ $DC_FOLIA up ;; @@ -82,6 +83,9 @@ case "${1:-}" in ensure_plugin_dir docker/velocity/plugins-paper-s1 ensure_plugin_dir docker/velocity/plugins-paper-s2 ensure_plugin_dir docker/velocity/plugins-velocity + rm -f docker/velocity/plugins-paper-s1/*.jar + rm -f docker/velocity/plugins-paper-s2/*.jar + rm -f docker/velocity/plugins-velocity/*.jar cp platform-paper/build/libs/*.jar docker/velocity/plugins-paper-s1/ cp platform-paper/build/libs/*.jar docker/velocity/plugins-paper-s2/ cp platform-velocity/build/libs/*.jar docker/velocity/plugins-velocity/ @@ -90,6 +94,7 @@ case "${1:-}" in start-s1) ./gradlew :platform-paper:clean :platform-paper:shadowJar ensure_plugin_dir docker/velocity/plugins-paper-s1 + rm -f docker/velocity/plugins-paper-s1/*.jar cp platform-paper/build/libs/*.jar docker/velocity/plugins-paper-s1/ $DC_VELOCITY up s1 ;; -- cgit v1.2.1 From 68c1eb05720f7c6d4fbf8d30d4b441125ad0860e Mon Sep 17 00:00:00 2001 From: Sho Sakuma Date: Mon, 23 Feb 2026 17:44:01 +0900 Subject: chore: Bump v0.10.0 --- CHANGELOG.md | 4 ++++ build.gradle.kts | 2 +- platform-paper/build.gradle.kts | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae9a946..b1f50b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## v0 +### v0.10.0 + +- Added support for Folia 1.21 and later. + ### v0.9.1 - Fixed an issue where update notification messages were not formatted correctly. diff --git a/build.gradle.kts b/build.gradle.kts index fb2b17c..a98c5e9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ plugins { allprojects { group = "dev.m1sk9" - version = "0.9.1" + version = "0.10.0" repositories { mavenCentral() diff --git a/platform-paper/build.gradle.kts b/platform-paper/build.gradle.kts index 972cce3..18eaf0f 100644 --- a/platform-paper/build.gradle.kts +++ b/platform-paper/build.gradle.kts @@ -29,7 +29,7 @@ dependencies { tasks { shadowJar { - archiveClassifier.set("paper") + archiveClassifier.set("") archiveBaseName.set("LunaticChat") } -- cgit v1.2.1 From 390a45b9a5af6c07f6c7dd37cd7e6208e2bbdcb1 Mon Sep 17 00:00:00 2001 From: Sho Sakuma Date: Mon, 23 Feb 2026 17:45:09 +0900 Subject: ci: add folia support to release and ci workflows Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/ci.yaml | 2 +- .github/workflows/release.yaml | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 455fb25..5ddd4d4 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -52,7 +52,7 @@ jobs: with: name: LunaticChat-${{ github.sha }} path: | - platform-paper/build/libs/LunaticChat-*-paper.jar + platform-paper/build/libs/LunaticChat-*.jar platform-velocity/build/libs/LunaticChat-*-velocity.jar retention-days: 7 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e94cfff..1fd9f27 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -12,6 +12,7 @@ jobs: version: ${{ steps.get_version.outputs.version }} paper_jar_name: ${{ steps.get_version.outputs.paper_jar_name }} velocity_jar_name: ${{ steps.get_version.outputs.velocity_jar_name }} + folia_jar_name: ${{ steps.get_version.outputs.folia_jar_name }} steps: - name: Checkout repository uses: actions/checkout@v6 @@ -21,8 +22,9 @@ jobs: run: | VERSION=$(grep ' version = ' build.gradle.kts | sed 's/.*version = "\(.*\)"/\1/') echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "paper_jar_name=LunaticChat-$VERSION-paper.jar" >> $GITHUB_OUTPUT + echo "paper_jar_name=LunaticChat-$VERSION.jar" >> $GITHUB_OUTPUT echo "velocity_jar_name=LunaticChat-$VERSION-velocity.jar" >> $GITHUB_OUTPUT + echo "folia_jar_name=LunaticChat-$VERSION.jar" >> $GITHUB_OUTPUT echo "Extracted version: $VERSION" - name: Validate tag matches version @@ -83,6 +85,7 @@ jobs: env: MODRINTH_CHANNEL: beta MODRINTH_GAME_VERSIONS: "1.21.x" + MODRINTH_MC_VERSION: "1.21.11" steps: - name: Checkout repository uses: actions/checkout@v6 @@ -116,7 +119,7 @@ jobs: uses: cloudnode-pro/modrinth-publish@0a5268ad092d4727bb6424326746fa2fe88761ff # v2 with: token: ${{ secrets.MODRINTH_TOKEN }} - name: v${{ needs.validate.outputs.version }} (Paper v${{ env.MODRINTH_GAME_VERSIONS }}) + name: v${{ needs.validate.outputs.version }} (Paper v${{ env.MODRINTH_MC_VERSION }}) project: ${{ secrets.MODRINTH_PROJECT_ID }} version: ${{ needs.validate.outputs.version }}-paper channel: ${{ env.MODRINTH_CHANNEL }} @@ -126,11 +129,25 @@ jobs: game-versions: ${{ env.MODRINTH_GAME_VERSIONS }} files: platform-paper/build/libs/${{ needs.validate.outputs.paper_jar_name }} + - name: Publish to Modrinth (Folia) + uses: cloudnode-pro/modrinth-publish@0a5268ad092d4727bb6424326746fa2fe88761ff # v2 + with: + token: ${{ secrets.MODRINTH_TOKEN }} + name: v${{ needs.validate.outputs.version }} (Folia v${{ env.MODRINTH_MC_VERSION }}) + project: ${{ secrets.MODRINTH_PROJECT_ID }} + version: ${{ needs.validate.outputs.version }}-folia + channel: ${{ env.MODRINTH_CHANNEL }} + changelog: |- + Please refer to the [GitHub release](https://github.com/m1sk9/LunaticChat/releases/tag/v${{ needs.validate.outputs.version }}) for update details. + loaders: folia + game-versions: ${{ env.MODRINTH_GAME_VERSIONS }} + files: platform-paper/build/libs/${{ needs.validate.outputs.folia_jar_name }} + - name: Publish to Modrinth (Velocity) uses: cloudnode-pro/modrinth-publish@0a5268ad092d4727bb6424326746fa2fe88761ff # v2 with: token: ${{ secrets.MODRINTH_TOKEN }} - name: v${{ needs.validate.outputs.version }} (Velocity v${{ env.MODRINTH_GAME_VERSIONS }}) + name: v${{ needs.validate.outputs.version }} (Velocity) project: ${{ secrets.MODRINTH_PROJECT_ID }} version: ${{ needs.validate.outputs.version }}-velocity channel: ${{ env.MODRINTH_CHANNEL }} -- cgit v1.2.1