- Java 100%
|
All checks were successful
Build EkaiiTweaks / build (push) Successful in 1m8s
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 |
||
|---|---|---|
| .forgejo/workflows | ||
| gradle/wrapper | ||
| src/main | ||
| .gitattributes | ||
| .gitignore | ||
| build.gradle | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle | ||
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 /onehit — EntityDamageByEntityEvent, 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 /ignoreentity — BlockCanBuildEvent#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).