diff --git a/src/Lumina/Text/Payloads/MacroCode.cs b/src/Lumina/Text/Payloads/MacroCode.cs
index 657604d2..54eddcd2 100644
--- a/src/Lumina/Text/Payloads/MacroCode.cs
+++ b/src/Lumina/Text/Payloads/MacroCode.cs
@@ -184,6 +184,13 @@ public enum MacroCode : byte
/// Parameters: row ID in UIColor sheet or 0 to pop(or reset?) the pushed color, terminator.
[MacroCodeData( null, "n x" )] EdgeColorType = 0x49,
+ /// Displays ruby text (furigana, interlinear annotation) above standard text.
+ ///
+ /// Parameters: standard text, ruby text.
+ /// Name of this payload is not defined in the client.
+ ///
+ [MacroCodeData(null, "s s")] Ruby = 0x4A,
+
/// Adds a zero-padded number as text.
/// Parameters: integer expression, target length, terminator.
[MacroCodeData( null, "n n x" )] Digit = 0x50,
diff --git a/src/Lumina/Text/ReadOnly/ReadOnlySePayload.cs b/src/Lumina/Text/ReadOnly/ReadOnlySePayload.cs
index 722c95d9..e92b0356 100644
--- a/src/Lumina/Text/ReadOnly/ReadOnlySePayload.cs
+++ b/src/Lumina/Text/ReadOnly/ReadOnlySePayload.cs
@@ -40,8 +40,14 @@ public ReadOnlySePayload( ReadOnlySePayloadType type, MacroCode macroCode, ReadO
throw new ArgumentOutOfRangeException( nameof( macroCode ), macroCode, "MacroCode may not be defined if the payload is of text type." );
break;
case ReadOnlySePayloadType.Macro:
- if( !Enum.IsDefined( macroCode ) || macroCode == 0 )
- throw new ArgumentOutOfRangeException( nameof( macroCode ), macroCode, null );
+ if( macroCode == default )
+ throw new ArgumentOutOfRangeException( nameof( macroCode ), macroCode, "MacroCode must be defined if the payload is of macro type." );
+ if( (byte) macroCode >= 0xCF )
+ {
+ throw new ArgumentOutOfRangeException( nameof( macroCode ), macroCode,
+ "Whether MacroCode is an integer expression is unknown. Change it when it happens." );
+ }
+
break;
default:
throw new ArgumentOutOfRangeException( nameof( type ), type, null );
diff --git a/src/Lumina/Text/ReadOnly/ReadOnlySePayloadSpan.cs b/src/Lumina/Text/ReadOnly/ReadOnlySePayloadSpan.cs
index 4a016952..f0fb960f 100644
--- a/src/Lumina/Text/ReadOnly/ReadOnlySePayloadSpan.cs
+++ b/src/Lumina/Text/ReadOnly/ReadOnlySePayloadSpan.cs
@@ -39,8 +39,14 @@ public ReadOnlySePayloadSpan( ReadOnlySePayloadType type, MacroCode macroCode, R
throw new ArgumentOutOfRangeException( nameof( macroCode ), macroCode, "MacroCode may not be defined if the payload is of text type." );
break;
case ReadOnlySePayloadType.Macro:
- if( !Enum.IsDefined( macroCode ) || macroCode == 0 )
- throw new ArgumentOutOfRangeException( nameof( macroCode ), macroCode, null );
+ if( macroCode == default )
+ throw new ArgumentOutOfRangeException( nameof( macroCode ), macroCode, "MacroCode must be defined if the payload is of macro type." );
+ if( (byte) macroCode >= 0xCF )
+ {
+ throw new ArgumentOutOfRangeException( nameof( macroCode ), macroCode,
+ "Whether MacroCode is an integer expression is unknown. Change it when it happens." );
+ }
+
break;
default:
throw new ArgumentOutOfRangeException( nameof( type ), type, null );