모드 스크립트: 채팅

이 페이지에서는 채팅 기능과 관련된 모드 스크립트에 대한 세부 사항을 설명합니다.

채팅 이벤트

채팅:메시지

새로운 채팅 메시지가 수신될 때마다 실행됩니다. 메시지의 유형이 rollresult, gmrollresult, secretrollresult 또는 supersecretrollresult인 경우, 주사위 굴림 결과에 대한 정보가 포함된 객체를 얻으려면 메시지의 내용에 대해 JSON.parse() 를 호출해야 한다는 점에 유의하십시오.

플레이어가 !로 시작하는 채팅 메시지를 입력하면, 해당 메시지의 유형은 "api" 이며 채팅창에는 표시되지 않습니다. 스크립트는 명령을 실행할 때 해당 유형을 사용합니다. sendChat() 은 채팅:message 이벤트도 발생시키며, 해당 메시지의 playerid는 “API”입니다.

콜백 매개변수:

부동산 기본값 참고
누가 "" 메시지를 보낸 플레이어 또는 캐릭터의 표시할 이름. GM의 경우, 이 문장은 (GM)으로 끝납니다. 게시된 이름에 접미사가 포함되지 않게 하려면, sendChat에 who를 전달하기 전에 해당 접미사를 제거하세요.
플레이어 ID 메시지를 보낸 플레이어의 ID. sendChat() 함수로 생성된 메시지는 “API”를 사용합니다.
유형 "일반" general, rollresult, gmrollresult, secretrollresult, supersecretrollresult, emote, 귓속말, desc, direct 또는 api 중 하나입니다.
내용 "" 채팅 메시지의 내용. type이 rollresult, gmrollresult, secretrollresult 또는 supersecretrollresult인 경우, 이는 주사위 굴림에 대한 데이터가 담긴 JSON 문자열이 됩니다.
원본롤 (주사위 입력 시에만) 주사위 입력의 원문. 예: 플레이어가 /r 2d10+5 화염 피해를 입력했을 때, 2d10+5 화염 피해. 이는 롤 결과 유형이 아닌 다른 유형의 메시지에 포함된 콘텐츠를 사용하는 것과 동일합니다.
인라인 롤 콘텐츠에 인라인 롤이 포함된 경우 표시합니다. "api" 메시지에서는 역할이 콘텐츠 내에서 $[[0]], $[[1]] 등의 형태로 나타나며, 이 배열에는 구문 분석된 역할이 해당 순서대로 저장되어 있습니다. 항목에 secret: true가 포함될 수 있습니다.
롤 템플릿 (콘텐츠에는 하나 이상의 롤 템플릿만 포함되어 있습니다) 지정된 템플릿의 이름입니다.
목표 (입력 귓속말 만) 귓속말을 받는 사람의 플레이어 ID. GM에게 표시할 이름을 사용하지 않고 귓속말을 보낸 경우(예: GM이 Riley일 때 /w Riley text 대신 /w gm text를 입력한 경우)나, 플레이어가 제어하지 않는 캐릭터에게 귓속말을 보낸 경우, 해당 값은 gm이 됩니다.
대상 이름 (입력 귓속말 만) 귓속말을 보낸 대상인 플레이어 또는 캐릭터의 표시할 이름입니다.
선택된 무언가가 선택되었을 때 플레이어 “api” 명령어에 표시됩니다. 각 항목은 Roll20 객체가 아닌 {_id, _type} 형태의 일반 객체입니다. 메시지가 sendChat()에서 전송된 경우에는 생략됩니다.
비밀 false 비밀 및 극비 등급의 주사위 굴림과 메시지에 해당합니다.
비밀 유지 "공개" "공개", "비밀" 또는 "슈퍼".

비밀 및 초비밀 롤은 다음 명령어를 사용합니다(두 샌드박스 버전 모두에서 사용 가능):

  • /secretroll 또는 /sr — 유형은 "secretrollresult", 비밀 여부는 true, 비밀 수준은 "secret"입니다.
  • /supersecretroll 또는 /ssr — 유형은 "supersecretrollresult", 비밀 여부는 true, 비밀 등급은 "super"입니다.
  • /secret 또는 /s 뒤에 메시지를 입력합니다(예: /secret [[1d6]]) — 유형은 “일반”으로 유지되며, 비밀 여부는 “ true”, 비밀 등급은 “비밀”로 설정됩니다. 귓속말로 주사위를 굴리는 방식의 간결한 비밀 방식: GM은 수치를 확인하고, 주사위를 굴린 사람은 비밀 주사위 굴림이 이루어졌음을 알 수 있다.
  • /supersecret 또는 /ss 뒤에 메시지를 입력하면 — 유형은 "일반"으로 유지되며, 비밀 수준은 true, 기밀 수준은 "super"로 설정됩니다.

