Content generated with AI — it may contain mistakes.

Configuring

Duets

Emotes that take two: the invitation, the reach, and how the two bodies meet in the middle.

A duet is an emote with kind: duet in emotes.yml. Two ship, both in the Social tab: highfive and handshake. Both players perform the same choreography at the same moment, each from their own feet — two people facing each other who both reach forward meet in the middle.

Inviting

/emote play <emote> <player>

Naming a player for a solo emote is quietly ignored and the emote simply plays. Leaving the player out of a duet is refused with needs-partner.

The shipped needs-partner line names the wrong command

Its default reads /emote %id% <player>, which only opens the menu. The command is /emote play <id> <player>: change the line in messages.yml to /emote play %id% <player>.

The invitation is refused on the spot when:

RefusalMessage
You named yourselfinvite-self
They are performing an emotepartner-busy
They are further than duet.max-distance, or in another worldpartner-too-far

Otherwise the inviter is told invite-sent, the invited player invite-received with Accept and Decline buttons, and feedback.on-invite is played to them.

Ownership is checked when it starts, not when it is sent

An invitation is sent even if either player does not own the emote, is on cooldown, in combat or in a world where emotes are off. Those are all checked on accept, and refuse it then.

One standing invitation

Each player holds one invitation at a time, the one they were sent last. A second replaces the first, and whoever sent the first is not told. An invitation lasts duet.invite — 20 seconds by default, never less than one — and is swept once a second after that.

Answering

ToHow
AcceptClick Accept, run /emote accept (alias yes), or right-click whoever invited you.
DeclineClick Decline or run /emote deny (aliases decline, no). The inviter is told invite-declined.

The name after accept or deny is accepted and ignored: there is only ever one invitation to answer.

Right-clicking the inviter runs /emote accept <name> as the player, exactly as if they had typed it — so whatever stops them typing it (a missing permission, a jail, a combat plugin blocking commands) stops the right-click too. Right-clicking anybody else is left alone.

AnswerMessage
Nothing to accept or declineinvite-none
It ran out, or the inviter leftinvite-expired
The emote was removed by a reload in betweenunknown-emote

Starting

On accept, in this order:

The inviter must be able to play it

Owning it, not already performing, in an allowed world, out of combat, off cooldown. The first that fails is the answer both of them are told.

The partner must be free

Still online and not performing anything, or partner-busy.

The partner must be able to play it

The same checks as the inviter. Any failure is reported as partner-cannot.

They must still be close

Within duet.max-distance of each other, in the same world, or partner-too-far: between the ask and the answer one of them can walk away.

Then both bodies start on the same tick, both players are told playing, and both cooldowns start for both of them.

Where the bodies stand

Not where the players do. Both bodies are placed on the line between the two players, gap blocks apart and turned towards each other, so the choreography meets in the middle whether they were standing shoulder to shoulder or three blocks apart. Each body keeps its own player's height, so two players on different steps are not sunk into one of them.

gap is part of the emote, not a preference: a handshake is written for arms reaching forward and a high five for arms reaching up, and the two meet at different distances. The shipped handshake uses 1.51, the high five 1.13. A duet that writes its own frames writes its own gap with them.

Only the bodies move. The players are never teleported into position — their hidden hitboxes stay exactly where they were standing.

Ending

The two halves are one emote: anything that ends it for one ends it for both, including a punch at either body.

Duets never appear in a showcase

A showcase plays one body at one spot, and half a handshake is a body reaching out at nothing. They are left out of every showcase whatever showcase.emotes lists.

Something missing on this page? Tell us on Discord