From 3cf8424c5286c615acde8eadedecd3fa794273fc Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Fri, 6 Mar 2026 14:25:06 +0100 Subject: [PATCH 01/12] - Introduced AvatarMask enum in avatar_masks.proto for animation bone targeting. - Updated TriggerEmoteRequest and TriggerSceneEmoteRequest messages to include an optional mask field for enhanced emote functionality. --- proto/decentraland/kernel/apis/restricted_actions.proto | 3 +++ .../decentraland/sdk/components/common/avatar_masks.proto | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 proto/decentraland/sdk/components/common/avatar_masks.proto diff --git a/proto/decentraland/kernel/apis/restricted_actions.proto b/proto/decentraland/kernel/apis/restricted_actions.proto index 97d19faf..be4bf58f 100644 --- a/proto/decentraland/kernel/apis/restricted_actions.proto +++ b/proto/decentraland/kernel/apis/restricted_actions.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package decentraland.kernel.apis; import "decentraland/common/vectors.proto"; +import "decentraland/sdk/components/common/avatar_masks.proto"; message MovePlayerToRequest { decentraland.common.Vector3 new_relative_position = 1; @@ -16,6 +17,7 @@ message TeleportToRequest { message TriggerEmoteRequest { string predefined_emote = 1; + optional decentraland.sdk.components.common.AvatarMask mask = 2; } message ChangeRealmRequest { @@ -40,6 +42,7 @@ message CommsAdapterRequest { message TriggerSceneEmoteRequest { string src = 1; optional bool loop = 2; + optional decentraland.sdk.components.common.AvatarMask mask = 3; } message SuccessResponse { diff --git a/proto/decentraland/sdk/components/common/avatar_masks.proto b/proto/decentraland/sdk/components/common/avatar_masks.proto new file mode 100644 index 00000000..8b058a1f --- /dev/null +++ b/proto/decentraland/sdk/components/common/avatar_masks.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; +package decentraland.sdk.components.common; + +// Mask for which bones an animation applies to. +enum AvatarMask { + AM_UPPER_BODY = 0; +} \ No newline at end of file From cf874db44aa8b5163b64da1e8fec6680b56056b6 Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Fri, 6 Mar 2026 16:13:21 +0100 Subject: [PATCH 02/12] Replaced AvatarMask with AvatarEmoteMask in restricted_actions.proto and add new avatar_emote_mask.proto file --- proto/decentraland/kernel/apis/restricted_actions.proto | 6 +++--- .../common/{avatar_masks.proto => avatar_emote_mask.proto} | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) rename proto/decentraland/sdk/components/common/{avatar_masks.proto => avatar_emote_mask.proto} (63%) diff --git a/proto/decentraland/kernel/apis/restricted_actions.proto b/proto/decentraland/kernel/apis/restricted_actions.proto index be4bf58f..c9f00c2f 100644 --- a/proto/decentraland/kernel/apis/restricted_actions.proto +++ b/proto/decentraland/kernel/apis/restricted_actions.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package decentraland.kernel.apis; import "decentraland/common/vectors.proto"; -import "decentraland/sdk/components/common/avatar_masks.proto"; +import "decentraland/sdk/components/common/avatar_emote_mask.proto"; message MovePlayerToRequest { decentraland.common.Vector3 new_relative_position = 1; @@ -17,7 +17,7 @@ message TeleportToRequest { message TriggerEmoteRequest { string predefined_emote = 1; - optional decentraland.sdk.components.common.AvatarMask mask = 2; + optional decentraland.sdk.components.common.AvatarEmoteMask mask = 2; } message ChangeRealmRequest { @@ -42,7 +42,7 @@ message CommsAdapterRequest { message TriggerSceneEmoteRequest { string src = 1; optional bool loop = 2; - optional decentraland.sdk.components.common.AvatarMask mask = 3; + optional decentraland.sdk.components.common.AvatarEmoteMask mask = 3; } message SuccessResponse { diff --git a/proto/decentraland/sdk/components/common/avatar_masks.proto b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto similarity index 63% rename from proto/decentraland/sdk/components/common/avatar_masks.proto rename to proto/decentraland/sdk/components/common/avatar_emote_mask.proto index 8b058a1f..c0debb95 100644 --- a/proto/decentraland/sdk/components/common/avatar_masks.proto +++ b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package decentraland.sdk.components.common; // Mask for which bones an animation applies to. -enum AvatarMask { - AM_UPPER_BODY = 0; +enum AvatarEmoteMask { + AEM_FULL_BODY = 0; + AEM_UPPER_BODY = 1; } \ No newline at end of file From 0fa6ab04e18ca412506150cea125f83c8e82962d Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Mon, 9 Mar 2026 10:00:59 +0100 Subject: [PATCH 03/12] Added UNRECOGNIZED value to AvatarEmoteMask enum. --- proto/decentraland/sdk/components/common/avatar_emote_mask.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/proto/decentraland/sdk/components/common/avatar_emote_mask.proto b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto index c0debb95..854fdb89 100644 --- a/proto/decentraland/sdk/components/common/avatar_emote_mask.proto +++ b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto @@ -5,4 +5,5 @@ package decentraland.sdk.components.common; enum AvatarEmoteMask { AEM_FULL_BODY = 0; AEM_UPPER_BODY = 1; + UNRECOGNIZED = -1; } \ No newline at end of file From 521db39ec0b3c82d462558a1d1c62875687e5c13 Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Mon, 9 Mar 2026 10:26:13 +0100 Subject: [PATCH 04/12] Removed UNRECOGNIZED value from AvatarEmoteMask enum in avatar_emote_mask.proto. --- proto/decentraland/sdk/components/common/avatar_emote_mask.proto | 1 - 1 file changed, 1 deletion(-) diff --git a/proto/decentraland/sdk/components/common/avatar_emote_mask.proto b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto index 854fdb89..c0debb95 100644 --- a/proto/decentraland/sdk/components/common/avatar_emote_mask.proto +++ b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto @@ -5,5 +5,4 @@ package decentraland.sdk.components.common; enum AvatarEmoteMask { AEM_FULL_BODY = 0; AEM_UPPER_BODY = 1; - UNRECOGNIZED = -1; } \ No newline at end of file From 6981c6216dc8920acd75489b8bea8e68d55ccf21 Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Mon, 9 Mar 2026 11:42:04 +0100 Subject: [PATCH 05/12] Refactor TriggerEmoteRequest and TriggerSceneEmoteRequest to replace AvatarEmoteMask with uint32 for mask field, and remove unnecessary import from restricted_actions.proto. --- proto/decentraland/kernel/apis/restricted_actions.proto | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/proto/decentraland/kernel/apis/restricted_actions.proto b/proto/decentraland/kernel/apis/restricted_actions.proto index c9f00c2f..d75889cf 100644 --- a/proto/decentraland/kernel/apis/restricted_actions.proto +++ b/proto/decentraland/kernel/apis/restricted_actions.proto @@ -2,7 +2,6 @@ syntax = "proto3"; package decentraland.kernel.apis; import "decentraland/common/vectors.proto"; -import "decentraland/sdk/components/common/avatar_emote_mask.proto"; message MovePlayerToRequest { decentraland.common.Vector3 new_relative_position = 1; @@ -17,7 +16,7 @@ message TeleportToRequest { message TriggerEmoteRequest { string predefined_emote = 1; - optional decentraland.sdk.components.common.AvatarEmoteMask mask = 2; + optional uint32 mask = 2; } message ChangeRealmRequest { @@ -42,7 +41,7 @@ message CommsAdapterRequest { message TriggerSceneEmoteRequest { string src = 1; optional bool loop = 2; - optional decentraland.sdk.components.common.AvatarEmoteMask mask = 3; + optional uint32 mask = 3; } message SuccessResponse { From a2dd79f78108ffc48bf27e00864d9011b16a0cc8 Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Mon, 9 Mar 2026 12:23:48 +0100 Subject: [PATCH 06/12] Refactor AvatarEmoteMask: move enum definition from avatar_emote_mask.proto to restricted_actions.proto and delete the obsolete file. --- proto/decentraland/kernel/apis/restricted_actions.proto | 6 ++++++ .../sdk/components/common/avatar_emote_mask.proto | 8 -------- 2 files changed, 6 insertions(+), 8 deletions(-) delete mode 100644 proto/decentraland/sdk/components/common/avatar_emote_mask.proto diff --git a/proto/decentraland/kernel/apis/restricted_actions.proto b/proto/decentraland/kernel/apis/restricted_actions.proto index d75889cf..bc8eafe7 100644 --- a/proto/decentraland/kernel/apis/restricted_actions.proto +++ b/proto/decentraland/kernel/apis/restricted_actions.proto @@ -3,6 +3,12 @@ package decentraland.kernel.apis; import "decentraland/common/vectors.proto"; +// Mask for which bones an animation applies to. +enum AvatarEmoteMask { + AEM_FULL_BODY = 0; + AEM_UPPER_BODY = 1; +} + message MovePlayerToRequest { decentraland.common.Vector3 new_relative_position = 1; optional decentraland.common.Vector3 camera_target = 2; diff --git a/proto/decentraland/sdk/components/common/avatar_emote_mask.proto b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto deleted file mode 100644 index c0debb95..00000000 --- a/proto/decentraland/sdk/components/common/avatar_emote_mask.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; -package decentraland.sdk.components.common; - -// Mask for which bones an animation applies to. -enum AvatarEmoteMask { - AEM_FULL_BODY = 0; - AEM_UPPER_BODY = 1; -} \ No newline at end of file From 0454e27840918f62fe9b00d02a6be301d496c9fc Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Mon, 9 Mar 2026 16:00:20 +0100 Subject: [PATCH 07/12] Refactor TriggerEmoteRequest and TriggerSceneEmoteRequest to use AvatarEmoteMask enum from new avatar_emote_mask.proto file, replacing uint32 mask field. --- .../decentraland/kernel/apis/restricted_actions.proto | 11 +++-------- .../sdk/components/common/avatar_emote_mask.proto | 8 ++++++++ 2 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 proto/decentraland/sdk/components/common/avatar_emote_mask.proto diff --git a/proto/decentraland/kernel/apis/restricted_actions.proto b/proto/decentraland/kernel/apis/restricted_actions.proto index bc8eafe7..c9f00c2f 100644 --- a/proto/decentraland/kernel/apis/restricted_actions.proto +++ b/proto/decentraland/kernel/apis/restricted_actions.proto @@ -2,12 +2,7 @@ syntax = "proto3"; package decentraland.kernel.apis; import "decentraland/common/vectors.proto"; - -// Mask for which bones an animation applies to. -enum AvatarEmoteMask { - AEM_FULL_BODY = 0; - AEM_UPPER_BODY = 1; -} +import "decentraland/sdk/components/common/avatar_emote_mask.proto"; message MovePlayerToRequest { decentraland.common.Vector3 new_relative_position = 1; @@ -22,7 +17,7 @@ message TeleportToRequest { message TriggerEmoteRequest { string predefined_emote = 1; - optional uint32 mask = 2; + optional decentraland.sdk.components.common.AvatarEmoteMask mask = 2; } message ChangeRealmRequest { @@ -47,7 +42,7 @@ message CommsAdapterRequest { message TriggerSceneEmoteRequest { string src = 1; optional bool loop = 2; - optional uint32 mask = 3; + optional decentraland.sdk.components.common.AvatarEmoteMask mask = 3; } message SuccessResponse { diff --git a/proto/decentraland/sdk/components/common/avatar_emote_mask.proto b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto new file mode 100644 index 00000000..2d2b6356 --- /dev/null +++ b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +package decentraland.sdk.components.common; + +enum AvatarEmoteMask { + AEM_FULL_BODY = 0; + AEM_UPPER_BODY = 1; +} \ No newline at end of file From cd815ebd805074904eb9efa7a129a0212799650d Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Mon, 9 Mar 2026 16:33:56 +0100 Subject: [PATCH 08/12] Refactor restricted_actions.proto to import AvatarEmoteMask from avatar_shape.proto, and delete obsolete avatar_emote_mask.proto file. --- proto/decentraland/kernel/apis/restricted_actions.proto | 6 +++--- proto/decentraland/sdk/components/avatar_shape.proto | 5 +++++ .../sdk/components/common/avatar_emote_mask.proto | 8 -------- 3 files changed, 8 insertions(+), 11 deletions(-) delete mode 100644 proto/decentraland/sdk/components/common/avatar_emote_mask.proto diff --git a/proto/decentraland/kernel/apis/restricted_actions.proto b/proto/decentraland/kernel/apis/restricted_actions.proto index c9f00c2f..380ae70e 100644 --- a/proto/decentraland/kernel/apis/restricted_actions.proto +++ b/proto/decentraland/kernel/apis/restricted_actions.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package decentraland.kernel.apis; import "decentraland/common/vectors.proto"; -import "decentraland/sdk/components/common/avatar_emote_mask.proto"; +import "decentraland/sdk/components/avatar_shape.proto"; message MovePlayerToRequest { decentraland.common.Vector3 new_relative_position = 1; @@ -17,7 +17,7 @@ message TeleportToRequest { message TriggerEmoteRequest { string predefined_emote = 1; - optional decentraland.sdk.components.common.AvatarEmoteMask mask = 2; + optional decentraland.sdk.components.AvatarEmoteMask mask = 2; } message ChangeRealmRequest { @@ -42,7 +42,7 @@ message CommsAdapterRequest { message TriggerSceneEmoteRequest { string src = 1; optional bool loop = 2; - optional decentraland.sdk.components.common.AvatarEmoteMask mask = 3; + optional decentraland.sdk.components.AvatarEmoteMask mask = 3; } message SuccessResponse { diff --git a/proto/decentraland/sdk/components/avatar_shape.proto b/proto/decentraland/sdk/components/avatar_shape.proto index 29f363f8..ce0ba627 100644 --- a/proto/decentraland/sdk/components/avatar_shape.proto +++ b/proto/decentraland/sdk/components/avatar_shape.proto @@ -42,3 +42,8 @@ message PBAvatarShape { optional bool show_only_wearables = 12; // hides the skin + hair + facial features (default: false) } +// Mask for which bones an animation applies to. +enum AvatarEmoteMask { + AEM_FULL_BODY = 0; + AEM_UPPER_BODY = 1; +} \ No newline at end of file diff --git a/proto/decentraland/sdk/components/common/avatar_emote_mask.proto b/proto/decentraland/sdk/components/common/avatar_emote_mask.proto deleted file mode 100644 index 2d2b6356..00000000 --- a/proto/decentraland/sdk/components/common/avatar_emote_mask.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -package decentraland.sdk.components.common; - -enum AvatarEmoteMask { - AEM_FULL_BODY = 0; - AEM_UPPER_BODY = 1; -} \ No newline at end of file From 65f2839329cf49259152556bb10515c221110d7d Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Mon, 9 Mar 2026 16:56:45 +0100 Subject: [PATCH 09/12] Refactor TriggerEmoteRequest and TriggerSceneEmoteRequest to replace AvatarEmoteMask with uint32 for mask field, and remove the import of avatar_shape.proto from restricted_actions.proto. --- proto/decentraland/kernel/apis/restricted_actions.proto | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/proto/decentraland/kernel/apis/restricted_actions.proto b/proto/decentraland/kernel/apis/restricted_actions.proto index 380ae70e..d75889cf 100644 --- a/proto/decentraland/kernel/apis/restricted_actions.proto +++ b/proto/decentraland/kernel/apis/restricted_actions.proto @@ -2,7 +2,6 @@ syntax = "proto3"; package decentraland.kernel.apis; import "decentraland/common/vectors.proto"; -import "decentraland/sdk/components/avatar_shape.proto"; message MovePlayerToRequest { decentraland.common.Vector3 new_relative_position = 1; @@ -17,7 +16,7 @@ message TeleportToRequest { message TriggerEmoteRequest { string predefined_emote = 1; - optional decentraland.sdk.components.AvatarEmoteMask mask = 2; + optional uint32 mask = 2; } message ChangeRealmRequest { @@ -42,7 +41,7 @@ message CommsAdapterRequest { message TriggerSceneEmoteRequest { string src = 1; optional bool loop = 2; - optional decentraland.sdk.components.AvatarEmoteMask mask = 3; + optional uint32 mask = 3; } message SuccessResponse { From eb74318c0074ce1acf2ea7354b791e347bcb5857 Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Tue, 10 Mar 2026 11:48:27 +0100 Subject: [PATCH 10/12] Add optional mask field to PlayerEmote message for animation bone targeting --- proto/decentraland/kernel/comms/rfc4/comms.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/proto/decentraland/kernel/comms/rfc4/comms.proto b/proto/decentraland/kernel/comms/rfc4/comms.proto index 2f440bef..f77092b0 100644 --- a/proto/decentraland/kernel/comms/rfc4/comms.proto +++ b/proto/decentraland/kernel/comms/rfc4/comms.proto @@ -93,6 +93,7 @@ message PlayerEmote { optional bool is_reacting = 8; // to a social emote started by other user optional string social_emote_initiator = 9; // wallet address of the user that initiated social emote optional string target_avatar = 10; // wallet address of the user whose avatar is the target of a directed emote + optional uint32 mask = 11; // mask for which bones an animation applies to. } // Message sent to force an avatar to look at a position From a93d3982bea4240ff858bd990a7cad8537e4b8f3 Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Tue, 10 Mar 2026 15:02:56 +0100 Subject: [PATCH 11/12] Add StopEmote RPC to RestrictedActionsService for stopping current emotes --- proto/decentraland/kernel/apis/restricted_actions.proto | 3 +++ 1 file changed, 3 insertions(+) diff --git a/proto/decentraland/kernel/apis/restricted_actions.proto b/proto/decentraland/kernel/apis/restricted_actions.proto index d75889cf..91d6aff1 100644 --- a/proto/decentraland/kernel/apis/restricted_actions.proto +++ b/proto/decentraland/kernel/apis/restricted_actions.proto @@ -92,4 +92,7 @@ service RestrictedActionsService { // CopyToClipboard copies the provided text into the clipboard rpc CopyToClipboard(CopyToClipboardRequest) returns (EmptyResponse) {} + + // StopEmote will stop the current emote + rpc StopEmote() returns (SuccessResponse) {} } From 9837746fc493dfcb43a6e0af330b009acfc24d77 Mon Sep 17 00:00:00 2001 From: Maurizio Farmi Date: Tue, 10 Mar 2026 15:04:31 +0100 Subject: [PATCH 12/12] Add StopEmoteRequest message and update StopEmote RPC in RestrictedActionsService --- proto/decentraland/kernel/apis/restricted_actions.proto | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/proto/decentraland/kernel/apis/restricted_actions.proto b/proto/decentraland/kernel/apis/restricted_actions.proto index 91d6aff1..3bddab3c 100644 --- a/proto/decentraland/kernel/apis/restricted_actions.proto +++ b/proto/decentraland/kernel/apis/restricted_actions.proto @@ -62,6 +62,8 @@ message CopyToClipboardRequest { message EmptyResponse { } +message StopEmoteRequest { } + service RestrictedActionsService { // MovePlayerTo will move the player to a position relative to the current scene. // If 'duration' field is used in the request, the success response depends on the @@ -94,5 +96,5 @@ service RestrictedActionsService { rpc CopyToClipboard(CopyToClipboardRequest) returns (EmptyResponse) {} // StopEmote will stop the current emote - rpc StopEmote() returns (SuccessResponse) {} + rpc StopEmote(StopEmoteRequest) returns (SuccessResponse) {} }