/sr 및 /ssr은 롤 명령어입니다. 그건 아니에요 ! 명령어. !로 시작하는 메시지 "api" 유형입니다.

참고: 이 정보 전부가 필요하지는 않을 것입니다. 대부분의 경우, 주사위 던지기 결과의 전체적인 결과에만 관심이 있을 것입니다(첫 번째 예시의 맨 아래 부분 참조). 그러나 주사위 결과에 대해 정말 깊이 파고들고 싶다면 모든 것이 제공됩니다.

주사위 결과 구조 예시 1

rollresult, gmrollresult, secretrollresult 또는 supersecretrollresult 메시지의 content 속성에 JSON.parse를 호출하면 다음과 같은 형식의 객체를 얻게 됩니다(다음은 /roll 명령어의 결과입니다 : {2d6}+5+1t[weather] Attack!)

{
  "type":"V", //"V" = "Validated Roll" (현재는 항상 "V"입니다)
  "rolls": [
    {
      "type":"G", //"G"는 그룹화된 롤을 나타냅니다. 그룹은 롤 내부의 일련의 "하위 롤"과 같습니다.
      "rolls": [
        [
          {
            "type":"R", //"R" = "Roll"
            "dice":2, // 던진 주사위 개수 (2dX는 2개의 주사위)
            "sides":6, //주사위의 면 수 (Xd6는 6면)
            "mods":{},
            "results": [ //각 던지기의 결과 배열.
              {
                "v":1 // 첫 번째 2d6 주사위 굴림에서 1이 나왔습니다.
              },
              {
                "v":5 // 두 번째 2d6 주사위 굴림에서 5가 나왔습니다.
              }
            ]
          }
        ]
      ],
      "mods":{},
      "resultType":"sum", //결과는 성공 여부 확인이 아닌 합계입니다.
      "results": [
        {
          "v":6 // 이 경우, 그룹의 전체 결과(합계)입니다.
        }
      ]
    },
    {
      "type":"M", //"M" = 수학 표현식
      "expr":"+5+"
    },
    {
      "type":"R", //"R" = 주사위 굴림
      "dice":1,
      "table":"weather", //테이블 속성은 이 롤이 테이블에 대해 수행된 경우 사용된 테이블의 이름으로 설정됩니다.
      "mods":{},
      "sides":2, //테이블 롤의 경우 이 부분은 무시해도 됩니다.
      "results": [
        {
          "v":0, //테이블 항목의 "값"이 굴려진 결과 텍스트 테이블의 경우 항상 0입니다.
          "tableidx":1, //테이블에서 굴려진 항목의 인덱스.
          "tableItem": { //테이블이 롤링되었을 당시 존재했던 테이블 항목 객체의 복사본입니다.
            "name":"rainy",
            "avatar":"", //롤러블 테이블이 이미지 아이콘을 사용하는 경우, 여기에 이미지 URL이 입력됩니다.
            "weight":1,
            "id":"-IpzPx2j_9piP09ceyOv"
          }
        }
      ]
    },
    {
      "type":"C", // "C" = 댓글
      "text":" 공격!"
    
  ],
  "resultType":"sum", // 전체 롤의 종합 결과 유형
  "total":11 // 전체 롤의 종합 합계 (모든 하위 그룹 포함)
}

롤 결과 구조 예시 2

/roll {1d6!!>5}>6의 결과에 대한 주석이 달린 구조(폭발 수정치 및 대상 성공 표시 포함):

{
  "type":"V",
  "rolls": [
    {
      "type":"G",
      "rolls": [
        [
          {
            "type":"R",
            "dice":1,
            "sides":6,
            "mods": { //롤에 대한 수정 사항
              "compounding": { //"compounding" = "폭발 롤의 중첩 적용(!!)"
                "comp":">=", //비교 유형
                "point":5 //비교 점수
              }
            },
            "results": [
              {
                "v":13 //전체 주사위 결과. 복합 폭발이므로 주사위 결과는 단 하나뿐임을 유의하십시오.
              }
            ]
          }
        ]
      ],
      "mods": {
        "success": {
          "comp":">=",
          "point":6
        }
      },
      "resultType":"sum",
      "results": [
        {
          "v":13
        }
      ]
    }
  ],
  "resultType":"success", // 이 경우 결과는 성공 건수입니다
  "total":1 //총 성공 건수
}

채팅 이벤트 예시 (사용자 정의 주사위 유형 구현)

on("chat:message", function(msg) {
  // 플레이어가 !d6 3을 입력하면, 목표치 4를 상대로 해당 개수의 d6 주사위를 굴립니다.
  if (msg.type !== "api" || msg.content.indexOf("!d6 ") !== 0) return;
  var numdice = parseInt(msg.content.substring(4), 10);
  if (!numdice || numdice < 1) return;
  var who = msg.who.replace(/\(GM\)$/, "");
  sendChat(who, "/roll " + numdice + "d6>4");
});

sendChat(말하는_아이디, 입력 [, 콜백 [, 옵션]] )

이 기능을 사용하여 채팅 메시지를 보낼 수 있습니다.

speakingAs 다음 중 하나일 수 있습니다:

  • 어떤 문자열이든, 이 경우 해당 문자열이 메시지를 보낸 사람의 이름으로 사용됩니다. 예를 들어 "라일리"
  • 플레이어의 ID는 "player|-Abc123" 형식으로 표기되며, 여기서 -Abc123은 해당 플레이어의 ID입니다. 이렇게 하면 플레이어의 아바타와 이름이 자동으로 적용됩니다.
  • 캐릭터의 ID로, "character|-Abc123" 형식으로 표기됩니다. 이렇게 하면 캐릭터의 아바타와 이름이 자동으로 적용됩니다.

입력 Roll20 앱에서 사용되는 것과 마찬가지로 유효한 표현식이어야 합니다. 기본 메시지를 보내려면 텍스트를 입력하거나, /roll, /em, /w, /secretroll (/sr), /supersecretroll (/ssr), /secret (/s), /supersecret (/ss) 등과 같은 슬래시 명령어를 사용하면 됩니다. 추가로:

  • 캐릭터 속성은 @{CharacterName|AttributeName} 형식으로 사용할 수 있습니다.
  • 캐릭터 능력은 %{CharacterName|AbilityName} 형식으로 사용할 수 있습니다.
  • 플레이어가 #MacroName을 입력하는 방식으로는 sendChat에서 매크로를 호출할 수 없습니다. 버튼을 클릭하면 매크로를 실행할 수 있습니다: [이름](!&#13;#MacroName).
  • @{selected|...} 는 sendChat 내부에서 전개되지 않습니다. 대신 채팅:message 핸들러에서 msg.selected를 읽어오세요.
  • 일반 메시지와 귓속말에는 아래의 HTML 태그를 포함할 수 있습니다. /direct <msg> 명령어를 사용하면 마크다운이나 URL 자동 링크 없이 메시지를 보낼 수 있으며, 동일한 태그를 사용할 수 있습니다:
<code><span><div><label><a><br><br/><p><b><i><del><strike><u><img>
<blockquote><mark><cite><small><ul><ol><li><hr><dl><dt><dd><sup>
<sub><big><pre><figure><figcaption><strong><em><table><tr><td><th>
<tbody><thead><tfoot><h1><h2><h3><h4><h5><h6>

콜백 은 선택적인 세 번째 매개변수로, 게임에 명령을 전송하는 대신 sendChat() 호출의 결과를 전달받는 콜백 함수로 구성됩니다. 이러한 방식으로 sendChat() 을 사용하는 것은 비동기적입니다. sendChat() 명령어의 결과는 일련의 작업으로 구성된 배열이 되며, 각 개별 객체는 채팅:message 이벤트 발생 시 수신하는 객체와 동일합니다(위 내용 참조).

예를 들어, Roll20 주사위 엔진을 사용하여 주사위를 굴린 후 즉시 결과를 확인할 수 있습니다. 그런 다음 게임 내 플레이어에게 전송하기 전에 롤에 추가 수정을 가할 수 있습니다.

sendChat("Riley", "/roll 1d20+4", function(ops) {
  // ops는 명령어 실행 결과로 구성된 배열이 됩니다.
  var rollresult = ops[0];
  //이제 채팅:메시지 이벤트가 발생했을 때와 마찬가지로 rollresult를 사용하여 작업을 수행합니다...
});

옵션 는 메시지 처리 방식을 설정하기 위한 선택적 네 번째 매개변수입니다. 옵션은 자바스크립트 객체 형태로 지정되며, 이 객체의 속성은 설정할 옵션의 이름이고, 값은 해당 옵션에 대한 설정값입니다. 일반적으로 기본값은 false이므로 값은 true로 설정됩니다.

사용 가능한 옵션:

  • noarchive – 이 설정을 true로 설정하면 메시지가 채팅 기록에 저장되지 않습니다. 이는 Mod 스크립트 버튼 메뉴나 상태 정보 등, 스토리 본편에 포함되지 않는 출력 내용에 특히 유용합니다.
  • use3d – 이제 sendChat() 함수를 사용하여 3D 주사위 굴림 결과를 생성할 수 있습니다. 구문은 간단합니다: sendChat("Name", "Rolling [[3d6]]", null, {use3d: true}); name 매개변수에 플레이어 ID를 전달하면(예: sendChat("player|-ABC123",...)), 해당 플레이어의 색상이 주사위에 적용됩니다. 그렇지 않으면 기본 흰색이 사용됩니다.

참고: 클라이언트는 한 번에 하나의 3D 롤 결과만 표시할 수 있으므로, 여러 개의 3D 롤을 연속으로 생성하는 것은 의미가 없습니다. 또한 3D 롤을 사용하면 양자 주사위 서버에 다소 더 많은 부하가 걸리므로, 상황에 따라 적절히 판단하여 1초 만에 100번의 3D 롤을 실행하지 않도록 주의해 주세요. 롤이 플레이어에게 중요하고 게임에 영향을 미칠 때 3D 롤을 사용하세요.

이러한 옵션을 조정하고 싶지만 콜백 매개변수(세 번째 매개변수—위 내용 참조)를 사용하지 않으려면, 해당 위치에 null을 전달하기만 하면 됩니다:

sendChat("상태", "모든 플레이어가 로그인되었습니다.", null, {noarchive:true});

모드 스크립트 명령 버튼

모드 스크립트 메시지, 매크로 및 능력에서 텍스트 채팅 서식을 적용하면 채팅창에 명령 버튼이 생성될 수 있습니다.

이를 마크다운 서식으로 수행하려면:

[공격 주사](!attackroll)

괄호 안의 텍스트는 버튼에 표시되며, 괄호 안의 부분은 실행될 명령어입니다. 일반 롤에는 무엇이든 포함시킬 수 있습니다(매크로, 능력, 쿼리 등). 다만 해당 명령어 자체는 이를 클릭한 플레이어가 실행하게 된다는 점을 명심하세요. 예를 들어, 메시지를 볼 수 있는 모든 사람이 해당 캐릭터에 접근할 수 없는 경우에는 @{Character|AC}를 포함하지 마십시오. 대신, 채팅 메시지를 보내기 전에 직접 입력하여 명령을 보낼 당시 존재했던 실제 값을 포함시키세요. 이 버튼들은 일반 메시지, 귓속말, 그리고 GM에게 보내는 귓속말에서 모두 작동합니다. 클릭 시, 클릭한 플레이어가 해당 플레이어의 playerid를 가지고 선택된 상태로 실행됩니다.

/direct는 마크다운을 무시하므로 [공격 굴림](!attackroll)은 버튼으로 변환되지 않습니다.

채팅창에 모드 스크립트 버튼 입력하기

또한 채팅창에 마크다운 구문이나 모드 스크립트 버튼을 입력하여 다른 사람들이 사용할 수 있도록 할 수도 있습니다. 채팅 파서가 해석할 것이므로, 버튼 클릭 시 속성, 쿼리 및 주사위 굴림이 확장되도록 하려면 명령어 일부를 특수 구문(HTML 엔티티)으로 입력해야 합니다:

캐릭터 교체
% &#37;
) &#41;
? &#63;
@ &#64;
[ &#91; 또는 &lbrack;
] &#93; 또는 &rbrack;
{ &#123;
} &#125;
| &#124;
, &#44;

