- Java 100%
Per-player, opt-in (off by default), PDC-persisted replacements for the global Lophine Carpet experience rules: /onehit (creativeOneHitKill), /nocooldown (creativeNoItemCooldown), /opencontainer (creativeOpenContainerForcibly), /ignoreentity (blockPlacementIgnoreEntity). creativeNoClip stays a global rule (client-executed, already per-player). Folia-safe: event-driven, entity schedulers only. Reason: Paul's decision — Carpet experience features must not be forced globally on creaclone; each player toggles them for themselves. |
||
|---|---|---|
| src/main | ||
| .gitignore | ||
| build.gradle | ||
| 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.
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 |
Persistance : PersistentDataContainer du joueur (survit reco/restart, rien à réappliquer).
Folia-safe : folia-supported: true, event-driven, schedulers d'entité uniquement.
Correspondance avec les règles Carpet de Lophine (investigation 2026-07-19)
| 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 |
PAS dans le plugin — déjà per-joueur de fait (seuls les clients moddés noclipent, en vol créa). Règle globale laissée ON. Aucune API Bukkit pour noPhysics per-joueur ⇒ un gating plugin serait du NMS lourd pour rien |
Règles passées à false dans creaclone/lophine_config/lophine_carpet_config.toml (live) :
creativeOneHitKill, creativeNoItemCooldown, creativeOpenContainerForcibly,
blockPlacementIgnoreEntity. Les mécaniques de monde (update suppression, redstone,
observer, xpNoCooldown, etc.) restent globales et intactes.
Extension
Ajouter un tweak per-joueur = une constante dans Tweak + un listener gaté sur
TweakManager#isActive(player, tweak) (+ la commande raccourci dans plugin.yml
si voulu). Rien d'autre.
Build
export JAVA_HOME=/opt/homebrew/opt/openjdk/libexec/openjdk.jdk/Contents/Home
gradle build # → build/libs/EkaiiTweaks-<version>.jar