Per-player creative experience tweaks for creaclone (Lophine 26.2/Folia) — opt-in replacements for global Carpet rules
Find a file
wait4mi 5b99d79326
All checks were successful
Build EkaiiTweaks / build (push) Successful in 1m8s
CI Forgejo : build sur main, release sur tag v*
Workflow calqué sur Ekaii/ekaii-regions (runner lesannes-ubuntu, container
node:20-bookworm --network host, actions via https://github.com/). Le job
vérifie que le tag correspond à version= dans build.gradle avant de publier.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TNceymDaJhiiAB12NTiqxG
2026-09-05 23:50:25 +02:00
.forgejo/workflows CI Forgejo : build sur main, release sur tag v* 2026-09-05 23:50:25 +02:00
gradle/wrapper EkaiiTweaks 1.1.0: /noclip per-joueur (opt-out du creativeNoClip client Carpet) 2026-09-05 23:37:48 +02:00
src/main EkaiiTweaks 1.1.1: enregistrer carpet:hello sur le joueur avant l'envoi 2026-09-05 23:44:26 +02:00
.gitattributes EkaiiTweaks 1.1.0: /noclip per-joueur (opt-out du creativeNoClip client Carpet) 2026-09-05 23:37:48 +02:00
.gitignore EkaiiTweaks 1.0.0: per-player creative experience tweaks for creaclone 2026-07-19 00:43:08 +02:00
build.gradle EkaiiTweaks 1.1.1: enregistrer carpet:hello sur le joueur avant l'envoi 2026-09-05 23:44:26 +02:00
gradlew EkaiiTweaks 1.1.0: /noclip per-joueur (opt-out du creativeNoClip client Carpet) 2026-09-05 23:37:48 +02:00
gradlew.bat EkaiiTweaks 1.1.0: /noclip per-joueur (opt-out du creativeNoClip client Carpet) 2026-09-05 23:37:48 +02:00
README.md CI Forgejo : build sur main, release sur tag v* 2026-09-05 23:50:25 +02:00
settings.gradle EkaiiTweaks 1.0.0: per-player creative experience tweaks for creaclone 2026-07-19 00:43:08 +02:00

EkaiiTweaks

Tweaks d'expérience créatif per-joueur pour creaclone (Lophine 26.2 / Folia). Remplace les règles Carpet globales "expérience" par des équivalents opt-in, off par défaut, que chaque joueur active pour lui seul — plus un opt-out per-joueur du noclip.

Commandes (permission ekaii.tweaks.use, default true)

Commande Effet (toujours limité au joueur qui l'exécute, créa uniquement)
/tweaks (alias /mytweaks) Liste l'état ON/OFF de tes tweaks, lignes cliquables pour toggle
/tweaks <id> [on|off] Toggle/force un tweak
/onehit Coup fatal : tes attaques mêlée tuent instantanément (cibles non créa/spec)
/nocooldown Aucun cooldown d'objet (ender pearls, chorus, boucliers…)
/opencontainer Ouvre les coffres / enderchests / shulkers bloqués
/ignoreentity Pose des blocs même si une entité occupe la place
/noclip Traverser les blocs en vol créa — ON par défaut, à couper si ton client Carpet te fait traverser sans le vouloir

Persistance : PersistentDataContainer du joueur (survit reco/restart, rien à réappliquer). Une clé n'est écrite que si le choix diffère du défaut du tweak (1 = ON, 0 = OFF). Folia-safe : folia-supported: true, event-driven, schedulers d'entité uniquement.

Correspondance avec les règles Carpet de Lophine (investigation 2026-07-19, noclip 2026-09-05)

Règle Carpet (globale) Implémentation Lophine Décision
creativeOneHitKill Serveur-forcé : Player#attack court-circuité, Entity#kill direct pour TOUT joueur créa Plugin /onehitEntityDamageByEntityEvent, dégâts létaux (2e6, létal après 80% de réduction max). Diff assumées : pas de sweep sneak, les totems fonctionnent encore
creativeNoItemCooldown Serveur-forcé : return dans ServerItemCooldowns#addCooldown AVANT le PlayerItemCooldownEvent de Paper Plugin /nocooldown — règle globale OFF ⇒ l'event Paper fire et est cancellable per-joueur
creativeOpenContainerForcibly Serveur-forcé : bypass des checks "blocked" dans ChestBlock / EnderChestBlock / ShulkerBoxBlock Plugin /opencontainer — pas de hook Bukkit à cet endroit ⇒ détection par observation (2 ticks après l'interaction, rien d'ouvert = bloqué) puis ouverture via l'API Bukkit (passe par InventoryOpenEvent). Cosmétique : vue générique, pas d'animation de couvercle
blockPlacementIgnoreEntity Serveur-forcé : bypass du check collision-entité dans BlockItem#useOn Plugin /ignoreentityBlockCanBuildEvent#setBuildable(true) seulement si une entité intersecte réellement la position (le verdict vanilla couvre aussi canSurvive, on ne l'écrase pas aveuglément)
creativeNoClip Patch Leaves 0116 : noPhysics = spectator || (règle && créa && vol) — le serveur ne fait qu'ACCEPTER ; le déplacement à travers les blocs est exécuté par le CLIENT (mod Carpet, règle synchronisée via CarpetServerProtocol). Un client vanilla collisionne localement et ne traverse rien Plugin /noclip (opt-OUT, défaut ON) — règle globale laissée ON (sinon le serveur refuserait le mouvement des clients qui veulent noclip). Le joueur qui coupe reçoit sur le canal carpet:hello un paquet Rules/creativeNoClip = false (même format NBT que Leaves : {Manager: "carpet", Rule, Value}) ; le mixin client Player_creativeNoClipMixin réévalue noPhysics chaque tick depuis cette valeur ⇒ effet immédiat, réversible en renvoyant true. Renvoyé 3 s et 10 s après join / enregistrement du canal (pour atterrir après le paquet Rules de Leaves) et à chaque toggle. Zéro NMS. Piège (1.1.1) : le mod Carpet n'utilise pas Fabric API et n'enregistre jamais carpet:hello via minecraft:register, or CraftPlayer#sendPluginMessage jette silencieusement tout message sur un canal non enregistré par le client ⇒ le plugin ajoute lui-même le canal au joueur (CraftPlayer#addChannel, réflexion sur une classe CraftBukkit publique) avant l'envoi. Client sans Carpet : payload inconnu ignoré côté client

Règles passées à false dans creaclone/lophine_config/lophine_carpet_config.toml (live) : creativeOneHitKill, creativeNoItemCooldown, creativeOpenContainerForcibly, blockPlacementIgnoreEntity. creativeNoClip reste true. Les mécaniques de monde (update suppression, redstone, observer, xpNoCooldown, etc.) restent globales et intactes.

Sources du format carpet:hello : Leaves org.leavesmc.leaves.protocol.CarpetServerProtocol (CarpetRule#writeNBT, codec ByteBufCodecs.COMPOUND_TAG), Lophine fun.bm.lophine.carpet.CarpetProtocalDataBase (enregistre ("carpet", "creativeNoClip", …)), Carpet carpet.network.ClientNetworkHandler (handler "Rules").

Extension

Ajouter un tweak per-joueur = une constante dans Tweak (id, description, défaut) + un listener gaté sur TweakManager#isActive(player, tweak) (+ la commande raccourci dans plugin.yml si voulu). Rien d'autre.

Build et release

./gradlew build   # → build/libs/EkaiiTweaks-<version>.jar (Java 25)

CI Forgejo (.forgejo/workflows/build.yml, runner ubuntu-latest) : chaque push sur main compile (contrôle). Une release se décide à la main en poussant un tag égal à la version de build.gradle : git tag v1.1.1-ekaii26.2 && git push origin v1.1.1-ekaii26.2 → la CI vérifie tag = version, builde et publie la release avec le jar. Côté infra, exo/ekaii-mc-stack (plugins/manifest.yml, creaclone) référence cette release en type: forgejo-release (repo, tag, artifact) et le sync télécharge le jar tout seul (restart creaclone manuel, service Coolify).