이 샘플 버튼은 그 중 일부를 사용합니다:

[공격 주사위 굴리기](!attackroll &#64;{target|token_id} &#91;[1d6+&#63;{Bonus|0}]&#93;)

실제로 모드 스크립트 버튼을 사용하여 매크로나 능력을 실행할 수 있습니다.

캐릭터 교체
<carriage return> &#13;

이를 위해서는 명령어 부분의 시작에 특수 코드 !&#13; 을 붙인 다음, #을 사용하여 매크로를 호출하거나 &#37; (%)을 사용하여 능력을 호출하면 됩니다:

[매크로](!&#13;#MacroName)

[능력](!&#13;&#37;{CharName|AbilityName})

참고: 현재, 사이드바의 ‘컬렉션’ 탭에 저장된 매크로를 다시 열면, 매크로 내의 HTML 엔티티가 원래 상태로 되돌아가게 됩니다. 이후 해당 매크로를 저장하면, 이러한 변경 사항도 함께 저장됩니다. 이 동작은 다음에서는 나타나지 않습니다. 능력 이나 능력 명령 버튼에서는 나타나지 않습니다.

능력 명령 버튼의 경우, 버튼을 생성하는 능력이며 해당 버튼이 참조하는 능력이 모두 같은 시트에 있다면 구문은 매우 간단합니다:

[능력](~AbilityName)

도움이 되었습니까?
26명 중 17명이 도움이 되었다고 했습니다.