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.
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:
| Refusal | Message |
|---|---|
| You named yourself | invite-self |
| They are performing an emote | partner-busy |
They are further than duet.max-distance, or in another world | partner-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.
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
| To | How |
|---|---|
| Accept | Click Accept, run /emote accept (alias yes), or right-click whoever invited you. |
| Decline | Click 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.
| Answer | Message |
|---|---|
| Nothing to accept or decline | invite-none |
| It ran out, or the inviter left | invite-expired |
| The emote was removed by a reload in between | unknown-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.
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