Skip to main content

Cosmetics

EdenEffects has eight cosmetic types. A player can have one of each at once.

TypeConfig keyPermission prefixHow it works
Trailstrailsedeneffects.trail.Particles behind a walking player.
Hatshatsedeneffects.hat.A ring of particles circling above the head.
Wingswingsedeneffects.wings.A particle wing shape on the player's back.
Petspetsedeneffects.pet.A real vanilla mob that follows the player. See Pets.
Gadgetsgadgetsedeneffects.gadget.A hotbar item that does something when used. See Gadgets.
Join effectsjoinsedeneffects.join.A one-shot burst when the player joins.
Leave effectsleavesedeneffects.leave.A one-shot burst where they were standing when they leave.
Death effectsdeathsedeneffects.death.A one-shot burst where they died.

The ID of a cosmetic is what goes in its permission node and in the database.

Singular nodes, plural keys

Permission prefixes are singular (edeneffects.join.arrival), while config keys and command arguments are plural (cosmetics.joins, /cosmetics joins). Wings is plural in both.


Trails​

A trail leaves particles behind the player as they walk, with a bigger puff when they jump. Nothing is drawn while they stand still.

IDNameParticleMenu iconPermission
flameFlameFlameBlaze Powderedeneffects.trail.flame
heartsHeartsHeartPoppyedeneffects.trail.hearts
snowSnowSnowflakeSnowballedeneffects.trail.snow
notesMusic NotesNoteNote Blockedeneffects.trail.notes
The Flame trail behind a walking player
Flame - small flames flicker up from the ground at the player's feet, leaving a burning line along their path that dies out a moment after they pass.
The Hearts trail behind a walking player
Hearts - red hearts pop out behind the player at about waist height and float upward in little clusters before fading.
The Snow trail behind a walking player
Snow - a dusting of white snowflakes scatters across the ground behind the player, like light snow kicked up by their steps.
The Music Notes trail behind a walking player
Music Notes - green notes bob up behind the player a few at a time, drifting upward from knee height as they walk.

Hats​

A hat is a ring of particles turning slowly above the player's head. Hats are drawn with particles rather than worn as an item or an armour stand, so they add no entities and never replace a real helmet.

IDNameParticleMenu iconPermission
haloHaloEnd RodGold Ingotedeneffects.hat.halo
crownCrownWax OnGolden Helmetedeneffects.hat.crown
stormStorm CloudCloudLight Gray Wooledeneffects.hat.storm

The three hats turning above a player

Wings​

Wings are traced in particles behind the player and turn with them, so they stay on their back. They flap gently while the player moves around, and spread out while gliding with an elytra.

IDNameParticleMenu iconPermission
angelAngel WingsEnd RodFeatheredeneffects.wings.angel
emberEmber WingsFlameBlaze Rodedeneffects.wings.ember
verdantVerdant WingsHappy VillagerOak Leavesedeneffects.wings.verdant

Wings flapping and spreading while gliding

Join, leave, and death effects​

Three types of one-shot effect: a burst of particles and a sound played where the player is at the moment they join, leave, or die. They are chosen in the menu like any other cosmetic, saved in MySQL, and carried in presets.

Nothing is registered on the render loop for them. There is no per-tick work and nothing to clean up, so they cost nothing until the moment they fire.

Join​

IDNameParticleSoundMenu iconPermission
arrivalArrivalEnd RodAmethyst chimeEnd Rodedeneffects.join.arrival
bloomBloomHappy VillagerGrass breakBone Mealedeneffects.join.bloom
flareFlareFlameBlaze shootBlaze Powderedeneffects.join.flare
fanfareFanfareNoteNote block bellNote Blockedeneffects.join.fanfare

Join effects firing as a player joins

Leave​

IDNameParticleSoundMenu iconPermission
vanishVanishPortalEnderman teleportEnder Pearledeneffects.leave.vanish
smoke_puffSmoke PuffLarge SmokeFire extinguishGunpowderedeneffects.leave.smoke_puff
farewellFarewellHeartVillager yesPoppyedeneffects.leave.farewell

Leave effects firing as a player logs out

Death​

IDNameParticleSoundMenu iconPermission
soulsSoulsSoulSoul escapeSoul Sandedeneffects.death.souls
ashesAshesCampfire SmokeFire extinguishCoaledeneffects.death.ashes
boomBoomExplosion EmitterGeneric explodeTNTedeneffects.death.boom
thunderThunderLightning flashVanilla thunderLightning Rodedeneffects.death.thunder

Boom and Thunder are effects only. Boom draws the explosion particle without an explosion: nothing is damaged and no blocks change. Thunder is a lightning flash with no strike behind it, so it starts no fires and hits nothing.

When an effect fires, the same gates as a worn cosmetic are checked at that moment: the player must still hold the permission, the type must be enabled in that world, and nothing plays for a vanished or spectating player. The leave effect is read before the player's cached selections are dropped, which is the only reason it can play at all.

Unlike trails, hats, and wings, these bursts are played through the world rather than sent per viewer, so everyone in normal view distance sees them and render.distance does not apply.

effects.sounds and Thunder

effects.sounds: false turns off the sound of every other cosmetic, particles included or not. Thunder is the exception: its flash carries vanilla's own thunder sound, which that setting does not silence.

Death effects firing where a player died

Pets​

Almost every mob in the game can be a pet, so there is no fixed list here. See Pets for how the list is built, the handful of mobs left out, and how pets behave.

Gadgets​

IDNameCooldownPermission
firework_launcherFirework Launcher5sedeneffects.gadget.firework_launcher
paint_gunPaint Gun3sedeneffects.gadget.paint_gun
grappling_hookGrappling Hook8sedeneffects.gadget.grappling_hook
balloonBalloon12sedeneffects.gadget.balloon

See Gadgets for what each one does.


Performance​

Trails, hats, and wings are all drawn by one async render loop, not a task per player.

  • Each tick, a very cheap sync task records where every player with a cosmetic is standing, since player positions cannot be read off the main thread.
  • Every render.period-ticks ticks, the async loop draws each cosmetic, skipping viewers in another world or further away than render.distance.
  • Particles are sent to each nearby viewer directly rather than broadcast, so a player nobody is near costs one loop step and no packets.

On a busy server, raise render.period-ticks to 3 or lower render.distance to cut the work further. See Configuration.

Join, leave, and death effects cost nothing until they fire. Pets are real entities, so they cost what any mob costs.

Adding cosmetics​

The stock set is defined in code, in Cosmetics.createRegistry. Adding a trail, hat, wings, or effect is one line there, and a new type needs one CosmeticType value plus one class implementing Cosmetic. The registry, storage, menu, permission registration, and config toggles all pick new entries up automatically.

Don't rename IDs

A cosmetic's ID is stored in players' selections and presets and used in permission nodes. Renaming one orphans every existing selection and grant, so treat a rename as a data migration.