From f526f431af0a8b3cbabc620dac596a8b9c8ef5e1 Mon Sep 17 00:00:00 2001 From: Pravus Date: Tue, 4 Aug 2026 16:07:23 +0200 Subject: [PATCH] feat: emote state in avatarEmoteCommand --- .../sdk/components/avatar_emote_command.proto | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/proto/decentraland/sdk/components/avatar_emote_command.proto b/proto/decentraland/sdk/components/avatar_emote_command.proto index 550bd34a..bf0d0cbb 100644 --- a/proto/decentraland/sdk/components/avatar_emote_command.proto +++ b/proto/decentraland/sdk/components/avatar_emote_command.proto @@ -5,6 +5,19 @@ import "decentraland/sdk/components/common/id.proto"; import "decentraland/sdk/components/common/avatar_mask.proto"; option (common.ecs_component_id) = 1088; +// EmoteState describes the lifecycle state of an emote playback. +enum EmoteState { + // ES_STARTED indicates the emote started playing. + // This is the zero value and is used for backward compatibility — entries + // written by older explorers (field absent) read as "started". + ES_STARTED = 0; + // ES_FINISHED indicates a non-looping emote completed naturally. + ES_FINISHED = 1; + // ES_INTERRUPTED indicates playback was cancelled (movement, teleport, + // another emote superseding it, explicit stop, or scene change). + ES_INTERRUPTED = 2; +} + // AvatarEmoteCommand is a grow only value set, written by the explorer to report // avatar emote playback to the scene. It is appended to every player entity in the // scene (the local player and remote avatars alike). @@ -13,4 +26,7 @@ message PBAvatarEmoteCommand { bool loop = 2; uint32 timestamp = 3; // monotonic counter optional decentraland.sdk.components.common.AvatarMask mask = 4; + // state describes the lifecycle event for this emote entry. + // When absent (older explorers), defaults to ES_STARTED. + optional EmoteState state = 5; } \ No newline at end of file