스크립트 명령어

스크립트 명령어

  • 등록자 슈퍼노비스  2023-05-06 /2023-05-06
  • //===== rAthena Documentation================================
    //= rAthena Script Commands
    //===== By:==================================================
    //= rAthena Dev Team
    //===== Last Updated:========================================
    //= 20220308
    //===== Description:=========================================
    //= A reference manual for the rAthena scripting language.
    //= Commands are sorted depending on their functionality.
    //= 한글화: 느낌
    //===========================================================

    이 문서는 rAthena에서 사용 가능한 모든 스크립트 명령어와 함수에 대한 참조 매뉴얼입니다.
    이것은 단순한 튜토리얼이 아닙니다. "RTFM(Read The F***ing Manual)"라고 말하는
    사람들은 이 문서를 의미합니다. 이 문서는 최소한 무엇을 하고자 하는지에 대해 약간의
    아이디어를 가지고 있고, 그것을 수행하는 데 사용 가능한 도구를 알고자 하는 사람들을
    위한 참조 자료입니다. 이 문서는 최대한 간단하게 유지하려고 노력했지만, 이해하지 못하면
    일반적인 프로그래밍 서적을 구해서 도움을 요청하는 것이 좋습니다.


    구조
    ---------

    스크립트 명령어는 특정 순서로 나열되지는 않지만, 관련 function으로 그룹화 되어
    있습니다.

    *명령어 이름과 파라미터(있는 경우).

    설명문

    완전 하지는 않지만 가능한 한 간단한 예제로서 실제로 어떻게 작동하는지에
    대한 아이디어는 얻을 수 있습니다.

    명령어를 찾을려면 Ctrl-F를 이용하십시오.
    먼저 *를 입력하고 그 다음 명령어를 입력하면 명령어와 설명을 찾을수 있습니다.


    누락된것들이 있다면 알려주세요!

    문법
    ------

    이 문서 전체에서 명령어는 어떤 인수를 원하는 곳에는 <> 괄호로로 표시 합니다.
    이것은 <>을 입력 해야 한다는것을 의미 하는 것은 아닙니다.
    만일 명령어의 인수가 옵션이면 {}로 표시 합니다.
    그리고 명령어가 옵션으로 지정되지 않은 갯수의 인수를 가질 경우 다음과 같이
    표시 됩니다.

    command <argument>{,<argument>...<argument>}

    이것은 인수는 쉼표로 구분되어어야 한다는 것을 의미 합니다.

    명령어가 문자을을 원하면 ""를 사용하고, 만일 숫자라면 "" 없이 사용됩니다.
    일반적으로 숫자대신 () 로 결과값을 돌려주는 함수 나 연산자와 같이 표현합니다.
    () 는 항상 필요한 것은 아니지만 종종 유용하게 사용됩니다.


    mpa name을 참조 할때는 항상 'map name'를 사용합니다.


    스크립트 로딩 구조
    -----------------

    스크립트는 'conf/map_atena.conf'파일에 참조된 대로 맵 서버에 의해 로드되지만
    기본 설정파일로 어떠한 스크립트를 로드 하지 않습니다.
    대신에 다른 파일을 참조를 포함한 '/npc/re/scripts_main.conf'을 로드 합니다.
    실제 스크립트는 txt 파일을 로드 하고 다음과 같이 링크 되어 있습니다.

    npc: <파일경로 및 파일이름>

    'map_athena.conf'에서 호출되어, 최종적으로 이 파일에 포함된 스크립트를 로드하고
    이를 사용할 수 있게 합니다. 가능한 오류를 방지하기 위해 동일한 파일은 두 번 로드되지
    않습니다.

    다른 관련성 있는 구성 파일 옵션으로는 다음이 있습니다:

    delnpc: <파일 이름에 대한 경로>

    이는 지정된 스크립트 파일 이름을 메모리에서 언로드(unload)합니다. 이 옵션은 보통
    쓸모가 없어 보이지만, 때때로 필요할 수 있습니다.

    해당 줄에서 '//'가 나오면, 이후의 모든 내용은 주석으로 처리되어 무시됩니다.
    이것은 줄 어디에든 위치해도 작동합니다.

    // 이 줄은 스크립트 처리 시 무시됩니다.

    블록 주석도 사용할 수 있습니다. 원하는 모든 텍스트 사이에
    /*와 */를 넣어서 rAthena가 무시하도록 할 수 있습니다.

    예제:
    /* 이 텍스트는
    어떤 새로운 줄에서 시작하더라도
    무시되며, 다음 기호를 만날 때까지
    계속됩니다: */

    각 줄 앞에 있는 별표(*)는 개인적인 취향이며 필수는 아닙니다.

    모든 파일을 로드한 후, 서버는 각 파일의 최상위 명령어를 실행합니다. 이 시점에서
    아직 변수가 존재하지 않으며, 이 섹션에서 제공된 명령어 이외에는 호출할 수 없습니다.
    이 명령어는 기본 구조를 설정합니다 - NPC 객체 생성, 몬스터 객체 소환,
    맵 플래그 설정 등입니다. 이 시점에서는 실제 코드가 실행되지 않습니다. 최상위 명령어는
    일반적으로 맵 이름으로 시작하기 때문에 예상한대로 구조화되어 있지 않아 혼동스러울 수 있습니다.

    탑-레벨 명령어에 대해서 더 혼란스러운 것은 대부분의 명령어가 인수를 구분하기 위해 탭 기호를
    사용한다는 것입니다.

    문제와 혼란을 방지하기 위해 이 문서 전체에서 탭 기호는 '%TAB%'으로 작성되었습니다.
    이는 텍스트를 약간 덜 읽기 쉽게 만듭니다. 인수를 나타내기 위해 보이지 않는 기호를
    사용하는 것은 이 언어의 단점 중 하나입니다.

    다음은 유효한 탑-레벨 명령어 목록입니다:


    ** Set a map flag:

    <맵 이름>%TAB%mapflag%TAB%<플래그>

    이 명령은 로드될 때 지정된 맵에서 맵 플래그를 설정합니다. 이것들은 일반적으로 'npc/mapflag' 안에
    있는 파일에 있으며 가장 먼저 로드되므로 서버가 실행될 때 모든 맵에는 해당하는 플래그가 있습니다.
    맵 플래그는 다양한 상황에서 맵의 동작을 결정합니다. 자세한 내용은 'setmapflag' 및
    'doc/mapflags.txt'를 참조하십시오.



    ** 몬스트 생성

    <맵 이름>{,<x>{,<y>{,<xs>{,<ys>}}}}%TAB%monster%TAB%<몬스터 이름>{,<몬스터 레벨>}%TAB%<몹 ID>,<수량>{,<딜레이1>{,<딜레이2>{,<이벤트>{,<몹 크기>{,<몹 AI>}}}}}

    맵 이름은 몬스터가 스폰될 맵의 이름입니다. x,y는 몹이 스폰될 좌표를 나타냅니다. 만약 xs와 ys가 0이
    아니라면, 몹은 x,y를 중심으로 하는 사각형 영역 내에 스폰됩니다. 이 좌표를 0으로 설정하면 몹은
    무작위로 스폰됩니다. 이는 초기 스폰 영역으로, 몹들은 랜덤워크로 이 좌표에서 벗어나 자유롭게
    움직일 수 있습니다.

    몬스터 이름은 화면에서 몹이 가질 이름으로, 다른 곳에서의 이름과는 전혀 상관이 없습니다.
    중요한 것은 몹 ID이며, 이는 몬스터 데이터베이스인 'mob_db.yml'에서 몬스터 레코드를 식별합니다.
    만약 몹 이름을 "--ja--"로 지정하면, 몬스터 데이터베이스의 '일본어 이름' 필드를 사용합니다.
    (rAthena에서는 실제로 영어 이름이 포함됨) 만약 "--en--"이라면, 몬스터 데이터베이스의
    '영어 이름'이 사용됩니다. (이는 GM명령으로 소환할때 대문자 이름으로 사용됩니다.)

    몬스터 레벨을 데이터베이스에 있는 레벨과 다르게 지정하려면 이름 뒤에 쉼표와 레벨을 추가하면 됩니다.
    예를 들어 "Poring,50"는 이름이 Poring이고 레벨이 50인 몬스터를 스폰합니다.

    Amount는 이 명령이 실행될 때 스폰되는 몬스터의 수이며, 'battle_athena.conf'에서 설정한 스폰률에
    영향을 받습니다.

    Delay1과 Delay2는 몬스터 스폰 딜레이를 제어합니다. Delay1은 기본적인 스폰 딜레이를, Delay2는
    기본 딜레이 위에 랜덤한 딜레이를 추가합니다. 두 값 모두 밀리초 단위로 지정됩니다 (1000 = 1초).
    또한 서버는 최소 스폰 딜레이를 1초로 강제합니다
    (자세한 내용은 /conf/battle/monster.conf::mob_respawn_time 참조).

    Event는 몬스터가 죽을 때 실행할 스크립트 이벤트입니다. 이벤트는 "NPCName::OnEventName"
    형식으로 작성해야 하며, 이벤트 이름 라벨은 "On"으로 시작해야 합니다. 모든 이벤트와 마찬가지로,
    NPC가 On-touch NPC인 경우 이벤트가 작동하려면 스크립트를 트리거하는 플레이어가 'trigger'
    범위 내에 있어야 합니다.

    <mob size>는 세 가지 값 중 하나를 선택할 수 있습니다:
    Size_Small (0)
    Size_Medium (1)
    Size_Large (2)

    <mob ai>는 다음 중 하나를 선택할 수 있습니다:
    AI_NONE (0) (기본값)
    AI_ATTACK (1) (공격/우호적)
    AI_SPHERE (2) (연금술사 스킬)
    AI_FLORA (3) (연금술사 스킬)
    AI_ZANZOU (4) (카게로우/오보로 스킬)
    AI_LEGION (5) (세라 스킬)
    AI_FAW (6) (메카닉 스킬)
    AI_WAVEMODE (7) 일반 몬스터는 AI_WAVEMODE 몬스터의 공격을 무시합니다.

    'boss_monster' 대신 'monster'를 사용하여 생성된 몬스터는 Convex Mirror에서 사용되는
    SC_BOSSMAPINFO 상태를 통해 맵에서 감지할 수 있습니다.



    ** NPC names

    /!\ 주의: 이것은 warp, NPC, duplicate, shop에 모두 적용됩니다 /!\

    NPC 이름은 특별한 형식을 갖고 있으며 다음과 같이 구성됩니다:

    <표시 이름>{::<고유 이름>}

    모든 NPC는 식별 용도로 사용되는 고유한 이름이 필요합니다.
    NPC를 이름으로 식별해야 하는 경우, <고유 이름>을 사용해야 합니다.
    <고유 이름>이 제공되지 않은 경우, 대신 <표시 이름>을 사용해야 합니다.

    클라이언트는 이름을 표시할 때 특별한 기능을 갖고 있습니다:
    만약 표시 이름에 '#' 문자가 포함되어 있다면, 해당 부분은 숨겨집니다.
    예: NPC의 이름이 'Hunter#hunter1'인 경우 'Hunter'로 표시됩니다.

    <표시 이름>은 최대 24자여야 합니다.
    <고유 이름>은 최대 24자여야 합니다.



    ** warp point 정의

    <현재 맵이름>,<현재 X좌표>,<현재 Y좌표>,<캐릭터가 바라보는 방향>%TAB%warp%TAB%<워프 포인트 이름>%TAB%<SpanX>,<SpanY>,<이동할 맵 이름>,<이동할 X좌표>,<이동할 Y좌표>
    <현재 맵이름>,<현재 X좌표>,<현재 Y좌표>,<캐릭터가 바라보는 방향>%TAB%warp2%TAB%<워프 포인트 이름>%TAB%<SpanX>,<SpanY>,<이동할 맵 이름>,<이동할 X좌표>,<이동할 Y좌표>

    이 명령어는 맵과 맵 사이를 이동할 수 있는 워프 NPC를 정의합니다. 대부분의
    인자들은 명확하지만, 특별한 언급이 필요한 몇 가지가 있습니다.

    SpanX와 SpanY는 캐릭터가 직접 밟지 않아도 워프를 감지할 수 있는 영역입니다.
    SpanX는 X축 방향으로 각각의 방향으로 확장되며, SpanY는 Y축 방향으로 각각의
    방향으로 확장됩니다.

    워프 NPC 객체는 이름을 가져야 하며, 이를 나중에 'enablenpc'/'disablenpc'로
    참조할 수 있습니다.

    워프 NPC의 바라보는 방향은 중요하지 않으며, 코드에서 사용되지 않으며 모든
    현재 스크립트에는 0이 있습니다.

    'warp'와 달리 'warp2'는 숨겨진 플레이어에 의해도 트리거됩니다.



    ** Define an NPC object.

    <맵 이름>,<x>,<y>,<facing>%TAB%script%TAB%<NPC 이름>%TAB%<스프라이트 ID>,{<코드>}
    <맵 이름>,<x>,<y>,<facing>%TAB%script%TAB%<NPC 이름>%TAB%<스프라이트 ID>,<트리거X>,<트리거Y>,{<코드>}

    이 명령은 지정된 위치에서 지정된 맵에 NPC 객체를 배치하며, 사용자는 클릭하거나
    트리거 영역에 들어가면 활성화됩니다.

    Facing은 NPC 스프라이트가 바라보는 방향입니다. 일부 NPC 스프라이트는 방향에 따라
    다른 이미지를 가지고 있지 않으므로, 일부 NPC에는 방향이 의미가 없을 수 있습니다.
    Facing은 45도씩 반시계 방향으로 세어지며, 0은 맵의 위쪽을 바라보는 것을 의미합니다.
    (스프라이트를 아래쪽으로 바라보도록 전환하려면 4를 사용하고, 남동쪽을 바라보도록
    하려면 5를 사용합니다.)

    Sprite ID는 이 특정 NPC를 표시하는 데 사용되는 스프라이트 번호 또는 상수입니다.
    몬스터 ID를 사용하여 이 NPC에 몬스터 스프라이트를 표시할 수도 있습니다.
    작업 스프라이트를 사용할 수도 있지만, 먼저 'mob_avail.yml'에서 몬스터 스프라이트로
    정의해야 합니다. 이에 대한 자세한 설명은 이 매뉴얼의 범위를 벗어납니다.
    '-1' 스프라이트 ID는 NPC를 보이지 않게(클릭할 수 없게) 만듭니다.
    '111' 스프라이트 ID는 스프라이트가 없지만 클릭할 수 있는 NPC를 만듭니다. 이는
    3D 지형의 클릭 가능한 객체를 만들 때 유용합니다.

    TriggerX와 triggerY가 지정된 경우, 해당 NPC를 중심으로 트리거X 셀을 X축 방향으로
    트리거Y 셀을 Y축 방향으로 걸쳐있는 영역을 정의합니다. 이 영역에 들어가면 NPC가
    활성화됩니다. NPC 코드에 'OnTouch:' 특수 레이블이 없으면 실행이 스크립트의
    처음부터 시작되고, 그렇지 않으면 'OnTouch:' 레이블에서 시작합니다. 몬스터도 NPC를
    활성화할 수 있으며, 이 경우 'OnTouchNPC:' 레이블이 사용됩니다

    코드 부분은 NPC가 트리거될 때마다 실행되는 스크립트 코드입니다. 이 코드는 명령어와
    함수 호출을 포함하며, 이 문서의 대부분을 구성하는 설명이 포함됩니다. 이 코드는
    다른 곳과는 달리 필수적인 매개변수로 중괄호로 묶여 있습니다.



    ** 'floating' NPC 오브젝트 정의

    -%TAB%script%TAB%<NPC 이름>%TAB%-1,{<code>}

    이 명령어는 일반적인 방법으로는 작동하지 않는 NPC 객체를 정의합니다. 이것은 보통
    아무것도 할 수 없기 때문에 무의미할 수 있지만, 지정된 시간에 스크립트를 실행하는 것과
    관련된 몇 가지 예외가 있습니다. 이러한 'floating' NPC 객체를 사용하는 방법에 대해
    자세히 알아보겠습니다.



    ** shop/cashshop/itemshop/pointshop NPC 정의

    -%TAB%shop%TAB%<NPC 이름>%TAB%<스프라이트 id>{,할인율},<아이템 id>:<가격>{,<아이템 id>:<가격>...}
    <맵 이름>,<x>,<y>,<바라보는 방향>%TAB%shop%TAB%<NPC 이름>%TAB%<스프라이트 id>{,할인율},<아이템 id>:<가격>{,<아이템 id>:<가격>...}

    -%TAB%cashshop%TAB%<NPC 이름>%TAB%<스프라이트 id>,<아이템 id>:<가격>{,<아이템 id>:<가격>...}
    <map 이름>,<x>,<y>,<facing>%TAB%cashshop%TAB%<NPC 이름>%TAB%<스프라이트 id>,<아이템 id>:<가격>{,<아이템 id>:<가격>...}

    -%TAB%itemshop%TAB%<NPC 이름>%TAB%<스프라이트 id>,<비용아이템 id>{:<할인율>},<아이템 id>:<가격>{,<아이템 id>:<가격>...}
    <map 이름>,<x>,<y>,<facing>%TAB%itemshop%TAB%<NPC 이름>%TAB%<스프라이트 id>,<비용아이템 id>{:<할인율>},<아이템 id>:<가격>{,<아이템 id>:<가격>...}

    -%TAB%pointshop%TAB%<NPC 이름>%TAB%<스프라이트 id>,<비용변수>{:<할인율>},<아이템 id>:<가격>{,<아이템 id>:<가격>...}
    <map 이름>,<x>,<y>,<facing>%TAB%pointshop%TAB%<NPC 이름>%TAB%<스프라이트 id>,<비용변수>{:<할인율>},<아이템 id>:<가격>{,<아이템 id>:<가격>...}

    <map 이름>,<x>,<y>,<facing>%TAB%marketshop%TAB%<NPC 이름>%TAB%<스프라이트 id>,<아이템 id>:<가격>:<재고>{,<아이템 id>:<가격>:<재고>...}

    참고: 더불어, 상인들은 npc/barters.yml에서 정의될 수 있습니다.

    이것은 상점 NPC를 정의하며, 트리거(클릭으로만 가능)될 때 상점 창이 열립니다.
    상점 NPC에서는 어떠한 코드도 실행되지 않으며, 스크립트 자체를 수정하지 않으면
    가격을 변경할 수 없습니다.

    아이템 ID는 'db/item_db.yml' 데이터베이스에서 아이템 번호입니다. 가격을 -1로 설정하면,
    아이템 데이터베이스에 지정된 '구매 가격'이 사용됩니다. 그렇지 않으면 지정한 가격이
    이 아이템에 대해 사용됩니다. 이것은 서로 다른 상점에서 아이템에 다른 가격을 만드는 방법입니다.

    선택적으로 할인 옵션을 지정하고 "yes" 또는 "no"로 설정하여 할인 기능을 사용하거나
    사용하지 않을 수 있습니다.

    다른 유형의 상점도 있습니다:
    캐시샵(cashshop) - "shop" 대신 "cashshop"을 사용하여 캐시샵 인터페이스를 사용할 수
    있습니다. 이를 통해 계정 변수로 저장된 특별한 포인트로 아이템을 구매할 수 있습니다.
    이 유형의 상점은 판매를 허용하지 않으며 구매만 가능합니다. 판매 아이템을 정의하는
    레이아웃은 여전히 적용되며, "<price>"는 구매에 사용할 포인트 수를 나타냅니다.

    "itemshop"과 "pointshop"은 상점 인터페이스를 사용하여 특정 아이템 또는 특별한
    포인트로 아이템을 구매할 수 있습니다. 'pointshop'은 영구 캐릭터 변수, 임시 캐릭터 변수,
    영구 로컬 계정 변수 또는 영구 글로벌 계정 변수만 지원합니다. 이 변수들은 문자열이
    아닌 정수형이어야 합니다. '할인(discount)' 플래그는 선택적인 값으로,
    해당 상점의 가격에 할인 스킬이 영향을 미치도록 합니다.

    "marketshop"은 아이템의 제한된 수량을 가질 수 있습니다. 재고 필드에 -1을
    사용하면 무제한 재고를 가진 마켓샵을 만들 수 있습니다.




    ** warp/shop/cashshop/itemshop/pointshop/NPC duplicate 정의

    warp/warp2: <map 이름>,<x>,<y>,<facing>%TAB%duplicate(<label>)%TAB%<NPC 이름>%TAB%<spanx>,<spany>
    shop/cashshop/itemshop/pointshop/npc: -%TAB%duplicate(<label>)%TAB%<NPC 이름>%TAB%<스프라이트 id>
    shop/cashshop/itemshop/pointshop/npc: <map name>,<x>,<y>,<facing>%TAB%duplicate(<label>)%TAB%<NPC Name>%TAB%<sprite id>
    npc: -%TAB%duplicate(<label>)%TAB%<NPC Name>%TAB%<sprite id>,<triggerX>,<triggerY>
    npc: <map name>,<x>,<y>,<facing>%TAB%duplicate(<label>)%TAB%<NPC Name>%TAB%<sprite id>,<triggerX>,<triggerY>

    이것은 'label'로 참조되는 워프/상점/캐시샵/아이템샵/NPC를 복제합니다.
    워프 복제본은 대상 위치를 상속합니다.
    상점/캐시샵/아이템샵 복제본은 아이템 목록을 상속합니다.
    NPC 복제본은 스크립트 코드를 상속합니다.
    나머지(이름, 위치, 방향, 스프라이트 ID, 범위/트리거 영역)는 복제본의 정의에서
    얻어집니다(상속되지 않음).

    #### 참고
    <map name>: 워프 대상 맵의 이름을 나타냅니다.
    <x>: 워프 대상 위치의 x좌표를 나타냅니다.
    <y>: 워프 대상 위치의 y좌표를 나타냅니다.
    <facing>: 워프 대상 위치에서의 방향을 나타냅니다.
    %TAB%: 탭 문자로 각 구성 요소를 구분합니다.
    duplicate(<label>): 이미 정의된 워프(NPC)의 레이블을 참조하여, 해당 워프(NPC)의 정의를 복제합니다.
    <NPC name>: 복제한 워프(NPC)에 대한 이름을 지정합니다.
    <spanx>: 워프(NPC)의 트리거 영역(span)의 가로 크기를 지정합니다.
    <spany>: 워프(NPC)의 트리거 영역(span)의 세로 크기를 지정합니다.
    <triggerX>: NPC를 클릭할 수 있는 영역의 중심점 X좌표를 지정합니다.
    <triggerY>: NPC를 클릭할 수 있는 영역의 중심점 Y좌표를 지정합니다.




    ** function object 정의

    function%TAB%script%TAB%<function 이름>%TAB%{<code>}

    이것은 함수 객체를 정의하며 'callfunc' 명령을 사용하여 호출할 수 있습니다 (아래 참조).
    이 객체는 각각의 맵 서버에서 로드되므로 어디에서나 사용할 수 있습니다.
    이 객체 안에 있는 코드를 'callfunc' 명령 이외의 방법으로 실행하는 것은 불가능합니다.

    'code' 부분은 함수가 호출될 때 실행될 스크립트 코드입니다. 중괄호로 묶여 있으며,
    이는 선택적 매개변수를 나타내는 중괄호와는 다릅니다.

    'code' 필드를 가진 객체가 정의되면, 실제로 트리거되고 실행될 수 있는 스크립트
    명령이 포함됩니다.

    ~ RID? GID? ~

    RID가 무엇이고 왜 알아야 하는지
    ------------------------------------

    대부분의 스크립팅 명령어와 함수는 캐릭터에 대한 데이터를 요청하거나 해당 캐릭터에
    참조하는 변수를 저장하거나, 해당 캐릭터에 연결된 클라이언트로 데이터를 보내야 합니다.
    캐릭터가 클릭하거나 OnTouch 영역에 들어가는 등의 방법으로 코드를 실행시킬 때마다
    RID라는 것이 전달됩니다. 이것은 코드를 실행시킨 캐릭터의 계정 ID 번호입니다.

    공통 NPC만 작성하는 경우 RID를 신경 쓰지 않아도 됩니다. 그러나 함수를 사용하거나
    타이머를 사용하거나 시계 기반 스크립트 활성화를 사용하는 경우에는 RID가 첨부되지
    않은 상태에서 스크립트 실행이 트리거될 수 있는 모든 경우를 알아야 합니다.
    그렇지 않으면 많은 명령어와 함수가 사용 불가능해지며, 특정 캐릭터의 데이터를
    요청하거나 해당 클라이언트에 데이터를 보내거나, 해당 캐릭터에 특정 변수를
    저장하려는 경우 작업할 캐릭터를 알 수 없습니다.

    그러나 'attachrid'를 사용하여 스크립트에 캐릭터를 명시적으로 첨부한 경우에는
    예외입니다.

    우리가 '호출 캐릭터'라고 말할 때, '실행 중인 스크립트에 첨부된 RID를 가진 캐릭터'를
    의미합니다. 스크립트 함수 "playerattached"를 사용하여 현재 스크립트에 연결된
    플레이어를 확인할 수 있습니다 (플레이어가 연결되어 있지 않은 경우나 연결된
    플레이어가 맵 서버에서 로그오프 한 경우 0을 반환합니다).


    GID는?
    --------------------------------
    GID는 무언가의 게임 ID를 나타냅니다. 이는 mobspawn (몹 컨트롤 명령)를 통해
    얻은 GID일 수도 있고 캐릭터의 계정 ID일 수도 있습니다. 또 다른 방법은
    GM으로 스프라이트된 캐릭터, 몹 또는 NPC를 마우스 오른쪽 버튼으로 클릭하여
    GID를 확인할 수 있습니다.

    'getpetinfo', 'getmercinfo', 'gethominfo' 및 'geteleminfo'도 참조하십시오.

    이는 대부분의 스킬과 몹 컨트롤 명령이 구현된 새 버전에서 주로 사용됩니다.


    Item and pet 스크립트
    ------------------------

    아이템 데이터베이스의 각 아이템은 Script, EquipScript 및 UnEquipScript 세 가지
    특수 필드를 갖습니다. 첫 번째는 캐릭터가 아이템을 장착할 때마다 실행되는
    스크립트 코드이며, 이때 RID는 장착하는 캐릭터의 계정 ID 번호입니다. 아이템을
    해제할 때마다, 스크립트 명령으로 인해 제공되는 모든 일시적인 보너스가
    지워지며, 모든 스크립트가 다시 실행되어 보너스를 재구성합니다.
    이는 로그인시와 같은 다른 상황에서도 발생하지만, 전체 목록은 현재
    알려져 있지 않습니다.

    EquipScript는 캐릭터가 아이템을 더블 클릭하여 사용할 때 실행되는 스크립트
    코드이며, UnEquipScript는 캐릭터가 장비를 해제할 때 실행됩니다.

    아이템 스크립트에서 모든 스크립트 명령이 제대로 작동하지는 않습니다.
    명령 및 함수가 아이템 스크립트에서 사용하기 위해 구체적으로 설계된 것으로
    알려진 경우, 해당 내용이 설명됩니다.

    모든 펫은 펫 데이터베이스에서 PetScript 필드를 가지며, 이 필드는 펫의 동작을
    결정합니다. 이는 해당 유형의 펫이 스폰될 때(알에서 부화되거나, 해당 펫을
    따르던 캐릭터가 연결될 때 캐릭터 서버에서 로드될 때) 호출됩니다.
    이는 몇 가지 다른 상황에서도 발생할 수 있습니다. 펫 스크립트에서 정확하게
    사용 가능한 명령어가 아닌 것들은 신뢰성 있게 작동하지 않을 수 있으니 참고하세요.



    숫자
    ----

    일반적인 10진수 이외에도 (이 언어에서 모든 숫자는 정수이므로 소수를 사용하지 마세요)
    이 스크립트 엔진은 16진수를 처리할 수 있습니다. '0x<16진수>'와 같은 형태로
    숫자를 작성하면 16진수 값으로 인식됩니다. 0x10은 16과 같습니다. 또한 'mes 0x10'을
    입력하면 '16'이 출력됩니다.
    숫자 값은 정수 변수의 한계를 초과할 수 없습니다. INT64_MAX(9223372036854775807)보다
    크거나 INT64_MIN(-9223372036854775808)보다 작은 수는 이 값으로 제한되며
    경고가 발생합니다.


    변수
    ----
    모든 프로그래밍 언어의 중요한 부분은 변수입니다 - 데이터를 저장하는 곳입니다.
    rAthena 스크립트 언어에서 변수 이름은 대소문자를 구분하지 않습니다

    변수는 다음과 같이 구분되고 고유하게 식별됩니다:

    prefix(접두사) - 변수의 범위와 수명을 결정합니다.
    name(이름) - 변수이름( _를 포함한 영숫자)
    postfix(접미사) - 변수유형(숫자 또는 문자열)

    변수의 범위는 다음과 같습니다 :
    global - 모든서버에 대해 전역적으로 사용가능
    local - server에서 로컬로 사용
    account - RID로 식별된 캐릭터의 계정에 연결된 변수
    character - RID로 식별된 캐릭터에 연결된 변수
    npc - NPC에 연결된 변수
    scope - 인스턴스의 범위에 연결된 변수

    변수의 수명:
    permanent - 서버가 리세트 되어도 존재
    temporary - 서버가 리세트 되면 사라짐

    Prefix(접두사): 범위와 수명
    nothing - 캐릭터에 부착된 영구 변수, 기본 변수 유형입니다.
    char-server에서 'char_reg_num' 및 'char_reg_str'에 저장됩니다.

    "@" - 캐릭터에 부착된 임시 변수입니다. 2094 버전 이전의 SVN 버전
    및 RC5 버전은 'l'을 임시 변수 접두사로 처리하기 때문에 변수
    이름이 'l'로 시작하는 경우 완전한 하위 호환성을 원하는 경우
    주의해야 합니다.

    "$" - 전역 영구 변수입니다. map-server에서 데이터베이스 테이블
    'mapreg'에 저장됩니다.

    "$@" - 전역 임시 변수입니다. RID가 연결되어 있지 않은 스크립트에
    중요합니다. 즉, 특정 캐릭터 개체에서 트리거되지 않은 경우입니다.

    "." - NPC 변수입니다. NPC에 존재하며 서버를 다시 시작하거나
    NPC를 다시로드할 때 사라집니다. NPC 내부 또는 'getvariableofnpc'를
    호출하여 액세스할 수 있습니다. 함수 객체도 .variables을 가질 수
    있으며, 이는 함수 내부에서 액세스할 수 있지만 'getvariableofnpc'는
    함수 객체에서 작동하지 않습니다.

    ".@" - 스코프 변수입니다. 인스턴스와 범위에 고유합니다. 각 인스턴스는
    자체 범위를 갖습니다. 함수를 callsub/callfunc로 호출하면 새 범위가
    시작되며 함수에서 반환하면 종료됩니다. 범위가 종료되면 변수가
    값으로 변환됩니다 ('return .@var;'는 참조가 아니라 값으로 반환됩니다).

    "'" - 인스턴스 변수입니다. 인스턴싱 시스템에서 사용되며 각 인스턴스
    유형에 고유합니다. 인스턴스 내부 또는 'getinstancevar'를 호출하여
    액세스할 수 있습니다.

    "#" - 영구 지역 계정 변수입니다. char-server에서 'acc_reg_num' 테이블과
    'acc_reg_str'에 저장됩니다.

    "##" - 로그인 서버에 저장되는 영구 전역 계정 변수입니다. 'global_acc_reg_num'
    테이블과 'global_acc_reg_str'에 저장됩니다. 일반 # 변수와의 유일한 차이점은
    여러 char-server가 동일한 로그인 서버에 연결된 경우입니다.
    # 변수는 각 char-server에 고유하지만 ## 변수는 모든 char-server에서 공유됩니다.


    Postfix(접미사): 정수 또는 문자열

    nothing - 정수 변수, 양수와 음수의 수를 저장할 수 있지만, 소수점 사용하지 마세요.
    '$' - 문자열 변수, 텍스트를 저장할 수 있습니다.

    예제:
    name - 영구적인 캐릭터 정수 변수
    name$ - 영구적인 캐릭터 문자열 변수
    @name - 일시적인 캐릭터 정수 변수
    @name$ - 일시적인 캐릭터 문자열 변수
    $name - 영구적인 전역 정수 변수
    $name$ - 영구적인 전역 문자열 변수
    $@name - 일시적인 전역 정수 변수
    $@name$ - 일시적인 전역 문자열 변수
    .name - NPC 정수 변수
    .name$ - NPC 문자열 변수
    .@name - 스코프 정수 변수
    .@name$ - 스코프 문자열 변수
    'name - 인스턴스 정수 변수
    'name$ - 인스턴스 문자열 변수
    #name - 영구적인 로컬 계정 정수 변수
    #name$ - 영구적인 로컬 계정 문자열 변수
    ##name - 영구적인 전역 계정 정수 변수
    ##name$ - 영구적인 전역 계정 문자열 변수

    변수에 값이 할당되지 않았다면, 정수 변수의 경우 0과 같다고 간주되며, 문자열 변수의
    경우 빈 문자열("" 따옴표 사이에 아무것도 없는)이라고 간주됩니다.
    변수를 값으로 설정하면, 그 변수는 영원히 잊혀지고 문자나 계정 데이터로 저장되었더라도
    어떤 흔적도 남지 않습니다.

    일부 변수는 특별한 경우가 있습니다. 즉, 스크립팅 엔진에 의해 이미 정의된 변수입니다.
    전체 목록은 'src/map/script_constants.hpp' 파일에서 확인할 수 있으며,
    해당 파일은 많은 명령에 대한 번호 대신 더 쉬운 텍스트로 대체할 수 있도록 합니다.
    다음은 가장 흔하게 사용되는 특별 변수는 모두 영구적인 캐릭터 기반 변수입니다.

    Zeny - Zeny의 양
    Hp - 현재 Hp
    MaxHp - 최대 Hp
    Sp - 현재 Sp
    MaxSp - 최대 Sp
    StatusPoint - 남은 스탯 포인트
    SkillPoint - 남은 스킬 포인트
    BaseLevel - 캐릭터의 베이스 레벨
    JobLevel - 캐릭터의 직업 레벨
    BaseExp - 베이스 경험치
    JobExp - 직업 경험치
    NextBaseExp - 다음 레벨에 필요한 베이스 경험치
    NextJobExp - 다음 레벨에 필요한 직업 경험치
    Weight - 현재 캐릭터의 무게
    MaxWeight - 캐릭터의 최대 무게
    Sex - 여성인 경우 0, 남성인 경우 1
    Class - 캐릭터의 직업
    Upper - 캐릭터가 일반 클래스인 경우 0, 전승인 경우 1, 베이비인 경우 2
    BaseClass - Upper 값과 관련되어 캐릭터가 1-1 'normal' 직업
    예들들어 직업이 Acolyte, Priest/Monk, High Priest/Champion,
    Arch Bishop/Sura인 경우 모두 Job_Acolyte를 반환 합니다.
    캐릭터가 1-1 클래스에 도달하지 않았을 경우는 Job_Novice를
    반환합니다.
    BaseJob - Upper 값과 관련하여 캐릭터의 'normal' 직업
    예들들어 Acolyte, Baby Acolyte, High Acolyte는
    모두 Job_Acolyte를 반환합니다
    Karma - 캐릭터의 카르마. 카르마 시스템은 완전히 기능하지는 않지만,
    전혀 작동하지 않는 것은 아닙니다. 테스트되지 않았습니다.
    Manner - 캐릭터의 매너 평가. 플레이어가 'manner.txt' 클라이언트 파일을
    사용하여 금지된 단어를 사용하면 음수가 됩니다.
    Ap - 현재 Ap 포인트
    MaxAp - 최대 Ap 포인트


    이러한 것들은 변수처럼 동작하지만, 모두 설정할 수 있는 것은 아닙니다.
    모든 것에 대해 설정하는 것이 작동할지 확실하지 않습니다.
    무언가를 설정하는 명령어나 함수가 있는 경우, 그것을 사용하는 것이
    일반적으로 우선적입니다. 중요한 예외는 Zeny입니다. Zeny는
    직접 수정할 수 있으며, 종종 직접 수정하게 됩니다.
    설정하면 캐릭터가 해당 Zeny 수를 소유하게됩니다.
    Zeny를 음수로 설정하려고하면 스크립트가 오류로 종료됩니다.

    다음 일부 소스 상수는 스크립트에서도 액세스할 수 있습니다.
    이 목록은 'src/map/script_constants.hpp'에 위치하며 서버 정의 및
    상태 옵션과 같은 상수를 포함합니다:

    PACKETVER, MAX_LEVEL, MAX_STORAGE, MAX_INVENTORY, MAX_CART, MAX_ZENY, MAX_PARTY,
    MAX_GUILD, MAX_GUILDLEVEL, MAX_GUILD_STORAGE, MAX_BG_MEMBERS, MAX_CHAT_USERS,
    VIP_SCRIPT, MIN_STORAGE

    Option_Nothing, Option_Sight, Option_Hide, Option_Cloak, Option_Falcon, Option_Riding,
    Option_Invisible, Option_Orcish, Option_Wedding, Option_Chasewalk, Option_Flying,
    Option_Xmas, Option_Transform, Option_Summer, Option_Dragon1, Option_Wug,
    Option_Wugrider, Option_Madogear, Option_Dragon2, Option_Dragon3, Option_Dragon4,
    Option_Dragon5, Option_Hanbok, Option_Oktoberfest, Option_Dragon, Option_Costume


    변수할당
    ---------

    변수는 다른 프로그래밍 언어와 비슷하게 액세스하고 수정할 수 있습니다.

    .@x = 100;
    .@x = .@y = 100;

    값을 할당할 때 아래 '연산자' 섹션에 나열된 모든 연산자 방법을 지원합니다. 예를 들면:

    .@x += 100;
    .@x -= 100;
    .@x *= 2;
    .@x /= 2;
    .@x %= 5;
    .@x >>= 2;
    .@x <<= 2;

    위와 같은 방법이 모두 작동합니다. 사용 가능한 연산자에 대한 자세한 정보는
    아래에서 설명하는 연산자 섹션을 참조하십시오. 변수를 수정할 때
    '=' 기호 앞에 나열된 모든 연산자는 필요한 작업을 수행합니다.

    참고:

    !! 현재 스크립트 엔진은 배열 변수를 직접 복사하는 것을 지원하지 않습니다.
    !! 변수 간에 배열을 복사하려면 'copyarray' 함수를 사용해야합니다.


    문자열
    -------

    문자열 내부에 " 를 사용할려면 이스케이프문자 \를 사용해야 합니다.


    배열
    ------

    배열은 rAthena에서 기본적으로 동일한 이름으로 구성된 변수 집합입니다.
    배열의 특정 변수를 구분하기 위해서는 '배열 인덱스'를 사용해야 합니다.
    배열 내 변수의 번호를 뜻합니다.

    <변수 이름>[<배열 인덱스>]

    모든 변수 유형을 배열로 사용할 수 있습니다.

    배열 내에 저장된 변수는 '배열 요소'라고도 합니다. 배열은 유사한 데이터 집합
    (예: 여러 개의 아이템 ID)을 저장하고 루프를 통해 반복 처리하는 데 유용합니다.
    배열 변수를 일반 변수처럼 사용할 수 있습니다.

    set .@arrayofnumbers[0],1;

    또한 변수 (또는 식 또는 다른 배열의 값)을 사용하여 배열 값에 접근할 수 있습니다.

    set .@x,100;
    set .@arrayofnumbers[.@x],10;

    이렇게 하면 .@arrayofnumbers[100]이 10이 됩니다.

    인덱스 번호는 항상 0에서 시작하며 배열은 20억 개 이상의 변수를 보유할 수
    있습니다. 따라서 인덱스에 대한 허용된 값은 0 ~ 2147483647 범위 내에 있습니다.

    배열 인덱스는 음수일 수 없습니다. 배열에서 음수 번호의 변수를 가져오려고
    하면 예측할 수 없는 동작이 발생할 수 있습니다.

    배열은 문자열을 자연스럽게 저장할 수 있습니다.

    .@menulines$[0]은 문자열 배열 .@menulines$의 0번째 요소입니다.
    대괄호 뒤에 있는 '$'는 일반적으로 문자열 변수를 나타내는 것입니다.


    연산자
    ---------

    연산자는 변수와 숫자에 적용할 수 있는 것입니다. 그것들은 보통 수학
    연산이나 조건 연산자입니다.

    + - 는 두 숫자를 더합니다. 두 개의 문자열을 더하면 결과는 더한 문자열입니다.
    숫자와 문자열을 더할 수 있으며 결과는 문자열입니다.
    다른 수학 연산자는 문자열과 함께 작동하지 않습니다.
    - - 두 숫자를 뺍니다.
    * - 두 숫자를 곱합니다.
    / - 두 숫자를 나눕니다. 이는 정수 나눗셈입니다. 즉, 7/2는 3.5가 아니라 3입니다.
    % - 나눗셈의 나머지를 반환합니다. 7%2는 1과 같습니다.

    조건 연산자도 있습니다. 이는 'if' 명령어와 관련이 있으며 조건이 충족되면
    1을 반환하고 그렇지 않으면 0을 반환합니다.
    (이를 'boolean' 변수라고 부릅니다. 0은 'False'를 의미합니다.
    0이 아닌 다른 모든 값은 'True'를 의미합니다.
    -1, -5 및 0보다 작은 숫자도 'True'입니다.)

    숫자를 서로 비교하거나 문자열을 서로 비교할 수 있지만,
    숫자와 문자열을 비교할 수는 없습니다.

    == - 양쪽 값이 같으면 참(True)입니다. 문자열의 경우, 두 값이 동일해야 참(True)입니다.
    >= - 첫 번째 값이 두 번째 값과 같거나 크면 참(True)입니다.
    <= - 첫 번째 값이 두 번째 값과 같거나 작으면 참(True)입니다.
    > - 첫 번째 값이 두 번째 값보다 크면 참(True)입니다.
    < - 첫 번째 값이 두 번째 값보다 작으면 참(True)입니다.
    != - 첫 번째 값이 두 번째 값과 같지 않으면 참(True)입니다.

    예제:

    1 == 1 : 참(True)입니다.
    1<2 : 참(True)이며 1>2는 거짓(False)입니다.
    .@x>2 : .@x가 3이면 참(True)입니다. 하지만 .@x가 2면 거짓(False)입니다.

    문자열 비교에 대해서는 '=='와 '!='만 검증되었습니다. 이 언어에서 복잡한
    데이터 구조를 코딩할 방법이 없기 때문에 알파벳순으로 문자열을
    정렬하는 것은 의미가 없을 것입니다.

    다음과 같이 비교 연산자들은 같은 조건 내에서 쌓아서 사용할 수 있습니다.

    && - 양쪽 모두가 참일 때만 True입니다.
    ('1 == 1 && 2 == 2'는 참입니다. '2 == 1 && 1 == 1'은 거짓입니다.)
    || - 이 식의 어느 한 쪽이 참일 때 True입니다.

    1 == 1 && 2 == 2 : 참입니다.
    1 == 1 && 2 == 1 : 거짓입니다.
    1 == 1 || 2 == 1 : 참입니다.

    논리 비트 연산자들은 오로지 숫자에 대해서만 동작하며, 다음과 같습니다.

    << - 왼쪽 shift.
    >> - 오른쪽 shift.

    왼쪽 시프트는 숫자를 n만큼 왼쪽으로 이동시키는 것입니다.
    이는 2를 n번 곱하는 것과 같습니다.
    오른쪽 시프트는 숫자를 n만큼 오른쪽으로 이동시키는 것입니다.
    이는 2를 n번 나누는 것과 같습니다.

    예제:
    set b,2;
    set a, b << 3;
    mes a;
    set a, a >> 2;
    mes a;

    위 예제에서 첫 번째 mes 명령어는 16을 출력합니다.
    이는 2 x (2 x 2 x 2) = 16과 같습니다.
    두 번째 mes 명령어는 4를 출력합니다.
    이는 16 / 2 = 8. 8 / 2 = 4와 같습니다.

    & - And.
    | - Or.

    비트 연산자 AND (&)는 두 값을 비교하여, 둘 다 활성화된
    비트를 설정합니다.
    이는 몇 가지 용도로 사용될 수 있지만, rAthena에서
    이 연산자는 대개 스크립트에서
    비트 마스크를 생성하는 데 사용됩니다.

    비트 연산자 OR (|)은 두 숫자 중 하나의 이진 위치가 1인 경우,
    이진 위치를 1로 설정합니다.
    이렇게 하면 변수에 여러 값을 저장할 수 있는데,
    이를 비트 마스크라고 합니다.
    현재 변수는 0에서 31번까지의 비트 마스크를 저장할 수 있습니다.
    이는 플레이어가 가질 수 있는 여러 체크를 저장하는 배열을
    사용하지 않고도, 저렴하게 여러 값을 저장할 수 있는
    쉬운 방법입니다.

    비트 마스크는 기본적으로 변수의 비트를 이용하여 하나의
    변수 내에서 여러 옵션을 설정하는 것입니다.
    현재 변수 제한으로 인해 하나의 변수에 32개의 서로 다른
    옵션을 저장할 수 있습니다
    (0에서 31번 위치의 비트를 사용하여).

    예제:
    - & 연산자의 기본적인 사용 방법:
    10 & 2 = 2
    계산결과 :
    10 = 2^1 + 2^3 (2 + 8), 이를 비트로 나타내면 1010
    2 = 2^1 (2), 이를 비트로 나타내면 (크기가 같음) 0010
    & (AND) 연산자는 두 인자에서 활성화된(1) 비트를
    설정하므로, 예제에서는 1010 & 0010에서
    2^1 비트만 두 인자에서 모두 활성화되어 있습니다.
    결과적으로 비트 0010이 나오며, 이는 2입니다.

    - 비트 마스크 생성 및 사용의 기본적인 예제:
    set .@options,2|4|16; //(참고: 2+4+16 또는 22와 같음)
    if (.@options & 1) mes "Option 1이 활성화되었습니다.";
    if (.@options & 2) mes "Option 2이 활성화되었습니다.";
    if (.@options & 4) mes "Option 3이 활성화되었습니다.";
    if (.@options & 8) mes "Option 4이 활성화되었습니다.";
    if (.@options & 16) mes "Option 5이 활성화되었습니다.";
    이 코드는 옵션 2, 3, 5가 활성화되었다는 메시지를 반환합니다
    (2, 4, 16 비트를 1로 설정했기 때문에).

    ^ - Xor.

    비트 연산자 XOR는 두 숫자가 같은 위치에 같은 값을 가지면
    해당 위치에 0을 설정하고, 다른 값을 가지면 해당 이진 위치에
    1을 설정합니다. 이는 비트 마스크에서 비트를 설정하거나
    해제하는 또 다른 방법입니다.

    예제:
    - 먼저 진행 중인 퀘스트를 설정해 봅시다:
    set inProgress,1|8|16; // 퀘스트 1, 8, 16이 진행 중입니다.
    - 일정 시간 이후, 플레이어는 다른 퀘스트를 시작합니다:
    if (inProgress&2 == 0) {
    // 이것은 퀘스트 2의 비트를 설정합니다
    // (inProgress는 해당 비트가 0으로 설정되어 있습니다)
    set inProgress,inProgress^2;
    mes "Quest 2: 초보자를 찾아 한 시간 동안 도움을 줍니다.";
    close;
    }
    - 일정 시간 동안 Xor에 대한 정보를 읽은 후,
    플레이어는 마침내 quest 1을 완료합니다:
    if (inProgress&1 && isComplete) {
    // 이것은 퀘스트 1의 비트를 해제합니다
    // (inProgress는 해당 비트가 1로 설정되어 있습니다)
    set inProgress,inProgress^1;
    mes "Quest 1 완료!! Xor 왕조의 비밀을 해금했습니다. 현명하게 사용하세요.";
    close;
    }

    단항 연산자는 하나의 수와 함께 사용되는 연산자입니다. 이 중에서도 다음과 같은 것들이 있습니다:

    - - 부정.
    숫자의 부호를 반대로 바꿉니다. 양수였다면 음수로,
    음수였다면 양수로 변합니다

    예제:
    set .@myvar,10;
    mes "Negative 10 is " + (-.@myvar);

    ! - 논리 부정 연산자
    표현식의 부울 결과를 반전시킵니다. 참은 거짓으로, 거짓은 참으로 변환됩니다.

    예제:
    if (!callfunc("F_dosomething"))
    {
    mes "Doing something failed.";
    close;
    }

    ~ - 비트 Not
    숫자의 각 비트를 반전시키며, one's complement라고도합니다.
    0으로 설정된 비트는 1로, 1로 설정된 비트는 0으로 바뀝니다.

    예제:
    - 다른 모든 퀘스트는 활성화되어 있다면 그대로 두고 퀘스트2만 비활성화 시킨다
    set inProgress,inProgress&(~2); // inProgress에서 2번째 비트만 0으로 변경 (0xfffffffd)


    삼항 연산자는 세 개의 표현식(숫자, 문자열 또는 불리언)을 사용합니다. 다음과 같습니다::

    ?: - 삼항연산자
    다음의 if else 문을 대체 합니다.

    if (Sex) mes "..."; else mes "..."; // 기존의 if-else문

    간단하게 표현하면

    mes "Welcome, " + (Sex?"Mr.":"Mrs.") + " " + strcharinfo(0); // 삼항 연산자로 대체

    ?: 연산자는 우선순위가 낮기 때문에 대부분의 경우 괄호로 둘러싸야 합니다.

    라벨
    ------

    실행 가능한 스크립트 코드 내에서는 몇몇 줄이 라벨이 될 수 있습니다:

    <label 이름>:

    라벨은 스크립트 내에서 참조 지점으로 사용할 수 있으며, 'goto', 'menu', 'jump_zero'
    명령을 사용하여 실행 경로를 변경하거나 'doevent', 'donpcevent' 명령을 통해
    호출될 수 있으며, 기본적으로 필수적입니다. 라벨의 이름은 22자를 초과할 수 없습니다.
    (23번째 문자는 ':'입니다.) 라벨 이름은 영숫자 및 밑줄만 포함될 수 있습니다.
    직접 이름을 지을 수 있는 라벨 이외에도, 스크립트 엔진이 특정 이벤트가
    발생하면 실행을 시작하는 몇몇 특수한 라벨이 있습니다:

    OnClock<hour><minute>:
    OnMinute<minute>:
    OnHour<hour>:
    On<weekday><hour><minute>:
    OnDay<month><day>:

    이것은 서버 시계가 지정된 날짜 또는 시간을 되었을때 실행됩니다.
    시간과 분은 밀러터리 시간으로 지정됩니다.
    ('0105'는 새벽 01:05를 의미합니다.)
    요일은 일, 월, 화, 수, 목, 금, 토입니다.
    월은 01에서 12까지이며, 일은 01에서 31까지입니다. 0을 기억하세요.

    OnInit:
    OnInterIfInit:
    OnInterIfInitOnce:

    OnInit는 스크립트 로딩이 완료될 때마다 실행됩니다.
    @reload script 명령어로 스크립트를 다시 로드할 때도 실행됩니다.
    OnInterIfInit는 맵 서버가 캐릭터 서버에 연결될 때 실행되며,
    OnInterIfInitOnce는 한 번만 실행되며 맵 서버가 나중에 캐릭터 서버에
    다시 연결될 때 실행되지 않습니다.

    OnAgitStart:
    OnAgitEnd:
    OnAgitInit:
    OnAgitStart2:
    OnAgitEnd2:
    OnAgitInit2:
    OnAgitStart3:
    OnAgitEnd3:
    OnAgitInit3:

    OnAgitStart는 @agitstart GM 명령어 또는 'AgitStart' 스크립트 명령어로
    WoE 모드로 전환될 때마다 실행됩니다. OnAgitEnd는 WoE가 끝날 때마다 실행됩니다.

    OnAgitInit는 초기 연결 후 맵 서버가 캐릭터 서버로부터 모든 성과 성을
    보유한 모든 길드의 데이터를 받은 후 실행됩니다.

    위에서 언급한 라벨 중 어느 하나가 트리거될 때 RID가 첨부되지 않으므로
    RID를 'attachrid'로 첨부하기 전까지 캐릭터 또는 계정 기반 변수에
    액세스할 수 없습니다.

    위 내용은 마지막 세 개의 라벨에도 적용되며, 이들은 WoE SE 전용으로
    사용되며 독립적으로 호출됩니다.

    OnInstanceInit:

    이 라벨은 'instance_create' 명령을 통해 인스턴스가 생성되고 초기화될 때
    실행됩니다. 인스턴스가 진행 중일 때 @reloadscript를 사용하면 다시 실행됩니다.

    OnInstanceDestroy:

    이 라벨은 인스턴스가 시간 초과로 인해 파괴되거나 'instance_destroy' 명령을 통해
    파괴될 때 실행됩니다. 인스턴스가 정확히 파괴되기 전에 호출되며
    인스턴스의 모든 다른 NPC는 이 시점에서 여전히 사용 가능합니다.

    OnTouch:

    이 라벨은 NPC 객체에 대한 트리거 영역이 정의된 경우 실행됩니다.
    트리거 영역이 없으면 NPC 코드의 시작부터 실행됩니다. 트리거 캐릭터
    객체의 RID가 첨부됩니다.

    OnPCLoginEvent:

    이 레이블은 플레이어가 로그인 할 때마다 실행됩니다.

    OnPCLogoutEvent:

    이 레이블은 플레이어가 로그아웃 할 때마다 실행됩니다.

    OnPCBaseLvUpEvent:

    이 레이블은 플레이어가 기본 레벨업 할 때마다 실행됩니다.

    OnPCJobLvUpEvent:

    이 레이블은 플레이어가 직업 레벨업 할 때마다 실행됩니다.

    OnPCDieEvent:

    이 특별한 라벨은 플레이어가 사망했을 때 트리거됩니다. 'killerrid' 변수는
    킬러의 ID로 설정됩니다.

    OnPCKillEvent:

    이 특별한 라벨은 플레이어가 다른 플레이어를 죽였을 때 트리거됩니다.
    'killedrid' 변수는 죽은 플레이어의 ID로 설정됩니다.

    OnNPCKillEvent:

    이 특별한 라벨은 라벨이 없는 몬스터를 플레이어가 죽였을 때 트리거됩니다.
    'killedrid' 변수는 죽은 몬스터의 클래스(몹 ID)로 설정됩니다.
    'killedgid' 변수는 죽은 몬스터의 ID(고유 몹 게임 ID)로 설정됩니다.

    OnPCLoadMapEvent:

    이 특별한 라벨은 'loadevent' 맵 플래그로 표시된 맵에 플레이어가 들어갈 때
    RID를 첨부하면 트리거됩니다. 이 라벨이 작동하려면 맵 플래그가
    필요한 이유는 그렇지 않으면 서버 전체에서 작동하여 플레이어가
    맵을 변경할 때마다 트리거됩니다. 1,000명의 플레이어가 서버에
    로드될 때의 서버 부하를 상상해보세요.

    OnWhisperGlobal:

    이 특별한 레이블은 플레이어가 NPC에 귓속말을 보내면 작동하며,
    플레이어의 RID가 첨부됩니다. 최대 열 개의 매개변수를 받을 수 있으며,
    각각 별도의 일시적인 문자열 변수 @whispervar0$에서 @whispervar9$까지 저장됩니다.
    자세한 설명은 'doc/whisper_sys.txt'을 참조하십시오.

    여기에는 스크립트 명령어와 관련이 없는 특별한 레이블만 나열되어 있습니다.
    비슷한 방식으로 트리거될 수 있는 다른 종류의 레이블도 있지만
    해당 명령어와 함께 설명되어 있습니다.

    OnNaviGenerate:

    이 특별한 레이블은 map-server-generator 이진 파일을 실행할 때 트리거됩니다.
    'naviregisterwarp'와 함께 사용하여 NPC에 추가 워프를 등록하는 데 사용됩니다.

    On<label name>:

    이러한 특별한 레이블은 대부분 몹 스크립트와 함께 사용되며, 몹이나 다른
    NPC에 명령어를 연결할 때 시작점으로 레이블 이름을 지정합니다.
    레이블 이름은 마음대로 지정할 수 있지만 "On"으로 시작해야 합니다.

    예제:

    monster "prontera",123,42,"Poringz0rd",2341,23,"Master::OnThisMobDeath";

    amatsu,13,152,4 script Master 767,{
    mes "Hi there";
    close;

    OnThisMobDeath:
    announce "Hey, " + strcharinfo(0) + " just killed a Poringz0rd!",bc_blue|bc_all;
    end;
    }

    Poringz0rd를 죽일 때마다 모든 사람에게 파란색으로 그 메시지가 나타납니다.

    "Global" 레이블

    레이블과 doevent에는 함정이 있습니다. (doevent를 사용하여) 레이블을
    호출하고 호출된 레이블이 트리거 영역을 가진 NPC에 있는 경우,
    해당 레이블은 전역적으로 작동하도록 끝에 "Global"을 붙여야 합니다.
    (일반적으로 RID가 트리거 영역 밖에 있기 때문에 그렇지 않으면
    OnTouch가 작동할 것입니다.) 자세한 내용은 npc.cpp에서
    npc_event를 참조하십시오.




    스크립트 명령어와 함수
    -------------------------

    이 명령어와 함수들은 특별한 순서로 나열되어 있지 않습니다. 명령어와 함수의
    차이점은 명령어는 '반환 값'이 없으며, 조건문에서 사용하거나 명령 인수로
    사용하거나 변수에 저장할 수 없다는 점입니다. 명령어를 함수처럼
    호출하는 것은 때로는 작동하지만 추적하기 어려운 오류를 유발할
    수 있으므로 권장되지 않습니다. 함수를 명령어처럼 호출하는 것은 스택을
    망가뜨리므로 'return' 명령이 해당 스크립트에서 올바르게 반환되지 않을
    수 있습니다.

    모든명령어는 ';' 로 끝나야 합니다.

    -------------------------



    1.- Basic 명령어
    2.- 정보검색 명령어
    3.- 확인 명령어
    4.- Player관련 명령어
    5.- Mob / NPC 관련 명령어
    6.- 기타 명령어
    7.- 인스턴스 명령어
    8.- Quest 로그 명령어
    9.- 전장 명령어
    10.- Pet 명령어
    10.1.- Pet Ai 명령어
    11.- 호문 명령어
    12.- 용병 명령어
    13.- 파티 명령어
    14.- 채널 명령어
    15.- 업적 명령어

    =====================
    |1.- Basic명령어. |
    =====================
    ---------------------------------------

    *mes "<문자열>"{,"<문자열>"{,...}};

    이 명령어는 호출된 캐릭터를 위해 화면에 대화상자를 표시하고, 그 대화상자에 지정된
    문자열을 출력합니다. 이전에 표시된 대화상자가 없는 경우, 보통은 이 대화상자에 '닫기'
    또는 '다음' 버튼이 없습니다. 'close' 또는 'next'를 사용하여 버튼을 만들어야 합니다.
    대화상자가 열려 있는 동안 플레이어는 아무것도 할 수 없으므로, 나중에 버튼을
    만드는 것이 중요합니다. 문자열이 비어 있으면 빈 줄로 표시됩니다.

    mes "대화상자에 나타날 텍스트";

    컬러
    ------
    문자열 안에 컬러 코드를 넣을 수 있습니다. 이것으로 문자열의 색상을 변경 할수
    있습니다. 컬러코드는 '^<R><G><B>' 로 3개로 16진수숫자로 이루어 있으며,
    만일 ^FF0000은 레드, ^00FF00는 그린, ^0000FF는 블루, ^000000는 블랙입니다.
    ^FF00FF는 마젠타이나 투명색상이기도 합니다. 컬러코드를 입력하여 텍스트
    색상을 지정 한 후 뒤의 블랙컬러의 텍스트를 출력하기 위해서는 블랙컬러코드를
    다시 설정해야 합니다.

    mes "이것은 ^FF0000 레드컬러 문자 ^000000 이고 이것은 ^00FF00 그린문자 ^000000 입니다.";

    텍스트 컬러는 클라이언트에 의해 처리 됩니다. 만약 비영어권 문자를 사용한다면
    비 영어권 문자를 사용하면 색상 코드가 인접한 문자와 붙어있는 경우에 꼬일 수 있습니다.
    양쪽 문자와 간격을 두고 분리하면 문제를 해결할 수 있습니다.


    멀티라인
    ----------
    한나의 'mes' 명령어로 여러 줄의 메시지를 표시하려면 다음과 같은 형식으로
    스크립트 명령어를 사용하십시오.

    mes "첫 번째 줄", "두 번째 줄", "세 번째 줄";

    이렇게 하면 하나의 스크립트 파일에서 한 번의 명령어만 사용하여 3개의 다른 줄이
    표시됩니다.


    네비게이션
    ----------
    2011-10-10aRagexe 이후 클라이언트에서는 HTML과 유사한 레이블을 사용하여
    네비게이션 링크를 생성할 수 있습니다.

    <NAVI>표시 이름<INFO>맵 이름,x,y,0,000,플래그</INFO></NAVI>

    "flag" 매개 변수는 다음과 같습니다:
    0 : 네비게이션 창 열기 않음 (기본값).
    1 : 네비게이션 창 열기.

    아래 예제에서는 클릭하면 알버타(98,154)로 이동하는 [도구 상점] 텍스트를 만듭니다.

    mes "<NAVI>[도구 상점]<INFO>alberta,98,154,0,000,0</INFO></NAVI>을 확인해 보셨나요?";

    특정 NPC 이벤트에 사용할 수 있는 'navigateto'도 참조하십시오.


    아이템
    -------
    일부 아이템에 대한 HTML과 유사한 링크를 사용하여 아이템을 참조할 수 있습니다.

    <ITEMLINK>표시 이름<INFO>아이템 ID</INFO></ITEMLINK>

    여기서 <표시 이름>은 링크를 클릭할 때 표시되는 이름이며
    <Item ID>는 클릭 시 연결할 아이템의 ID입니다.

    2015년에는 태그 이름이 <ITEM>으로 변경되어 다음 구문이 만들어졌습니다.

    <ITEM>표시 이름<INFO>아이템 ID</INFO></ITEM>

    따라서 구성된 패킷 버전에 따라 올바른 구문을 생성할 수 있는 스크립트 명령어
    'mesitemlink'를 만들었습니다. HTML과 유사한 태그를 직접 하드코딩하는 대신
    이 스크립트 명령어를 사용하는 것이 좋습니다.
    자세한 내용은 'mesitemlink' 문서를 참조하십시오.

    다음 예제는 레드 포션에 대한 미리보기 창을 엽니다.

    mes "<ITEM>레드 포션<INFO>501</INFO></ITEM>을 마셔 보셨나요?";


    URLs
    ----
    마찬가지로, 새 창에서 열리는 웹 사이트 링크를 만들 수 있습니다:

    <URL>표시할 이름<INFO>http://www.example.com/</INFO></URL>";


    퀘스트
    ------
    퀘스트에 링크를 걸 수 있습니다:

    <QUEST>퀘스트<INFO>1</INFO></QUEST>


    Message
    ---------
    msgstringtable에서 메시지를 표시할 수 있습니다:

    <MSG>1</MSG>


    팁상자
    ----
    팁 상자를 표시할 수 있습니다:

    <TIPBOX>팁 표시<INFO>1</INFO></TIPBOX>

    ---------------------------------------

    *next;

    이 명령은 NPC와의 대화를 구분하기 위해 '다음' 버튼을 메시지
    창에 표시합니다. 클릭하면 창이 지워지고 새로운 창이 표시됩니다.
    next는 'mes'와 'close'와 함께 자주 사용됩니다.

    창이 현재 화면에 없으면 생성됩니다. 그러나 NPC 대화 중 클릭하면
    서버 콘솔에 경고가 표시되고 스크립트가 종료됩니다.

    mes "[여성 NPC]";
    mes "이것은 페이지에 표시됩니다";
    next;
    // 새 페이지이므로 이것이 필요합니다. 위쪽은 비어 있게 됩니다.
    mes "[여성 NPC]";
    mes "이것은 두 번째 페이지에 표시됩니다.";

    ---------------------------------------

    *clear;

    이 명령은 대화 상자의 텍스트를 지우고 플레이어와의 상호작용 없이
    스크립트를 계속합니다.

    예제:
    mes "이것이 'clear' 스크립트 명령어가 작동하는 방식입니다.";
    sleep2 3000;
    clear; // 대화 상자를 지우고 다음으로 진행합니다.
    mes "다시 보여줄게요.";
    sleep2 3000;
    clear;
    mes "안녕!";
    close;

    ---------------------------------------

    *close;

    이 명령어는 NPC의 대화를 끝내는 방법 중 하나로, 대화 상자에 'close' 버튼을 생성합니다.
    현재 화면에 대화 상자가 없는 경우 스크립트 실행이 종료됩니다.
    버튼을 클릭하면 NPC 스크립트 실행이 종료되고 대화 상자가 사라집니다.

    mes "[여자]";
    mes "당신과 대화를 마쳤습니다. 닫기 버튼을 클릭하세요.";
    close;
    mes "이 명령은 스크립트가 이미 종료되었으므로 실행되지 않습니다.";

    ---------------------------------------

    *close2;

    이 명령어는 NPC의 대화를 끝내는 방법 중 하나로, 대화 상자에 'close' 버튼을 생성합니다.
    경고: 현재 화면에 대화 상자가 없는 경우 스크립트 실행이 무기한 중단됩니다!
    'close'를 참조하세요. 하지만 메시지 상자가 닫혔다고 해서 스크립트 실행이
    중지되지는 않으며, 'close2' 이후의 명령이 여전히 실행됩니다.
    즉, 스크립트를 종료하려면 'end'를 사용해야 합니다. 그렇지 않으면 다른 방법으로
    스크립트를 중지시켜야 합니다.

    mes "[Woman]";
    mes "지금 워프시키겠습니다.";
    close2;
    warp "place",50,50;
    end;

    스크립트를 'end'로 종료하지 않으면 무리한 실행이 될 수 있습니다.

    ---------------------------------------

    *close3;

    이 명령어는 'close'와 유사하지만, 닫기 후 cutin(있는 경우)이 지워집니다.



    ---------------------------------------

    *end;

    이 명령어는 이 특정 스크립트의 실행을 중지합니다. 두 버전은 완전히 동일합니다.
    'mes'를 사용하지 않는 스크립트를 끝내는 일반적인 방법입니다.

    if (BaseLevel <= 10)
    npctalk "당신은 아직 초보자입니다.";
    else if (BaseLevel <= 20)
    npctalk 조금 더 나아지고 있습니다, 하지만 여전히 초보자입니다.";
    else if (BaseLevel <= 30)
    npctalk "거의 2차 전직을 할 수 있는 수준까지 왔습니다.";
    else if (BaseLevel <= 40)
    npctalk "거의 2차 전직을 할 수 있을 정도입니다.";
    end;

    'end'를 사용하지 않으면 레이블을 통해 스크립트의 끝까지 이동합니다.
    레벨이 10 이하인 경우, 모든 대화 문장을 볼 수 있습니다.

    ---------------------------------------

    *set <변수>, <식>{, <캐릭터_ID>};
    *set(<변수>, <식>{, <캐릭터_ID>})

    이 명령어는 변수를 식이 평가한 값으로 설정합니다. 변수는 이 명령어나 직접적으로
    지정될 수 있으며, 이는 다른 언어와 유사합니다. ("변수 할당" 섹션 참조)

    이것은 가장 기본적인 스크립트 명령어이며, 메시지 상자에 텍스트를 출력하는 것
    이상의 기능을 수행하려면 자주 사용됩니다.

    set .@x,100; // .@x를 100으로 설정합니다.
    set .@x,1+5/8+9; //1 + 5/8 + 9(즉, 10)을 계산하여 .@x를 해당 값으로 설정합니다.

    ---------------------------------------

    *setd "<변수 이름>", <값>{, <캐릭터_ID>};

    이 명령어는 set과 거의 동일하게 작동하지만 변수 이름이 문자열로 식별되므로
    동적으로 구성할 수 있습니다.

    이 명령어는 다음과 동등합니다:
    set getd("variable name"),<value>;

    예제:

    setd ".@var$", "Poporing";
    mes .@var$; // "Poporing"을 표시합니다.

    setd ".@" + .@var$ + "123$", "Poporing is cool";
    mes .@Poporing123$; // "Poporing is cool"을 표시합니다.

    주의:
    'char_id'는 서버 변수에 대해서만 작동합니다.
    캐릭터 ID가 'char_id'인 플레이어는 온라인 상태여야 합니다.

    ---------------------------------------

    *getd("<변수 이름>")

    변수 참조를 반환하며, 이름은 동적으로 구성될 수 있습니다.
    사용법에 대해서는 'setd'를 참조하십시오.

    이것은 동적으로 배열을 설정하는 데에도 사용할 수 있습니다.
    setarray getd(".array[0]"), 1, 2, 3, 4, 5;

    예제:

    set getd("$varRefence"), 1;
    set .@i, getd("$" + "pikachu");

    ---------------------------------------

    *getvariableofnpc(<변수>, "<npc 이름>")

    이 명령어는 대상 NPC에서 NPC 변수(. 접두사)에 대한 참조를 반환합니다.
    이는 . 변수만 사용할 수 있습니다.

    예제:

    // 이것은 .var의 값을 반환합니다. 값이 캐치되지 않기 때문에 사용할 수 없습니다.
    getvariableofnpc(.var,"TargetNPC");

    // 이것은 .v 변수를 TargetNPC의 .var 변수의 값으로 설정합니다.
    set .v, getvariableofnpc(.var,"TargetNPC");

    //이것은 TargetNPC의 .var변수를 1로 설정합니다..
    set getvariableofnpc(.var,"TargetNPC"), 1;

    참고: 함수개체가 .variables를 가질 수 있지만,
    getvariableofnpc는 그들에게 작동하지 않을 것이다.

    ---------------------------------------

    *getvar <변수>,<char_id>;

    정된 플레이어로부터 변수 값을 가져옵니다. 임시 캐릭터 변수 "@",
    영구 캐릭터 "", 영구 로컬 계정 "#", 영구 글로벌 계정 "##"만 사용할 수 있습니다.

    ---------------------------------------

    *goto <라벨>;

    이 명령어는 스크립트를 라벨로 이동시키는 역할을 합니다.
    일반적으로 "if"와 같은 다른 명령어와 함께 사용되지만, 종종 그 자체로 사용됩니다.
    ...
    goto Label;

    mes "이 부분은 보이지 않습니다.";
    end;
    Label:
    mes "이 부분은 보입니다";
    end;

    이 명령어는 다른 옵션이 없을 때에만 사용하고, 가능하면 피하는 것이 좋습니다.

    ---------------------------------------

    *menu "<옵션_텍스트>", <타겟_라벨>{, "<옵션_텍스트>", <타겟_라벨>, ...};

    이 명령어는 호출된 캐릭터에 대해 선택 가능한 메뉴를 만듭니다.
    한 번에 하나의 메뉴만 화면에 표시할 수 있습니다.

    플레이어가 메뉴에서 선택한 내용에 따라, 스크립트 실행은 해당 레이블에서
    계속됩니다. (문자열-레이블 쌍입니다.)

    옵션은 콜론으로 구분하여 그룹화할 수 있습니다.

    menu "A:B",L_Wrong,"C",L_Right;

    또한 특별한 임시 캐릭터 변수인 @menu를 설정합니다. 이 변수는 플레이어가
    선택한 옵션 번호를 포함합니다. (옵션 번호는 1부터 시작합니다.)
    이 번호는 빈 옵션과 그룹화된 옵션과 일관됩니다.

    menu "A::B",L_Wrong,"",L_Impossible,"C",L_Right;

    L_Wrong:
    // "A" 또는 "B"를 클릭한 경우 이곳으로 이동합니다.
    // "A"를 클릭한 경우 @menu == 1
    //옵션은 비어 있으므로 @menu == 2는 발생하지 않습니다.
    // "B"를 클릭한 경우 @menu == 3
    L_Impossible:
    // 빈 옵션은 표시되지 않으므로 선택할 수 없습니다.
    // 이 레이블은 menu 명령어에서 도달할 수 없습니다.
    L_Right:
    // "C"를 클릭한 경우 이곳으로 이동합니다.
    // @menu == 5

    만약 라벨이 '-'라면 해당 옵션을 선택하면 메뉴 명령어 바로 다음으로
    스크립트 실행이 이어집니다. 이는 시간을 절약하고 큰 스크립트를 최적화하는데
    사용할 수 있습니다.

    menu "A::B:",-,"C",L_Right;
    // "A" 또는 "B"를 클릭하면 여기로 이동
    // "A"를 클릭하면 @menu == 1
    // "B"를 클릭하면 @menu == 3
    L_Right:
    // "C"를 클릭하면 여기로 이동
    // @menu == 5

    이 두 가지 예제는 정확히 동일한 작업을 수행합니다.

    메뉴 항목으로 빈 문자열을 지정하면 해당 항목이 표시되지 않습니다.
    이는 빈 항목을 사용하여 동적 메뉴를 스크립트화하는 데 효과적으로 사용할 수 있습니다.

    이 방법은 배열을 사용하여 수행할 수 있습니다. 그러나 주의해서 살펴보세요
    - 이 기교는 높은 마법이 아니지만, 적어도 소형 마법입니다.
    이 방법이 어떻게 작동하는지 이해하지 않으면 쉽게 복제할 수 없습니다.

    임시 문자열 배열을 생성하고, 이 실행에서 메뉴에 들어갈 문자열을 포함시키되
    공백을 남기지 않도록 합니다. 보통 이를 루프와 추가 카운터를 사용하여 수행합니다.
    예를 들면 다음과 같습니다.


    setarray .@possiblemenuitems$[0],<잠재적인 메뉴 항목 목록>;
    .@j = 0; // 이것은 메뉴 줄 수를 나타내는 카운터입니다.

    // 메뉴 항목 목록을 루프를 통해 순회합니다.
    // .@i는 루프 카운터입니다.
    for( .@i = 0; .@i < getarraysize(.@possiblemenuitems$); .@i++ )
    {
    // 'condition'은 메뉴 항목 번호 .@i가 메뉴에 실제로 들어가는지 여부를 결정하는
    // 조건입니다.
    if (<condition>)
    {
    // 옵션을 실제로 사용 가능한 옵션 목록에 기록합니다.
    .@menulist$[@j] = .@possiblemenuitems$[@i];
    // 문자열을 방금 복사했으므로, 나중에 사용할 번호가 필요합니다.
    // 그래서 이것도 기록합니다.
    .@menureference[@j] = .@i;
    // 메뉴 항목을 목록에 추가했으므로, 메뉴 줄 수 카운터를 증가시킵니다.
    .@j++;
    }
    // 다음 가능한 메뉴 항목으로 이동합니다.
    }

    이것은 조건에 따라 메뉴에 들어 갈 모든 아이템의 텍스트를 포함하는 .@menulist$ 라는
    배열을 생성합니다. 그리고 .@menureference라는 배열도 생성되며 이 배열에는
    가능한 메뉴아이템의 리스트 해당하는 항목번호를 포함합니다.
    (기업하세요 배열은 0부터 시작합니다). 이것은 가능한 메뉴아이템보다 적다는것을
    의미합니다. 그러나 메뉴 명령은 비어있는 라인을 처리 할수 있습니다 - 빈 줄은 리스트의
    끝에 있을지라도
    다음과 같은 트릭으로 해결합니다.

    // X는 예상되는 가장 많은 메뉴갯수
    menu .@menulist$[0],-,.@menulist$[1],-,...,.@menulist$[<X>],-;

    위 코드는 모든 메뉴 항목을 호출합니다. 가능한 메뉴 항목 중 일부는 리스트에 복사되지 않았기
    때문에, 끝은 빈 상태가 되며 끝 이후에 메뉴 항목이 나타나지 않습니다.
    그러나 이 메뉴 호출은 어디로도 점프하지 않고, 메뉴 명령 다음에 직접 실행을 계속합니다.
    (어디로 점프할 레이블을 명시적으로 정의할 수 있지만, 어떤 옵션이 메뉴에서 어디에
    위치하는지 미리 알지 못하면 어떤 레이블을 정의해야 하는지 모르기 때문에 이 방법이 좋습니다.)

    그러나 사용자가 어떤 옵션을 선택했는지 어떻게 알 수 있을까요?
    여기서 @menu가 등장합니다. @menu에는 사용자가 선택한 옵션 번호가 포함됩니다.
    첫 번째 옵션의 번호는 1부터 시작합니다. 이제 사용자가 선택한 옵션과 이에 해당하는
    실제 가능한 메뉴 항목의 번호를 알 수 있습니다.

    mes "당신은 " + .@possiblemenuitems$[.@menureference[@menu-1]] + "을(를) 선택했습니다!";

    @menu은 사용자가 선택한 옵션 번호입니다.
    @menu-1은 우리가 만든 실제로 사용된 메뉴 항목 목록의 배열 인덱스입니다.
    .@menureference[@menu-1]은 우리가 이 목적으로 저장한 가능한 메뉴 항목 배열에서의
    항목 번호입니다.
    .@possiblemenuitems$[.@menureference[@menu-1]]은 사용자가 선택한 메뉴 항목을 표시하는 데
    사용된 문자열입니다.(조금 복잡하지만 잘 작동합니다.)

    이제 선택한 항목에 따라 실행을 결정하기 위해 'if (.@menureference[@menu-1] == X) goto Y' 문을
    여러 개 설정할 수 있습니다. 이 방법을 사용하면 사용자가 특정 순서로 항목을 선택하도록
    요구하거나 임의로 섞인 메뉴를 만들어야 할 때 편리합니다.

    텔레포트 목록에 대한 Kafra 코드는 표준 배포와 함께 제공되며 비슷한 배열 기반
    메뉴 기술을 사용하지만 @menu를 사용하지 않으며, 아마도 문서화되지 않았기 때문입니다.
    특정 경우에는 'select'가 더 나을 수 있습니다. 'select'를 사용하여
    다음과 같이 메뉴를 만들 수 있습니다.

    .@dummy = select(.@menulist$[0],.@menulist$[1],...,.@menulist$[<X>]);

    메뉴 제작에 두가지 기술적으로는 동등 합니다.

    ---------------------------------------

    *select("<옵션>"{,"<옵션>",...})
    *prompt("<옵션>"{,"<옵션>",...})

    이 함수는 복잡한 레이블 구조를 필요로 하지 않는 특정 상황에서 'menu' 대신 유용한
    대체 기능입니다. 예를 들어 간단한 예/아니오 질문을 하고 싶을 때 사용할 수 있습니다.
    이 함수는 선택한 메뉴 옵션의 번호를 1부터 시작하여 반환합니다.
    'menu'와 마찬가지로 사용자가 선택한 옵션을 포함하는 변수 @menu를 설정합니다.

    if (select("예:아니오" ) == 1)
    mes "당신은 예라고 대답했습니다.";

    'menu'와 마찬가지로, 선택한 옵션은 그룹화된 옵션과 빈 옵션과 일관성을 유지합니다.

    'prompt'는 select와 거의 동일하지만 캐릭터가 취소 버튼을 클릭할 때 이 함수는
    대신 255를 반환합니다.

    ---------------------------------------

    *input(<변수>{,<최소값>{,<최대값>}})

    이 명령은 클라이언트에 입력 상자를 나타내어 숫자나 문자열을 입력할 수 있도록 합니다.
    이 명령은 많은 용도로 활용됩니다. 예를 들어, 'rand' 함수를 이용한
    추측 게임을 만들 수 있습니다.

    mes "[Woman]";
    mes "제가 생각한 숫자를 맞춰보세요.";
    mes "그 숫자는 1부터 10 사이일 것입니다.";
    next;
    .@number = rand(1,10);
    input .@guess;
    if (.@guess == .@number) {
    mes "[Woman]";
    mes "잘 했어요! 그것이 제가 생각한 숫자였습니다!";
    close;
    } else {
    mes "[Woman]";
    mes "죄송해요, 그것은 제가 생각한 숫자가 아니었습니다.";
    close;
    }

    만약 입력 값을 저장할 문자열 변수를 입력한다면, 플레이어는 텍스트를
    입력할 수 있습니다. 그렇지 않으면, 숫자만 입력 가능합니다.

    mes "[Woman]";
    mes "HELLO를 입력해주세요.";
    next;
    input .@var$;
    if (.@var$ == "HELLO") {
    mes "[Woman]";
    mes "잘 했어요! 정확히 입력하셨습니다.";
    close;
    } else {
    mes "[Woman]";
    mes "죄송해요, 잘못 입력하셨습니다.";
    close;
    }

    보통 이 명령으로 음수를 입력할 수는 없습니다. 이는 잘못 작성된 스크립트에서
    악용될 수 있는 경우를 방지하기 위함입니다. 예를 들어, 은행 스크립트에서
    음수의 제니를 입력하면 무료 제니를 받을 수 있는 상황이 발생할 수 있습니다.

    버전 r12192부터 이 명령은 두 개의 선택적 매개변수와 반환 값을 가집니다.
    'input_min_value'와 'input_max_value'로 스크립트_아테나.conf에서 기본값을
    설정할 수 있습니다. 숫자 입력에 대해서는 값이 [최소값, 최대값] 범위 내에
    있도록 제한됩니다. 만약 값이 'max'보다 크면 1을, 'min'보다 작으면 -1을,
    그 외에는 0을 반환합니다. 문자열 입력에 대해서는 값이 'max'보다 길면 1을,
    'min'보다 짧으면 -1을, 그 외에는 0을 반환합니다.

    ---------------------------------------

    *callfunc "<function>"{,<argument>,...<argument>};
    *callfunc("<function>"{,<argument>,...<argument>})

    이 명령어는 함수 NPC를 호출하는 데 사용됩니다. 함수 NPC는 어느 맵 서버에서든
    어느 스크립트에서든 호출될 수 있습니다. 'return' 명령어를 사용하여
    호출한 곳으로 돌아갑니다.

    place,50,50,6%TAB%script%TAB%Woman%TAB%115,{
    mes "[Woman]"
    mes "Let's see if you win...";
    callfunc "funcNPC";
    mes "Well done, you have won!";
    close;
    }

    function%TAB%script%TAB%funcNPC%TAB%{
    .@win = rand(2);
    if (.@win == 0)
    return;
    mes "Sorry, you lost.";
    close;
    }

    함수에 인수를 전달할 수 있으며, 이는 'getarg()'를 사용하여 사용 가능합니다.
    반환은 필수가 아니며, 그 자리에서 실행을 종료할 수 있습니다.

    함수 NPC 내부에서 실제 값을 반환하려면 함수 형식으로 작성하는 것이 좋습니다.

    place,50,50,6%TAB%script%TAB%Man%TAB%115,{
    mes "[Man]"
    mes "Gimme a number!";
    next;
    input .@number;
    if (callfunc("OddFunc",.@number)) mes "It's Odd!";
    close;
    }
    function%TAB%script%TAB%OddFunc%TAB%{
    if (getarg(0)%2 == 0)
    return 0;// it's even
    return 1;// it's odd
    }

    또한, rAthena r15979 및 r15981부터는 'callfunc' 스크립트 명령어 없이 직접
    사용자 정의 함수를 호출할 수 있습니다. 이 경우 함수는 일반적으로 작성되므로
    스크립트가 더 깨끗해집니다.

    function<tab>script<tab>SayHello<tab>{
    mes "Hello " + getarg(0);
    return 0;
    }

    place,50,50,6<tab>script<tab>Man<tab>115,{
    mes "[Man]";
    SayHello strcharinfo(0);
    close;
    }

    주의사항:

    !! 사용자 정의 함수는 스크립트가 호출하기 전에 선언되어야 합니다.
    !! 즉, 함수는 스크립트나 NPC보다 위에 배치되거나
    (또는 별도의 파일에서 먼저 로드) 직접 호출하기 전에 미리 선언되어야 합니다.

    ---------------------------------------

    *callsub <label>{,<argument>,...<argument>};
    *callsub(<label>{,<argument>,...<argument>})

    이 명령어는 현재 스크립트 내에서 지정된 레이블로 이동합니다
    (따옴표를 사용하지 마세요). 이때, 인수가 지정된 경우 해당 인수가 전달되며,
    해당 레이블에서 'getarg'로 검색할 수 있습니다. 끝나면 해당 레이블이 호출된
    지점으로 돌아가기 위해 'return' 명령어를 사용해야합니다.
    이 명령어는 스크립트에 대해 특정 작업을 반복해서 수행해야하는 경우 사용됩니다.
    이를 통해 'callfunc'과 달리 추가 NPC 객체를 생성하지 않고도 시간과 공간을
    절약할 수 있습니다. 레이블은 다른 스크립트에서 이 방식으로 호출할 수 없습니다.

    에제 1: 체크를 위한 callsub(체크가 통과되면 스크립트로 돌아감)

    callsub S_CheckFull, "guild_vs2",50;
    switch( rand(4) ) {
    case 0: warp "guild_vs2",9,50; end;
    case 1: warp "guild_vs2",49,90; end;
    case 2: warp "guild_vs2",90,50; end;
    case 3: warp "guild_vs2",49,9; end;
    }

    ...

    S_CheckFull:
    if (getmapusers(getarg(0)) >= getarg(1)) {
    mes "죄송합니다. 이 아레나는 꽉 찼습니다. 나중에 다시 시도해주세요.";
    close;
    }
    return;

    예제 2: 반복적으로 사용되는 callsub(다른 인수를 사용)

    // 경고: 이전에 사용한 Zeny 체크/삭제가 재사용됨 (복사/붙여넣기 대신)
    switch(select("어비스 호수:아마쯔 던전:개미지옥:아요타 던전:Beacon Island, 파로스")) {
    case 1: callsub S_DunWarp,"hu_fild05",192,207;
    case 2: callsub S_DunWarp,"ama_in02",119,181;
    case 3: callsub S_DunWarp,"moc_fild20",164,145;
    case 4: callsub S_DunWarp,"ayo_fild02",279,150;
    case 5: callsub S_DunWarp,"cmd_fild07",132,125;
    // etc
    }

    ...

    S_DunWarp:
    // getarg(0) = "map name"
    // getarg(1) = x
    // getarg(2) = y
    if (Zeny >= 100) {
    Zeny -= 100;
    warp getarg(0),getarg(1),getarg(2);
    } else {
    mes "던전 워프 비용은 100제니입니다 .";
    }
    close;

    ---------------------------------------

    *getarg(<index>{,<default_value>})

    이 함수는 'callsub' 또는 'callfunc' 명령을 사용할 때 사용됩니다.
    호출에서 변수를 지정하여 다른 호출과 구별되도록 할 수 있습니다.
    이 함수는 함수나 서브루틴이 호출될 때 전달된 인수를 반환하며,
    이것은 같은 코드를 여러 번 사용할 수 있게 해주는 보편적인 방법입니다.

    인수 번호는 0부터 시작합니다. 즉, 첫 번째 인수는 번호 0입니다.
    이러한 인수가 전달되지 않은 경우 0이 반환됩니다.

    place,50,50,6%TAB%script%TAB%Woman1%TAB%115,{
    mes "[Woman]";
    mes "Let's see if you win...";
    callfunc "funcNPC",2;
    mes "Well done, you have won!";
    close;
    }

    place,52,50,6%TAB%script%TAB%Woman2%TAB%115,{
    mes "[Woman]";
    mes "Let's see if you win...";
    callfunc "funcNPC",5;
    mes "Well done, you have won!";
    close;
    }

    function%TAB%script%TAB%funcNPC%TAB%{
    .@win = rand(getarg(0));
    if (.@win == 0) return;
    mes "Sorry, you lost.";
    close;
    |

    "woman1" NPC 오브젝트는 funcNPC를 호출합니다.
    이 호출에서 지정된 인수는 2입니다.
    따라서 'rand' 함수에 의해 생성된 임의 숫자는 0 또는 1일 수 있습니다.
    반면에 "woman2"는 함수를 호출할 때 인수 번호 0으로 5를 제공합니다.
    그래서 임의 숫자는 0, 1, 2, 3 또는 4일 수 있으며,
    이로 인해 "woman2"는 플레이어가 이길 가능성이 더 적습니다.

    함수 호출에서 여러 개의 인수를 전달할 수 있습니다.

    callfunc "funcNPC",5,4,3;

    getarg(0)은 5이고, getarg(1)은 4이고, getarg(2)는 3입니다.

    'getarg'에는 선택적 인수가 있습니다. trunk r10773 및 stable r10958부터
    대상 인수가 존재하는 경우 해당 값을 반환합니다.
    그렇지 않은 경우 <default_value>가 있으면 대신 반환되며,
    그렇지 않으면 스크립트가 즉시 종료됩니다.

    이전 예제에서 getarg(2,-1)는 3이고 getarg(3,-1)은 -1입니다.

    ---------------------------------------

    *getargcount()

    이 함수는 'callsub' 또는 'callfunc' 명령을 사용할 때 사용됩니다.
    호출 시 인수를 지정할 수 있습니다. 이 함수는 제공된 인수의 개수를 반환합니다.


    예제:
    callfunc "funcNPC",5,4,3;
    ...
    function%TAB%script%TAB%funcNPC%TAB%{
    .@count = getargcount(); // 3
    ...
    }

    ---------------------------------------

    *return {<value>};

    이 명령은 이전에 callfunc 또는 callsub로 참조된 함수 또는 스크립트에서 스크립트
    실행을 종료하고 호출이 시작된 위치로 되돌아갑니다. 함수 형식으로 호출했을 때
    선택적으로 반환 값을 제공할 수 있습니다.

    callsub로 참조된 함수나 스크립트 이외에서 이 명령을 사용하면 오류가 발생하고
    스크립트가 종료됩니다.

    callfunc "<your function>";// 반환값이 없을 때
    set <variable>,callfunc("<your function>");// 값을 반환할 때

    ---------------------------------------

    *function <function name>;
    *<function name>{(<argument>,...<argument>)};
    *function <function name> {
    <code>
    }

    이 명령은 callfunc과 같이 작동하며, 더 깨끗하고 빠른 스크립팅을 위해 사용됩니다.
    함수는 스크립트 내에서 정의되고 사용되며, 인수와 함께 라벨처럼 작동합니다.
    이름에는 알파벳과 밑줄만 사용할 수 있다는 점에 유의하세요.

    사용 방법:

    1. 함수를 선언합니다.
    function <function name>;
    2. 스크립트 내에서 어디에서든 함수를 호출합니다.
    괄호와 함께 사용하면 반환 값을 제공할 수 있습니다.
    <function name>;
    3. 스크립트 내에서 함수를 정의합니다.
    <function name> {<code>}

    예제:

    prontera,154,189,4 script Item Seller 767,{
    /* 함수 선언 */
    function SF_Selling;

    if (Zeny > 50) {
    mes "어서 오세요!";
    /* 함수 호출 */
    SF_Selling;
    }
    else mes "50z가 필요합니다. 죄송합니다!";
    close;

    /* 함수 정의 */
    function SF_Selling {
    mes "50z에 프라콘을 구매하시겠습니까?";
    next;
    if (select("네","아니오") == 1) {
    Zeny -= Zeny;
    getitem 1010,1;
    mes "감사합니다!";
    }
    return;
    }
    }

    매개 변수와 반환 값이 있는 예:

    prontera,150,150,0 script TestNPC 123,{
    /* 함수 선언 */
    function MyAdd;

    mes "두 숫자를 입력하세요.";
    next;
    input .@a;
    input .@b;
    /* Function call */
    mes .@a + " + " + .@b + " = " + MyAdd(.@a,.@b);
    close;

    /* Function definition */
    function MyAdd {
    return getarg(0)+getarg(1);
    }
    }


    ---------------------------------------

    *is_function("<function name>")

    이 명령은 함수의 존재 여부를 확인합니다.
    함수를 찾으면 1을 반환하고, 없으면 0을 반환합니다.

    예제:

    function script try {
    dothat;
    }

    - script test -1,{
    .@try = is_function("try"); // 1
    .@not = is_function("not"); // 0
    }

    ---------------------------------------

    *if (<condition>) <statement>;

    이것은 기본적인 조건문 명령어로, 이 스크립팅 언어에서 유일하게 사용 가능합니다.

    조건은 모든 표현식이 가능합니다. 0이 아닌 모든 값은 참(True)으로 간주되며,
    음수 값도 참으로 인식됩니다. 0을 결과로 하는 모든 표현식은 거짓(False)입니다.

    만약 표현식이 참이면, 명령문이 실행됩니다. 만약 거짓이면, 아무 일도 일어나지 않고
    스크립트의 다음 줄로 이동합니다.

    if (1) mes "항상 출력됩니다.";
    if (0) mes "절대로 출력되지 않습니다.";
    if (5) mes "항상 출력됩니다.";
    if (-1) mes "우습게도, 이것도 잘 출력됩니다.";

    조건 연산자에 대한 자세한 내용은 위의 연산자 섹션을 참조하십시오.
    어떤 함수에서 반환된 것이든 특정 변수에 저장하지 않고도 조건 검사에 사용할 수 있습니다:

    if (strcharinfo(0) == "다니엘 잭슨") mes "당신이 다니엘이라는 것이 맞습니다!";

    실제 세계에서 'if' 명령어를 사용하는 더 많은 예제:

    예제 1:

    .@answer = 1;
    input .@input;
    if (.@input == .@answer)
    close;
    mes "죄송합니다, 답이 틀렸습니다.";
    close;

    예제 2:

    .@answer = 1;
    input .@input;
    if (.@input != .@answer)
    mes "죄송합니다, 답이 틀렸습니다.";
    close;

    예제 1과 2는 같은 효과가 있음을 주목하십시오.

    예제 3:

    .@count++;
    mes "[Forgetful Man]";
    if (.@count == 1) mes 처음으로 나와 이야기를 나누셨군요.";
    if (.@count == 2) mes "이미 한 번 나와 이야기를 나누셨군요.";
    if (.@count == 3) mes "이미 세 번이나 나와 이야기를 나누셨군요.";
    if (.@count == 4) {
    mes "이미 네 번이나 나와 이야기를 나누셨군요.";
    mes 저는 기억력이 나빠져가는 것 같습니다...";
    .@count = 0;
    }
    close;

    예제 4:

    mes "[Quest Person]";
    if (countitem(512) < 1) { // 512는 'Apple'의 아이템 ID로, db/item_db.yml에서 찾을 수 있습니다.
    mes "사과 하나 주실수 있나요??";
    close;
    }
    mes "오, 사과를 가져오셨군요.";
    mes "나는 그것을 원하지 않았고, 단지 하나를 보고 싶었을 뿐이었습니다.";
    close;

    예제 5:

    mes "[Person Checker]";
    if ($@name$ == "") { // $@name$ 변수 값이 비어 있는 경우
    mes "누군가의 이름을 말해주세요";
    next;
    input $@name$;
    $@name2$ = strcharinfo(0);
    mes "[Person Checker]";
    mes "감사합니다..";
    close;
    }
    if ($@name$ == strcharinfo(0)) { //플레이어 이름이 $@name$과 일치한 경우
    mes "당신은 방금 언급된 " + $@name2$ + " 입니다.";
    mes "만나서 반갑습니다.";

    // 글로벌 변수 초기화
    $@name$ = "";
    $@name2$ = "";

    close;
    }
    mes "당신은 방금 언급된 " + $name2$ + " 가 아닙니다.";
    close;

    이 함수의 기능에 대한 설명은 'strcharinfo'를 참조하십시오.

    예제 6: 복합조건 사용

    mes "[Multiple Checks]";
    if (@queststarted == 1 && countitem(512) >= 5) {
    mes "잘했어요, 당신은 퀘스트를 시작했고 나에게 사과 5개를 가져다 주었어요.";
    @queststarted = 0;
    delitem 512,5;
    close;
    }
    mes "사과 5개만 가져다 주세요.";
    @queststarted = 1;
    close;

    중첩된 'if' 문도 지원합니다:

    if (<condition>)
    dothis;
    else
    dothat;

    조건이 거짓이면 'else' 다음 문장들을 수행합니다.
    조건에 따라 작업을 그룹화할 수도 있습니다.

    if (<condition>) {
    dothis1;
    dothis2;
    } else {
    dothat1;
    dothat2;
    dothat3;
    }

    조건이 거짓인 경우에도 여러 작업을 수행하려는 경우, 중괄호({})를 사용하지 않으면
    두 번째 작업은 조건의 결과와 관계없이 실행됩니다. 그러나 조건이 참인 경우에는
    스크립트의 실행을 중지해야 합니다. 이를 위해서는 첫 번째 그룹에서 return;, end;,
    또는 close;를 사용하면 됩니다

    또한 여러 조건이 중첩되거나 연결될 수 있습니다.

    if (<condition 1>)
    dothis;
    else if (<condition 2>) {
    dothat;
    end;
    } else
    dothis;

    ---------------------------------------

    *jump_zero (<condition>),<label>;

    이 명령어는 'if'와 'goto'를 한 번에 수행하는 것과 비슷합니다. (자세한 내용은 'if'를 참조하십시오.)
    조건이 거짓인 경우 (0과 같은)이 명령어는 'goto'처럼 즉시 지정된 레이블로 이동합니다.
    'if'가 보다 일반적으로 유용하지만, 일부 경우에는 이 명령어가 최적화에 유용할 수 있습니다.

    이 명령어의 주요 목적은 'switch', 'for' 또는 'while'과 같은 다른 제어문이 스크립트를
    구문 분석할 때 이 명령어와 함께 간단한 식으로 변환되기 때문입니다.

    ---------------------------------------

    *switch (expression);

    스위치 문은 일련의 if 문과 유사합니다. 많은 경우에, 여러 가지 다른 값과 동일한 변수
    (또는 표현식)을 비교하고, 값이 같은 경우에만 다른 코드 조각을 실행하도록 하려는
    경우가 있습니다. 이것이 스위치 문이 하는 일입니다.

    실수를 피하기 위해 스위치 문이 어떻게 실행되는지 이해하는 것이 중요합니다.
    스위치 문은 줄 단위로 실행됩니다 (실제로는 문장 단위).
    처음에는 어떤 코드도 실행되지 않습니다. 스위치 식의 값과 일치하는 값을 가진 case 문이
    발견될 때까지는 코드가 실행되지 않습니다. 파서는 스위치 블록의 끝까지 또는 첫 번째
    break 문을 만날 때까지 문을 실행합니다. case 문 목록의 끝에 break 문을 작성하지 않으면,
    파서는 다음 case의 문을 실행합니다 (폴스루).

    예제 1:

    switch(select("Yes:No")) {
    case 1:
    mes "You said yes!";
    break;
    case 2:
    mes "Aww, why?";
    break;
    }
    close;

    위의 예제는 메뉴처럼 작동하며, 사용자가 옵션을 선택하면 첫 번째 case로 이동하고,
    그렇지 않으면 두 번째로 이동합니다.

    예제 2:

    switch(getgroupid()) {
    case 1:
    mes "Wow, you're super!";
    break;
    case 2:
    mes "A helping hand!";
    break;
    case 3:
    mes "10001010010011";
    break;
    case 4:
    mes "Yes, milord?";
    break;
    default:
    mes "Hello there!";
    break;
    }

    위의 예제는 플레이어의 그룹 ID에 따라 메시지를 인쇄합니다.
    해당 그룹 ID에 대한 문이 선언되지 않은 경우, 스크립트는 가능한 모든 값을 대상으로
    하는 'default' 문을 사용하며, 이는 if-else 문의 'else'와 유사합니다.

    ---------------------------------------

    *while (<condition>) <statement>;

    이것은 아마도 가장 간단하면서 가장 자주 사용되는 루프 구조일 것입니다.
    'while' 문은 "<조건>이 true인 동안 <문>을 실행한다"는 의미로 해석할 수 있습니다.
    이것은 조건식이 평가되기 전에 루프 본문의 문이 실행되기 전에 조건식을 먼저 검사하는
    선조건(pretest) 루프입니다. 만약 조건식이 거짓으로 평가되면 루프 본문의 문은
    실행되지 않습니다. 만약 조건식이 참으로 평가되면 문이 실행되고,
    제어는 다시 조건식으로 전환되고, 이것은 다시 평가되고 사이클이 계속됩니다.

    여러 문장은 'if' 문과 마찬가지로 { } 중괄호를 사용하여 그룹화할 수 있습니다.

    예제 1:
    while (switch(select("Yes:No") == 2 ))
    mes "You picked no.";
    close;

    예제 2: multiple statements
    while (switch(select("Yes:No") == 2 )) {
    mes "Why did you pick no?";
    mes "You should pick yes instead!";
    }
    close;

    예제 3: counter-controlled loop
    .@i = 1;
    while (.@i <= 5) {
    mes "This line will print 5 times.";
    .@i += 1;
    }
    close;

    예제 4: sentinel-controlled loop
    mes "Input 0 to stop";
    input .@num;
    while (.@num != 0) {
    mes "You entered " + .@num;
    input .@num;
    }
    close;

    ---------------------------------------

    *for (<variable initialization>; <condition>; <variable update>) <statement>;

    다른 선조건 루프 구조는 'for' 문입니다. 이것은 일반적으로 카운터를 제어하는 루프와 관련이 있으며,
    'while' 문의 특수한 형태로 간주됩니다. 'for' 문의 단계는 다음과 같습니다. 초기화 문이 먼저 실행되며,
    한 번만 실행됩니다. 조건 검사가 수행됩니다. 조건식이 거짓으로 평가되면 나머지 for 문이
    건너뛰어집니다. 조건식이 참으로 평가되면 루프 본문이 실행되고, 그런 다음 업데이트 문이
    실행됩니다(일반적으로 변수를 증가시킵니다). 그런 다음 조건식이 다시 평가되고 사이클이 계속됩니다.

    예제 1:
    for( .@i = 1; .@i <= 5; .@i++ )
    mes "This line will print 5 times.";

    예제 2:
    mes "This will print the numbers 1 - 5.";
    for( .@i = 1; .@i <= 5; .@i++ )
    mes "Number: " + .@i;

    ---------------------------------------

    *do { <statement>; } while (<condition>);

    'do...while'은 이 스크립트 언어에서 유일한 후조건(post-test) 루프 구조입니다.
    후조건 루프에서는 조건식을 테스트하기 전에 문이 한 번 실행됩니다. 조건이 참이면 문이 반복됩니다.
    조건이 거짓이면 'do...while' 루프 표현식 다음의 문으로 제어가 전환됩니다.

    예제 1: sentinel-controlled loop
    mes "This menu will keep appearing until you pick Cancel";
    do {
    .@menu = select("One:Two:Three:Cancel");
    } while (.@menu != 4);

    예제 2: counter-controlled loop
    mes "This will countdown from 10 to 1.";
    .@i = 10;
    do {
    mes .@i;
    .@i -= 1;
    } while (.@i > 0);

    ---------------------------------------

    *freeloop({<toggle>})

    이 기능을 활성화(1)하면 스크립트 인스턴스가 무한 루프 보호 기능을 우회하여 필요한 만큼
    루프할 수 있습니다. 비활성화(0)하면 무한 루프가 감지될 경우 경고 메시지가 표시됩니다.

    인수가 제공되지 않은 경우에도 해당 스크립트의 freeloop 상태를 반환합니다.

    예제:
    freeloop(1); // freeloop 활성화

    // be careful with what you do here
    for ( .@i = 0; .@i < .@bigloop; .@i++ ) {
    dothis;
    // 무한 루프를 감지하면 1ms 동안 스크립트를 일시 정지하여
    // rAthena가 소켓, 타이머, 프로세스 등을 처리할 수 있도록 합니다.
    }

    freeloop(0); // freeloop 비활성화

    for ( .@i = 0; .@i < .@bigloop; .@i++ ) {
    dothis;
    // 비활성화 되어 있기 때문에 무한루프 발생시 오류 발생
    }

    ---------------------------------------

    *setarray <배열 이름>[<첫번쨰 값>],<값>{,<값>...<값>};

    이 명령어는 한 번에 배열을 빠르게 채울 수 있도록 해줍니다. 배포 버전에서 Kafra 스크립트를
    확인해보면 이것이 자주 사용됩니다.

    setarray .@array[0], 100, 200, 300, 400, 500, 600;

    첫 번째 값은 변경할 배열 요소의 첫 번째 인덱스입니다.
    예제:

    setarray .@array[0],200,200,200;
    setarray .@array[1],300,150;

    다음과 같습니다:

    .@array[0]=200
    .@array[1]=300
    .@array[2]=150

    ---------------------------------------

    *cleararray <배열 이름>[<처음 값을 변경할 인덱스>],<값>,<설정할 값의 개수>;

    이 명령은 동시에 많은 배열 값들을 동일한 값으로 변경합니다.

    setarray .@array[0], 100, 200, 300, 400, 500, 600;
    // 6개의 값을 0으로 변경
    cleararray .@array[0],0,6;
    // 요소 0을 245로 변경
    cleararray .@array[0],245,1;
    // 요소 1및 2가 345로 변경
    cleararray .@array[1],345,2;


    ---------------------------------------

    *copyarray <대상 배열>[<첫번째 값>],<원본 배열>[<첫번째 값>],<복사할 데이터의 갯수>;

    이 명령어는 경우에 따라서 불가치한 많은 양의 데이터를 배열 간에 빠르게 섞을 수 있도록 해줍니다.

    setarray .@array[0], 100, 200, 300, 400, 500, 600;

    copyarray .@array2[0],@array[2],2;
    // .@array2[0] 는 .@array[2] (300)과 같습니다.
    // .@array2[1] 는 .@array[3]과 같습니다.

    .@array[0] = 100
    .@array[1] = 200
    .@array[2] = 300
    .@array[3] = 400
    .@array[4] = 500
    .@array[5] = 600

    새 배열:
    .@array2[0] = 300
    .@array2[1] = 400
    .@array2[2] = 0
    .@array2[3] = 0

    .@array[4] 와 .@array[5] 는 복사되지 않습니다(0을 리턴함)


    ---------------------------------------

    *deletearray <배열 이름>[<첫 번째 값>]{,<삭제할 개수>};

    이 명령은 배열에서 지정된 개수의 배열 요소를 완전히 삭제하고 이후의 모든 요소를
    배열의 처음으로 이동합니다

    // 이것은 배열 요소 0을 삭제하고 다른 모든 배열 요소를 한 곳으로 이동시킵니다.
    deletearray .@array[0],1

    // 이것은 배열 요소 1, 2 및 3을 삭제하고 요소 0을 그대로 두며 다른 요소들을 이동시킵니다.
    // 이렇게 하면 간격이 없는 배열이 만들어집니다.

    deletearray .@array[1],3

    ---------------------------------------

    *inarray <배열 이름>,<값>;

    이 명령은 배열에서 처음 일치하는 값을 찾아 첫 번째 일치하는 값의 인덱스를 반환합니다.
    값이 발견되지 않으면 -1을 반환합니다.

    setarray .@array[0], 100, 200, 300, 400, 500, 600, 100;

    inarray(.@array[0], 200);
    // 200은 인덱스 1에 있으므로 1을 반환합니다.
    // 다른 방법으로는 .@array[1] == 200을 의미합니다.

    .@index = inarray(.@array[0], 600);
    // .@index는 이제 .@array[5] == 600인 인덱스 5입니다.

    inarray(.@array[0], 100);
    // 인덱스 6도 100인데 명령은 첫 번째 발견된 요소를 반환합니다.
    // 따라서 .@array[0] == 100 이므로 0을 반환합니다.

    inarray(.@array[0], 800);
    // 800은 배열 .@array의 요소가 아니므로 -1을 반환합니다.

    자세한 내용은 'doc/sample/inarray.txt'의 샘플을 참조하세요.

    ---------------------------------------

    *countinarray <배열 이름>{[<시작 인덱스>]},<배열 이름>{[<시작 인덱스>]};

    이 명령은 배열 값과 일치하는 것을 확인하고 일치하는 수를 반환합니다.
    선택적으로 [<start index>]를 제공하면 지정된 인덱스 값부터 검색을 시작합니다.

    setarray .@array[0], 100, 200, 300, 400, 500, 600;

    .@variable = 100;
    if(countinarray(.@array[0], .@variable))
    mes "숫자 100이 배열 .@array에서 찾았습니다.";

    countinarray(.@array[0], .@variable);
    // 숫자 100은 배열 .@array의 요소이기 때문에 1을 반환합니다.

    setarray .@array2[0],100,500;
    countinarray(.@array[0], .@array2[0]);
    // 숫자 100과 500은 배열 .@array의 요소이므로 2를 반환합니다.

    setarray .@array3[0],100,700;
    countinarray(.@array[0], .@array3[0]);
    // 숫자 100은 배열 .@array의 요소이지만,
    // 700은 배열 .@array의 요소가 아니므로 1을 반환합니다.

    // 또한, 명령에서 배열 간의 위치를 변경할 수도 있습니다.
    if(countinarray(.@array[0], .@array3[0]) == countinarray(.@array3[0], .@array[0]))
    //결과값 true

    자세한 내용은 'doc/sample/inarray.txt'에서 샘플을 참조하세요.

    ---------------------------------------

    ======================================
    |2.- 정보 검색 명령어 |
    ======================================
    ---------------------------------------

    *strcharinfo(<타입>{,<char_id>})

    이 함수는 호출하는 캐릭터의 이름, 파티 이름 또는 길드 이름을 반환합니다.
    반환되는 값은 type에 의해 결정됩니다.

    0 - 캐릭터의 이름
    1 - 소속된 파티의 이름 (소속되어 있지 않은 경우 빈 문자열 반환)
    2 - 소속된 길드의 이름 (소속되어 있지 않은 경우 빈 문자열 반환)
    3 - 캐릭터가 있는 맵의 이름

    캐릭터가 파티나 길드의 멤버가 아닌경우 빈 문자열을 리턴 합니다.

    ---------------------------------------

    *convertpcinfo(<char_id>,<type>)
    *convertpcinfo(<account_id>,<type>)
    *convertpcinfo(<player_name>,<type>)

    이 함수는 지정된 캐릭터의 정보 <type>을 반환합니다.
    리턴 값은 타입에 따라 결정됩니다.

    CPC_NAME - 캐릭터의 이름
    CPC_CHAR - 캐릭터 ID
    CPC_ACCOUNT - 계정 ID

    캐릭터가 찾을 수 없거나 (또는 오프라인인 경우), CPC_NAME에는 빈 문자열이,
    다른 <type>에는 0이 반환됩니다.


    ---------------------------------------

    *strnpcinfo(<type>)

    이 함수는 호출한 NPC의 이름의 여러 부분을 반환합니다.
    반환되는 값은 type에 따라 결정됩니다.

    0 - NPC의 표시 이름 (visible#hidden)
    1 - NPC의 표시 이름의 보이는 부분
    2 - NPC의 표시 이름의 숨겨진 부분
    3 - NPC의 고유 이름 (::name)
    4 - NPC가 있는 맵의 이름.



    ---------------------------------------

    *getarraysize(<array name>)

    이 함수는 채워진 배열의 가장 높은 인덱스를 반환합니다.
    이 배열의 끝에 있는 0과 빈 문자열은 이 숫자에 포함되지 않습니다.

    예를 들어:

    setarray .@array[0], 100, 200, 300, 400, 500, 600;
    set .@arraysize,getarraysize(.@array);

    위 코드는 .@arraysize == 6을 만듭니다. 그러나 이렇게 시도해 보면:

    setarray .@array[0], 100, 200, 300, 400, 500, 600, 0;
    set .@arraysize,getarraysize(.@array);

    .@arraysize는 여전히 6이 됩니다. 즉, 7개의 값을 설정했음에도
    불구하고 6이 됩니다.

    ---------------------------------------

    *getelementofarray(<array name>,<index>)

    이 명령은 주어진 인덱스에서 주어진 배열 요소의 값을 가져옵니다.
    이는 다음을 사용하는 것과 동등합니다:

    <array name>[<index>]

    이유는 이 짧은 형식이 스크립트가 로드될 때 getelementofarray
    호출로 내부적으로 변환되기 때문입니다.

    또한 함수에 배열을 전달하거나 다른 NPC의 배열에 액세스 할 때 유용합니다:
    getelementofarray(getarg(0),<index>)
    getelementofarray(getvariableofnpc(.var, "testNPC"),<index>)

    ---------------------------------------

    *readparam(<parameter number>{,"<character name>"})
    *readparam(<parameter number>{,<char_id>})

    이 함수는 호출하는 캐릭터 또는 지정된 플레이어(캐릭터 이름 또는 ID가 지정된 경우)의
    지정된 스탯을 반환합니다. 스탯은 'src/map/script_constants.hpp'에서 정의된 번호
    또는 매개 변수 이름일 수 있습니다.

    예제 매개 변수

    StatusPoint, BaseLevel, SkillPoint, Class, Upper, Zeny, Sex, Weight, MaxWeight,
    JobLevel, BaseExp, JobExp, NextBaseExp, NextJobExp, Hp, MaxHp, Sp, MaxSp,
    BaseJob, Karma, Manner, bVit, bDex, bAgi, bStr, bInt, bLuk, Ap, MaxAp

    이러한 모든 매개 변수는 변수로 작동하지만 단순히 'set'만으로 설정할 수 없습니다.
    내부적인 이유로 작동하지 않습니다.

    예제 1:

    // 아직 사용하지 않은 스텟 포인트 수를 반환합니다.
    mes "Unused status points: " + readparam(9);

    이 명령을 함수 호출로 사용하는 것은 필요하지 않습니다.
    다음과 같이 입력해도 동일한 결과가 반환됩니다

    mes "남은 스테이터스 포인트: " + StatusPoint;

    예제 2:

    이 명령을 사용하여 스텟 값을 가져올 수도 있습니다.

    if (readparam(bVit) > 77)
    mes "Only people with over 77 Vit are reading this!";

    ---------------------------------------

    *getcharid(<type>{,"<character name>"})

    이 함수는 호출된 캐릭터의 고유 ID 번호를 반환합니다. 만약 캐릭터 이름이 지정되면 해당 플레이어의 ID를 반환합니다.

    타입은 다음과 같습니다:

    0 - 캐릭터 ID
    1 - 파티 ID
    2 - 길드 ID
    3 - 계정 ID
    4 - 전장 ID
    5 - 클랜 ID

    이름 대신 숫자를 사용하는 것이 더 좋습니다. 캐릭터 이름은 사람들이 자신의 캐릭터 이름에
    끔찍한 일을 할 수 있기 때문입니다.

    캐릭터가 파티에 속해 있지 않거나 길드에 속해 있지 않은 경우 길드 또는 파티 번호를
    요청하면 0이 반환됩니다. 이름이 지정되고 캐릭터를 찾을 수 없는 경우 0이 반환됩니다.

    getcharid(0)이 0을 반환하면 스크립트가 캐릭터에 의해 호출되지 않았고 연결된 RID가
    없다는 것을 의미합니다. 이는 맵 서버가 "player not attached!" 오류 메시지를
    출력하므로 "playerattached"를 사용하여 스크립트가 연결된 캐릭터를 확인하는 것이 좋습니다.

    다음 예제는 길드 멤버만 들어올 수 있는 상황입니다:

    if (getcharid(2) == 0)
    mes "길드 멤버만 들어올 수 있습니다!";

    ---------------------------------------

    *getnpcid(<type>{,"<npc name>"});

    현재 호출된 NPC의 ID를 검색합니다. 고유한 npc 이름이 주어지면 해당 NPC의 ID를
    검색합니다. Type은 검색할 ID를 지정하며 다음 중 하나 일 수 있습니다.

    0 - NPC Game ID

    유효하지 않은 유형이 지정된 경우나 NPC가 존재하지 않는 경우 0이 반환됩니다.

    ---------------------------------------

    *getchildid({<char_id>})
    *getmotherid({<char_id>})
    *getfatherid({<char_id>})

    이러한 함수는 첨부된 플레이어의 자식, 어머니, 아버지의 캐릭터 ID를 반환합니다.
    ID가 없는 경우 0을 반환합니다.

    if (getmotherid()) mes "당신의 어머니 ID는: " + getmotherid();

    ---------------------------------------

    *ispartneron({<char_id>})

    이 함수는 호출 중인 캐릭터의 배우자가 현재 온라인인 경우 1을 반환하고
    오프라인인 경우 0을 반환하며 캐릭터가 배우자가 없으면 0을 반환합니다.

    ---------------------------------------

    *getpartnerid({<char_id>})

    이 함수는 호출 중인 캐릭터의 배우자의 캐릭터 ID(있는 경우)를 반환합니다.
    호출 중인 캐릭터가 결혼하지 않았다면 0을 반환하므로 다음과 같이
    쉽게 확인할 수 있습니다.

    if (getpartnerid()) mes "나는 당신의 여자친구가 될 생각 없어요!";
    if (getpartnerid()) mes "이미 결혼했군요!";

    ---------------------------------------

    *getlook(<type>{,<char_id>})

    이 함수는 타입에 따라 지정된 현재 캐릭터 외모값 번호를 반환합니다.
    유효한 외모 유형은 'setlook'을 참조하세요.

    이 함수는 검은색으로 입은 캐릭터가 특정 스크립트의 동작을 다르게 하는 데
    사용될 수 있습니다

    ---------------------------------------

    *getsavepoint(<information type>{,<char_id>})

    이 함수는 호출된 캐릭터의 저장 지점 정보를 반환합니다. 캐릭터가 여러 저장
    지점을 기록하고 이를 교환할 수 있게 하는 데 사용할 수 있습니다.
    사용 가능한 정보 유형은 다음과 같습니다.

    0 - 맵 이름 (문자열)
    1 - X 좌표
    2 - Y 좌표

    ---------------------------------------

    *getcharip({"<character name>"|<account id>|<char id>})

    이 함수는 호출된 캐릭터의 IP 주소를 반환하며, 플레이어가 지정된 경우 해당
    캐릭터의 IP 주소를 반환합니다. 플레이어가 연결되어 있지 않은 경우
    빈 문자열이 반환됩니다.

    예제:

    // 현재 연결된 플레이어의 IP 주소 출력
    mes "당신의 IP 주소: " + getcharip();

    // 캐릭터 "Silver"의 IP 주소 출력
    mes "Silver의 IP 주소: " + getcharip("Silver");

    ---------------------------------------

    *vip_status(<type>,{"<character name>"})

    플레이어의 VIP 상태에 대한 다양한 정보를 반환합니다.

    유효한 유형:
    VIP_STATUS_ACTIVE - VIP 상태: 플레이어가 VIP인 경우 true, 그렇지 않으면 false
    VIP_STATUS_EXPIRE - VIP 만료 타임스탬프 (VIP가 아닌 경우 0)
    VIP_STATUS_REMAINING - VIP 남은 시간(초)

    참고: 이 명령은 VIP 시스템이 활성화되어 있는 경우에만 사용할 수 있습니다.

    ---------------------------------------

    *vip_time <time>,{"<character name>"};

    이 명령어는 플레이어의 VIP 시간을(분) 변경합니다.
    양수 값은 시간을 증가시키고, 음수 값은 시간을 감소시킵니다.

    참고: VIP 시스템이 활성화되어 있는 경우에만 사용할 수 있습니다.

    ---------------------------------------

    *addspiritball <count>,<duration>{,<char_id>};

    플레이어에게 기구체를 'duration' 밀리초 동안 추가합니다.

    ---------------------------------------

    *delspiritball <count>{,<char_id>};

    플레이어로부터 기구체를 제거합니다.

    ---------------------------------------

    *countspiritball {<char_id>};

    플레이어가 가지고 있는 기구체 수를 반환합니다.

    ---------------------------------------

    *ignoretimeout <flag>{,<char_id>};

    이 스크립트를 호출한 캐릭터 또는 주어진 캐릭터 ID/캐릭터 이름에서
    SECURE_NPCTIMEOUT 기능을 비활성화합니다.

    유효한 플래그:
    0 - SECURE_NPCTIMEOUT 활성화.
    1 - SECURE_NPCTIMEOUT 비활성화.

    참고: 이 기능을 사용하려면 SECURE_NPCTIMEOUT을 활성화해야 합니다.

    ---------------------------------------
    \\
    2,2 아이템 관련 명령어
    \\
    ---------------------------------------

    *getequipid({<equipment slot>,<char_id>})

    이 함수는 스크립트를 호출하는 아이템 슬롯 또는 지정된 장비 슬롯의 아이템 ID를 반환합니다.
    해당 장비 슬롯에 장비가 장착되어 있지 않은 경우 -1을 반환합니다.
    유효한 장비 슬롯은 다음과 같습니다:

    EQI_COMPOUND_ON (-1) - 아이템 슬롯 (아이템 스크립트 컨텍스트에서 이 슬롯은
    getequipid에 대해서만 사용 가능합니다)
    EQI_ACC_L (0) - 악세사리(L)
    EQI_ACC_R (1) - 악세사리(R)
    EQI_SHOES (2) - 신발
    EQI_GARMENT (3) - 걸칠것 (머플러, 후드, 망토 등)
    EQI_HEAD_LOW (4) - 하단
    EQI_HEAD_MID (5) - 중단
    EQI_HEAD_TOP (6) - 상단
    EQI_ARMOR (7) - 갑옷
    EQI_HAND_L (8) - 왼손(방패)
    EQI_HAND_R (9) - 오른손(무기)
    EQI_COSTUME_HEAD_TOP (10) - 의상 상단
    EQI_COSTUME_HEAD_MID (11) - 의상 중단
    EQI_COSTUME_HEAD_LOW (12) - 의상 하단
    EQI_COSTUME_GARMENT (13) - 의상 걸칠것
    EQI_AMMO (14) - 화살/탄약
    EQI_SHADOW_ARMOR (15) - 쉐도우 아머
    EQI_SHADOW_WEAPON (16) - 쉐도우 웨폰
    EQI_SHADOW_SHIELD (17) - 쉐도우 쉴드
    EQI_SHADOW_SHOES (18) - 쉐도우 슈즈
    EQI_SHADOW_ACC_R (19) - 쉐도우 악세사리(R)
    EQI_SHADOW_ACC_L (20) - 쉐도우 악세사리(L)

    일부 아이템은 여러 장비 슬롯을 차지하며, 캐릭터가 이러한 아이템을 착용하고 있다면
    'getequipid'는 해당 슬롯 중 하나에 대한 ID 번호를 반환합니다.

    이 함수는 장비를 장착했는지 여부를 확인하거나 장착하지 않은 것을 확인하는 데
    사용할 수 있습니다.

    if (getequipid(EQI_HEAD_TOP) == 2234)
    mes "당신은 티아라를 착용 있나요?";
    else
    mes "티아라를 착용하고 다시 오세요.";
    close;

    또한 다음과 같이 코드를 작성하여 사람들이 Legion Plate 갑옷을 착용하지 못하도록
    제한할 수 있습니다. 먼저 장비 창에서 확인한 다음 인벤토리에서 확인할 수 있습니다.

    if (getequipid(EQI_ARMOR) == 2341 || getequipid(EQI_ARMOR) == 2342) {
    mes "당신은 풀 플레이트 아머을 입고 있습니다. 계속하기 전에 착용 해제하세요.";
    close;
    }
    // ||는 OR 연산자입니다. 2341과 2342가 있는 이유는 Legion Plate Armor이
    // 두 가지 버전이 있기 때문입니다.
    if (countitem(2341) > 0 || countitem(2432) > 0) {
    mes "인벤토리에 풀 플레이트 아머가 있습니다. 계속하기 전에 그것을 드롭하세요.";
    close;
    }
    mes "여길 통과해주겠습니다.";
    close2;
    warp "place",50,50;
    end;

    ---------------------------------------

    *getequipuniqueid(<equipment slot>{,<char_id>})

    이 함수는 호출한 캐릭터의 지정된 장비 슬롯에 장착된 아이템의 고유 ID(문자열 형태)를
    반환합니다. 장비 슬롯에 아무것도 장착되어 있지 않은 경우 빈 문자열을 반환합니다.
    유효한 장비 슬롯 목록은 'getequipid'를 참조하세요.

    ---------------------------------------

    *getequipname(<equipment slot>{,<char_id>})

    이 함수는 호출한 캐릭터의 지정된 장비 슬롯에 장착된 아이템의 이름(일본어)을
    반환합니다. 해당 위치에 아무것도 장착되어 있지 않은 경우 빈 문자열을 반환합니다.
    'getequipid'를 참조하여 유효한 장비 슬롯 목록을 확인하세요.
    'getitemname(getequipid())'과 같은 역할을 합니다. NPC가 플레이어가 무엇을
    입고 있는지 알리거나, 문자열 변수로 저장하는 데 유용합니다.

    if ( getequipname(EQI_HEAD_TOP) != "" )
    mes "상단에 " + getequipname(EQI_HEAD_TOP) + "를 착용하고 있습니다.";
    else
    mes "상단에 착용한 장비가 없습니다.";

    ---------------------------------------

    *getitemname(<item id>)
    *getitemname(<aegis item name>)

    아이템의 데이터베이스 ID 번호가 주어지면, 이 함수는 item_db_*.yml 파일의
    'Name' 필드에 저장된 텍스트 또는 SQL 버전의 'name_english' 필드에서
    해당 텍스트를 반환합니다. 아이템이 존재하지 않으면 "null"을 반환합니다.

    ---------------------------------------

    *getbrokenid(<number>{,<char_id>})

    이 함수는 호출하는 캐릭터의 인벤토리에서 고장난 아이템을 검색하고,
    그 아이템의 ID 번호를 반환합니다. 캐릭터가 여러 개의 고장난 아이템을
    가지고 있을 수 있으므로, 1이 주어지면 첫 번째로 찾은 아이템을 반환하고,
    2가 주어지면 두 번째로 찾은 아이템을 반환합니다. 이러한 아이템이 없으면
    0을 반환합니다.

    // 고장난 아이템이 있는지 확인해보자:
    if (getbrokenid(1) == 0)
    mes "고장난 아이템이 없네요. 귀찮게 하지 마세요.";
    else
    // 고장난 아이템이 있으면, 첫 번째 고장난 아이템의 이름을 출력합니다:
    mes "오, 여기 고장난 " + getitemname(getbrokenid(1)) + "이 있네요!";
    end;

    ---------------------------------------

    *getequipisequiped(<equipment slot>{,<char_id>})

    이 함수는 지정된 장비 슬롯에 장착된 장비가 있는 경우 1을 반환하고 그렇지
    않으면 0을 반환합니다. 장비 슬롯의 목록은 'getequipid'를 참조하십시오.
    원래 제련 NPC가 사용한 함수입니다:

    if (getequipisequiped(EQI_HEAD_TOP)) {
    mes "[Refiner]";
    mes "좋은 모자를 쓰고 있군요...";
    close;
    } else {
    mes "[Refiner]";
    mes "상단 투구를 제련해 드릴까요?";
    close;
    }

    ---------------------------------------

    *getequipisenableref(<equipment slot>{,<char_id>})

    이 함수는 호출하는 캐릭터가 지정된 장비 슬롯에 장착한 아이템이 제련
    가능한지 여부를 반환합니다. 장비 슬롯의 목록은 'getequipid'를 참조하십시오.

    if (getequipisenableref(EQI_HEAD_TOP)) {
    mes "[Refiner]";
    mes "좋아요, 이걸 제련해 드릴게요";
    close;
    } else {
    mes "[Refiner]";
    mes "이 모자는 제련할 수 없어요!...";
    close;
    }

    ---------------------------------------

    *getequiprefinerycnt(<equipment slot>{,<char_id>})

    지정된 장비 슬롯에 장착된 아이템의 현재 강화 수치를 반환합니다.
    장비 슬롯의 목록은 'getequipid'를 참조하세요.

    이 함수는 최대 강화 값(+10)에 도달했는지 확인하는 데 사용할 수 있습니다.

    if (getequiprefinerycnt(EQI_HEAD_TOP) < 10)
    mes "이제 " + getequipname(EQI_HEAD_TOP) + "을 업그레이드합니다.";
    else
    mes "죄송합니다, 모자는 +10보다 더 강화할 수 없습니다.";
    close;

    ---------------------------------------

    *getequipweaponlv({<equipment slot>{,<char_id>}})

    이 함수는 호출된 캐릭터가 장비한 지정된 장비 슬롯에 장착된 무기의 레벨을
    반환합니다. 장비 슬롯의 목록은 'getequipid'를 참조하십시오.

    보통 EQI_HAND_L 및 EQI_HAND_R만 의미가 있으며, 무기만이 무기 레벨을 갖습니다.

    이 슬롯에 아무것도 장착되어 있지 않거나 데이터베이스에 따르면 무기 레벨이 없으면
    0이 반환됩니다.

    예제:

    switch (getequipweaponlv(EQI_HAND_R)) {
    case 1: mes "당신은 레벨 1 무기를 들고 있습니다."; break;
    case 2: mes "당신은 레벨 2 무기를 들고 있습니다."; break;
    case 3: mes "당신은 레벨 3 무기를 들고 있습니다."; break;
    case 4: mes "당신은 레벨 4 무기를 들고 있습니다."; break;
    case 5: mes "당신은 레벨 5 무기를 들고 있습니다."; break;
    case 6: mes "당신은 레벨 6 무기를 들고 있습니다. 아마도 커스텀 디자인인가요..."; break;
    default: mes "당신은 아무것도 들고 있지 않습니다."; break;
    }

    if (getequipid(EQI_HAND_L) == 0) {
    mes "이 자리에 아무것도 장착되어 있지 않습니다.";
    close;
    }

    switch (getequipweaponlv(EQI_HAND_L)) {
    case 0: mes "당신은 무기를 들고 있지 않기 때문에 레벨이 없습니다."; break;
    case 1: mes "당신은 레벨 1 무기를 들고 있습니다."; break;
    case 2: mes "당신은 레벨 2 무기를 들고 있습니다."; break;
    case 3: mes "당신은 레벨 3 무기를 들고 있습니다."; break;
    case 4: mes "당신은 레벨 4 무기를 들고 있습니다."; break;
    case 5: mes "당신은 레벨 5 무기를 들고 있습니다."; break;
    case 6: mes "당신은 레벨 6 무기를 들고 있습니다. 아마도 커스텀 디자인인가요..."; break;
    }

    ---------------------------------------

    *getequiparmorlv({<equipment slot>{,<char_id>}})

    이 함수는 호출하는 캐릭터의 지정된 장비 슬롯에 장착된 아이템의 방어 레벨을 반환합니다.
    장비 슬롯 목록은 'getequipid'를 참조하십시오.

    만약 이 슬롯에 아이템이 장착되어 있지 않거나 데이터베이스에서 방어 레벨이 정의되어
    있지 않으면 0이 반환됩니다.

    if (getequipid(EQI_ARMOR) == 0) {
    mes "이 곳에 장착된 아이템이 없습니다.";
    close;
    }
    switch (getequiparmorlv(EQI_ARMOR)) {
    case 1: mes "레벨 1 방어구를 착용하고 있습니다."; break;
    case 2: mes "레벨 2 방어구를 착용하고 있습니다."; break;
    case 3: mes "레벨 3 방어구를 착용하고 있습니다. 아, 맞다 커스텀으로 만든 것이군요..."; break;
    }

    ---------------------------------------

    *getequippercentrefinery(<equipment slot>{,<enriched>,<char_id>})

    이 함수는 호출하는 캐릭터의 지정된 장비 슬롯에 있는 아이템을 +1으로 제련할
    확률을 백분율 값으로 계산하여 반환합니다. 실제로는 정확한 공식은 없으며,
    특정 제련 레벨의 무기 레벨에 대한 성공 확률은 db/(pre-)re/refine_db.yml
    파일에서 찾을 수 있습니다. 장비 슬롯 목록은 'getequipid'를 참조하십시오.

    enriched 매개변수가 true로 설정되면, 강화된 재료로 아이템을 제련할 성공 확률이 반환됩니다.

    이 값을 플레이어에게 표시하거나, 랜덤한 제련 성공/실패 확률을 계산하는 데 사용할 수
    있으며, 이를 통해 성공하거나 실패하고 그에 따라 제련 작업을 진행합니다
    (공식 NPC 제련 스크립트에서도 이와 같은 방식을 사용합니다).

    // 이 코드는 0부터 99까지의 랜덤한 숫자를 찾아서 이 명령어로 반환된 값보다
    // 같거나 크면 L_Fail로 이동합니다.
    if (getequippercentrefinery(EQI_HAND_L)<=rand(100)) goto L_Fail;

    ---------------------------------------

    *getequiprefinecost(<equipment slot>,<type>,<information>{,<char id>})

    이 함수는 전달된 <type> 및 <information>에 기반하여 <equipment slot>의 장비에 대한
    제련 비용을 반환합니다.

    유효한 비용 유형은 다음과 같습니다.

    REFINE_COST_NORMAL - 일반 제련용
    REFINE_COST_HD - 농축 광석 제련용
    REFINE_COST_ENRICHED - 고농축 광석 제련용

    이 함수는 <information> 인수에 기반하여 제련에 필요한 비용을 반환합니다.

    유효한 정보 유형은 다음과 같습니다.

    REFINE_ZENY_COST - 제련 비용(제니)
    REFINE_MATERIAL_ID - 소재 아이템 ID

    이 함수는 실패하면 -1을 반환합니다. 비용 유형이 잘못되었거나 장비 슬롯에 항목이
    없으면 함수가 실패합니다.

    ---------------------------------------

    *getareadropitem("<map name>",<x1>,<y1>,<x2>,<y2>,<item>)

    이 함수는 지정된 맵 내에서 x1/y1-x2/y2 사각형 안에 있는 지정된 아이템 ID 번호를
    가진 모든 아이템의 수를 세고 해당 수를 반환합니다.

    이 함수는 매개 변수가 문자열 또는 숫자 둘 중 하나 일 수 있는 유일한 함수입니다!
    숫자 인 경우 해당 아이템 ID 번호를 가진 아이템만 계산됩니다.
    문자열인 경우, 아이템 데이터베이스의 '영어 이름' 필드를 의미한다고 가정됩니다.

    ---------------------------------------

    *getequipcardcnt(<equipment slot>)

    이 함수는 호출된 캐릭터의 특정 장착 된 아이템에 결합된 카드 수를 반환합니다.
    가능한 장비 슬롯의 목록은 'getequipid'를 참조하십시오.

    ---------------------------------------

    *getinventorylist {<char_id>};

    이 명령은 호출된 캐릭터가 인벤토리에 가지고 있는 모든 항목과, 그 항목들을
    완벽하게 재생성하기 위해 필요한 모든 데이터를 포함하는 일련의 배열을 설정합니다.
    다음과 같은 항목을 얻을 수 있습니다:

    @inventorylist_id[] - 아이템 ID 배열
    @inventorylist_idx[] - 아이템 인벤토리 인덱스 배열
    @inventorylist_amount[] - 해당 아이템의 수량
    @inventorylist_equip[] - 장착된 위치를 나타내는 상수 (EQP_* 상수 참조). 장착되어 있지 않은 경우 0을 포함합니다.
    @inventorylist_refine[] - 제련된 수치
    @inventorylist_identify[] - 식별 여부
    @inventorylist_attribute[] - 손상 여부
    @inventorylist_card1[] - 아이템 카드 데이터가 포함된 4개의 배열 중 첫 번째
    @inventorylist_card2[] - 아이템 카드 데이터가 포함된 4개의 배열 중 두 번째
    @inventorylist_card3[] - 아이템 카드 데이터가 포함된 4개의 배열 중 세 번째
    @inventorylist_card4[] - 아이템 카드 데이터가 포함된 4개의 배열 중 네 번째. 이 데이터 슬롯은 아이템에 기록된 이름을 저장하는 데도 사용됩니다. 따라서 캐릭터가 특정 장인이 만든 아이템을 소유하고 있는지 명시적으로 확인할 수 있습니다.
    @inventorylist_expire[] - 만료 시간(Unix 시간). 0은 만료되지 않음을 나타냅니다.
    @inventorylist_bound[] - 아이템의 바인드 유형 (BOUND_* 상수 참조)
    @inventorylist_enchantgrade[] - 아이템의 강화 등급
    @inventorylist_count - 이러한 목록에 있는 아이템 수
    @inventorylist_option_id1[] - 랜덤 옵션 ID의 첫 번째 배열
    @inventorylist_option_value1[] - 랜덤 옵션 값의 첫 번째 배열
    @inventorylist_option_parameter1[] - 랜덤 옵션 매개 변수의 첫 번째 배열
    @inventorylist_option_id2[] - 랜덤 옵션 ID의 두 번째 배열
    @inventorylist_option_value2[] - 랜덤 옵션 값의 두 번째 배열
    @inventorylist_option_parameter2[] - 랜덤 옵션 매개 변수의 두 번째 배열
    @inventorylist_option_id3[] - 랜덤 옵션 ID의 세 번째 배열
    @inventorylist_option_value3[] - 랜덤 옵션 값의 세 번째 배열
    @inventorylist_option_parameter3[] - 랜덤 옵션 매개 변수의 세 번째 배열
    @inventorylist_option_id4[] - 랜덤 옵션 ID의 네 번째 배열
    @inventorylist_option_value4[] - 랜덤 옵션 값의 네 번째 배열
    @inventorylist_option_parameter4[] - 랜덤 옵션 매개 변수의 네 번째 배열
    @inventorylist_option_id5[] - 랜덤 옵션 ID의 다섯 번째 배열
    @inventorylist_option_value5[] - 랜덤 옵션 값의 다섯 번째 배열
    @inventorylist_option_parameter5[] - 랜덤 옵션 매개 변수의 다섯 번째 배열
    @inventorylist_tradable - 아이템이 거래 가능한지 여부를 반환
    (item_db.yml, 바인딩, 임대제한 ).
    @inventorylist_favorite - 아이템이 favorite 여부를 반환

    이 명령어는 캐릭터의 인벤토리를 저장하고 복원하는 데 유용할 수 있으며,
    다른 명령어에서는 반환되지 않는 매우 완벽한 데이터 집합이므로 카드가
    장착된 이름이 있는 아이템을 판매하는 NPC 상인을 올바르게 처리하는
    유일한 방법이 될 수도 있습니다. NPC 객체는 아이템을 소유할 수 없으므로
    아이템 데이터를 변수에 저장하고 아이템을 다시 생성해야하기 때문입니다.

    알림: 이 명령어에서 생성된 변수는 모두 일시적으로 캐릭터에 부착되며
    정수형입니다. 또한, 'getinventorylist' 실행 사이에 배열이 자동으로
    지워지지 않기 때문에 'getarraysize'가 아닌 @inventorylist_count를 사용하여
    이 배열을 반복하는 것이 중요합니다.

    'getinventorylist' 명령어로 생성된 배열들은 자동으로 초기화되지 않으므로,
    반드시 'getarraysize' 대신 '@inventorylist_count'를 사용하여 배열을
    반복해야 합니다

    ---------------------------------------

    *cardscnt()

    이 함수는 호출한 장비에 삽입된 카드의 수를 반환합니다.
    이 함수는 아이템 스크립트에서 사용하기 위해 제작되었습니다.



    ---------------------------------------

    *getrefine()

    이 함수는 호출한 장비의 제련 수치를 반환합니다.
    이 함수는 아이템 스크립트에서 사용하기 위해 제작되었습니다.

    ---------------------------------------

    *getnameditem(<item id>,"<name to inscribe>"|<char id>);
    *getnameditem("<item name>","<name to inscribe>"|<char id>);

    이 함수는 'getitem'을 사용하는 것과 동일하지만, 캐릭터에게 아이템 객체만
    제공하는 것이 아니라 지정된 캐릭터의 이름으로 아이템에 새 이름을 부여합니다.
    임의의 문자열로 아이템에 이름을 붙일 수는 없으며, 실제로 존재하는 캐릭터의
    이름만 사용할 수 있습니다. 이는 명확하게 명시되어 있지는 않지만, 아이템
    이름이 부여된 캐릭터의 ID로 인해 카드를 가진 이름이 부여된 아이템은
    (슬롯이 있는 경우에도) 없을 수 있다는 것입니다. 이름이 부여된 아이템은 슬롯 중
    하나가 여유로이 남아 있지만, 이곳에 카드를 넣을 수 있는지 여부는 분명하지 않습니다.

    이 함수는 아이템이 성공적으로 생성되면 1을 반환하고, 어떤 이유로든 생성되지
    않았으면 0을 반환합니다. 'getitem'과 마찬가지로, 이 함수는 아이템 데이터베이스에서
    '영문 이름'을 아이템 이름으로 사용할 수 있으며, 그러한 항목이 없으면 0을 반환합니다.

    ---------------------------------------

    *getitemslots(<아이템 ID>)

    이 함수는 데이터베이스에서 지정된 ID 번호의 아이템을 찾아 해당 아이템의 슬롯 수를
    반환합니다. 아이템이 슬롯이 없는 경우 0을 반환합니다. 아이템이 장비가 아닌 경우에도
    자연스럽게 0이 반환됩니다. 이 함수는 해당 아이템이 없는 경우 -1을 반환합니다.

    예제:

    //.@slots는 ID 1205의 아이템의 슬롯 수를 가지고 있습니다.
    .@slots = getitemslots(1205);

    *getiteminfo(<아이템 ID>,<타입>)
    *getiteminfo(<아이템 이름>,<타입>)
    *getiteminfo(<aegis 아이템 이름>,<타입>)

    이 함수는 데이터베이스에서 지정된 ID 번호 또는 이름의 아이템을 찾아 TYPE 인수로
    설정된 정보를 반환합니다.
    해당 아이템이 없는 경우 -1을 반환하고 aegis 아이템 이름이 요청된 경우 ""을 반환합니다.

    유효한 타입은 다음과 같습니다:
    ITEMINFO_BUY (0) - 구매 가격
    ITEMINFO_SELL (1) - 판매 가격
    ITEMINFO_TYPE (2) - Type
    ITEMINFO_MAXCHANCE (3) - max 드롭율 (이 아이템의 최대 드랍 확률, 예: 1 = 0.01%)
    0이면, 몬스터가 아이템을 드롭하지 않음(퀘스트나 희귀 아이템)
    10000이면, 이 아이템은 NPC 상점에서만 판매됩니다.
    ITEMINFO_GENDER (4) - 성별
    ITEMINFO_LOCATIONS (5) - 위치
    ITEMINFO_WEIGHT (6) - 무게
    ITEMINFO_ATTACK (7) - 공격력
    ITEMINFO_DEFENSE (8) - 방어력
    ITEMINFO_RANGE (9) - 사거리
    ITEMINFO_SLOT (10) - 슬롯
    ITEMINFO_VIEW (11) - 보기
    ITEMINFO_EQUIPLEVELMIN (12) - 장비 착용 가능 최저 레벨
    ITEMINFO_WEAPONLEVEL (13) - 무기 레벨
    ITEMINFO_ALIASNAME (14) - AliasName
    ITEMINFO_EQUIPLEVELMAX (15) - 장비 레벨 상한 레벨
    ITEMINFO_MAGICATTACK (16) - Matk(Renewal이 정의된 경우)
    ITEMINFO_ID (17) - 아이템 ID
    ITEMINFO_AEGISNAME (18) - aegis 아이템 이름
    ITEMINFO_ARMORLEVEL (19) - 방어구 레벨
    ITEMINFO_SUBTYPE(20) - Subtype

    자세한 내용은 'doc/sample/getiteminfo.txt' 문서를 확인하세요.

    ---------------------------------------

    *getequipcardid(<장착 슬롯>, <카드 슬롯>)

    지정된 슬롯(0, 1, 2, 3)의 장착된 아이템 슬롯에서 값을 반환합니다.

    이 함수는 카드 ID, CARD0_FORGE, CARD0_CREATE 또는 CARD0_PET(생산된 아이템의 경우 카드 0)를 반환합니다.
    아이템에 카드가 포함되어 있는지 또는 사인되어 있는지 확인하려는 경우에 유용합니다.

    --------------------------------------

    *mergeitem({,<char_id>});

    합병 가능한 아이템을 병합할 수 있는 아이템 병합 창을 엽니다.

    예제:

    1.'npc/re/other/merge_item.txt' NPC 참조
    2.단순 사용법:
    mes "병합 가능한 아이템이 있는지 확인해봅시다.";
    close2;
    mergeitem;
    end;

    ---------------------------------------

    *mergeitem2({<item_id>{,<char_id>}});
    *mergeitem2({"<item name>"{,<char_id>}});

    아이템 병합을 가능케 하는 모든 중첩 가능한 아이템을 병합합니다.
    아이템 ID/이름이 지정되지 않으면, 플레이어 인벤토리의 모든 가능한 아이템이 병합됩니다.

    ----------------------------------------

    *getequiptradability(<장비 슬롯>{,<char id>});

    <장비 슬롯>에 있는 아이템이 거래 가능한 경우 true를 반환합니다.
    그렇지 않으면 false를 반환합니다.

    ---------------------------------------

    *identifyall({<type>{,<account_id>}});

    플레이어 인벤토리에 식별되지 않은 아이템의 수를 반환합니다.
    <type>이 true인 경우 명령은 모든 식별되지 않은 아이템을 식별합니다(기본값).
    <type>이 false인 경우 명령은 식별되지 않은 아이템의 수만 반환합니다.
    ---------------------------------------

    *getenchantgrade({<equipment slot>,<char_id>})

    이 함수는 호출하는 장비의 enchantgrade 를 반환합니다. 지정된 장비 슬롯이 없으면 -1을 반환합니다.

    유효한 장비 슬롯은 다음과 같습니다.

    EQI_COMPOUND_ON - 아이템 스크립트에서 호출하는 아이템 슬롯 (기본값)

    다른 장비 슬롯 목록은 'getequipid'를 참조하십시오.

    ---------------------------------------

    *getitempos()

    이 함수는 호출하는 장비의 장착 위치를 반환합니다. (EQP_* 상수 참조)

    이 함수는 아이템 스크립트에서 사용하기 위해 고안되었습니다.



    ---------------------------------------
    //
    2,1.- 아이템 관련 명령어 끝
    //
    ---------------------------------------

    *getmapxy("<맵 이름 변수>",<X 좌표 변수>,<Y 좌표 변수>{,<종류>,"<검색 값>"})

    이 함수는 캐릭터 오브젝트, NPC 오브젝트 또는 펫의 좌표를 찾아 그 좌표를 호출할 때 지정한 변수에
    할당합니다. 검색이 성공하면 0을, 매개변수가 변수가 아니거나 검색이 실패하면 -1을 반환합니다.

    종류는 찾으려는 오브젝트의 타입입니다:


    BL_PC - 캐릭터 오브젝트 (기본값)
    BL_NPC - NPC 오브젝트
    BL_PET - 펫 오브젝트
    BL_HOM - 호문큘러스 오브젝트
    BL_MER - 용병 오브젝트
    BL_ELEM - 엘리멘탈 오브젝트

    검색 값은 선택 사항입니다. 지정하지 않으면 BL_PC 및 BL_PET의 경우 호출하는 캐릭터의 위치가 항상
    반환되며, BL_NPC의 경우 이 함수를 실행 중인 NPC의 위치가 반환됩니다.

    검색 값이 지정된 경우, BL_PC 및 BL_NPC의 경우 해당 이름 또는 GID를 가진 캐릭터 또는 NPC가
    찾아집니다.

    종류가 BL_PET / BL_HOM / BL_MER / BL_ELEM인 경우, 검색 값으로 지정된 이름 / GID를 가진
    캐릭터의 현재 오브젝트가 찾아지며, 이름으로 오브젝트를 찾지 않습니다.

    예제:

    prontera,164,301,3%TAB%script%TAB%Meh%TAB%730,{
    mes "내 이름은 Meh야. 여기에 있어서 Nyah가 나를 찾을 수 있게 도와주고 있어.";
    close;
    }

    prontera,164,299,3%TAB%script%TAB%Nyah%TAB%730,{
    mes "내 이름은 Nyah야.";
    mes "이제 세상 각지에서 Meh를 찾아볼게!";
    if (getmapxy(.@mapname$, .@mapx, .@mapy, BL_NPC, "Meh") != 0) {
    mes "어디를 뒤져봐도 Meh를 찾을 수가 없어!";
    close;
    }
    mes "그리고 " + .@mapname$ + " 맵에서 X좌표 " + .@mapx + ", Y좌표 " + .@mapy + " 에서 찾았어!";
    close;
    }

    이 함수를 사용하여 'disablenpc'로 비활성화된 NPC 오브젝트도 찾을 수 있다는 점에 유의하세요.
    ---------------------------------------

    *mapid2name(<맵 ID>)

    주어진 맵 ID의 맵 이름을 반환합니다. 만약 주어진 맵 ID가 존재하지 않는다면 빈 문자열을 반환합니다.

    --------------------------------------

    *getgmlevel({<char_id>})

    이 함수는 호출된 캐릭터가 속한 플레이어 그룹에 대응되는 (GM) 레벨을 반환합니다. 만약 이 함수가
    콘솔 명령에서 실행된 경우, 99가 반환됩니다. 또한 계정이 GM 레벨을 가지고 있지 않은 경우 0이
    반환됩니다.

    이 함수는 일부 NPC를 특정 GM 레벨에만 접근 가능하도록 만들거나, GM에 의해 대화할 때 특별하게
    동작하도록 만들 수 있습니다.

    if (getgmlevel()) mes "당신의 명령은 무엇입니까?";

    -----------------------------------

    *getgroupid({<char_id>})

    이 함수는 호출된 플레이어가 속한 그룹 ID를 반환합니다.


    -----------------------------------

    *gettimetick(<틱 유형>)

    이 함수는 <틱 유형>에 따라 틱을 반환합니다:
    0: 서버 틱, 서버의 타이머 시스템에서 사용하는 밀리초 단위의 측정값입니다. 이 틱은 약 50일마다
    루프합니다.
    1: 현재 일(day)이 시작된 이후 경과한 시간(초)입니다.
    2: 유닉스 시간(epoch time)의 시스템 시간, 또는 1970년 1월 1일 이후 경과한 초 단위 시간입니다.
    시간 간격을 신뢰성 있게 측정하는 데 유용합니다.

    ---------------------------------------

    *gettime(<type>)

    이 함수는 현재 시스템 시간에 대한 지정된 정보를 반환합니다.

    DT_SECOND - 현재 분의 초
    DT_MINUTE - 현재 시간의 분
    DT_HOUR - 현재 일의 시간
    DT_DAYOFWEEK - 요일 (MONDAY에서 SUNDAY까지의 상수가 사용 가능합니다)
    DT_DAYOFMONTH - 현재 월의 일
    DT_MONTH - 월 (JANUARY에서 DECEMBER까지의 상수가 사용 가능합니다)
    DT_YEAR - 연도
    DT_DAYOFYEAR - 올해의 일
    DT_YYYYMMDD - YYYYMMDD 형식으로 현재 날짜

    숫자만 반환합니다. 다른 타입이 제공되면 -1을 반환합니다.

    if (gettime(DT_DAYOFWEEK) == SATURDAY) mes "토요일입니다. 토요일에는 일하지 않습니다.";

    ---------------------------------------

    *gettimestr(<"time format">,<max length>{,<time_tick>})

    이 함수는 지정된 시간 형식으로 시간 데이터가 포함된 문자열을 반환합니다.

    이 함수는 'strfmtime' C 함수를 사용하며, 특별한 형식 문자열을 따릅니다. 예를 들어 'strfmtime'의
    설명을 참조하십시오.
    http://www.delorie.com/gnu/docs/glibc/libc_437.html
    거기에서 제공된 모든 형식 문자는 올바르게 작동해야 합니다.
    최대 길이는 생성할 수 있는 시간 문자열의 최대 길이입니다.

    rAthena 샘플 스크립트에서 제공된 예제는 다음과 같이 작동합니다.

    mes gettimestr("%Y-%m/%d %H:%M:%S",21);

    위의 예제는 현재 날짜와 시간을 'YYYY-MM/DD HH:MM:SS'와 같이 표시합니다.
    다음 예제는 <time_tick>으로 주어진 VIP 상태가 만료되는 날짜와 시간을 표시합니다.

    mes gettimestr("%Y-%m/%d %H:%M:%S",21,vip_status(VIP_STATUS_EXPIRE));

    ---------------------------------------

    *getusers(<type>)

    이 함수는 맵 또는 전체 서버에 있는 사용자 수를 반환합니다. 반환되는 내용은 Type에 따라 지정됩니다.

    Type은 다음 값 중 하나일 수 있으며 반환할 내용을 제어합니다:

    0 - 호출한 캐릭터의 맵에있는 모든 캐릭터 수를 반환합니다.
    1 - 전체 서버에있는 모든 캐릭터 수를 반환합니다.
    8 - 스크립트가 실행 중인 NPC의 맵에있는 모든 캐릭터 수를 반환합니다.

    ---------------------------------------

    *getmapusers("<map name>")

    이 함수는 지정된 맵에 현재 위치한 사용자 수를 반환합니다.

    이것은 공식적으로 PVP 스크립트에서 방이 가득 찼는지 확인하는 데 사용됩니다.

    ---------------------------------------

    *getareausers("<map name>",<x1>,<y1>,<x2>,<y2>)

    이 함수는 지정된 맵의 x1 / y1-x2 / y2 사각형 내에 위치한 연결된 캐릭터 수를 반환합니다.

    이것은 많은 건물로 나뉘어진 맵, 예를 들어 모든 "_in" 맵에 유용합니다.

    ---------------------------------------

    *getunits(<type>{,<array_variable>[<first value>]})
    *getmapunits(<type>,<"map name">{,<array_variable>[<first value>]})
    *getareaunits(<type>,<"map name">,<x1>,<y1>,<x2>,<y2>{,<array_variable>[<first value>]})

    'getunits' 명령은 서버에서 활성화 된 <type> 개체 수를 반환합니다.

    'getmapunits' 명령은 지정된 <"맵 이름">에서 활성화 된 <type> 개체 수를 반환합니다.

    'getareaunits' 명령은 <x1>, <y1>, <x2>, <y2>가 해당 지역을 형성하는 지점인 지정된 영역 내에서
    활성 위치하는 <type> 개체 수를 반환합니다.

    Type은 검색할 개체 유형입니다:

    BL_PC - 캐릭터 개체
    BL_MOB - 몬스터 개체
    BL_PET - 펫 개체
    BL_HOM - 호문 개체
    BL_MER - 용병 개체
    BL_NPC - NPC 개체
    BL_ELEM - 정령 개체

    <array_variable>이 제공되면:
    - int 변수는 GID 목록을 반환합니다.
    - 문자열 변수는 이름 목록을 반환합니다.

    예제 1:
    // 플레이어 수를 가져 오고 이름 문자열 배열을 만듭니다.
    .@num = getunits(BL_PC,.@array$[0]);

    mes "서버에 연결된 사용자 수는 " + .@num + " 입니다.";
    mes "플레이어 이름 목록 :";
    freeloop(1); // 목록이 너무 길 경우를 대비
    for(.@i=0;.@i<getarraysize(.@array$);.@i++)
    mes (.@i + 1) + " " + .@array$[.@i];
    freeloop(0);
    end;

    예제 2:
    // Prontera에서 NPC 수를 가져오고 이름 문자열 배열을 만듭니다.
    .@num = getmapunits(BL_NPC,"prontera",.@array$[0]);

    mes "Prontera에 있는 NPC 수는 " + .@num + "명입니다.";
    mes "NPC 이름 목록:";
    freeloop(1); // 목록이 너무 길 경우를 대비
    for(.@i=0;.@i<getarraysize(.@array$);.@i++)
    mes (.@i + 1) + " " + .@array$[.@i];
    freeloop(0);
    end;

    예제 3:
    // 특정 좌표에 있는 Prontera의 몬스터 수를 가져와 GID 정수 배열을 빌드합니다.
    .@num = getareaunits(BL_MOB,"prontera",154,186,159,182,.@array[0]);

    mes "해당 좌표에 있는 Prontera의 몬스터 수는 " + .@num + "마리입니다.";
    mes"몬스터 GID 목록:";
    freeloop(1); // 목록이 너무 길 경우를 대비
    for(.@i=0;.@i<getarraysize(.@array);.@i++)
    mes (.@i + 1) + " " + .@array[.@i];
    freeloop(0);
    end;

    ---------------------------------------
    \\
    2,2.- 길드 관련 명령어
    \\
    ---------------------------------------

    *getguildname(<guild id>)

    이 함수는 ID 번호가 주어졌을 때 해당 길드의 이름을 반환합니다. 만약 그런 길드가 없다면
    "null"을 반환합니다.

    예제:
    mes "그 길드인 " + getguildname(10007) + " 멤버들은 모두 착합니다.";


    ---------------------------------------

    *getguildmember <guild id>{,<type>{,<array_variable>}};

    이 명령어는 특정 길드의 모든 멤버를 찾아서 그들의 이름 (또는 캐릭터 ID 또는 계정 ID)을
    전역 임시 변수의 배열에 반환합니다.

    실행후,

    $@guildmembername$[]는 이 길드 멤버들의 모든 이름을 담고 있는 전역 임시 문자열 배열입니다
    (타입이 0이거나 지정되지 않은 경우에만 설정됩니다)

    $@guildmembercid[]는 이 길드 멤버들의 캐릭터 ID를 담고 있는 전역 임시 숫자 배열입니다.
    (타입이 1인 경우에만 설정됩니다)

    $@guildmemberaid[]는 이 길드 멤버들의 계정 ID를 담고 있는 전역 임시 숫자 배열입니다.
    (타입이 2인 경우에만 설정됩니다)

    $@guildmembercount는 찾아진 길드 멤버의 수입니다.

    온라인이든 오프라인이든 모든 길드 멤버가 찾아집니다. 이름의 순서는 특정하지 않습니다.

    이 배열을 탐색할 때 'getarraysize'가 아니라 $@guildmembercount를 사용해야 합니다.
    이유는 'getguildmember' 실행 사이에 배열이 초기화되지 않기 때문입니다.

    'array_variable'이 설정된 경우, 결과는 전역 변수 대신에 그 변수에 저장됩니다.

    사용 예는 'getpartymember'를 참고하세요.



    ---------------------------------------

    *getguildmaster(<guild id>)

    이 함수는 지정된 ID 번호를 가진 길드의 마스터 이름을 반환합니다. 만약 그런 길드가 없다면
    "null"을 반환합니다.

    예제 1:
    /// 어떤 길드의 마스터인지 모르겠지만, 그 길드의 마스터 이름을 출력합니다.
    mes getguildmaster(10007) + " 님이 " + getguildname(10007) + " 길드를 운영하고 계십니다.";

    예제 2:
    // 해당 길드의 마스터인지 확인합니다.
    .@GID = getcharid(2);
    if (.@GID == 0) {
    mes "죄송합니다, 길드에 소속되어 있지 않습니다.";
    close;
    }
    if (strcharinfo(0) != getguildmaster(.@GID)) {
    mes "죄송합니다, 길드 마스터가 아닙니다.";
    close;
    }
    mes "반갑습니다. " + getguildname(.@GID) + "의 길드 마스터님";
    close;

    ---------------------------------------

    *getguildmasterid(<guild id>)

    이 함수는 ID로 지정된 길드의 길드 마스터 캐릭터 ID 번호를 반환합니다. 캐릭터가 어떤 길드의
    마스터도 아닌 경우 0을 반환합니다.

    ---------------------------------------

    *is_guild_leader({<guild ID>})

    이 명령어는 스크립트에 연결된 플레이어가 자신의 길드의 리더인 경우 또는 지정된 길드의 리더인
    경우 true를 반환합니다.

    ---------------------------------------

    *getcastlename("<map name>")

    이 함수는 해당 성곽의 맵 이름을 주면 성 이름을 반환합니다. 데이터는 'db/castle_db.yml'에서
    읽어옵니다

    ---------------------------------------

    *getcastledata("<map name>",<type of data>)
    *setcastledata "<map name>",<type of data>,<value>;

    이 함수는 맵 이름으로 지정된 성의 소유권 정보를 반환합니다. 성 정보는 'guild_castle' SQL 테이블에
    저장됩니다.

    데이터 종류는 'guild_castle' 테이블의 열에 해당합니다:

    CD_GUILD_ID - 길드 ID
    CD_CURRENT_ECONOMY - 성 경제 점수
    CD_CURRENT_DEFENSE - 성 방어 점수
    CD_INVESTED_ECONOMY - 경제 투자 횟수
    CD_INVESTED_DEFENSE - 방어 투자 횟수
    CD_NEXT_TIME - 사용하지 않음
    CD_PAY_TIME - 사용하지 않음
    CD_CREATE_TIME - 사용하지 않음
    CD_ENABLED_KAFRA - 이 성에 Kafra가 고용되어있는 경우 1, 아닌 경우 0입니다.
    CD_ENABLED_GUARDIAN0 - 1 번째 가디언(병사 가디언)이 존재하는 경우 1입니다.
    CD_ENABLED_GUARDIAN1 - 2 번째 가디언(병사 가디언)이 존재하는 경우 1입니다.
    CD_ENABLED_GUARDIAN2 - 3 번째 가디언(병사 가디언)이 존재하는 경우 1입니다.
    CD_ENABLED_GUARDIAN3 - 4 번째 가디언(궁수 가디언)이 존재하는 경우 1입니다.
    CD_ENABLED_GUARDIAN4 - 5 번째 가디언(궁수 가디언)이 존재하는 경우 1입니다.
    CD_ENABLED_GUARDIAN5 - 6 번째 가디언(기사 가디언)이 존재하는 경우 1입니다.
    CD_ENABLED_GUARDIAN6 - 7 번째 가디언(기사 가디언)이 존재하는 경우 1입니다.
    CD_ENABLED_GUARDIAN7 - 8 번째 가디언(기사 가디언)이 존재하는 경우 1입니다.

    모든 데이터 유형은 Emperium 전장 스크립트에 의해 의미가 결정되며, 다음을 제외하고는:
    - CD_GUILD_ID는 항상 해당 성을 소유한 길드의 ID로 간주됩니다.
    - CD_CURRENT_DEFENSE는 가디언 및 Emperium HP 계산에 사용됩니다
    - CD_ENABLED_GUARDIANX 가디언의 존재 여부를 나타내는 비트로 항상 유지됩니다.

    'setcastledata' 명령은 지정된 유형의 접근 가능한 데이터에 대한 값을 반환하는 것과 동일하게
    작동하지만, 그 값을 변경하고 char-server로 보내게 됩니다.

    길드 ID 또는 성의 방어력을 변경하면 가디언의 HP 재계산과 같은 추가적인 작업이 발생합니다.

    ---------------------------------------

    *getgdskilllv(<guild id>,<skill id>)
    *getgdskilllv(<guild id>,"<skill name>")

    이 함수는 <guild id> 길드의 <skill id> 스킬 레벨을 반환합니다.
    만약 길드가 해당 스킬을 가지고 있지 않으면 0을 반환합니다.
    만약 길드가 존재하지 않으면 -1을 반환합니다.
    스킬 목록 전체는 'db/(pre-)re/skill_db.yml'를 참조하세요. (GD_*는 길드 스킬입니다)

    ---------------------------------------

    *requestguildinfo <guild id>{,"<event label>"};

    이 명령은 길드 데이터를 char 서버에서 요청하고 실행을 계속합니다.
    길드 정보가 이미 메모리에 있는 경우 즉시 사용할 수 있으며,
    만약 메모리에 없어서 맵 서버가 char 서버의 응답을 기다려야 하는 경우 나중에 사용할 수 있습니다.
    길드 정보가 사용 가능해지면 지정된 이벤트를 'donpcevent' 호출처럼 실행합니다.

    ---------------------------------------

    *getmapguildusers("<map name>",<guild id>)

    지정된 맵에서 해당 길드의 캐릭터 수를 반환합니다.

    예제:

    mes "프론테라에는 길드원 " + getMapGuildUsers("prontera",getcharid(2)) + "명이 있습니다.";

    ---------------------------------------
    //
    2,2.- 전장관련 명령어 끝
    //
    ---------------------------------------

    *getskilllv(<skill id>)
    *getskilllv("<skill name>")

    이 함수는 호출하는 캐릭터가 가지고 있는 특정 스킬의 레벨을 반환합니다. 만약 그 스킬을 가지고
    있지 않으면 0이 반환됩니다. 캐릭터 스킬의 전체 목록은 'db/(pre-)re/skill_db.yml'에서
    확인할 수 있습니다.

    이 함수는 주로 캐릭터가 스킬을 가지고 있는지 여부를 확인하거나, 레벨이 충분한지 여부를
    알려줄 때 사용됩니다.

    예제 1:
    if (getskilllv(152))
    mes "돌던지기 스킬이 있습니다.";
    else
    mes "돌던지기 스킬이 없습니다.";
    close;

    예제 2:
    if (getskilllv(28) >= 5)
    mes "힐스킬 레벨이 5이상입니다.";
    else if (getskilllv(28) == 10)
    mes "힐스킬 레벨이 Max입니다.";
    else
    mes "힐스킬 레빌이 5이하 입니다.";
    close;

    ---------------------------------------

    *getskilllist({<char_id>});

    이 명령어는 호출하는 캐릭터가 가지고 있는 모든 스킬 목록을 설정하는 배열을 설정합니다.
    다음과 같은 것을 얻을 수 있습니다:

    @skilllist_id[] - 스킬 ID
    @skilllist_lv[] - 스킬 레벨
    @skilllist_flag[] - 스킬 플래그의 의미는 'skill' 참조
    @skilllist_count - 위 배열에 있는 스킬 수

    'getskillv'가 대부분의 상황에서 더 유용할 것이지만, 이 명령어는 모든 스킬을 저장하고 캐릭터를
    잠시 다른 캐릭터로 만드는 가장 쉬운 방법입니다. 하루 동안 고급 직업? 이 명령어는 캐릭터가
    가진 스킬 수를 확인하는 데도 유용합니다.

    이 명령은 플래그 4 (영구적으로 부여된 스킬)로 설정된 스킬 (ALL_BUYING_STORE/ALL_INCCARRY)을
    세지 않습니다.

    ---------------------------------------

    *getrandmobid(<type>{,<flag>{,<level>}})

    이 명령어는 랜덤 몬스터 그룹에서 랜덤 몬스터 ID를 반환합니다.
    <flag>를 사용하여 그룹에서 반환될 수 있는 몬스터에 일부 제한을 적용할 수 있습니다.
    매개 변수 중 하나가 잘못되었거나 지정된 매개 변수로 몬스터를 찾을 수 없는 경우 0을 반환합니다.

    유효한 <type>은 다음과 같습니다:
    MOBG_BRANCH_OF_DEAD_TREE
    MOBG_PORING_BOX
    MOBG_BLOODY_DEAD_BRANCH
    MOBG_RED_POUCH_OF_SURPRISE
    MOBG_CLASSCHANGE
    MOBG_TAEKWON_MISSION

    유효한 <flag>는 다음과 같습니다:
    RMF_NONE = 0x00 - 플래그를 적용하지 않음
    RMF_DB_RATE = 0x01 - 목록에서 찾은 소환 성공 확률을 적용함(그렇지 않으면
    데이터베이스에서 임의의 몬스터를 가져옴)
    RMF_CHECK_MOB_LV = 0x02 - 몬스터 레벨 확인을 적용함
    RMF_MOB_NOT_BOSS = 0x04 - 선택된 몬스터는 보스 유형이 아니어야 함(기본값)
    (MOBG_BLOODY_DEAD_BRANCH의 몬스터는 제외)
    RMF_MOB_NOT_SPAWN = 0x08 - 선택된 몬스터는 일반 스폰을 가져야 함
    RMF_MOB_NOT_PLANT = 0x10 - 선택된 몬스터는 식물 유형이 아니어야 함
    RMF_ALL = 0xFF - 모든 플래그를 적용함

    ---------------------------------------

    *getmonsterinfo(<mob ID>,<type>)
    *getmonsterinfo(<mob name>,<type>)

    이 함수는 몹 데이터베이스에서 <mob ID> 또는 <mob name>으로 지정된 몬스터를 찾아
    <type> 매개 변수가 설정한 정보를 반환합니다.
    해당 몬스터가 없거나 유효하지 않은 값인 경우 -1을 반환하며,
    몬스터 이름을 요청한 경우 "null"을 반환합니다.

    유효한 타입은 다음과 같습니다:
    MOB_NAME - 이름, 해당 몬스터가 없으면 "null"이 반환됩니다.
    MOB_LV - 레벨
    MOB_MAXHP - Max Hp
    MOB_BASEEXP - base 경험치
    MOB_JOBEXP - job 경험치
    MOB_ATK1 - Atk
    MOB_ATK2 - Atk2
    MOB_DEF - Def
    MOB_MDEF - Mdef
    MOB_RES - Res
    MOB_MRES - Mres
    MOB_STR - Str
    MOB_AGI - Agi
    MOB_VIT - Vit
    MOB_INT - Int
    MOB_DEX - Dex
    MOB_LUK - Luk
    MOB_RANGE - Range
    MOB_RANGE2 - Range2
    MOB_RANGE3 - Range3
    MOB_SIZE - 사이즈
    MOB_RACE - 종족
    MOB_ELEMENT - 속성(속성 level은 반환하지 않음, 속성ID만 반환)
    MOB_MODE - Mode
    MOB_MVPEXP - MVP 경험치
    MOB_ID - ID

    자세한것은 'doc/sample/getmonsterinfo.txt'를 찾아보세요

    ---------------------------------------

    *getmobdrops(<mob id>)

    이 명령은 지정한 몬스터가 드롭하는 모든 아이템의 ID와 드롭 확률을 임시 전역 변수 배열에
    저장하고, 성공하면 1을 반환하며 몬스터 ID가 존재하지 않으면 0을 반환합니다.

    실행 후, 다음과 같은 전역 임시 변수 배열이 생성됩니다:

    $@MobDrop_item[]: 몬스터의 드롭 아이템 ID를 포함하는 전역 임시 숫자 배열입니다.
    $@MobDrop_rate[]: 각 아이템의 드롭 확률을 포함하는 전역 임시 숫자 배열입니다. (1 = 0.01%)
    $@MobDrop_nosteal[]: 각 아이템의 StealProtected 플래그를 포함하는 전역 임시 숫자 배열입니다. (기본값은 false입니다.)
    $@MobDrop_randomopt[]: 각 아이템의 랜덤 옵션 그룹 ID를 포함하는 전역 임시 숫자 배열입니다. (기본값은 0입니다.)
    $@MobDrop_count: 발견된 아이템 드롭 수입니다.

    $getarraysize가 아닌 $@MobDrop_count를 사용하여 배열을 탐색해야합니다. 이는 임시 전역 변수 배열이
    'getmobdrops' 실행 사이에 초기화되지 않기 때문입니다. 예를 들어, 7개의 아이템이 드롭되는
    몬스터를 조회하면 배열에는 7개의 요소가 있습니다. 그러나 다른 몬스터를 조회하면서 5개의
    아이템이 드롭되는 경우 서버는 이전에 호출한 값이 지워지지 않으므로 5+2개의 아이템이
    조회됩니다. 이때 $@MobDrop_count는 항상 올바른 값을 가지지만 'getarraysize'는 7을 반환합니다.


    예제:

    // 유저로부터 몬스터 ID를 입력 받음
    input .@mob_id;

    if (getmobdrops(.@mob_id)) { // 'getmobdrops'는 성공하면 1을 반환합니다.
    // 전역 임시 변수를 사용하기 때문에 다시 호출되는 것을 방지하기
    //위해 바로 전역 변수를 스코프 변수로 복사합니다.
    .@count = $@MobDrop_count;
    copyarray .@item[0],$@MobDrop_item[0],.@count;
    copyarray .@rate[0],$@MobDrop_rate[0],.@count;

    mes getmonsterinfo(.@mob_id,MOB_NAME) + " - " + .@count + "개의 드롭 아이템을 찾았습니다:";
    for( .@i = 0; .@i < .@count; .@i++ ) {
    mes .@item[.@i] + " (" + getitemname(.@item[.@i]) + ") " + .@rate[.@i]/100 + ((.@rate[.@i]%100 < 10) ? ".0":".") + .@rate[.@i]%100 + "%";
    }
    } else {
    mes "알수없는 몬스터 ID.";
    }
    close;

    ---------------------------------------

    *skillpointcount({<char_id>})

    이 명령어는 캐릭터가 보유한 총 스킬 포인트 (SkillPoint + 스킬 사용에 사용된 SP 포함)를 반환합니다.
    현재 연결된 캐릭터의 총 스킬 포인트를 확인하는 데 사용할 수 있습니다.
    즉, 스킬에 사용된 스킬 포인트가 계산되어 SkillPoints (사용되지 않은 스킬 포인트 수)에 추가됩니다.
    이 명령어는 플래그 4로 설정된 스킬 (예: ALL_BUYING_STORE / ALL_INCCARRY)는 계산하지 않습니다.

    예제 1:
    .@skillPoints = skillpointcount();
    mes "총 " + .@skillPoints + "개의 스킬 포인트를 보유하고 있습니다!";

    예제 2:
    if (skillpointcount() > 20)
    mes "와, 총 20개 이상의 스킬 포인트를 보유하고 있군요!";


    ---------------------------------------

    *getscrate(<effect type>,<base rate>{,<GID>})

    이 함수는 지정된 효과 타입에 대한 적용 확률(방어력 등에 따라 수정된 비율)을 반환합니다.
    'base rate'는 해당 상태 효과가 적용될 기본 확률입니다.

    if (rand(100) > getscrate(Eff_Blind, 50)) goto BlindHimNow;


    사용 가능한 모든 효과 타입은 'src/map/script_constants.hpp'의 'Eff_' 아래에서 확인할 수 있습니다.

    ---------------------------------------

    ========================
    |3.- 체크 명령어. |
    ========================
    ---------------------------------------

    *playerattached()

    현재 스크립트에 첨부된 플레이어의 ID를 반환합니다. 첨부된 플레이어가 없거나 맵 서버에서 더 이상
    존재하지 않는 경우 0을 반환합니다. 타이머를 다루는 스크립트 함수에서 첨부된 플레이어를 확인하는 것이
    좋습니다. 왜냐하면 타이머가 트리거될 때 플레이어가 여전히 로그인되어 있을 보장이 없기 때문입니다. 참고로 플레이어의 ID는 실제로 계정 ID입니다.

    ---------------------------------------

    *getattachedrid();

    실행 중인 스크립트에서 RID를 반환합니다. 부동 스크립트 또는 함수와 같이 어떤 RID에도 첨부되어
    있지 않은 경우 0을 반환합니다.

    ---------------------------------------

    *isloggedin(<account id>{,<char id>})

    이 함수는 지정된 계정이 로그인되어 있는 경우 1을 반환하고, 로그인되어 있지 않은 경우 0을 반환합니다.
    char id를 전달하여 계정 ID와 캐릭터 ID를 모두 확인할 수도 있습니다.

    ---------------------------------------

    *checkweight(<item id>,<amount>{,<item id>,<amount>,<item id>,<amount>,...});
    *checkweight("<item name>",<amount>{,"<item name>",<amount>,"<item name>",<amount>,...});
    *checkweight2(<id_array>,<amount_array>);

    이러한 함수는 지정된 특정 아이템의 수의 총 무게가 호출 캐릭터의 운반 능력을 초과하지 않으면 1을
    계산하여 반환하고, 그렇지 않으면 0을 반환합니다. 플레이어가 예상한 아이템을 운반할 수 있는지
    확인하는 것이 중요합니다. 그렇지 않으면 스크립트를 남용하거나 매우 불공평한 오류를 생성할
    수 있습니다.

    두 번째 함수는 아이템 및 수량의 배열을 확인하고 성공 시 1, 실패 시 0을 반환합니다.

    함수는 플레이어가 설정한 수의 아이템을 운반할 수 있는지 확인하는 것 외에도, 플레이어가 받을
    아이템에 대한 인벤토리 공간이 있는지도 확인합니다.

    'getitem'과 마찬가지로 이 함수는 데이터베이스에서 '영어 이름'을 인수로 허용합니다.


    예제 1:

    if (checkweight(512,10)) {
    getitem 512,10;
    } else {
    mes "미안하지만 이 사과를 가질수 없습니다.";
    }

    예제 2:

    setarray .@item[0],512,513,514;
    setarray .@amount[0],10,5,5;
    if (!checkweight2(.@item,.@amount)) {
    mes 미안하지만 이 사과를 가질수 없습니다.";
    }

    ---------------------------------------

    *basicskillcheck()

    이 함수는 'battle_athena.conf'의 설정 옵션 'basic_skill_check'의 상태를 반환합니다. 이 옵션이
    활성화되어 있으면 기본 기술 레벨이 일정 수준 이상인 캐릭터만 앉을 수 있고 거래 요청을
    할 수 있으며 감정을 사용할 수 있습니다. 이러한 모든 기능을 수행하기 위해서는 캐릭터가
    실제로 해당 기술을 가지고 있어야하는 경우도 있으므로 스크립트가 동작하는 방식을 달리하는
    것이 필요할 수 있습니다.

    ---------------------------------------

    *checkoption(<option number>{,<char_id>})
    *checkoption1(<option number>{,<char_id>})
    *checkoption2(<option number>{,<char_id>})
    *setoption <option number>{,<flag>{,<char_id>}};

    'setoption' 함수 시리즈는 호출 캐릭터에 설정된 '옵션'을 확인합니다. '옵션'은 상태 조건 및 기타
    일회성 캐릭터 데이터를 저장하는 데 사용되는 예/아니오 유형의 데이터입니다. 대부분의 경우
    'checkcart', 'checkfalcon', 'checkriding' 등과 같은 함수를 사용하는 것이 더 좋지만 이 방법으로
    확인할 수 없는 몇 가지 옵션이 있습니다. 이 함수는 옵션이 설정되어 있으면 1을 반환하고 설정되어
    있지 않으면 0을 반환합니다.

    이 명령어의 첫 번째 (option) 버전에서 유효한 옵션 번호는 다음과 같습니다.

    0x1 - Sight 효과
    0x2 - 하이딩 효과
    0x4 - 클로킹 효과
    0x8 - 카트1 존재여부
    0x10 - 팔콘 존재여부
    0x20 - 페코페코 존재여부
    0x40 - GM 퍼펙트 하이딩 효과
    0x80 - 카트2 존재여부
    0x100 - 카트3 존재여부
    0x200 - 카트4 존재여부
    0x400 - 카트5 존재여부
    0x800 - 오크 헤드 여부
    0x1000 - 웨딩옷 착용여부
    0x2000 - 루와크 효과
    0x4000 - 체이스워크
    0x8000 - 날개 또는 크리스마스복장
    0x10000 - 사이트트레셔
    0x100000 - 워그
    0x200000 - 워그탑승

    두 번째 버전(opt1)의 이 명령어에 대한 유효한 옵션 번호는 다음과 같습니다:

    1 - 석화
    2 - Frozen.
    3 - 스톤
    4 - 수면
    6 - 걸음을 걷는 상태의 석화

    세 번째 버전(opt2)의 이 명령어에 대한 유효한 옵션 번호는 다음과 같습니다:

    0x1 - 중독
    0x2 - 저주
    0x4 - 침묵
    0x8 - Signum Crucis 울음 소리 효과음이 재생됩니다. 그 외에는 어떤 시각적 효과도 표시되지 않습니다)
    0x10 - 암흑
    0x80 - 치명적인 독 부여

    opt1을 제외한 옵션 번호들은 비트마스크입니다. 여러 상태를 확인하려면 이를 더해도 되지만,
    함수는 적어도 하나의 상태가 적용되어 있으면 참(true)을 반환합니다.

    'setoption'은 명령어를 호출하는 캐릭터에게 옵션을 설정합니다. 이 명령어에 대한 두 번째와
    세 번째 버전은 없으므로, 첫 번째 목록(클로킹, 카트, 루왁 등)의 값만 변경할 수 있습니다.
    flag가 1(생략될 경우 기본값)이면, 캐릭터에게 현재 설정된 옵션에 추가됩니다. flag가 0이면,
    옵션이 제거됩니다.

    이 목록은 분명 사용 가능한 옵션 플래그 번호의 전체 목록은 아닙니다. 전체 목록을 확인하려면
    코어 개발자에게 문의하거나(또는 소스를 읽으세요: src/map/status.hpp), 확인하세요.

    ---------------------------------------

    *setcart {<type>{,<char_id>}};
    *checkcart({<char_id>});

    <type>이 0이면 이 명령은 캐릭터에서 카트를 제거합니다. 그렇지 않으면 호출한 캐릭터에 카트를
    제공합니다. 제공된 카트는 카트 번호 <type>이며, 캐릭터가 상인 클래스인지 여부에 상관없이
    작동합니다.

    참고: 캐릭터는 카트를 획득하려면 푸쉬카트 기술이 있어야 합니다.

    함께 제공되는 함수는 호출한 캐릭터에게 카트(어떤 종류든)가 있는 경우 1을 반환하고 없으면 0을
    반환합니다.

    if (checkcart()) mes "이미 카트가 있습니다!";

    ---------------------------------------

    *setfalcon {<flag>{,<char_id>}};
    *checkfalcon({<char_id>});

    <flag>가 0이면 이 명령은 캐릭터에서 팔콘를 제거합니다. 그렇지 않으면 호출한 캐릭터에게 팔콘을
    제공합니다. 팔콘은 헌터인지 여부와 상관없이 있을 것입니다. 그러나 헌터가 아닌 유저에게는 유용한
    효과가 없을 것입니다.

    참고: 캐릭터는 팔콘를 획득하려면 HT_FALCON 기술이 있어야 합니다.

    함께 제공되는 함수는 호출한 캐릭터가 팔콘을 가지고 있는 경우 1을 반환하고 없으면 0을 반환합니다.

    if (checkfalcon()) mes "이미 팔콘이 있습니다!";

    ---------------------------------------

    *setriding {<flag>{,<char_id>}};
    *checkriding({<char_id>});

    <flag>가 0이면 이 명령은 캐릭터에서 탈 것을 제거합니다. 그렇지 않으면 호출한 캐릭터에게
    페코페코(나이트 계열 클래스인 경우), 그랜트페코(크루세이더 계열 클래스인 경우) 또는
    그리폰(로얄 가드인 경우)을 제공합니다. 'setfalcon' 및 'setcart'와 달리 이 명령은 탈 것을 탈 수
    있는 클래스가 아니면 전혀 작동하지 않습니다.

    참고: 캐릭터는 탈 것을 획득하려면 KN_RIDING 기술이 있어야 합니다.

    함께 제공되는 함수는 호출한 캐릭터가 타고 있는 경우 1을 반환하고, 타고 있지 않으면 0을 반환합니다.

    if (checkriding()) mes "PLEASE leave your bird outside! No riding birds on the floor here!";

    ---------------------------------------

    *setdragon {<color>{,<char_id>}};
    *checkdragon({<char_id>});

    'setdragon' 함수는 캐릭터가 드래곤을 타게끔 만듭니다. 성공하면 1을 반환하고, 실패하면 0을 반환합니다.

    사용 가능한 색상은 다음과 같습니다:
    1 - Green 드래곤 (default)
    2 - Brown 드래곤
    3 - Gray 드래곤
    4 - Blue 드래곤
    5 - Red 드래곤

    참고: 캐릭터는 룬 나이트여야 하며, 스킬 RK_DRAGONTRAINING을 가지고 있어야 합니다.

    'checkdragon' 함수는 캐릭터가 용을 타고 있는지 아닌지에 따라 1 또는 0을 반환합니다.

    ---------------------------------------

    *setmadogear {<flag>{,<type>{,<char_id>}}};
    *checkmadogear({<char_id>});

    <flag>이 false이면 이 명령은 캐릭터에서 마도 기어를 제거합니다. 그렇지 않으면 캐릭터에 메카닉이고
    스킬 NC_MADOLICENCE를 가지고 있는 경우 마도 기어를 제공합니다.

    클라이언트 버전 PACKETVER_MAIN_NUM >= 20191120 또는 PACKETVER_RE_NUM >= 20191106을
    사용할 때, <type> 플래그를 사용하여 특정한 매도 기어를 지정할 수 있습니다.

    타입:
    MADO_ROBOT (default)
    MADO_SUIT

    'checkmadogear' 함수는 캐릭터가 매도 기어를 가지고 있는지 아닌지에 따라 1 또는 0을 반환합니다.

    ---------------------------------------

    *setmounting {<char_id>};
    *ismounting({<char_id>});

    'setmounting' 함수는 캐시 마운트를 타게끔 만듭니다. 성공하면 1을 반환하고, 실패하면 0을 반환합니다.

    참고: 캐릭터는 캐쉬마운트가 아닌 마운트(예: 드래곤, 페코페코 등)를 타고 있으면 안 됩니다.

    'ismounting' 함수는 캐릭터가 캐시 마운트를 타고 있는지 아닌지에 따라 1 또는 0을 반환합니다.

    ---------------------------------------

    *checkwug({<char_id>});

    이 함수는 현재 캐릭터가 워그를 타고 있는 경우 1을 반환하고, 타고 있지 않은 경우 0을 반환합니다.

    ---------------------------------------

    *checkvending({"<Player Name>"})

    해당 플레이어가 현재 상점 판매중인지 또는 구매중인 상점이 있는지 확인합니다. 또한 플레이어가
    오토트레이드를 사용하는지 여부도 알려줍니다. 이름은 선택적 매개변수이며,
    지정하지 않으면 현재 플레이어로 설정됩니다.

    반환값은 다음과 같은 비트마스크입니다.
    0 = 판매중이거나 구매중인 상점이 없음 (오토트레이드를 사용할 수 없음)
    1 = 일반적인 상점 판매 중
    2 = @autotrade를 사용 중
    4 = 구매중인 상점이 있음

    예제:
    // 아론의 상태 확인
    .@state = checkvending("Aaron");
    if (.@state&1)
    mes 아론은 현재 상점 판매중입니다!";
    if (.@state&4)
    mes "아론은 구매중인 상점이 있습니다!";
    if (.@state&2)
    mes "아론은 오토트레이드 중입니다!";

    ---------------------------------------

    *checkchatting({"<Player Name>"})

    해당 플레이어가 현재 채팅방에 있는지 확인합니다. 이름은 선택적 매개변수이며, 지정하지 않으면
    현재 플레이어로 설정됩니다. 반환값은 채팅방에 있으면 1, 없으면 0입니다.

    예제s:
    // 현재 플레이어가 채팅방에 있는지 확인합니다.
    if (checkchatting())
    mes "현재 채팅방에 있습니다!";

    ---------------------------------------

    *checkidle({"<Player Name>"})

    지정된 플레이어가 현재 얼마나 대기 중인지 초 단위로 반환합니다. 이름은 선택 사항이며,
    생략된 경우 첨부된 플레이어로 기본값으로 설정됩니다.

    ---------------------------------------

    *checkidlehom({"<Player Name>"})

    호문 아이템/경험치 공유를 위해 플레이어가 얼마나 대기 중인지 초 단위로 반환합니다.
    이름은 선택 사항이며, 생략된 경우 첨부된 플레이어로 기본값으로 설정됩니다. 이 함수는
    'hom_idle_no_share' 및 'idletime_hom_option'이 활성화된 경우에만 작동합니다
    ('/conf/battle/homunc.conf' 참조).


    ---------------------------------------

    *checkidlemer({"<Player Name>"})

    용병 아이템 공유를 위해 플레이어가 얼마나 대기 중인지 초 단위로 반환합니다.
    이름은 선택 사항이며, 생략된 경우 첨부된 플레이어로 기본값으로 설정됩니다.
    이 함수는 'mer_idle_no_share' 및 'idletime_mer_option'이 활성화된 경우에만
    작동합니다('/conf/battle/drops.conf' 참조).

    ---------------------------------------

    *agitcheck()
    *agitcheck2()
    *agitcheck3()

    이 함수들은 서버가 현재 WoE:FE 모드(agitchecK()), WoE:SE 모드(agitchecK2()),
    또는 WoE:TE 모드(agitchecK3())인지 확인하고, 월드 오브 엠페리움이 진행 중이면
    true를 반환하고 그렇지 않으면 false를 반환합니다.

    ---------------------------------------

    *isnight()
    *isday()

    이 함수들은 서버가 밤 모드 또는 낮 모드인지에 따라 1 또는 0을 반환합니다.
    'isday'는 낮인 경우 1을 반환하고 그렇지 않으면 0을 반환하며, 'isnight'는 그 반대입니다.
    서로 교환 가능하며, 선호하는 함수를 선택하면 됩니다:

    // 이 두 가지는 동등합니다:
    if (isday()) mes "나는 밤에만 돌아다닙니다.";
    if (isnight() != 1) mes "나는 밤에만 돌아다닙니다.";

    ---------------------------------------

    *checkre(<type>)

    renewal.hpp 파일에서 리뉴얼 기능이 활성화되어 있는지 여부를 확인하고,
    활성화되어 있으면 1을 반환하고 비활성화되어 있으면 0을 반환합니다.

    확인할 리뉴얼 기능은 <type> 숫자에 의해 결정됩니다.
    0 - RENEWAL 기능 활성화 (리뉴얼 서버 모드)
    1 - RENEWAL_CAST (리뉴얼 캐스팅 시간)
    2 - RENEWAL_DROP (리뉴얼 드롭 확률 알고리즘)
    3 - RENEWAL_EXP (리뉴얼 경험치 확률 알고리즘)
    4 - RENEWAL_LVDMG (리뉴얼 레벨 수정자 데미지)
    5 - RENEWAL_ASPD (리뉴얼 ASPD)

    ---------------------------------------
    \\
    3,1.- 아이템 관련명령어
    \\
    ---------------------------------------

    *isequipped(<id>{,<id>{,..}})

    이 함수는 호출하는 캐릭터가 모든 아이템 ID를 장착한 경우(아이템/카드 ID가 전달되면 현재 착용한
    장비 슬롯에 아이템/카드가 삽입되었는지 확인) 1을 반환합니다. 이론적으로 동시에 테스트할
    수 있는 아이템 수에 제한이 없습니다. 주어진 아이템 중 하나라도 장착되어 있지 않은 경우 0을
    반환합니다.

    // (포링, 산타포링, 포포링, 마린)
    if (isequipped(4001,4005,4033,4196)) mes "와우! 가능한 모든 포링 카드를 착용하고 있군요!";
    // (포링)
    if (isequipped(4001)) mes "포링 카드는 유용합니다. 그렇지 않나요?";

    이 함수는 Gravity가 2005년 2월에 출시한 카드를 지원하기 위해 아이템 스크립트를 위해
    만들어졌지만 일반 NPC 스크립트에서도 잘 작동합니다.

    ---------------------------------------

    *isequippedcnt(<id>{,<id>{,..}})

    이 함수는 'isequipped'와 유사하지만 1 또는 0 대신 주어진 목록에서 검색된 장착 아이템/카드의
    수를 반환합니다.

    예제:
    if (isequippedcnt(4001,4005,4033,4196) == 5)
    mes "포링 몬스터 유형에서 5개의 카드를 마침내 모았군요?";

    ---------------------------------------

    *checkequipedcard(<item id>)

    이 함수는 아이템 ID 번호로 지정된 아이템/카드가 인벤토리에 있는 장비에 삽입되었는지
    여부와 관계없이 1을 반환합니다.

    ---------------------------------------
    //
    3,1.- 아이템관련 명령어 끝
    //
    ---------------------------------------

    ==============================
    |4.- 플레이어 관련 명령어. |
    ==============================
    ---------------------------------------

    *attachrid(<account ID>{,force})
    *detachrid;

    이러한 명령어는 스크립트에 현재 연결된 플레이어를 조작할 수 있게 해줍니다.
    'attachrid'는 매개변수 RID로 계정 ID를 사용하여 다른 플레이어를 연결할 수 있으며,
    'detachrid'는 다음 명령어가 플레이어에 의해 호출되지 않은 것처럼 실행됩니다.

    플레이어가 연결되지 않는 경우(계정이 오프라인 상태이거나 존재하지 않는 경우) 명령어는 false를
    반환하며, 성공한 경우 true를 반환합니다.

    기본적으로 명령어는 강제로 실행되므로, 다른 스크립트에 이미 연결된 플레이어를 연결하려 할 때도
    작동합니다. 하지만 이는 항상 원하는 동작이 아니므로 명령어에 false를 지정하여 플레이어가
    온라인이며 다른 스크립트에 연결되지 않았을 때에만 true를 반환하도록 할 수도 있습니다.

    ---------------------------------------

    *addrid(<type>{,<flag>{,<parameters>}});

    이 명령어는 호출한 RID를 분리하지 않고 다른 RID를 현재 스크립트에 연결합니다.
    성공하면 1을 반환하며, 실패하면 0을 반환합니다.

    <type>은 연결할 RID를 결정합니다:
    0: 서버의 모든 플레이어.
    1: 연결한 플레이어가 없으면, 호출한 NPC인 경우 호출한 플레이어가 속한 맵의 모든 플레이어.
    2: 지정된 파티 ID의 파티 멤버.
    [ 매개변수: <파티 ID> ]
    3: 지정된 길드 ID의 길드 멤버.
    [ 매개변수: <길드 ID> ]
    4: 호출한 플레이어(또는 NPC)의 지정된 맵 영역 내의 모든 플레이어.
    [ 매개변수: <x0>,<y0>,<x1>,<y1> ]
    5: 맵에 있는 모든 플레이어.
    [ 매개변수: "<맵 이름>" ]

    Account ID: 계정 ID가 지정된 경우, 해당 계정 ID가 연결됩니다.

    <flag>는 특정 플레이어가 연결되지 않도록 방지할 수 있습니다:
    0: 플레이어는 항상 연결됩니다. (기본값)
    1: 다른 스크립트를 실행 중인 플레이어는 연결되지 않습니다.

    ---------------------------------------

    *rid2name(<rid>)

    rid를 이름으로 변환합니다. 참고: 플레이어/몬스터/NPC는 온라인/활성화되어 있어야 합니다.
    'killedrid'를 플레이어의 이름으로 변환하여 PCKillEvent에 사용하는 것이 좋습니다.

    참고: rid2name은 rid = 계정 ID이므로 올바른 캐릭터 이름을 생성하지 못할 수 있습니다.
    계정의 현재 온라인 캐릭터만 반환합니다.

    ---------------------------------------

    *message "<character name>","<message>";

    해당 이름의 캐릭터에게 메시지를 보냅니다. 텍스트는 해당 캐릭터의 머리 위에 표시됩니다.
    다른 사람에게는 보이지 않습니다.

    ---------------------------------------

    *dispbottom "<message>"{,<color>{,<char_id>}};

    해당 캐릭터의 채팅창에 메시지를 보냅니다. 색상은 RGB(0xRRGGBB) 형식입니다.
    색상은 기본적으로 초록색입니다.

    ---------------------------------------

    *showscript "<message>"{,<GID>, <flag>};

    해당 플레이어 또는 GID가 주어진 메시지를 외칩니다. 이 메시지는 채팅창에는 보이지 않고
    주변의 모든 사람에게 보입니다.

    flag: 대상을 지정합니다.
    AREA - 메시지는 소스 근처의 플레이어에게 전송됩니다(기본값).
    SELF - 메시지는 해당 플레이어에게만 전송됩니다.

    ---------------------------------------

    *warp "<map name>",<x>,<y>{,<char id>};

    이 명령어는 호출한 캐릭터나 <캐릭터 ID>가 지정된 경우 해당 맵으로 이동하며, 필요한 경우 지정된
    좌표로 이동합니다. 그러나 좌표가 랜덤일 수 있습니다.

    예를 들어, 다음과 같이 작성하면 캐릭터는 "place" 맵의 X 좌표 50, Y 좌표 55로 이동합니다.

    warp "place",50,55;

    X와 Y 좌표가 걷기 불가능한 맵 영역에 놓이면 이동한 캐릭터는 무작위로 다른 장소로 보내집니다.
    또한 둘 다 0으로 설정된 경우도 같은 결과가 나타납니다.

    warp "place",0,0;

    X, Y 좌표가 0, 0인 위치로 캐릭터를 이동하면 보통 그들을 무작위 장소로 보내지만, 실제로 이 코드가
    어디에 있는지는 모르겠습니다. 공식 맵에서는 모든 장소에서 0, 0 좌표가 걷기 불가능한 위치이기
    때문일 수 있습니다. 사용자 정의 맵을 사용하는 경우 주의하십시오.

    "Random"은 캐릭터를 현재 맵에서 무작위로 이동합니다. "Save"와 "SavePoint"는 캐릭터를 그들의
    세이브 포인트로 돌아가게 합니다.

    ---------------------------------------

    *areawarp "<from map name>",<x1>,<y1>,<x2>,<y2>,"<to map name>",<x3>,<y3>{,<x4>,<y4>};

    이 명령어는 'warp'와 유사하지만 호출된 캐릭터 대신, x1/y1-x2/y2 사각형에 의해 정의된 지정된
    영역 내의 모든 캐릭터가 이동합니다. 영역 바깥에 있는 캐릭터는 영향을 받지 않으며,
    영역 바깥에 있는 활성화 캐릭터도 그렇습니다.

    areawarp "place",10,10,120,120,"place2",150,150;

    "place"라는 지도에서 X 10 Y 10부터 X 120 Y 120까지의 영역에 있는 모든 캐릭터가 "place2"라는
    지도의 X 150 Y 150에 위치로 이동합니다.

    areawarp "place",10,10,120,120,"place2",0,0;

    대상 좌표로 ,0,0;를 사용하면, 영향을 받는 지역 내 모든 캐릭터를 "place2"의 임의의 좌표로
    이동합니다.

    areawarp "place",10,10,120,120,"place2",150,150,200,200;

    선택적인 x4 및 y4 매개 변수를 사용하면, 대상 좌표는 정의된 x3/y3-x4/y4 사각형 내의 임의의
    장소입니다.

    'warp'와 마찬가지로, "Random"으로 '도착 지도 이름'을 지정하면 캐릭터를 현재 지도로 명시적으로
    무작위로 이동시킬 수 있습니다.

    참조: 'warp'도 참조하세요.

    ---------------------------------------

    *warpparty "<to_mapname>",<x>,<y>,<party_id>,{"<from_mapname>",<range x>,<range y>};

    이 명령어는 파티 ID를 사용하여 파티를 지정된 맵과 좌표로 이동시킵니다. 파티 ID는 getcharid(1)으로
    얻을 수 있습니다. 또한 getcharid(1,<player_name>)으로 멤버 이름을 사용하여 다른 파티 ID를
    요청할 수 있습니다.

    다음과 같은 "맵 이름"을 사용하여 특별한 이동을 할 수 있습니다.
    Random: 모든 파티 멤버가 현재 맵에서 무작위로 이동됩니다(날아다니는 날개 아이템 사용과 같은 효과).
    SavePointAll: 모든 파티 멤버가 자신의 세이브 포인트로 이동됩니다.
    SavePoint: 모든 파티 멤버가 현재 연결된 플레이어의 세이브 포인트로 이동됩니다
    (플레이어가 연결되어 있지 않으면 실패합니다).
    Leader: 모든 파티 멤버가 리더의 위치로 이동됩니다. 리더는 현재 맵 서버에 온라인 상태여야 합니다.
    RandomAll: 모든 파티 멤버가 현재 맵에서 동일한 무작위 위치로 이동됩니다.

    from_mapname을 지정하면 'warpparty'는 해당 맵에서만 작동합니다.

    <range x> 및 <range y> 선택적 값은 플레이어의 워프 지점에 무작위성을 추가할 수 있습니다.
    값은 지정된 <x> 및 <y> 좌표에서 무작위로 추가하거나 뺍니다.

    예제:
    mes "[Party Warper]";
    mes "여기 있습니다!";
    close2;
    .@party_id = getcharid(1);
    warpparty "prontera",150,100,.@party_id;
    close;

    위 예제는 "[Party Warper]"라는 메시지를 띄우고, getcharid(1)로 파티 ID를 가져와서 prontera 맵의
    좌표 (150, 100)으로 이동시키는 코드입니다.

    ---------------------------------------

    *warpguild "<map name>",<x>,<y>,<guild_id>;

    길드 ID를 사용하여 지정된 맵과 좌표로 길드를 순간이동합니다. 길드 ID는 getcharid(2)를 사용하여
    얻을 수 있으며, 멤버의 이름으로 길드 ID를 요청할 수도 있습니다.

    다음과 같은 "맵 이름"을 사용하여 특별한 순간이동 동작을 수행할 수 있습니다.
    Random: 모든 길드원이 현재 맵에서 무작위로 순간이동합니다(마치 모두 날개 아이템을 사용한 것처럼).
    SavePointAll: 모든 길드원이 각자의 저장 위치로 순간이동합니다.
    SavePoint: 현재 연결된 플레이어의 저장 위치로 모든 길드원이 순간이동합니다
    (플레이어가 연결되어 있지 않으면 실패합니다).

    예제:

    warpguild "prontera",x,y,Guild_ID;

    ---------------------------------------

    *warppartner("<map name>",<x>,<y>);

    이 함수는 호출된 캐릭터의 배우자(있는 경우)를 찾아 지정된 맵과 좌표로 순간이동합니다.
    성공하면 1을 반환하고, 배우자가 오프라인 상태이거나 캐릭터가 결혼하지 않았거나,
    RID가 없는 경우(호출된 캐릭터가 없는 경우) 0을 반환합니다. 일반적으로 0,0은
    무작위 좌표로 변환됩니다.

    ---------------------------------------

    *savepoint "<map name>",<x>,<y>{,{<range x>,<range y>,}<char_id>};
    *save "<map name>",<x>,<y>{,{<range x>,<range y>,}<char_id>};

    이 명령어들은 호출된 캐릭터가 "Save Point로 돌아가기"를 클릭했을 때, 죽었을 때
    그리고 다른 몇몇 경우에 해당 캐릭터가 되돌아갈 위치를 저장합니다. 두 버전은 동일합니다.
    이 명령어들은 모든 맵플래그를 무시하며, 캐릭터를 어떤 순간에든지 텔레포트가 불가능한 위치에서
    소환할 수 있습니다.

    <range x>와 <range y>는 선택적 값으로, 플레이어의 세이브포인트에 무작위성을 부여합니다.
    입력한 <x>와 <y> 좌표에 무작위로 값을 더하거나 뺍니다.
    savepoint "place",350,75;
    savepoint "place",350,75,2,2; // 캐릭터의 위치를 348,73부터 352,77 사이의 랜덤 위치에
    // 저장합니다.

    ---------------------------------------

    *heal <hp>,<sp>{,<char_id>};

    이 명령어는 호출된 캐릭터의 HP와/또는 SP를 설정된 양만큼 회복시킵니다.

    heal 30000,0; // 30,000의 HP를 회복합니다.
    heal 0,30000; // 30,000의 SP를 회복합니다.
    heal 300,300; // 300의 HP와 SP를 회복합니다.

    이 명령어는 호출된 캐릭터의 HP와 SP만 변경하며, 다른 어떤 출력도 하지 않습니다.

    ---------------------------------------

    *healap <ap>{,<char_id>};

    이 명령어는 호출한 캐릭터의 활동 포인트(AP)를 설정된 값만큼 회복합니다.

    healap 10; // 활동 포인트 10 회복
    healap -10; // 활동 포인트 10 감소


    이 명령어는 호출한 캐릭터의 활동 포인트만 수정하며 다른 출력은 없습니다.


    ---------------------------------------

    *itemheal <hp>,<sp>{,<char_id>};

    이 명령어는 호출한 캐릭터에게 상대적인 양의 HP와/또는 SP를 회복합니다.
    heal과 달리 이 명령어는 아이템 스크립트에서 사용할 목적으로 설계되었습니다.
    알케미스트 랭킹, 카드 및 상태 변화와 같은 물약 관련 보너스가 적용됩니다.
    NPC 스크립트 내에서 사용될 경우 일부 보너스가 생략됩니다.

    이 명령어는 SP/VIT 관련 보너스도 적용합니다
    heal = heal * [(100 + STATUS*2) / 100]

    예제:
    // 플레이어가 50 VIT와 보너스가 없는 경우,
    // 200에서 300 HP와 5 SP를 회복합니다.
    itemheal rand(100,150),5;

    ---------------------------------------

    *percentheal <hp>,<sp>{,<char_id>};

    이 명령어는 호출한 캐릭터의 HP/SP를 일정 비율만큼 회복합니다.
    이 명령어는 HP/SP를 일정한 값으로 회복시키는 것이 아니라,
    최대 HP/SP의 일정 비율만큼 회복시킵니다.

    percentheal 100,0; // HP 100% 회복
    percentheal 0,100; // SP 100% 회복
    percentheal 50,50; // HP 50%와 SP 50% 회복

    따라서 회복되는 양은 최대 HP 또는 SP 양에 따라 결정됩니다.
    'heal'과 마찬가지로, 이 명령어는 애니메이션 또는 효과를 생성하지 않습니다.

    ---------------------------------------

    *recovery <type>{,<option>,<revive_flag>{,<map name>}};

    이 명령어는 선택한 캐릭터의 체력/마력을 완전히 회복시키고 부활합니다. 사용 성공 시 1을 반환합니다.

    <type>은 대상을 결정하며, <option> 매개 변수를 결정합니다.
    0: 플레이어 -> 캐릭터 ID 번호
    1: 파티 -> 파티 ID 번호
    2: 길드 -> 길드 ID 번호
    3: 맵 -> 맵 이름 (문자열)
    4: 모두 -> 없음 (<revive_flag>을 옵션으로 사용)

    옵션이 지정되지 않으면, 호출한 플레이어의 캐릭터 ID, 파티 ID, 길드 ID 또는 맵이 사용됩니다.

    <revive_flag>은 행동을 결정합니다.
    1: 모든 플레이어 부활 및 회복 (기본값)
    2: 살아있는 플레이어만 회복
    4: 죽은 플레이어만 부활


    <map name>은 옵션으로 사용할 수 있으며, 타입 1 (파티) 및 2 (길드)에 대해 명령을 실행할
    단일 맵을 정의할 수 있습니다.

    예제:
    // "morocc" 맵에서 호출한 파티의 캐릭터만 부활
    recovery 1,getcharid(1),4,"morocc";

    //호출한 캐릭터의 길드 모든 회원을 완전히 회복 (부활하지 않음)
    recovery 2,getcharid(2),2;

    // "prontera" 맵의 모든 플레이어를 부활 및 회복
    recovery 3,"prontera";

    // 서버의 모든 죽은 캐릭터를 부활
    recovery 4,4;

    ---------------------------------------

    *jobchange <job number>{,<upper flag>,<char_id>};

    이 명령어는 호출한 캐릭터의 직업 클래스를 변경합니다.

    jobchange 1; // 이 명령은 플레이어를 검사로 변경합니다.
    jobchange 4002; // 이 명령은 플레이어를 하이검사로 변경합니다.

    이 명령은 숫자로도 작동하지만 직업 이름을 사용할 수 있습니다. 직업 이름과 해당하는 번호의
    전체 목록은 'src/map/script_constants.hpp'에서 확인할 수 있습니다.

    // 이 명령은 플레이어를 검사로 변경합니다.
    jobchange Job_Swordman;
    // 이 명령은 플레이어를 하이검사로 변경합니다.
    jobchange Job_Swordman_High;

    'upper flag'은 변경할 직업의 타입을 지정하는 데 사용할 수 있습니다. 예를 들어,
    jobchange Job_Swordman,1;은 캐릭터를 하이 소드맨으로 변경합니다. 상위 값은 다음과 같습니다.
    -1 (또는 지정하지 않을 때): 현재 직업 유형 유지
    0: 일반/기본 직업
    1: 하이/고급 직업
    2: 베이비 직업

    이 명령어는 또한 영구적인 캐릭터 기반 변수 'jobchange_level'을 설정합니다. 이 변수에는
    전직하기 직전의 직업 레벨이 저장되며, 나중에 스크립트에서 확인할 수 있습니다.

    ---------------------------------------

    *jobname(<job number>)

    이 명령어는 맵 메시지 항목 550->655를 사용하여 주어진 직업의 이름을 검색합니다.

    mes "[Kid]";
    mes "I never thought I'd met a " + jobname(Class) + " here of all places.";
    close;

    ---------------------------------------

    *eaclass({<job number>,<char_id>})

    이 명령어는 주어진 클래스에 해당하는 "eA 직업 번호"를 반환하며, 지정된 클래스가 없으면
    호출한 플레이어의 클래스를 사용합니다. eA 직업 번호는 또한 클래스 번호 시스템입니다.
    그러나 상수와 함께 제공되므로 클래스 간 변환을 쉽게 할 수 있습니다. 이 명령은 eA 직업 번호와
    대응되지 않는 직업 번호를 전달하면 -1을 반환합니다.

    .@eac = eaclass();
    if ((.@eac&EAJ_BASEMASK) == EAJ_SWORDMAN)
    mes "당신의 베이스 직업은 Swordman 입니다.";
    if (.@eac&EAJL_UPPER)
    mes "당신은 리버스 직업입니다.";
    if ((.@eac&EAJ_UPPERMASK) == EAJ_SWORDMAN)
    mes "당신은 Swordman, Baby Swordman 또는 High Swordman 중 하나여야 합니다.";

    eA 직업 시스템에 대한 자세한 정보는 docs/ea_job_system.txt 파일을 참조하세요.



    ---------------------------------------

    *roclass(<job number>{,<gender>})

    이 명령은 eaclass의 반대입니다. 즉, 주어진 eA 직업 번호에 해당하는 RO 클래스 번호를 반환합니다.
    성별이 필요합니다. Bard와 Dancer는 같은 eA 직업 번호 (EAJ_BARDDANCER)를 공유하며,
    지정된 경우 호출한 플레이어의 성별을 사용합니다. (플레이어가 없는 경우 기본적으로 남성이
    사용됩니다.) 지정된 직업을 나타내는 유효한 클래스가 없으면 -1을 반환합니다.
    (예 : Taekwon 클래스의 baby 버전을 가져 오려고 할 때)

    .@eac = eaclass();
    // 클래스가 이미 리버스인지 확인
    if (.@eac&EAJL_UPPER) {
    mes "당신은 강해 보입니다.";
    close;
    }
    .@eac = roclass(.@eac|EAJL_UPPER);
    // 클래스에 리버스 버전이 있는지 확인
    if (.@eac != -1) {
    mes "당신은 " + jobname(.@eac) + "이 되기를 고대하겠죠!";
    close;
    }

    ---------------------------------------

    *changebase <job ID number>{,<account ID>};

    이 명령은 캐릭터의 외모를 지정된 직업 클래스의 외모로 변경합니다. 외모만 변경됩니다.

    계정 ID가 지정되지 않은 경우 호출한 캐릭터에서 실행됩니다.


    changebase Job_Novice; // 플레이어를 Novice 스프라이트로 변경합니다.
    changebase Class; // 플레이어를 기본 스프라이

    ---------------------------------------

    *classchange(<view id>{,"<NPC name>","<flag>"});

    이 명령은 매우 오래된 명령으로, 기원이 불분명합니다. 이 명령은 NPC 객체 주변의 모든 플레이어에게
    'display id change' 패킷을 보내 NPC를 다른 스프라이트, NPC 스프라이트 ID 또는 몬스터 ID로 보이게
    합니다. 이 효과는 어디에도 저장되지 않으며 유지되지 않을 것입니다(보관하면 상대적으로 쉽게 할
    수 있기 때문에 이것은 이상합니다) 그리고 무엇보다도 고급 클래스 도입으로 이 명령은 전혀 작동하지
    않을 것입니다. 이 코드는 가장 낮은 스프라이트 ID가 직업 스프라이트이고, 그 이상의 것들은
    몬스터와 NPC 스프라이트라고 가정하여 작성되었습니다. 그러나 고급 클래스가 도입되면서,
    그들은 몬스터 스프라이트가 떠돌아다니는 숫자 풀의 반대쪽에서 ID 번호를 얻게 되었습니다.

    결과적으로 유효한 view id로 이 명령을 호출하는 것은 현재 불가능합니다. view ID가 4047보다
    낮으면 아무것도하지 않을 것입니다. 실행하면 클라이언트가 충돌합니다.

    나중에 SVN 리비전에서 이것이 의도 한대로 작동되도록 가져올 수 있다면, 실제로 보석이 될 수
    있습니다.

    빈 <NPC name>은 부착된 NPC를 의미합니다.

    <flag> 대상:

    bc_area: 소스 주변의 플레이어에게 스프라이트가 전송됩니다 (기본값).
    bc_self: 스프라이트가 부착된 플레이어에게만 전송됩니다.

    ---------------------------------------

    *changesex({<char_id>});

    이 명령은 부착된 캐릭터의 계정의 성별을 변경합니다. 이전에 남성이었다면 여성이 되고,
    여성이었다면 남성이 됩니다. 변경 사항은 캐릭터 서버에 기록되며, 플레이어는
    "Need disconnection to perform change-sex request..." 메시지를 받고 즉시 로그인 화면으로
    킥됩니다. 다시 로그인하면 성별이 바뀐 상태가 됩니다.

    계정에 Dancer/Gypsy 또는 Bard/Clown 캐릭터가 있는 경우, 'changesex'시 그들의
    스킬이 재설정됩니다.

    ---------------------------------------

    *changecharsex({<char_id>});


    이 명령어는 캐릭터의 성별을 변경합니다. 남성이었다면 여성으로 바뀌고, 여성이었다면 남성으로
    바뀝니다. 변경 내용은 캐릭터 서버에 기록되며, "Need disconnection to perform change-sex
    request..." 메시지가 나타나고 플레이어는 즉시 로그인 화면으로 이동합니다. 다시 로그인하면
    캐릭터의 성별이 바뀐 것을 확인할 수 있습니다.

    변경 대상 캐릭터가 댄서/집시 또는 바드/클로운 계열이라면, 'changecharsex'
    실행 후 스킬이 초기화됩니다.


    ---------------------------------------

    *getexp <base_exp>,<job_exp>{,<char_id>};

    이 명령어는 일종의 퀘스트 보상으로, 지정한 양의 경험치를 받게 합니다. 음수 값을 사용할 수
    없습니다. 경험치 값은 'quest_exp_rate' 구성 값, VIP 보너스, 길드 상납, 전투교범, 풍선껌,
    SC_EXPBOOST 또는 SC_ITEMBOOST 등 경험치 증가 아이템에 따라 조정됩니다.

    getexp 10000,5000;

    ---------------------------------------

    *getexp2 <base_exp>,<job_exp>{,<char_id>};

    이 명령어는 BaseExp 및 JobExp 값을 'set' 명령어로 설정할 때, 해당 값이 2,147,483,647(INT_MAX)보다
    큰 경우 오버플로 오류가 발생하는 것을 방지하기 위한 안전한 버전입니다.

    'getexp'와는 달리, 이 명령어는 조정 요소를 무시합니다!

    ---------------------------------------

    *getbaseexp_ratio(<percent>{,<base_level>{,char_id});

    주어진 <percent>만큼의 기준 경험치가 <base_level>에서 필요한 경험치의 양을 반환합니다.
    기준 레벨이 지정되지 않으면 첨부된 캐릭터의 기준 레벨이 사용됩니다.

    ---------------------------------------

    *getjobexp_ratio(<percent>{,<job_level>{,char_id});

    주어진 <percent>만큼의 직업 경험치가 <job_level>에서 필요한 경험치의 양을 반환합니다.
    직업 레벨이 지정되지 않으면 첨부된 캐릭터의 직업 레벨이 사용됩니다.

    ---------------------------------------

    *setlook <look type>,<look value>{,<char_id>};
    *changelook <look type>,<look value>{,<char_id>};

    'setlook'는 호출하는 캐릭터의 외모 데이터를 변경합니다. 대개 헤어와 옷에 사용하는 팔레트를
    변경하는 데 사용됩니다. 바꾸고자 하는 look type을 지정한 후 사용할 팔레트를 지정합니다.
    사용 가능한 클라이언트에서 사용할 수 있는 팔레트 번호를 지정해야 합니다. 'changelook'도
    같은 작업을 수행하지만, 클라이언트 측에서만 작동합니다(외모 값을 저장하지 않습니다).

    // 이것은 머리 색상을 변경하여, 팔레트 8을 사용하도록 변경합니다.
    // 팔레트 8의 색상을 사용하여 머리를 표시합니다.

    setlook LOOK_HAIR_COLOR,8;

    // 이것은 옷 색상을 변경하여 팔레트 1을 사용하도록 변경합니다.
    // 팔레트 1의 색상을 사용하여 옷을 표시합니다.
    setlook LOOK_CLOTHES_COLOR,1;

    다음은 가능한 look type입니다.

    LOOK_BASE - 기본 스프라이트
    LOOK_HAIR - 헤어 스타일
    LOOK_WEAPON - 무기
    LOOK_HEAD_BOTTOM - 아래 모자
    LOOK_HEAD_TOP - 위 모자
    LOOK_HEAD_MID - 중간 모자
    LOOK_HAIR_COLOR - 헤어 색상
    LOOK_CLOTHES_COLOR - 옷 색상
    LOOK_SHIELD - 방패
    LOOK_SHOES - 신발
    LOOK_BODY2 - 바디 스타일

    'shoes'가 무슨 의미인지는 아무도 모르겠지만, Gravity에게 물어보세요 - 클라이언트는 이 값에 대해
    아무런 작업도 수행하지 않습니다. 그러나 서버에서는 여전히 이 값을 요청하므로 보존됩니다.
    보통 아무 일도 하지 않습니다.

    'hairstyle', 'hair color', 'clothes color'에 대한 룩 데이터만 캐릭터 서버의 데이터베이스에 저장되어
    지속됩니다. 'save_body_style' 구성이 '/conf/battle/client.conf'에서 활성화되어 있는 경우,
    'body style'도 지속됩니다. 그 외의 항목은 장비를 착용하거나 해제하거나 맵을 이동하거나
    로그인/로그아웃하는 등의 캐릭터 상태 변화에 따라 자유롭게 변경됩니다. 실제로 이들을
    설정하는 것은 위험하며, 검증되지 않았으므로 사용은 주의해야 합니다. 데이터베이스 손상을
    일으키지는 않을 것이지만 서버 충돌을 일으킬 가능성이 낮지는 않습니다. 그러나
    클라이언트를 비정상적으로 종료시키는 일은 언제든지 가능합니다.

    그러나 '빈 view ID'를 빠르게 확인하는 것은 커스텀 헤드기어를 만드는 데 필수적이므로 쉬운
    방법일 수 있습니다.

    많은 사람들이 머리카락과 옷에 대해 다른 팔레트를 가지고 있기 때문에, 모든 색상 번호를
    알려주는 것은 불가능합니다. 심각한 예를 원한다면 기본 rAthena 설치 안에 있는
    스타일리스트 스크립트 'npc/custom/stylist.txt'를 확인할 수 있습니다.

    ---------------------------------------

    *pushpc <direction>,<cells>;

    이 명령은 현재 연결된 플레이어를 주어진 방향으로 주어진 셀 수만큼 밀어냅니다. 방향은 NPC를
    선언할 때 사용한 것과 동일하며 DIR_* 상수(src/map/script_constants.hpp) 중 하나를 사용하여
    지정할 수 있습니다.

    넉백은 아이템이나 맵 플래그로 제한되지 않으며, 장애물만 고려됩니다. 충분한 공간이 없으면
    (예: 벽 때문에) 캐릭터는 장애물까지만 밀어냅니다.

    // 현재 위치에서 3시 방향으로 5칸 밀기
    pushpc DIR_EAST, 5;

    ---------------------------------------

    *recalculatestat;

    이 명령은 연결된 플레이어의 스탯을 강제로 다시 계산합니다.

    ---------------------------------------

    *needed_status_point(<type>,<val>{,<char id>});

    지정된 스탯 <type>을 <val>만큼 변경하려면 필요한 스탯 포인트의 수를 반환합니다.
    만약 <val>이 음수인 경우, 지정된 스탯을 (현재 값 - <val>)에서 현재 값까지 높이기
    위해 필요한 스탯 포인트 수를 반환합니다.

    ---------------------------------------

    *jobcanentermap("<mapname>"{,<JobID>});

    선택한 직업 ID에 해당하는 플레이어가 <mapname> 지도에 진입할 수 있는지 여부를 반환합니다.

    선택적으로 'JobID'에는 Job_ * 상수를 참조하거나 플레이어의 Class, BaseJob 및 BaseClass를
    사용할 수 있습니다. 플레이어가 연결되어 있지 않은 경우이 매개 변수는 값을 가져야합니다.

    db / [pre-]re / job_noenter_map.txt도 참조하세요

    ---------------------------------------

    *get_revision()

    이 명령은 서버가 현재 실행중인 SVN 리비전 번호를 반환합니다.

    if (get_revision() >= 15000)
    mes "Welcome to rAthena!";

    ---------------------------------------

    *get_githash()

    이 명령은 서버가 현재 실행중인 Git 해시를 반환합니다.

    mes "Welcome to rAthena! Git Hash: " + get_githash();

    ---------------------------------------
    \\
    4,1.- 아이템 관련 명령어
    \\
    ---------------------------------------

    *getitem <item id>,<amount>{,<account ID>};
    *getitem "<item name>",<amount>{,<account ID>};

    이 명령어는 현재 캐릭터에게 특정 아이템을 수량만큼 주는 기능을 합니다.
    선택적으로 계정 ID를 지정할 경우, 해당 계정의 캐릭터가 현재 접속 상태이면
    해당 캐릭터의 인벤토리에 아이템이 지급됩니다. 그렇지 않으면 아무 일도 일어나지 않습니다.

    일반적으로 이 명령어에서는 'db/item_db.yml'에서 찾을 수 있는 아이템의 데이터베이스 ID 번호를
    사용합니다.

    getitem 502,10 // 사과 10개 지급
    getitem 617,1 // Old Violet Box 1개 지급

    로그 스크립트에서 생성된 거래 옵션이 활성화되면 이 거래 내역이 기록됩니다.

    아이템 이름으로도 생성할 수 있습니다. 이 경우에는 아이템 데이터베이스에서 'english name'
    필드에서 해당 이름을 찾아 생성합니다.

    getitem "RED_POTION",10;


    이것은 일반적으로 아이템과 관련된 대부분의 NPC 및 일부 아이템 스크립트에서 사용됩니다.
    더 많은 예제는 공식 스크립트를 참조하세요.

    ---------------------------------------

    *getitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
    *getitem2 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
    *getitem3 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};
    *getitem3 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};
    *getitem4 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};
    *getitem4 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};

    기본적으로 'getitem'과 유사하게 작동하지만 더욱 유연합니다. 이 명령어를 사용하여 특정 아이템의
    양을 캐릭터에게 지급할 수 있습니다. 선택적으로 계정 ID를 지정하면 대상 캐릭터가 현재 온라인
    상태인 경우 해당 캐릭터의 인벤토리에 아이템이 생성됩니다. 그렇지 않으면 아무 일도 발생하지
    않습니다.

    'getitem'과 다른 매개 변수는 다음과 같습니다.

    identify - 아이템 감정(1) 또는 미감정(0).
    refine - 제련수치/최대 수치보다(20) 높게 제련할 수 없습니다.
    attribute - 아이템이 파괴(1) 또는 정상(0).
    card1, 2, 3, 4 - 카드를 합성하려면 해당 카드 ID 번호를 특정 카드 슬롯에 입력하세요.

    Card1-card4 값은 네임드 아이템의 이름 정보 및 무기와 방어구의 속성도 저장합니다. 이 방법으로
    네임드 아이템을 만들 수 있지만, 표준 장비의 이름이 필요한 경우 'getnameditem' 함수를 사용하는
    것이 더 쉽습니다.

    이 값을 보존하면 네임드 아이템을 파괴한 후 완벽하게 재생성하려면 'getinventorylist'를 참조하십시오.

    'getnameditem'이 너무 제한적이어서 이 명령어를 사용하여 네임드 아이템을 만들려는 경우 다음과
    같이 수행할 수 있습니다. 조심하세요, 약간의 마법이 들어갑니다.

    // 먼저 항목에 이름이 들어갈 캐릭터의 ID를 가져옵니다.
    // 존재하는 캐릭터의 이름만 들어갈 수 있습니다.
    // 캐릭터가 'Adam'인 경우 ID를 찾아 봅시다.
    .@charid = getcharid(0,"Adam");

    // 이제 이진 시프트 작업으로 캐릭터 ID 번호를 두 부분으로 분리합니다.
    // 이 작업이 무엇인지 이해하지 못하는 경우 그냥 복사하세요.
    .@card3 = .@charid & 65535;
    .@card4 = .@charid >> 16;

    // 만약 장비가 아닌 것을 만들 때는 .@card1을 254로 설정해야 합니다.
    // 화살 역시 장비가 아닙니다.
    .@card1 = 254;

    // 이름이 있는 장비의 경우, 카드2는 해당 장비를 만들기 위해 사용된
    // 별의 조각와 속성석 갯수를 나타냅니다.
    // 다른 아이템에서는 0입니다.
    .@card2 = 0;

    // 이제, 스크립트를 호출한 캐릭터에게 사과 몇 개를 주도록 합니다.
    getitem2 512,1,1,0,0,.@card1,.@card2,.@card3,.@card4;

    모든 가능한 아이템으로 테스트하지 않았기 때문에, 신뢰할 수 없습니다.
    의존하기 전에 먼저 실험해 보십시오.

    장비를 만드는 방법은 다음과 같이 계속 진행하십시오:

    // 이미 card3와 card4에 올바른 값이 로드되었으므로, card1과 card2를
    // Ice Stiletto를 만들기 위한 데이터로 설정해줍니다.

    // 장비를 만드는 경우, .@card1은 255여야 합니다.
    .@card1 = 255;

    // 무기에 있는 별의 조각 갯수입니다.
    .@sc = 2;

    // 무기의 속성석 갯수입니다.
    .@ele = 1;

    // 그리고 이상한 공식으로 그들을 하나의 숫자로 만듭니다.
    .@card2 = .@ele+((.@sc*5)<<8);

    // 이렇게 하면 Adam의 +2 무무쎈 Ice Stiletto가 만들어집니다.
    getitem2 1216,1,1,2,0,.@card1,.@card2,.@card3,.@card4;

    별의 조각 갯수에 따라 실험해보세요. 어느 정도가 가장 효과적인지와 그것이 무엇에 의존하는지는
    확신할 수 없습니다. 유효한 속성 번호는 다음과 같습니다:

    1 - 아이스, 2 - 어쓰 3 - 화이어 4 - 윈드

    이 명령어로는 동일한 애완 동물 알의 복제본을 만들 수 있으며, 동일하지만 동시에 두 개의 알에서 부화할 수 있습니다. 그러나 이것이 어떤 문제를 일으킬 수 있는지는 확실하지 않습니다.

    'getitem3'은 추가 값으로 아이템 랜덤 옵션을 사용하는 'getitem2'의 고급 버전입니다.
    <RandomIDArray> : 아이템 랜덤 옵션의 ID를 담은 배열 변수입니다.
    db/[pre-]re/item_randomopt_db.yml 참조
    <RandomValueArray> : 아이템 랜덤 옵션의 값(수치)을 담은 배열 변수입니다.
    <RandomParamArray> : 아이템 랜덤 옵션의 param을 담은 배열 변수입니다.

    'getitem4'는 등급을 추가 값으로 사용하는 'getitem3'의 고급 버전입니다.

    유효한 등급은 다음과 같습니다:
    ENCHANTGRADE_NONE - 등급 없음
    ENCHANTGRADE_D - D등급
    ENCHANTGRADE_C - C등급
    ENCHANTGRADE_B - B등급
    ENCHANTGRADE_A - A등급

    예제 염속성 진홍의 대거를 만드는 예제 :
    // +9 진홍의 대거 [2]
    setarray .@OptID[0],RDMOPT_WEAPON_ATTR_TELEKINESIS;
    setarray .@OptVal[0],0;
    setarray .@OptParam[0],0;
    getitem3 28705,1,1,9,0,0,0,0,0,.@OptID,.@OptVal,.@OptParam;

    ---------------------------------------

    *getitembound <아이템 ID>,<수량>,<바인드 타입>{,<계정 ID>};
    *getitembound "<아이템 이름>",<수량>,<바인드 타입>{,<계정 ID>};

    이 명령은 'getitem'과 동일하게 작동하지만, 생성된 아이템은 바인드 타입에 따라 대상 캐릭터에
    바인드됩니다. 이 방법으로 생성된 모든 아이템은 버릴 수 없으며, 팔거나 경매에 올리거나
    우편으로 보낼 수 없습니다. 때에 따라 거래하거나 보관할 수 없는 경우도 있습니다.

    유효한 바인드 타입은 다음과 같습니다.
    Bound_Account : 계정 바인드 아이템
    Bound_Guild : 길드 바인드 아이템
    Bound_Party : 파티 바인드 아이템
    Bound_Char : 캐릭터 바인드 아이템

    ---------------------------------------

    *getitembound2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<bound type>{,<account ID>};
    *getitembound2 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<bound type>{,<account ID>};
    *getitembound3 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<bound type>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};
    *getitembound3 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<bound type>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};
    *getitembound4 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<bound type>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};
    *getitembound4 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<bound type>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};

    이 명령어는 'getitem2'와 거의 유사하지만, 생성되는 아이템은 바인드 타입에 따라 대상 캐릭터에게
    바인드됩니다. 이 방법으로 생성된 모든 아이템은 버릴 수 없으며, 판매, 판매대금 수령, 경매 및 우편을
    보낼 수 없으며 일부 경우에는 거래 또는 저장할 수 없습니다.

    바인드 타입의 유효한 값은 다음과 같습니다:
    Bound_Account : 계정바인드 아이템
    Bound_Guild : 길드바인드 아이템
    Bound_Party : 파티바인드 아이템
    Bound_Char : 캐릭터바인드 아이템

    'getitembound3'은 추가적인 값으로 아이템 랜덤 옵션을 사용하는 'getitembound2'의 개선 버전입니다.
    <RandomIDArray> : 아이템 랜덤 옵션 ID의 배열 변수. db/[pre-]re/item_randomopt_db.yml 참조
    <RandomValueArray> : 아이템 랜덤 옵션의 값의 배열 변수.
    <RandomParamArray> : 아이템 랜덤 옵션의 param 값의 배열 변수.

    'getitembound4'는 등급을 추가 값으로 사용하는 'getitembound3'의 개선 버전입니다. 유효한 등급은
    다음과 같습니다.
    ENCHANTGRADE_NONE - 등급 없음
    ENCHANTGRADE_D - 등급 D
    ENCHANTGRADE_C - 등급 C
    ENCHANTGRADE_B - 등급 B
    ENCHANTGRADE_A - 등급 A

    염속성 진홍의 대거 생성 예제:
    // +9 진홍의 대거 [2]
    setarray .@OptID[0],RDMOPT_WEAPON_ATTR_TELEKINESIS;
    setarray .@OptVal[0],0;
    setarray .@OptParam[0],0;
    getitembound3 28705,1,1,9,0,0,0,0,0,BOUND_CHAR,.@OptID,.@OptVal,.@OptParam;

    ---------------------------------------

    *getnameditem <item id>,<character name|character ID>;
    *getnameditem "<item name>",<character name|character ID>;

    주어진 캐릭터의 이름이 새겨진 아이템을 생성합니다.

    명령이 성공적으로 실행되면 1을 반환하고 실패하면 0을 반환합니다.
    실패하는 경우:
    - 플레이어가 연결되어 있지 않은 경우
    - 아이템 이름 또는 ID가 유효하지 않은 경우
    - 주어진 캐릭터 ID/이름이 오프라인인 경우

    예제:

    //이것은 현재 연결된 플레이어에게 Aaron's Apple을 제공합니다 (Aaron이 온라인인 경우).
    getnameditem "Apple","Aaron";


    if (getnameitem("Apple","Aaron")) {
    mes "You now have a Aaron's Apple!";
    }

    ---------------------------------------

    *rentitem <item id>,<time>{,<account_id>};
    *rentitem "<item name>",<time>{,<account_id>};

    현재 캐릭터의 인벤토리에 대여 아이템을 만듭니다. <time> 초 후에 아이템이 만료되고 자동으로
    삭제됩니다. 대여 아이템을 수신하면 채팅 창에 메시지가 표시됩니다. 아이템이 사라지기 전에 경고
    메시지도 채팅 창에 표시됩니다.

    대여 기간이 만료될 때 아이템의 'UnEquipScript'가 호출됩니다. 이는 상태 변경을 제거하거나
    플레이어의 변수 또는 상태를 재설정하는 데 사용할 수 있습니다.

    이 명령은 묶음 아이템을 대여할 수 없습니다. 대여 아이템은 버릴 수 없으며 거래 및 길드 보관함에
    넣을 수 없습니다. (예: 거래 마스크 67)
    참고: NPC 스크립트에서 'delitem'는 대여 아이템을 제거할 수 있습니다.
    참고: 'countitem'은 대여 시간이 지정된 모든 아이템을 세지 않습니다.
    'rentalcountitem'을 대신 사용하십시오.

    ---------------------------------------

    *rentitem2 <item id>,<time>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account_id>};
    *rentitem2 "<item name>",<time>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account_id>};
    *rentitem3 <item id>,<time>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account_id>};
    *rentitem3 "<item name>",<time>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account_id>};
    *rentitem4 <item id>,<time>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account_id>};
    *rentitem4 "<item name>",<time>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account_id>};

    'rentitem2'와 마찬가지로, 이 명령어는 첨부된 캐릭터의 인벤토리에 렌탈 아이템을 생성합니다.
    아이템은 <time> 초 후에 자동으로 삭제됩니다. 자세한 내용은 'rentitem'을 참조하십시오.

    확장된 매개변수에 대한 설명은 'getitem2'를 참조하십시오.

    'rentitem3'은 아이템 무작위 옵션을 추가로 사용하는 'rentitem2'의 고급 버전입니다.
    <RandomIDArray> : 아이템 무작위 옵션 ID의 배열 변수입니다. db/[pre-]re/item_randomopt_db.yml을
    참조하십시오.
    <RandomValueArray> : 아이템 무작위 옵션 값의 배열 변수입니다.
    <RandomParamArray>: 아이템 무작위 옵션 매개 변수의 배열 변수입니다.

    'rentitem4'는 학년을 추가 매개변수로 사용하는 'rentitem3'의 고급 버전입니다.
    유효한 등급은 다음과 같습니다.
    ENCHANTGRADE_NONE - No grade
    ENCHANTGRADE_D - Grade D
    ENCHANTGRADE_C - Grade C
    ENCHANTGRADE_B - Grade B
    ENCHANTGRADE_A - Grade A

    염속성 진홍의 대거 생성 예제:
    // +9 진홍의 대거 [2]
    setarray .@OptID[0],RDMOPT_WEAPON_ATTR_TELEKINESIS;
    setarray .@OptVal[0],0;
    setarray .@OptParam[0],0;
    rentitem3 28705,(24*60*60),1,9,0,0,0,0,0,.@OptID,.@OptVal,.@OptParam;

    ---------------------------------------

    *makeitem <item id>,<amount>,"<map name>",<X>,<Y>{,<canShowEffect>};
    *makeitem "<item name>",<amount>,"<map name>",<X>,<Y>{,<canShowEffect>};

    모든 드랍 아이템과 마찬가지로, 이 명령어로 생성된 아이템은 시간이 지난 후 사라집니다.
    수량을 1 이상으로 설정하면 주어진 수량의 하나의 스택을 생성하며, 1 개당 하나의 스택이 아닌
    여러 개의 스택을 생성하지 않습니다.

    'getitem'과 마찬가지로 데이터베이스의 "영어 이름" 필드를 입력으로 받고, 이름이 발견되지
    않으면 Apple을 생성합니다.
    맵 이름을 "this"로 지정하면, 명령어를 실행한 캐릭터가 있는 맵이 사용됩니다.
    <canShowEffect> 플래그가 true로 설정된 경우, 아이템 데이터베이스의 DropEffect 플래그에 따라
    지면에 기둥 효과를 표시합니다.

    ---------------------------------------

    *makeitem2 <item id>,<amount>,"<map name>",<X>,<Y>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<canShowEffect>};
    *makeitem2 "<item name>",<amount>,"<map name>",<X>,<Y>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<canShowEffect>};
    *makeitem3 <item id>,<amount>,"<map name>",<X>,<Y>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<canShowEffect>};
    *makeitem3 "<item name>",<amount>,"<map name>",<X>,<Y>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<canShowEffect>};
    *makeitem4 <item id>,<amount>,"<map name>",<X>,<Y>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<canShowEffect>};
    *makeitem4 "<item name>",<amount>,"<map name>",<X>,<Y>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<canShowEffect>};

    이 명령어는 맵의 지정된 위치에 아이템을 생성합니다. 'makeitem'을 참조하십시오.

    확장 매개변수에 대한 설명은 'getitem2'를 참조하십시오.

    'makeitem3'은 아이템 랜덤 옵션도 추가 값을 사용하는 'makeitem2'의 고급 버전입니다.
    <RandomIDArray> : 아이템 랜덤 옵션의 ID에 대한 배열 변수입니다.
    db/[pre-]re/item_randomopt_db.yml을 참조하십시오.
    <RandomValueArray> : 아이템 랜덤 옵션 값에 대한 배열 변수입니다.
    <RandomParamArray> : 아이템 랜덤 옵션 매개변수에 대한 배열 변수입니다.

    'makeitem4'는 등급을 추가 값을로 사용하는 'makeitem3'의 고급 버전입니다.
    유효한 등급은 다음과 같습니다:
    Valid grades are:
    ENCHANTGRADE_NONE - No grade
    ENCHANTGRADE_D - Grade D
    ENCHANTGRADE_C - Grade C
    ENCHANTGRADE_B - Grade B
    ENCHANTGRADE_A - Grade A

    예제:
    // 발키리 란드그리스 처치 시 0.5% 확률로 중립 속성 저항 10%와 반 인간 및 플레이어에
    // 대한 5% 데미지 감소를 갖는 +0 발키리 실드 [1] 획득
    OnNPCKillEvent:
    if (killedrid == 1751 && rand(0,10000) > 9950) { // 발키리 란드그리스
    getmapxy(.@map$,.@x,.@y,BL_PC);
    setarray .@OptID[0],RDMOPT_ATTR_TOLERACE_NOTHING,RDMOPT_RACE_TOLERACE_HUMAN;
    setarray .@OptVal[0],10,5;
    setarray .@OptParam[0],0;
    makeitem3 2115,1,.@map$,.@x,.@y,0,0,0,0,0,0,0,.@OptID,.@OptVal,.@OptParam;
    }
    end;

    ---------------------------------------

    *cleanarea "<map name>",<x1>,<y1>,<x2>,<y2>;
    *cleanmap "<map name>";

    이 명령어는 특정 맵에서 지정한 범위 내 또는 전체 맵에서 떨어져 있는 모든 아이템을 제거합니다.

    ---------------------------------------

    *searchitem <array name>,"<item name>";

    이 명령어는 주어진 아이템 이름과 일치하는 아이템 ID를 배열에 채우며, 찾은 아이템 수를 반환합니다.
    성능상의 이유로 결과 배열은 최대 10개의 아이템으로 제한됩니다.

    mes "어떤 아이템을 찾고 있나요?";
    input .@name$;
    .@qty = searchitem(.@matches[0],.@name$);
    mes "찾은 아이템은 " + .@qty + "개 입니다:";
    for (.@i = 0; .@i < .@qty; .@i++)
    // 이름 표시 (예: "사과[0]")
    mes getitemname(.@matches[.@i]) + "[" + getitemslots(.@matches[.@i]) + "]";

    ---------------------------------------

    *delitem <item id>,<amount>{,<account ID>};
    *delitem "<item name>",<amount>{,<account ID>};

    이 명령어는 특정 아이템을 수량만큼 플레이어의 인벤토리에서 제거합니다.
    모든 아이템 명령어와 마찬가지로, 'db/item_db.yml'에서 찾을 수 있는 아이템 ID를 사용합니다.
    delitem 502,10; // 10개의 사과를 잃습니다.
    delitem 617,1; // 1개의 Old Violet Box를 잃습니다.

    플레이어가 실제로 아이템을 가지고 있는지 확인하는 것이 좋습니다. 플레이어가 가지고 있는
    것보다 더 많은 아이템을 삭제하려고 하면, 플레이어는 가지고 있는 것을 잃게되고 스크립트는
    오류로 종료됩니다.

    'getitem'과 마찬가지로, 이 명령어는 데이터베이스에서 '영어 이름' 필드를 수용합니다.
    이름이 발견되지 않으면 아무것도 삭제되지 않습니다.

    ---------------------------------------

    *cartdelitem <item id>,<amount>{,<account ID>};
    *cartdelitem "<item name>",<amount>{,<account ID>};
    *storagedelitem <item id>,<amount>{,<account ID>};
    *storagedelitem "<item name>",<amount>{,<account ID>};
    *guildstoragedelitem <item id>,<amount>{,<account ID>};
    *guildstoragedelitem "<item name>",<amount>{,<account ID>};

    이 명령어는 'delitem'과 동일하게 작동하지만, 플레이어의 카트, 창고 또는 길드 창고에서
    아이템을 삭제합니다.

    카트가 장착되어 있지 않으면 'cartdelitem'은 -1을 반환합니다.
    플레이어가 길드에 속하지 않거나 창고가 열려 있지 않으면 'guildstoragedelitem'은 -1을 반환합니다.

    ---------------------------------------

    *delitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
    *delitem2 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
    *delitem3 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};
    *delitem3 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};
    *delitem4 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};
    *delitem4 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<account ID>};

    이 명령어는 명시된 양의 아이템을 호출/대상 캐릭터의 인벤토리에서 제거합니다.
    'getitem2'와 같이 확장된 파라미터에 대한 설명은 해당 항목을 참조하세요.

    'delitem3'는 아이템 랜덤 옵션을 기준으로 하는 고급 버전이며, 다음과 같은 추가 변수를 사용합니다.
    <RandomIDArray>: 아이템 랜덤 옵션의 ID 배열 변수
    <RandomValueArray>: 아이템 랜덤 옵션의 값 배열 변수
    <RandomParamArray>: 아이템 랜덤 옵션의 파라미터 배열 변수

    'delitem4'는 Grade을 기준으로 하는 고급 버전입니다.

    *delitemidx <index>{,<amount>{,<char id>}}

    이 명령어는 지정된 인벤토리 인덱스의 아이템을 제거합니다.

    <amount>가 지정되지 않으면, 해당 인덱스의 모든 아이템을 제거합니다.

    인벤토리 인덱스를 얻는 유일한 방법은 'getinventorylist()'를 사용하는 것입니다.
    주어진 인덱스에서 아이템을 삭제한 후 해당 인덱스는 플레이어가 다시 로그인할 때까지 비어있을
    수 있으며, 'getinventorylist()'를 다시 호출해야합니다.
    잘못된 인덱스로 아이템을 삭제하면 스크립트가 오류로 종료됩니다.

    이 명령어는 해당 인덱스의 아이템이 삭제되거나 지정된 양의 아이템이 충분하지 않은 경우 참(true)을
    반환하며, 그렇지 않으면 거짓(false)을 반환합니다.

    예제:

    // 인벤토리에서 모든 레드포션을 제거
    getinventorylist();
    for (.@i = 0; .@i < @inventorylist_count; ++.@i)
    if (@inventorylist_id[.@i] == 501)
    delitemidx @inventorylist_idx[.@i];

    ---------------------------------------

    *cartdelitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
    *cartdelitem2 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
    *storagedelitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
    *storagedelitem2 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
    *guildstoragedelitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
    *guildstoragedelitem2 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};

    이 명령어는 'delitem2'와 동일하게 작동하지만, 플레이어의 카트, 창고, 길드 창고에서 아이템을 삭제합니다.

    만약 카트를 타고 있지 않다면, 'cartdelitem2'는 -1을 반환합니다.
    만약 플레이어가 길드에 속해있지 않거나 창고가 열려있지 않다면, 'guildstoragedelitem2'는 -1을 반환합니다.



    ---------------------------------------

    *countitem(<item id>{,<accountID>})
    *countitem("<item name>"{,<accountID>})

    이 함수는 인벤토리에 있는 지정된 아이템 ID의 아이템 개수를 반환합니다.

    mes "[Item Checker]";
    mes "음, 현재 당신은 " + countitem(502) + "개의 사과를 가지고 있습니다.";
    close;

    'getitem'과 마찬가지로 데이터베이스의 'english name'을 인수로 받습니다.

    문장 끝에 수를 표시하려면 문자열을 합쳐서 사용할 수 있습니다:

    mes "[Item Checker]";
    mes "음, 현재 당신은 사과 " + countitem("APPLE") + "개를 가지고 있습니다.";
    close;

    ---------------------------------------

    *cartcountitem(<item id>{,<accountID>})
    *cartcountitem("<item name>"{,<accountID>})
    *storagecountitem(<item id>{,<accountID>})
    *storagecountitem("<item name>"{,<accountID>})
    *guildstoragecountitem(<nameID>{,<accountID>})
    *guildstoragecountitem("<item name>"{,<accountID>})

    이 명령은 'countitem'와 동일하게 작동하지만, 플레이어의 카트, 창고 또는 길드 창고에서 아이템을
    세어줍니다.

    카트가 장착되어 있지 않으면 'cartcountitem2'는 -1을 반환합니다.
    길드에 속하지 않거나 창고가 열려 있지 않으면 'guildstoragecountitem2'는 -1을 반환합니다.

    ---------------------------------------

    *countitem2(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<accountID>})
    *countitem2("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<accountID>})
    *countitem3(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<accountID>})
    *countitem3("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<accountID>})
    *countitem4(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<accountID>})
    *countitem4("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<accountID>})

    창조/카드/제작한 아이템에 대한 세부정보를 사용하여 특정 아이템의 수량을 반환하는 함수입니다.
    확장 매개변수에 대한 설명은 'getitem2'를 참조하십시오.

    'countitem3'는 아이템 랜덤 옵션도 기준으로 사용하는 'countitem2'의 고급 버전입니다.
    <RandomIDArray> : 아이템 랜덤 옵션 ID의 배열 변수, db / [pre-]re / item_randomopt_db.yml 참조
    <RandomValueArray> : 아이템 랜덤 옵션 값의 배열 변수.
    <RandomParamArray>: 아이템 랜덤 옵션 매개변수의 배열 변수.

    'countitem4'는 등급도 추가 기준으로 사용하는 'countitem3'의 고급 버전입니다.

    ---------------------------------------

    *cartcountitem2(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<accountID>})
    *cartcountitem2("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<accountID>})
    *storagecountitem2(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<accountID>})
    *storagecountitem2("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<accountID>})
    *guildstoragecountitem2(<nameID>,<Identified>,<Refine>,<Attribute>,<Card0>,<Card1>,<Card2>,<Card3>{,<accountID>})
    *guildstoragecountitem2("<item name>",<Identified>,<Refine>,<Attribute>,<Card0>,<Card1>,<Card2>,<Card3>{,<accountID>})

    이 명령은 'countitem2'와 동일하게 작동하지만, 플레이어의 카트, 창고 또는 길드 창고에서 아이템을
    세어줍니다.

    카트가 장착되어 있지 않으면 'cartcountitem2'는 -1을 반환합니다.
    길드에 속하지 않거나 창고가 열려 있지 않으면 'guildstoragecountitem2'는 -1을 반환합니다.

    ---------------------------------------

    *rentalcountitem(<item id>{,<accountID>})
    *rentalcountitem("<item name>"{,<accountID>})

    이 함수는 플레이어가 인벤토리에서 가지고 있는 특정 아이템 ID에 대한 렌탈 아이템 수량을 반환합니다.

    ---------------------------------------

    *rentalcountitem2(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<accountID>})
    *rentalcountitem2("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<accountID>})
    *rentalcountitem3(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<accountID>})
    *rentalcountitem3("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<accountID>})
    *rentalcountitem4(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<accountID>})
    *rentalcountitem4("<item name>",<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<grade>,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>{,<accountID>})

    "rentalcountitem" 함수에 대한 확장 버전으로, 렌탈 아이템의 수를 반환합니다. "getitem2"와 같은
    확장 매개변수에 대한 설명을 참조하세요.

    "rentalcountitem3"은 추가적인 매개변수로 아이템 랜덤 옵션을 사용하는 "rentalcountitem2"의 고급 버전입니다.
    <RandomIDArray> : 아이템 랜덤 옵션 ID에 대한 배열 변수, db/[pre-]re/item_randomopt_db.yml 참조
    <RandomValueArray> : 아이템 랜덤 옵션 값에 대한 배열 변수
    <RandomParamArray> : 아이템 랜덤 옵션 파라미터에 대한 배열 변수

    "rentalcountitem4"는 등급에 대한 추가적인 매개변수를 사용하는 "rentalcountitem3"의 고급 버전입니다.


    ---------------------------------------

    *countbound({<bound type>{,<char_id>}})

    이 함수는 캐릭터 인벤토리에 있는 서로 다른 바인드 아이템의 수를 반환하며, 배열 @bound_items[]와
    @bound_amount[]를 설정하여 계산된 아이템의 모든 아이디와 해당 수량을 포함합니다.
    바인드 유형이 지정된 경우 해당 아이템만 계산됩니다.

    바인드 유형의 목록은 'getitembound'를 참조하세요.

    예제:
    .@total_type = countbound();
    mes "당신은 현재 " + .@total_type + " 종류의 바인드 아이템을 가지고 있습니다.";
    next;
    mes "바인드 아이템 목록은 다음과 같습니다:";
    for(.@i = 0; .@i < .@total_type; .@i++)
    mes "x" + @bound_amount[.@i] + " " + getitemname(@bound_items[.@i]);
    close;

    ---------------------------------------

    *groupranditem <group id>{,<sub_group>};

    이 명령어는 지정한 그룹에서 무작위로 선택된 아이템의 item_id를 반환합니다.
    다양한 그룹과 그룹 번호는 'db/(pre-)re/item_group_db.yml'에서 지정됩니다.

    다른 함수와 함께 사용하면 무작위 아이템을 얻을 수 있습니다. 예를 들어, 랜덤 펫를 얻으려면:

    getitem groupranditem(IG_Taming),1;

    'sub_group'은 지정된 무작위 그룹에서 아이템 그룹의 사용 가능한 무작위 아이템을 가져오는 데
    사용됩니다. 'must' 아이템 그룹은 0이고, 무작위 아이템 그룹은 1에서 5까지
    (MAX_ITEMGROUP_RANDGROUP+1)입니다.

    자세한 정보는 'doc/item_group.txt'를 참조하세요.

    ---------------------------------------

    *getrandgroupitem <group_id>{,<quantity>{,<sub_group>{,<identify>{,<char_id>}}}};

    위의 예제와 유사하게, 이 명령어를 사용하여 "<group id>" 그룹에서 지정된 수량의 무작위 아이템을
    획득할 수 있습니다. 다양한 그룹과 그룹 번호는 'db/(pre-)re/item_group_db.yml'에서 지정됩니다.

    'quantity'가 정의되지 않거나 0이면, 아이템 그룹 목록에서 정의된 수량을 사용합니다.

    'sub_group'이 정의되지 않으면 값은 1이 됩니다(무작위 그룹은 1~5이며 0은 'must' 아이템 그룹입니다).

    IT_WEAPON, IT_ARMOR, IT_PETARMOR, IT_SHADOWGEAR 유형의 아이템은 'identify'에 1 값을
    정의하지 않는 한 확인되지 않은 아이템으로 제공됩니다. (src/map/itemdb.cpp의 itemdb_isidentified에
    의해 정의됨)

    자세한 정보는 'doc/item_group.txt'를 참조하세요.

    ---------------------------------------

    *getgroupitem <group_id>{,<identify>{,<char_id>}};

    아이템 그룹 내용에 따라 부착된 플레이어에게 아이템을 제공합니다. 이는 지정된 아이템 그룹 및
    서브 그룹에 대해 하나의 아이템만 제공하는 'getrandgroupitem'과는 다릅니다.

    IT_WEAPON, IT_ARMOR, IT_PETARMOR 및 IT_SHADOWGEAR 유형의 아이템은 itemdb.cpp의
    itemdb_isidentified에 정의된 대로 식별되지 않은 아이템으로 제공됩니다. 그러나 'identify'에
    값 1이 정의된 경우에는 제대로 식별된 아이템으로 제공됩니다.

    자세한 내용은 'doc/item_group.txt'를 참조하세요.

    ---------------------------------------

    *enable_items;
    *disable_items;

    이 명령은 NPC와 상호 작용하면서 장비를 변경하는 능력을 전환합니다. 가능한 악용을 방지하기
    위해 명령은 특정 스크립트 인스턴스에만 영향을 미칩니다. 다른 스크립트가 enable_items를
    호출하면 마지막 호출을 덮어쓰므로, 여러분은 이 명령을 스크립트 시작시에 호출해야 합니다.

    기본 설정 'item_enabled_npc'은 'conf/battle/items.conf'에서 정의됩니다.

    ---------------------------------------

    *itemskill <skill id>,<skill level>{,<keep requirement>};
    *itemskill "<skill name>",<skill level>{,<keep requirement>};

    이 명령은 사용 가능한 아이템에서 단일 사용 스킬을 복제하는 아이템 스크립트를 위해 만들어졌습니다.
    보이는 대화 창이나 메뉴가 없거나, 아이템이 'Delayconsume' 유형이 아닌 경우 올바르게 작동하지
    않을 수 있습니다. 스킬이 자가 또는 자동 대상팅인 경우 즉시 사용되며, 그렇지 않으면 대상
    커서가 표시됩니다.

    <keep requirement> 매개변수를 true로 설정하면 스킬의 요구 사항이 확인됩니다. 아이템 스킬의
    요구 사항은 기본적으로 확인되지 않기 때문에 기본값은 false입니다.

    // 안티 페인멘트을 사용하면, 실제 스킬 트리에서 스킬을 사용한 것과 같은 방법으로 Endure (8),
    //레벨 1을 시전합니다.
    - Id: 605
    AegisName: Anodyne
    Name: Anodyne
    Type: Delayconsume
    Buy: 2000
    Weight: 100
    Flags:
    BuyingStore: true
    Script: |
    itemskill "SM_ENDURE",1;

    // 시에나엑서크레이트 스크롤 를 사용하면, 시에나엑서크레이트 레벨 5를 시전하고
    // 레드젬스톤 2개를 소비합니다.
    - Id: 23194
    AegisName: Sienna_Execrate_Scroll_1_5
    Name: Level 5 Sienna Execrate
    Type: Delayconsume
    Buy: 10
    Weight: 10
    Script: |
    itemskill "WL_SIENNAEXECRATE",5,true;

    ---------------------------------------

    *consumeitem <item id>{,<char_id>};
    *consumeitem "<item name>"{,<char_id>};

    이 명령어는 호출된 캐릭터에게 해당 아이템의 아이템 스크립트를 실행합니다. 캐릭터가 해당
    아이템을 소유하지 않아도 실행 가능하며, 아이템은 삭제되지 않습니다. 이 명령어는 사용
    가능한 아이템에 대해서는 의도되었지만, 모든 아이템 타입에 대해 실행됩니다.

    현재 이 명령어는 'itemskill' 스크립트 명령어와 함께 사용되지 않습니다.

    ---------------------------------------

    *produce <item level>;

    이 명령어는 호출된 캐릭터에 연결된 클라이언트에서 제작 창을 엽니다. 'item level'은
    어떤 종류의 제작 창이 열릴지를 결정하는 번호입니다.

    제작 창이 비어있지 않은 경우는, 호출된 캐릭터가 해당 유형의 아이템을 제작할 수 있으며,
    그 유형의 아이템을 제작하기 위한 적절한 원자재를 소유하고 있는 경우입니다.

    제작 아이템 목록은 'db/produce_db.txt'에 있으며, 해당 유형의 아이템을 실제로 생산할 수 있는지를
    결정합니다.

    아이템을 생산하는 성공 확률은 해당 아이템 레벨에 대응하는 스킬의 성공 확률과 동일합니다.
    스킬 id가 없는 경우, 성공 확률은 50%가 됩니다.

    유효한 아이템 레벨은 다음과 같습니다:

    1 - Level 1무기
    2 - Level 2 무기
    3 - Level 3 무기
    21 - 블랙스미스의 Stones and Metals
    22 - 알케미스트 포션, 성수, 치명적인 독
    23 - 속성 컨버트

    ---------------------------------------

    *cooking <dish level>;

    이 명령은 호출한 캐릭터와 연결된 클라이언트에서 요리 창을 엽니다. 'dish level'은 제작 가능한
    요리의 레벨을 결정하는 숫자입니다. 'db/produce_db.txt'에서 생성 가능한 요리의 전체 목록을
    볼 수 있습니다.

    만약 호출한 캐릭터가 요리를 요리할 수 있는 충분한 재료가 없다면, 창은 비어 보일 것입니다.

    유효한 요리 레벨은 다음과 같습니다:

    11 - Level 1 요리
    12 - Level 2 요리
    13 - Level 3 요리
    14 - Level 4 요리
    15 - Level 5 요리
    16 - Level 6 요리
    17 - Level 7 요리
    18 - Level 8 요리
    19 - Level 9 요리
    20 - Level 10 요리

    요리를 만들기 위한 재료가 있는 경우, 레벨 1로 설정하더라도 명령어는 작동합니다.

    ---------------------------------------

    *makerune <% success bonus>{,<char_id>};

    이 명령은 룬 제작창을 호출하여, 명령어 사용자의 클라이언트에게 룬 제작을 요청합니다.
    이 명령은 공식적으로 룬 원석에서 사용되며, 추가 성공 확률을 지정해야 합니다
    (기본 공식에 더해집니다).

    'produce_db.txt'에서 제작 가능한 모든 룬을 확인할 수 있습니다.
    윈도우는 명령어 사용자가 실제로 룬을 제작할 수 있고, 적절한 원재료를 인벤토리에
    보유한 경우에만 나타납니다.

    ---------------------------------------

    *successremovecards <equipment slot>;

    이 명령은 명령어 사용자가 착용한 장비 슬롯에서 'item_db.yml'에서 정의된 카드 슬롯의 모든
    카드를 제거하고, 새로운 카드 아이템을 생성하여 캐릭터에게 지급합니다.
    이 방법으로 제거된 카드가 있는 경우 성공 효과가 표시됩니다.

    ---------------------------------------

    *failedremovecards <equipment slot>,<type>;

    이 명령은 명령어 사용자가 착용한 장비 슬롯에서 모든 카드를 제거합니다. 'type'은 아이템
    및 카드에 대해 다음을 결정합니다.

    0 - 아이템과 카드 모두를 파괴합니다.
    1 - 아이템을 유지하지만 카드를 파괴합니다.
    2 - 카드를 유지하지만 아이템을 파괴합니다.

    어떤 유형을 선택하더라도 실패 효과가 화면에 나타납니다.

    ---------------------------------------

    *repair <broken item number>{,<char_id>};

    이 명령은 'getbrokenid'를 통해 사용 가능한 파손된 장비 목록을 사용하여 파손된 장비를 수리합니다.

    ---------------------------------------

    *repairall {<char_id>};

    이 명령은 부착된 플레이어 인벤토리의 모든 파손된 장비를 수리합니다.
    아이템이 수리되면 수리 효과가 표시되며, 그렇지 않으면 명령이 조용히 종료됩니다.

    ---------------------------------------

    *successrefitem <equipment slot>{,<count>{,<char_id>}};

    이 명령은 부착된 캐릭터의 지정된 장비 슬롯의 아이템을 +1 또는 지정된 수량으로 제련합니다.
    장비 슬롯 목록은 'getequipid'를 참조하세요. 이 명령은 또한 캐릭터에게 '제련 성공' 효과를
    표시하고 적절한 메시지를 채팅 창에 표시합니다. 무기가 이 방법으로 +10이 되면 캐릭터에게
    명성 포인트를 부여하며, 나중에 무기를 제작하는 대장장이에게만 영향을 미칩니다.

    ---------------------------------------

    *failedrefitem <equipment slot>{,<char_id>};

    이 명령은 부착된 캐릭터의 지정된 장비 슬롯에 있는 아이템의 제련에 실패합니다. 아이템은
    파괴됩니다. 이 명령은 또한 캐릭터에게 '제련 실패' 효과를 표시하고 적절한 메시지를
    채팅 창에 표시합니다.

    ---------------------------------------

    *downrefitem <equipment slot>{,<count>{,<char_id>}};

    이 명령어는 호출된 캐릭터의 지정 장비 슬롯에 있는 아이템을 -1 레벨 다운그레이드합니다.
    카운트가 지정되면 그 수만큼 다운그레이드합니다. 장비 슬롯에 대한 전체 목록은 'getequipid'를
    참조하세요.

    이 명령어는 또한 캐릭터의 '제련 실패' 효과를 표시하고 적절한 메시지를 채팅 창에 표시합니다.


    ---------------------------------------

    *unequip <equipment slot>{,<char_id>};

    이 명령어는 호출된 캐릭터의 지정 장비 슬롯에서 현재 장착한 아이템을 해제합니다. 가능한 장비
    슬롯의 전체 목록은 'getequipid'를 참조하세요.

    아이템이 여러 장비 슬롯을 차지하는 경우, 그 모든 장비 슬롯에서 장착 해제됩니다.

    ---------------------------------------

    *delequip <equipment slot>{,<char_id>};

    이 명령어는 호출된 캐릭터의 지정 장비 슬롯에서 현재 장착한 아이템을 삭제합니다.
    가능한 장비 슬롯의 전체 목록은 'getequipid'를 참조하세요.

    이 명령어는 아이템이 삭제되면 1을 반환하고, 그렇지 않으면 0을 반환합니다.

    ---------------------------------------

    *breakequip <equipment slot>{,<char_id>};

    이 명령어는 호출된 캐릭터의 지정 장비 슬롯에서 현재 장착한 아이템을 파괴하고 해제합니다.
    가능한 장비 슬롯의 전체 목록은 'getequipid'를 참조하세요.

    이 명령어는 아이템이 파괴되면 1을 반환하고, 그렇지 않으면 0을 반환합니다.

    ---------------------------------------

    *clearitem {<char_id>};

    이 명령어는 호출된 캐릭터의 인벤토리에 있는 모든 아이템 (장착된 아이템 포함)을 삭제합니다.
    이는 창고나 카트 등 다른 것들에는 영향을 미치지 않습니다.

    ---------------------------------------

    *equip <item id>{,<char_id>};
    *autoequip <item id>,<option>;

    이 명령어는 현재 캐릭터에 장비를 장착하는 데 사용됩니다. equip 함수는 플레이어가 인벤토리에
    해당 아이템을 가지고 있을 때 주어진 아이템 ID를 장착하며, autoequip 함수는 주어진 아이템 ID가
    획득될 때 자동으로 장착합니다. autoequip의 옵션 매개변수는 1 또는 0입니다. 1은 켜고 0은 끕니다.

    예제:

    // 인벤토리에 1104(폴쳔)이 있으면 이 아이템을 캐릭터에 장착합니다.
    equip 1104;

    //폴쳔이 획득되면 캐릭터가 자동으로 장착하도록 설정합니다.
    autoequip 1104,1;

    //폴쳔을 자동으로 장착하지 않도록 설정합니다.
    autoequip 1104,0;

    ---------------------------------------

    *buyingstore <slots>;

    이 명령어는 'Open Buying Store' 스킬과 같은 기능으로 상점 설정창을 띄웁니다.
    아이템 필요 없이 상점을 열 수 있으며, 슬롯의 수는 서버에서 기본적으로 5개로 제한됩니다.

    예제:
    // 4 종류의 아이템을 구매할 수 있는 기회를 제공합니다.
    buyingstore 4;

    ---------------------------------------

    *searchstores <uses>,<effect>;

    이 명령어는 판매중인 상점과 구매중인 상점을 모두 검색할 수 있는 창을 띄웁니다.
    'uses'는 창을 열 수 있는 검색 기회의 수를 의미하며, 'effect'는 아이템을 더블클릭했을 때
    동작을 설정할 수 있습니다. 'effect' 값은 아래와 같습니다:

    0 = 검색 결과가 나온 맵이 현재 플레이어의 맵과 같을 경우 상점의 위치를 미니맵에
    표시하고 노란색으로 상점 표지판을 강조합니다.
    1 = 거리 제한 없이 상점을 바로 엽니다.

    예제:
    // Item 만능 카탈로그 골드(10회사용, 이펙트: open shop)
    searchstores 10,1;

    ---------------------------------------

    *enable_command;
    *disable_command;

    이 명령어들은 NPC와 상호작용하는 동안 atcommand 사용을 허용하거나 금지합니다.

    기본 설정 값인 'atcommand_disable_npc'은 'conf/battle/gm.conf' 파일에서 정의됩니다.

    ---------------------------------------
    //
    4,1.- 아이템관련 명령어 끝
    //
    ---------------------------------------

    *openstorage;

    이 명령은 실행한 캐릭터의 카프라 창고 창을 클라이언트에서 엽니다. 이 명령은 카프라 스태프에
    국한되지 않고, 어떤 종류의 NPC나 아이템 스크립트에서도 사용할 수 있습니다.

    다이얼로그 창이 열려 있든 아니든 창고 창이 열립니다. 그러나 창이 겹치면서 일어날 수 있는
    불편을 방지하기 위해 창을 열기 전에 대화를 닫는 것이 좋습니다.

    mes "창고를 열기위해 대화창을 닫으세요";
    close2;
    openstorage;
    end;

    ---------------------------------------

    *openstorage2 <storage_id>,<mode>{,<account_id>};

    이 명령은 'openstorage' 명령과 유사하지만, 이 명령은 <storage_id>로 지정된 추가적인 창고를
    열 수 있습니다. <storage_id>에 대한 값을 확인하려면 conf/inter_server.yml 파일을 읽어보세요.

    <mode> 값의 종류는 다음과 같습니다.
    STOR_MODE_NONE : 플레이어는 창고 항목을 확인만 할 수 있습니다.
    STOR_MODE_GET : 플레이어는 창고에서 아이템을 가져올 수 있습니다.
    STOR_MODE_PUT : 플레이어는 창고에 아이템을 넣을 수 있습니다.

    예제:
    if (vip_status(VIP_STATUS_ACTIVE)) {
    mes "프리미엄 창고를 열겠습니다.";
    mes "저희의 서비스를 이용해주셔서 감사합니다.";
    close2;
    openstorage2 1,STOR_MODE_GET|STOR_MODE_PUT;
    } else {
    mes "죄송합니다, 프리미엄 상태가 만료되었습니다.";
    mes "창고가 열리지만 아이템을 넣을 수 없습니다.";
    close2;
    openstorage2 1,STOR_MODE_GET;
    }
    end;

    ---------------------------------------

    *openmail({<char_id>});

    이명령어는 호출된 캐릭터의 메일 창을 오픈합니다.

    PACKETVER 20150513 이상의 클라이언트에서는 지원되지 않습니다.

    mes "Close this window to open your mail inbox.";
    close2;
    openmail;
    end;

    ---------------------------------------

    *mail <destination id>,"<sender name>","<title>","<body>"{,<zeny>{,<item id array>,<item amount array>{,refine{,bound{,<item card0 array>{,<item card1 array>{,<item card2 array>{,<item card3 array>
    {,<random option id0 array>, <random option value0 array>, <random option paramter0 array>{,<random option id1 array>, <random option value1 array>, <random option paramter1 array>
    {,<random option id2 array>, <random option value2 array>, <random option paramter2 array>{,<random option id3 array>, <random option value3 array>, <random option paramter3 array>
    {,<random option id4 array>, <random option value4 array>, <random option paramter4 array>}}}}}}}}};

    이 명령어는 <destination id>로 메일을 보내며, <sender name>은 선택적으로 지정할 수 있지만
    메일의 생성자가 아니어도 되며, NAME_LENGTH(24) 자 이내로 제한됩니다. 메일 제목 <title>은
    MAIL_TITLE_LENGTH(40) 자로 제한되며, 메일 내용 <body>은 PACKETVER < 20150513에서는
    MAIL_BODY_LENGTH(200) 자, 이후 클라이언트에서는 500자로 제한됩니다.

    메일에 <zeny>와 아이템 데이터를 추가할 수도 있습니다. PACKETVER < 20150513에서는 1개의
    아이템이 가능하며, 이후 클라이언트에서는 MAIL_MAX_ITEM(5)까지 가능합니다.

    <item id array>, <item amount array>, <item card0 array>, <item card1 array>,
    <item card2 array>, 및 <item card3 array>는 모두 정수 배열이어야 합니다.

    랜덤 옵션의 경우, 카드 바로 다음에 5 쌍의 배열(ids, values, parameters)이 있을 수 있습니다.
    이러한 모든 배열은 정수 배열이어야 합니다.

    제니와 함께 메일을 보내는 예제:
    .@charid = getcharid(0);
    .@sender$ = "Poring";
    .@title$ = "Welcome";
    .@body$ = "Hi! I'm a simple Poring from the Prontera fields! Welcome to Ragnarok!";
    .@zeny = 5000;
    mail .@charid, .@sender$, .@title$, .@body$, .@zeny;

    아이템과 함께 메일을 보내는 예제:
    .@charid = getcharid(0);
    .@sender$ = "Angeling";
    .@title$ = "Welcome";
    .@body$ = "Hi! I'm a simple Angeling from the Prontera fields! Welcome to Ragnarok!";
    .@zeny = 0;
    setarray .@mailitem[0], 504, 505, 2220, 1214; // 화이트포션, 블루포션, 햇, 대거
    setarray .@mailamount[0], 10, 5, 1, 1; //각 아이템 수량// 10 화이트포션, 5 블루포션s, 1 햇, 1 대거 수량
    setarray .@mailrefine[0], 0, 0, 3, 10; // 제련도 // +3 Hat, +10 Dagger
    setarray .@mailbound[0], 0, 0, Bound_Account, Bound_Char; // 바인드 플래그 // Account bounded Hat, Char bounded Dagger
    setarray .@mailcard0[0], 0, 0, 4198, 4092; // 카드 // 마야퍼플 카드, 스켈레톤워커
    setarray .@mailcard1[0], 0, 0, 0, 4092; // 카드 슬롯 1번에 스켈레톤워커
    setarray .@mailcard2[0], 0, 0, 0, 4092; // 카드 슬롯 2번에 스켈레톤워커
    mail .@charid, .@sender$, .@title$, .@body$, .@zeny, .@mailitem, .@mailamount, .@mailrefine, .@mailbound, .@mailcard0, .@mailcard1, .@mailcard2;

    아이템을 랜덤옵션으로 메일을 보내는 예제:
    .@charid = getcharid(0);
    .@sender$ = "Angeling";
    .@title$ = "Welcome";
    .@body$ = "Hi! I'm a simple Angeling from the Prontera fields! Welcome to Ragnarok!";
    .@zeny = 0;
    setarray .@mailitem[0], 504, 505, 2220, 1214; // White Potion, Blue Potion, Hat, Dagger
    setarray .@mailamount[0], 10, 5, 1, 1; // 10 White Potions, 5 Blue Potions, 1 Hat, 1 Dagger
    setarray .@mailrefine[0], 0, 0, 3, 10; // +3 Hat, +10 Dagger
    setarray .@mailbound[0], 0, 0, Bound_Account, Bound_Char; // Account bounded Hat, Char bounded Dagger
    setarray .@mailcard0[0], 0, 0, 4198, 4092; // Attach Maya Purple Card to the Hat, Attach Skeleton Worker Card to Dagger
    setarray .@mailcard1[0], 0, 0, 0, 4092; // Attach Skeleton Worker Card to Dagger
    setarray .@mailcard2[0], 0, 0, 0, 4092; // Attach Skeleton Worker Card to Dagger
    setarray .@mailcard3[0], 0, 0, 0, 0; // Empty last slot
    setarray .@mailrndopt_id0[0], 0, 0, 0, RDMOPT_VAR_MAXHPAMOUNT; // Enchant the Dagger with increased HP option
    setarray .@mailrndopt_val0[0], 0, 0, 0, 1000; // Enchant the Dagger with increased HP option by 1000 points
    setarray .@mailrndopt_prm0[0], 0, 0, 0, 0; // Enchant the Dagger with increased HP option - does not need any parameter
    mail .@charid, .@sender$, .@title$, .@body$, .@zeny, .@mailitem, .@mailamount, .@mailrefine, .@mailbound, .@mailcard0, .@mailcard1, .@mailcard2, .@mailcard3, .@mailrndopt_id0, .@mailrndopt_val0, .@mailrndopt_prm0;

    ---------------------------------------

    *openauction({<char_id>});

    이 명령어는 호출한 캐릭터에 연결된 클라이언트에서 경매장 창을 엽니다.

    mes "Close this window to open the Auction window.";
    close2;
    openauction;
    end;

    ---------------------------------------
    \\
    4,2.- 길드관련 명령어
    \\
    ---------------------------------------

    *guildopenstorage()

    이 함수는 'openstorage'과 동일하게 작동하지만, 캐릭터가 속한 길드 보관함 창을 엽니다.

    반환 값:
    GSTORAGE_OPEN - 성공적으로 열림
    GSTORAGE_STORAGE_ALREADY_OPEN - 플레이어 저장소가 이미 열려 있음
    GSTORAGE_ALREADY_OPEN - 길드 저장소가 이미 열려 있음
    GSTORAGE_NO_GUILD - 플레이어가 길드에 속해 있지 않음
    GSTORAGE_NO_STORAGE - 길드가 길드 보관함 확장 기술에 투자하지 않음
    (공식 길드 보관함이 활성화되어 있는 경우에만 해당)
    GSTORAGE_NO_PERMISSION - 플레이어가 길드 보관함을 사용할 수 있는 권한이 없음

    ---------------------------------------

    *guildopenstorage_log({<char id>})

    이 명령어는 현재 캐릭터 또는 주어진 캐릭터 ID의 길드 창고 로그 창을 엽니다.

    가능한 반환 값:
    GUILDSTORAGE_LOG_FINAL_SUCCESS - 창이 성공적으로 열렸습니다.
    GUILDSTORAGE_LOG_EMPTY - 항목이 없기 때문에 창이 열리지 않았습니다.
    GUILDSTORAGE_LOG_FAILED - 일부 데이터베이스 오류가 발생했습니다.

    *guild_has_permission(<permission>{,<char id>})

    이 명령어는 현재 캐릭터 또는 주어진 캐릭터 ID가 주어진 권한이 있는지 확인합니다.
    권한은 비트마스크이며 동시에 여러 값을 사용할 수 있습니다.
    플레이어가 모든 주어진 권한을 갖고 있으면 true를 반환하고 그렇지 않으면 적어도
    하나의 권한이 부족하거나 전혀 길드에 속하지 않은 경우 false를 반환합니다.

    사용 가능한 권한은 다음과 같습니다.
    GUILD_PERM_INVITE - 플레이어가 다른 플레이어를 초대할 수 있는지 여부입니다.
    GUILD_PERM_EXPEL - 플레이어가 다른 길드원을 제거할 수 있는지 여부입니다.
    GUILD_PERM_STORAGE - 플레이어가 길드 창고에 액세스할 수 있는지 여부입니다.
    GUILD_PERM_ALL - 위의 모든 권한의 조합입니다.
    ---------------------------------------

    *guildchangegm(<guild id>,<new master's name>)

    이 함수는 길드 마스터를 변경합니다. <길드 id>는 변경하려는 길드의 id이며,
    새로운 길드 마스터의 이름을 전달해야 합니다.

    성공하면 1, 실패하면 0을 반환합니다.

    ---------------------------------------

    *guildgetexp <amount>;

    이 명령은 호출된 캐릭터가 속한 길드에 지정된 양의 길드 경험치를 부여합니다.
    호출된 캐릭터가 어떤 길드에도 속해 있지 않은 경우 무시됩니다.
    ---------------------------------------

    *guildskill <skill id>,<level>
    *guildskill "<skill name>",<level>

    이 명령은 지정된 길드 스킬을 지정된 레벨만큼 높입니다. 호출된 캐릭터가 길드원이면서
    길드 마스터인 경우에만 작동합니다. 그렇지 않으면 실패 메시지가 표시되지 않고 아무 일도
    일어나지 않습니다. 또한 길드 스킬이 최대치를 초과하려고 할 때도 마찬가지입니다.
    길드 스킬의 전체 목록은 'db/(pre-)re/skill_db.yml'에 있으며, 모두 끝에 GD_가 붙습니다.

    // 이 명령은 길드 승인 (GD_APPROVAL ID 10000)에 1 레벨을 부여합니다.
    // 승인을 두 번 추가하려고 하거나, 이미 길드에 승인이 있는 경우에도 1 레벨의 승인만 남게 됩니다.
    guildskill 10000,1,0;

    특정 길드 스킬을 얻기 위한 퀘스트를 만들어 길드원 전체가 함께 해야 하는 어려운 작업을
    하도록 할 수도 있습니다. 길드 엠블렘을 사용할 수 있게 하는 길드의 영광 스킬에 대해
    이를 수행하는 것이 좋은 아이디어입니다.

    ---------------------------------------
    //
    4,2 길드 관련 명령어 끝
    //
    ---------------------------------------

    *resetlvl <action type>{,<char_id>};

    이 명령어는 주로 전승직업을 지원하는 전승 스크립트를 위해 만들어진 캐릭터 초기화
    명령어입니다. 명령어에 따라 속성과 레벨이 초기화되며, 캐릭터 재설정을 제공합니다.
    가능한 액션 타입은 다음과 같습니다:

    1 - 베이스 레벨 1, 잡 레벨 1, 0 스킬 포인트, 0 베이스 경험치, 0 잡 경험치,
    스탯 리셋 (setoption으로 설정 가능한 것만), 모든 스탯 1로 초기화.
    새로운 직업이 'Novice High'인 경우, 100 상태 포인트, 응급치료 및 죽은척하기 스킬을 제공합니다.
    2 - 베이스 레벨 1, 잡 레벨 1, 0 스킬 포인트, 0 베이스 경험치, 0 잡 경험치. 스킬 및 속성 값은
    변경되지 않습니다.
    3 - 베이스 레벨 1, 베이스 경험치 0. 그 외는 변경되지 않습니다.
    4 - 잡 레벨 1, 잡 경험치 0. 그 외는 변경되지 않습니다.

    모든 경우에 캐릭터가 착용 중인 아이템은 해제됩니다.

    값을 반환하지 않지만, 공식 전승 스크립트에서 함수로 사용됩니다.
    이유는 AppleGirl에게 문의하세요.

    ---------------------------------------

    *resetstatus({<char_id>});

    이 명령어는 캐릭터 리셋 명령어로, 호출된 캐릭터의 스탯을 초기화하고 이전에 사용한 모든
    스탯 포인트를 반환합니다. 캐릭터의 다른 숫자에는 아무런 영향을 미치지 않습니다.

    리셋 NPC에서 사용됩니다.


    ---------------------------------------

    *resetskill({<char_id>});

    이 명령어는 호출된 캐릭터의 모든 스킬 포인트를 제거하여, 기본 스킬 (레벨 0)만 남기고
    포인트를 반환합니다. 캐릭터의 다른 숫자에는 아무런 영향을 미치지 않습니다.
    'battle_athena.conf'에서 'quest_skill_reset' 옵션이 'Yes'로 설정된 경우 퀘스트 스킬도
    리셋되며, 'quest_skill_learn' 옵션이 설정된 경우 퀘스트 스킬의 포인트도 총 포인트에 계산됩니다.

    리셋 NPC에서 사용됩니다.

    ---------------------------------------

    *resetfeel({<char_id>});

    이 명령어는 Star Gladiator와 Star Emperor 클래스에서만 작동하며, 호출된 캐릭터의 지정된
    맵을 초기화합니다.

    ---------------------------------------

    *resethate({<char_id>});

    이 명령어는 Star Gladiator와 Star Emperor 클래스에서만 작동하며, 호출된 캐릭터의 지정된
    몬스터를 초기화합니다.

    ---------------------------------------

    *sc_start <effect type>,<ticks>,<value 1>{,<rate>,<flag>{,<GID>}};
    *sc_start2 <effect type>,<ticks>,<value 1>,<value 2>{,<rate>,<flag>{,<GID>}};
    *sc_start4 <effect type>,<ticks>,<value 1>,<value 2>,<value 3>,<value 4>{,<rate>,<flag>{,<GID>}};
    *sc_end <effect type>{,<GID>};
    *sc_end_class {<char_id>{,<job_id>}};

    이 명령어는 캐릭터에게 상태 효과를 부여합니다.

    <effect type>은 어떤 상태를 부를지를 결정합니다. 이는 번호나 상수로 표시될 수 있으며,
    일반적인 상태 (주로 부정적인 것)은 'src/map/script_constants.hpp'에 있는 'SC_'
    접두어가 붙은 것으로 찾을 수 있습니다. 전체 목록은 'src/map/status.hpp'에 있지만
    현재는 문서화되어 있지 않습니다.

    상태의 지속 시간은 <ticks> 또는 밀리초로 지정됩니다.
    무한 지속 시간을 위해서는 INFINITE_TICK를 사용하십시오.

    일부 상태 변경은 추가 매개 변수 <value 1>을 필요로하며, 일반적으로 플레이어 스탯을
    지정된 숫자나 백분율로 수정합니다. 이는 각 상태마다 다르며 때로는 0입니다.

    선택적인 값 <rate>는 상태가 발생할 확률 (100 = 1 %)을 나타냅니다.
    이는 주로 아이템 스크립트에서 사용됩니다. NPC 스크립트에서 사용할 때는
    반드시 rate가 작동하도록 flag가 정의되어 있어야 합니다.

    선택적인 값 <flag>는 상태 변경 시작이 처리되는 방식(비트마스크)입니다.
    SCSTART_NOAVOID : 상태 변경을 회피할 수 없습니다.
    SCSTART_NOTICKDEF : 틱을 스탯으로 감소시킬 수 없습니다(기본값).
    SCSTART_LOADED : sc_data가 로드되었으므로 값을 변경하지 않습니다.
    SCSTART_NORATEDEF : 확률을 감소시킬 수 없습니다.
    SCSTART_NOICON : 상태 아이콘이 클라이언트로 전송되지 않습니다.

    <GID>가 지정되면, 해당 캐릭터 대신에 명령어가 지정된 캐릭터에 상태 변경을 발생시킵니다.
    이것은 반드시 rate와 flag를 설정한 후에만 정의될 수 있습니다.

    'sc_start2' 및 'sc_start4'는 추가 매개 변수를 전달할 수 있으며, 필요한 효과에만 사용됩니다.
    추가 값의 의미는 효과 유형에 따라 다양합니다. 자세한 정보는 status_change.txt를 읽어보십시오.
    여기에는 모든 상태 변경 및 소스에서 사용하는 val1, val2, val3 및 val4 사용 목록이 나와 있습니다.

    'sc_end'는 지정된 상태 효과를 제거합니다. SC_ALL (-1)이 지정된 경우 모든 상태를 완전히
    제거하지만, 영구적인 상태는 다시 적용됩니다.

    'sc_end_class'는 'sc_end'와 비슷하지만, 소환자 캐릭터가 배운 모든 스킬에서 상태 효과를
    제거합니다. <job_id>가 제공되면 해당 직업의 효과를 제거합니다.

    예제:
    // 50% 확률로 10분간 독 상태를 부여합니다.
    sc_start SC_POISON,600000,0,5000;

    // 레벨 10 블레싱을 부여합니다.
    sc_start SC_BLESSING,240000,10;

    // 속성 내성을 백분율로 조절합니다. Resist_Fire 아이템 스크립트 예제:
    // val1: 수속성 내성
    // val2: 지속성 내성
    // val3: 화속성 내성
    // val4: 풍속성 내성
    sc_start4 SC_ARMOR_ELEMENT,1200000,-15,0,20,0;

    // 소환자 캐릭터의 빙결 상태를 제거합니다.
    sc_end SC_FREEZE;

    // 소환자 캐릭터의 배운 모든 스킬의 효과를 제거합니다.
    sc_end_class;

    // <char_id> 150000의 캐릭터가 배운 모든 스킬의 효과를 제거합니다.
    // val1: <char_id>
    sc_end_class(150000);

    // 소환자 캐릭터의 모든 아크비숍 스킬 효과를 제거합니다.
    // val1: <char_id>
    // val2: 아크비숍의 <job_id>
    sc_end_class(getcharid(0),Job_Arch_Bishop);

    참고: SC_NOCHAT을 사용하려면 Manner를 수정해야 합니다.
    Manner를 -5로 설정하면 사용자를 5분 동안 음소거 상태로 만듭니다.
    Manner를 0으로 설정하면 사용자의 음소거 상태를 해제합니다.
    Manner를 5로 설정하면 사용자의 음소거 상태를 해제하고 'Manner'의
    다음 사용을 방지합니다.

    ---------------------------------------

    *getstatus(<effect type>{,<type>{,<char_id>}})

    특정 상태 효과에 대한 정보를 호출할 때 사용합니다. 지정된 <type>에 따라, 함수는 다른 정보를
    반환합니다.

    가능한 <type> 값:

    0 또는 정의되지 않음: 상태가 활성화되어 있는지 여부
    1: 상태의 val1
    2: 상태의 val2
    3: 상태의 val3
    4: 상태의 val4
    5: 상태가 남아 있는 시간(밀리초)

    만약 <type>이 정의되지 않았거나 0으로 설정된 경우, 스크립트 함수는 상태가 활성화되어 있는
    경우 1을 반환하고, 상태가 활성화되어 있지 않은 경우 0을 반환합니다. 어떤 <type> 필드가
    제공될 때 상태가 활성화되어 있지 않으면 이 스크립트 함수는 항상 0을 반환합니다.

    ---------------------------------------

    *skilleffect <skill id>,<number>;
    *skilleffect "<skill name>",<number>;

    이 명령은 현재 연결된 캐릭터에 대해 주어진 스킬의 시각적 및 청각적 효과를 표시합니다.
    number 매개변수는 숫자를 표시하는 시각적 효과를 가진 스킬(회복 또는 데미지)에 대해
    지정됩니다. 이 명령은 스킬을 실제로 사용하지 않습니다. NPC가 해당 스킬의
    시뮬레이션(버프 등)을 실행하도록 스크립트를 사용하도록 고안되었습니다.

    mes "Be blessed!";
    // 힐 2000
    heal 2000,0;
    skilleffect 28,2000;
    // 블레싱 10레벨
    sc_start SC_BLESSING,240000,10;
    skilleffect 34,0;
    // 민첩성증가 5레벨
    sc_start SC_INCREASEAGI,140000,5;
    skilleffect 29,0;

    이것은 캐릭터를 2000 HP로 회복하고, 축복 레벨 10과 증가된 AGI 레벨 5를 버프하고
    적절한 효과를 표시합니다.

    ---------------------------------------

    *npcskilleffect <skill id>,<number>,<x>,<y>;
    *npcskilleffect "<skill name>",<number>,<x>,<y>;

    이 명령은 'skilleffect'와 동일하게 동작하지만 지상 타입의 스킬 효과는
    첨부된 캐릭터가 위치한 맵과 동일한 좌표에 중심이 맞춰지고, 다른 스킬 유형은
    첨부된 캐릭터에 중심이 맞춰집니다.

    ---------------------------------------

    *specialeffect <effect number>{,<send_target>{,"<NPC Name>"}};

    이 명령은 지정된 NPC 좌표에 중심을 둔 주어진 특수 효과를 표시합니다.
    효과 번호의 전체 목록은 'doc/effect_list.txt'에서 확인할 수 있습니다.
    몇몇 효과 번호는 일부 클라이언트에서 작동하지 않습니다. (특히 2005년 4월 이후에
    릴리스된 클라이언트에서는 비가 없습니다.)

    <NPC 이름> 매개변수는 다른 NPC에게 <effect number>를 표시합니다. 지정된 NPC가
    존재하지 않으면, 명령은 아무것도 수행하지 않습니다. NPC를 지정할 때,
    <NPC 이름>을 지정하는 경우 <send_target>를 지정해야하며, AREA를 지정하면
    명령의 기본 동작을 유지합니다.

    // 이 명령은 Jane Doe가 지정한 "EF_HIT1" 효과를
    /// "John Doe#1" NPC에서 표시합니다.
    mes "[Jane Doe]";
    mes "Well, I never!";
    specialeffect EF_HIT1,AREA,"John Doe#1";
    close;

    ---------------------------------------

    *specialeffect2 <effect number>{,<send_target>{,"<Player Name>"}};

    이 명령어는 'specialeffect'와 유사하게 작동하지만, 이펙트가 스크립트를 호출한 캐릭터의
    위치에 중심을 둡니다.

    <Player name> 매개변수는 현재 스크립트에 연결된 플레이어와 다른 플레이어에게
    <effect number>를 표시합니다. 플레이어를 지정할 때는 <send_target>를 제공해야하며,
    AREA를 지정하면 기본 동작을 유지합니다.

    ---------------------------------------

    *removespecialeffect <effect number>{,<send_target>{,"<NPC Name>"}};

    2018-10-02+ 버전 이상에서 작동합니다.
    이 명령어는 'specialeffect'와 동일한 매개변수를 사용하지만, <effect number>로 지정된
    이펙트를 호출하는 NPC에서 제거하는 데 사용됩니다.

    ---------------------------------------

    *removespecialeffect2 <effect number>{,<send_target>{,"<Player Name>"}};

    2018-10-02+ 버전 이상에서 작동합니다.
    이 명령어는 'specialeffect2'와 유사한 매개변수를 사용하지만, <effect number>로 지정된
    이펙트를 호출하는 캐릭터에서 제거하는 데 사용됩니다.

    ---------------------------------------

    *statusup <stat>{,<char_id>};

    이 명령어는 호출된 캐릭터의 지정된 스텟을 영구적으로 1 증가시킵니다. 스텟은 숫자로
    제공해야하지만 다음과 같은 상수를 사용할 수 있습니다.

    bStr - Str
    bVit - Vit
    bInt - Int
    bAgi - Agi
    bDex - Dex
    bLuk - Luk

    ---------------------------------------

    *statusup2 <stat>,<amount>{,<char_id>};

    이 명령은 호출된 캐릭터의 지정된 스탯을 영구적으로 지정된 양만큼 변경합니다. 양은 음수일 수도
    있습니다. 'statusup' 명령을 참조하세요.

    // This will decrease a character's Vit forever.
    statusup2 bVit,-1;
    ---------------------------------------

    *traitstatusup <stat>{,<char_id>};

    이 명령은 호출된 캐릭터의 지속적인 특성 스탯을 1만큼 증가시킵니다. 특성 스탯은 숫자로
    지정해야하지만, 이러한 상수를 사용하여 대체할 수 있습니다.

    bPow - Power
    bSta - Stamina
    bWis - Wisdom
    bSpl - Spell
    bCon - Concentration
    bCrt - Creative

    ---------------------------------------

    *traitstatusup2 <stat>,<amount>{,<char_id>};

    이 명령은 호출된 캐릭터의 특정 특성 능력치를 지정된 양만큼 영구적으로 변경합니다.
    수량은 음수가 될 수 있습니다. 'statusup'을 참조하세요.

    // 이것은 캐릭터의 Sta를 영원히 감소시킵니다.
    traitstatusup2 bSta,-1;

    ---------------------------------------

    *bonus <bonus type>,<val1>;
    *bonus2 <bonus type>,<val1>,<val2>;
    *bonus3 <bonus type>,<val1>,<val2>,<val3>;
    *bonus4 <bonus type>,<val1>,<val2>,<val3>,<val4>;
    *bonus5 <bonus type>,<val1>,<val2>,<val3>,<val4>,<val5>;

    이 명령어들은 아이템 스크립트에서 사용되는 것이 좋습니다. 아이템 스크립트 외부에서도
    작동할 수 있지만, 보너스가 오랫동안 유지되지는 않을 것입니다. 이 명령어들은 호출된
    캐릭터에 대해서만 참조됩니다.

    가능한 보너스의 전체 목록 및 각 종류에 대한 명령어는 'doc/item_bonus.txt'에서 찾을 수 있습니다.

    ---------------------------------------

    *autobonus <bonus script>,<rate>,<duration>{,<flag>,{<other script>}};
    *autobonus2 <bonus script>,<rate>,<duration>{,<flag>,{<other script>}};
    *autobonus3 <bonus script>,<rate>,<duration>,<skill id>,{<other script>};
    *autobonus3 <bonus script>,<rate>,<duration>,"<skill name>",{<other script>};

    이 명령어들은 아이템 스크립트에서만 사용할 수 있습니다! 펫 사용에는 'petautobonus'를
    참조하세요.

    이 명령어들은 공격 시 (혹은 autobonus2의 경우 공격을 받을 때) 실행될 플레이어 스크립트를
    "붙여주는" 역할을 합니다.

    Rate는 스크립트가 실행될 확률(1000 = 100%)입니다.

    Duration은 스크립트가 실행될 때 보너스가 지속되는 시간(밀리초)입니다.

    Skill ID / Skill name은 보너스를 시작할 스킬입니다. (autobonus3)

    옵션인 'flag' 인자는 스크립트가 트리거될 때 분류되는 공격 유형
    (기본값: BF_WEAPON+BF_NORMAL)을 지정합니다. 이 인자는 bAutoSpell 보너스 스크립트와
    동일한 플래그를 공유합니다.

    공격 거리 발동조건:
    BF_SHORT: 근접 공격에서 트리거
    BF_LONG: 원거리 공격에서 트리거
    Default: BF_SHORT+BF_LONG
    어택 타입 발동조건:
    BF_WEAPON: 무기 스킬에서 트리거
    BF_MAGIC: 마법 스킬에서 트리거
    BF_MISC: 기타 스킬에서 트리거
    Default: BF_WEAPON
    스킬발동 조건:
    BF_NORMAL: 일반 공격에서 트리거
    BF_SKILL: 스킬에서 트리거
    default: 만약 공격 유형이 BF_WEAPON인 경우, BF_NORMAL을 사용하며,
    그렇지 않은 경우 BF_SKILL+BF_NORMAL을 사용합니다.

    옵션 인자 'other script'와 'bonus script'의 차이점은 'bonus script'가 status 계산 시에도 실행되어,
    지속 시간 내에 상태 계산으로 인해 손실된 "보너스"가 복원되도록 하는 것입니다.
    따라서 'bonus script'는 보너스 명령어만 수용하도록 설계되어 있습니다.
    일반적으로 'other script'는 시각적 효과를 보여줄 때 사용합니다.

    어떤 경우에든 스크립트가 트리거될 때, 해당 보너스를 가지고 있는 플레이어가 바로 보너스를
    받는 사람입니다. 현재 이 스크립트 내에서 다른 캐릭터(autobonus2의 경우 공격자 또는
    autobonus의 경우 대상)를 알 수 있는 방법은 없습니다.

    // 무기나 기타 공격(근거리와 원거리 스킬 모두)시 1% 확률로 "모든 스탯 +10" 상태를
    // 10초간 부여하며, 보너스 활성화 시 특수 이펙트를 보여줍니다.
    autobonus "{ bonus bAllStats,10; }",10,10000,BF_WEAPON|BF_MISC,"{ specialeffect2 EF_FIRESPLASHHIT; }";

    ---------------------------------------

    *bonus_script "<script code>",<duration>{,<flag>{,<type>{,<status_icon>{,<char_id>}}}};

    이 명령어는 지정된 지속 시간(초) 동안 플레이어에게 스크립트를 부여합니다.
    그 시간이 지나면 스크립트가 자동으로 만료됩니다. 같은 보너스는 중첩할 수 없습니다.
    기본적으로, 이 보너스는 플레이어가 로그아웃할 때 bonus_script 테이블에 저장됩니다.

    플래그 (비트마스크):
    1: 사망 시 제거.
    2: Dispell에 의해 제거 가능.
    4: Clearance에 의해 제거 가능.
    8: 로그아웃할 때 제거.
    16: Banishing Buster에 의해 제거 가능.
    32: Refresh에 의해 제거 가능.
    64: Lux Anima에 의해 제거 가능.
    128: Madogear가 활성화되거나 비활성화될 때 제거.
    256: 피해를 받을 때 제거.
    512: 스크립트가 영구적으로 유지되어 'bonus_script_clear'로 지울 수 없음.
    1024: 중복되는 스크립트를 지우지 않고 지속 시간을 늘림.
    2048: 중복되는 스크립트를 추가함. 1024와 동시에 사용할 수 없으며,
    둘 다 정의된 경우 1024가 먼저 확인되고 2048은 무시됩니다.

    타입:
    'debuff_on_logout'에 대해 부정적인(디버프) 또는 긍정적인(버프) 버프를 결정합니다.
    0: 버프 유형을 무시하고 플래그가 &8이 아닌 경우 제거되지 않음 (기본값)
    1: 버프
    2: 디버프

    상태 아이콘: 'src/map/script_constants.hpp'의 "Status Icon" 섹션을 참조하세요.
    기본값은 SI_BLANK(-1)입니다.

    예제:
    - Id: 512
    AegisName: Apple
    Name: Apple
    Type: Healing
    Buy: 15
    Weight: 20
    Flags:
    BuyingStore: true
    Script: |
    bonus_script "{ bonus bStr,5; }",60;

    ---------------------------------------

    *bonus_script_clear {<flag>,{<char_id>}};

    이 명령어는 플레이어에서 bonus_script를 제거합니다. 'char_id'가 주어지지 않으면,
    호출자의 bonus_script를 제거합니다.

    'flag'가 1이면, 영구적인 효과를 가진 스크립트도 모두 삭제합니다. 기본적으로는
    영구적이지 않은 스크립트만 삭제합니다.

    ---------------------------------------

    *plagiarizeskill <skill_id>,<level>;

    이 명령어는 지정된 도작 가능한 스킬을 도작할 수 있도록 합니다.
    성공 시 1을 반환하고, 그렇지 않으면 0을 반환합니다.

    참고:

    - 도작은 SC_PRESERVE가 활성화되지 않은 경우에만 도작 가능한 스킬을 도작할 수
    있습니다.
    - 리프로듀스는 SC__REPRODUCE가 활성화되어 있고, 해당 스킬이 리프로듀스로 복제
    가능한 경우에만 복제할 수 있습니다

    ---------------------------------------

    *plagiarizeskillreset <flag>;

    플레이어가 도작한 스킬을 제거합니다.
    성공하면 1을 반환하고, 그렇지 않으면 0을 반환합니다.
    Flag 상수:
    1 - 도작에 사용
    2 - 리프로듀스에 사용

    ---------------------------------------

    *skill <skill id>,<level>{,<flag>};
    *skill "<skill name>",<level>{,<flag>};
    *addtoskill <skill id>,<level>{,<flag>};
    *addtoskill "<skill name>",<level>{,<flag>};

    이 명령어는 스킬 습득을 위해 사용됩니다. 아이템 스크립트에서도 사용할 수 있습니다.

    Level은 스킬 레벨이며, skill id는 'db/(pre-)re/skill_db.yml'에 나열된 스킬의 ID 번호입니다.
    이 명령어로 몬스터 스킬을 캐릭터에 부여할 수 있는지는 확실하지 않지만,
    'db/(pre-)re/mob_skill_db.txt'에서 제공하는 번호로 시도할 수 있습니다.

    Flag는 스킬을 영구적으로 부여하려면 0, 임시로 부여하려면 1로 설정합니다
    (캐릭터 데이터에 기록됨). Flag 매개변수는 선택적이며, 'skill'에서는 기본값이 1이며
    'addtoskill'에서는 2입니다.

    Flag 2는 레벨 매개변수가 스킬 레벨에 추가적인 보너스로 적용되어야 함을 의미합니다.
    캐릭터가 해당 스킬을 이전에 가지고 있지 않은 경우 0+지정된 레벨로 부여됩니다.

    Flag 3은 flag 1과 동일하여 데이터베이스에 저장됩니다. 그러나 이러한 스킬은 스킬 트리를
    조정하는 모든 작업에서 무시됩니다(재설정/전직).

    Flag 상수:
    0 - SKILL_PERM
    1 - SKILL_TEMP
    2 - SKILL_TEMPLEVEL
    3 - SKILL_PERM_GRANT

    // 이 명령은 캐릭터에 돌던지기(TF_THROWSTONE, 152) 스킬을 1레벨로 영구적으로 부여합니다.
    skill 152,1,0;

    ---------------------------------------

    *nude {<char_id>};

    이 명령은 호출된 캐릭터가 장착한 아이템을 모두 벗게 합니다.

    직업을 변경할 때는 이미 새 직업 클래스에서 장착할 수 없는 모든 것이 벗겨지므로
    이를 수행하는 것이 필요하지 않습니다.

    ---------------------------------------

    *sit {"<character name>"};
    *stand {"<character name>"};

    이 명령은 캐릭터를 앉거나 서게 만듭니다.
    캐릭터가 지정되지 않은 경우 명령은 호출된 캐릭터에 대해 실행됩니다.

    또한 Sitting 상수는 캐릭터가 앉아 있는 경우 true이고 그렇지 않은 경우 false입니다.

    ---------------------------------------

    *disguise <Monster ID>{,<char_id>};
    *undisguise {<char_id>};

    이 명령은 현재 플레이어를 몬스터 스프라이트로 변신합니다.
    변신은 'undisguise'가 입력되거나 플레이어가 로그아웃할 때까지 지속됩니다.

    예제:

    disguise 1002; // 포링으로 변신합니다.
    next;
    undisguise; // 변신을 해제 합니다.

    ---------------------------------------

    *transform <monster ID>,<duration>{,<sc type>,<val1>,<val2>,<val3>,<val4>};
    *transform "<monster name>",<duration>{,<sc type>,<val1>,<val2>,<val3>,<val4>};
    *active_transform <monster ID>,<duration>{,<sc type>,<val1>,<val2>,<val3>,<val4>};
    *active_transform "<monster name>",<duration>{,<sc type>,<val1>,<val2>,<val3>,<val4>};

    이 명령은 플레이어를 일정 시간동안 몬스터로 변신시키며, 변신 중에는 SC 효과를 부여할 수
    있습니다. 그러나 워 오브 엠페러움 중이거나 이미 변장한 상태에서는 적용되지 않습니다.
    사망하거나 지속 시간이 끝나기 전까지만 해제될 수 있습니다.

    'transform'과 'active_transform'은 서로 중첩될 수 있지만, 'transform' 또는 'active_transform'을
    두 번 사용하면 중첩되지 않고 새로운 보너스로 이전 보너스가 취소됩니다.
    'active_transform'는 해당 기간 동안 'transform'보다 우선권이 있습니다.

    ---------------------------------------
    \\
    4,3 결혼관련 명령어
    \\
    ---------------------------------------

    *marriage("<spouse name>");

    이 함수는 호출하는 캐릭터와 주어진 이름의 캐릭터를 서로의 배우자로 결혼시키며,
    서로에게서 spouse ID를 설정합니다. 현재 SVN에서는 이후로 두 번째 함수 호출 없이도
    결혼이 양쪽에서 모두 작동합니다. 이 함수는 성공하면 1을 반환하며, 대상 캐릭터를 찾을
    수 없거나 이미 누군가와 결혼한 경우 0을 반환합니다.

    이 함수는 반지를 주지 않으며, 효과도 보여주지 않습니다.

    ---------------------------------------

    *wedding;

    이 명령은 호출하는 캐릭터 중심으로 웨딩 음악과 종이 조각을 뿌리는 이펙트를 실행합니다.
    웨딩 스크립트에서 예제를 볼 수 있습니다.

    ---------------------------------------

    *divorce({<char_id>})

    이 함수는 부부 사이의 결혼 관계를 해제합니다. 양쪽 모두가 서로의 배우자가 아니게 됩니다.
    (현재 SVN에서는 다수의 배우자 문제를 방지하기 위해 이런 경우를 막습니다).
    성공하면 1, 이전에 결혼하지 않았으면 0을 반환합니다.

    이 함수는 두 결혼 반지를 파괴하고, 양쪽 플레이어에게 이혼을 알리는 메시지를 보냅니다.

    ---------------------------------------

    *adopt("<parent_name>","<baby_name>");
    *adopt(<parent_id>,<baby_id>);

    이 함수는 지정된 아기 캐릭터에게 클라이언트 채택 요청을 보냅니다. 부모 값은 어느
    쪽이든 상관 없습니다. 채송부모와 아기 모두 온라인 상태여야 채송이 가능합니다.

    반환 값:
    ADOPT_ALLOWED - 베이비 캐릭터에게 수락 또는 거부 메시지를 보냄.
    ADOPT_ALREADY_ADOPTED - 캐릭터가 이미 입양되었습니다.
    ADOPT_MARRIED_AND_PARTY - 부모는 결혼하고 베이비와 파티에 있어야 합니다.
    ADOPT_EQUIP_RINGS - 부모는 결혼반지를 장착해야 합니다.
    ADOPT_NOT_NOVICE - 베이비 캐릭터는 노비스여야 합니다.
    ADOPT_CHARACTER_NOT_FOUND - 부모 또는 베이비 캐릭터를 찾을 수 없습니다.
    ADOPT_MORE_CHILDREN - 하나의 베이비만 입양할 수 있습니다. (클라이언트 메시지)
    ADOPT_LEVEL_70 - 부모는 누군가를 입양하려면 최소 레벨 70이어야 합니다. (클라이언트 메시지)
    ADOPT_MARRIED - 결혼한 사람을 입양할 수 없습니다. (클라이언트 메시지)

    ---------------------------------------
    //
    4,3.- 결혼 관련 명령어 끝
    //
    ---------------------------------------

    *pcfollow <id>,<target id>;
    *pcstopfollow <id>;

    이 명령어는 특정 인물을 따르게 하거나 멈추게 합니다. 이 명령어는 @follow 명령어와 동일한
    기능을 합니다. 다른 점은 @follow는 캐릭터 이름을 사용할 수 있고, 이 명령어는 대상의
    계정 ID가 필요합니다.

    예제:
    // Aaron이 Bullah를 따르게 합니다. Aaron과 Bullah가 모두 온라인인 경우에만 작동합니다.
    pcfollow getCharID(3,"Aaron"),getCharID(3,"Bullah");

    // Aaron이 따르고 있는 상대방을 그만 따르게 합니다.
    pcstopfollow getCharID(3,"Aaron");

    ---------------------------------------

    *pcblockmove <id>,<option>;
    *unitblockmove <id>,<option>;

    옵션이 1인 경우 지정된 GID가 이동하지 못하도록하며, 옵션이 0인 경우 이동할 수 있도록합니다.
    이 명령은 지정된 GID가 0 인 경우에는 해당 단위에 대해서 실행됩니다.

    예제:
    // 현재 캐릭터가 움직이지 못하도록합니다.
    pcblockmove getcharid(3),1;

    // 캐릭터를 다시 이동할 수 있도록 합니다.
    pcblockmove getcharid(3),0;

    ---------------------------------------

    *pcblockskill <id>,<option>;
    *unitblockskill <id>,<option>;

    주어진 GID가 옵션을 1로 가지면 스킬 시전을 금지하고, 0으로 가지면 스킬 시전이
    가능하게 합니다. GID가 0인 경우 이 명령은 첨부된 유닛에 대해 실행됩니다.

    예제:
    // 현재 캐릭터가 스킬 시전을 할 수 없게 합니다.
    pcblockskill getcharid(3),1;
    // 현재 캐릭터가 다시 스킬 시전이 가능하도록 합니다.
    pcblockskill getcharid(3),0;

    ---------------------------------------

    *setpcblock <type>,<state>{,<account ID>};
    *getpcblock {<account ID>};

    'setpcblock' 명령은 플레이어가 <type>에 해당하는 행동을 현재 세션에서 수행하지 못하도록
    (<state>가 참인 경우) 금지하거나 다시 허용합니다(<state>가 거짓인 경우). 하나 이상의
    <type>을 추가하여 여러 개의 행동을 변경할 수 있습니다.

    <type> 값은 비트마스크로, <type>의 배수로 추가하여 플레이어의 행동을 변경할 수 있습니다.

    <state>가 참이면 행동이 차단되고, 거짓이면 다시 실행됩니다.

    'getpcblock' 명령은 현재 활성화된 차단 플래그의 비트마스크 값을 반환합니다.

    사용 가능한 <type>:
    PCBLOCK_MOVE 플레이어의 이동 금지
    PCBLOCK_ATTACK 플레이어의 공격 금지
    PCBLOCK_SKILL 플레이어의 스킬/아이템 스킬 사용 금지
    PCBLOCK_USEITEM 플레이어의 소비 아이템 사용 금지
    PCBLOCK_CHAT 플레이어의 글로벌/길드/파티/귓속말 메시지 전송 금지
    PCBLOCK_IMMUNE 플레이어가 몬스터의 공격을 받지 않게 합니다.
    PCBLOCK_SITSTAND 플레이어의 앉기/서기 금지
    PCBLOCK_COMMANDS 플레이어의 atcommand/charcommand 사용 금지
    PCBLOCK_NPCCLICK 플레이어가 NPC/상점/워프 클릭/터치 금지
    PCBLOCK_EMOTION 플레이어의 감정 사용 금지
    PCBLOCK_NPC NPC 상호작용 시뮬레이션입니다. 메시지 창이 없는 NPC에 유용합니다.
    PCBLOCK_MOVE|PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_COMMANDS
    |PCBLOCK_NPCCLICK의 합입니다.
    PCBLOCK_ALL 모든 플래그의 합입니다.

    예제:

    // 현재 플레이어를 몬스터로부터 무적 상태로 만듭니다 (@monsterignore와 동일).
    setpcblock PCBLOCK_IMMUNE, true;

    // 현재 플레이어 공격,스킬 사용 금지
    setpcblock PCBLOCK_ATTACK|PCBLOCK_SKILL, true;

    // 공격, 스킬, 아이템 사용을 다시 가능하게 합니다.
    setpcblock PCBLOCK_ATTACK|PCBLOCK_SKILL|PCBLOCK_USEITEM, false;

    // getpcblock 관련 확인
    if (getpcblock() & PCBLOCK_IMMUNE)
    mes "몬스터로부터 무적입니다!";

    if (getpcblock() & (PCBLOCK_MOVE|PCBLOCK_SITSTAND))
    mes ""걷거나 앉을 수 없습니다.";

    if ((getpcblock() & (PCBLOCK_ATTACK|PCBLOCK_SKILL)) == 0)
    mes "공격하고 스킬을 사용할 수 있습니다.";

    if (getpcblock() & PCBLOCK_CHAT)
    mes "채팅할 수 없습니다.";

    ---------------------------------------

    macro_detector({<account ID>});
    macro_detector({"<character name>"});

    이 명령은 호출된 캐릭터 또는 지정된 <account ID>/<character name>에
    대한 캡차 UI 도전을 표시합니다.

    예제:
    // getareaunits로 플레이어 영역을 수집하여 테스트합니다.
    // int 배열로 계정 ID를 작성합니다.
    .@num = getareaunits(BL_PC, "prontera", 150, 150, 160, 160, .@array[0]);

    mes "150x150과 160x160 사이의 프론테라 플레이어 수는 " + .@num + " 입니다.";
    mes "도전 대상 플레이어:";
    freeloop(1); // 리스트가 너무 커지면 사용
    for(.@i = 0; .@i < getarraysize(.@array); .@i++) {
    mes (.@i + 1) + " " + convertpcinfo(.@array[.@i], CPC_NAME);
    macro_detector .@array[.@i];
    }
    freeloop(0);
    end;

    ---------------------------------------

    ==================================
    |5.- 몬스터 /NPC 관련 명령어 |
    ==================================
    ---------------------------------------

    *monster "<맵 이름>",<x>,<y>,"<표시할 이름>",<몬스터 ID>,<수량>{,"<이벤트 레이블>",<크기>,<AI>};
    *monster "<맵 이름>",<x>,<y>,"<표시할 이름>","<몬스터 이름>",<수량>{,"<이벤트 레이블>",<크기>,<AI>};
    *areamonster "<맵 이름>",<x1>,<y1>,<x2>,<y2>,"<표시할 이름>",<몬스터 ID>,<수량>{,"<이벤트 레이블>",<크기>,<AI>};
    *areamonster "<맵 이름>",<x1>,<y1>,<x2>,<y2>,"<표시할 이름>","<몬스터 이름>",<수량>{,"<이벤트 레이블>",<크기>,<AI>};

    이 명령어는 특정 좌표에 <몬스터 ID> 또는 <몬스터 이름>을 가진 몬스터를 <수량>마리를
    지정한 맵에 소환합니다. 스크립트가 캐릭터에 의해 호출되면 특별한 "this"라는 <맵 이름>이
    명령에 사용될 수 있어, 호출된 캐릭터가 위치한 맵 이름을 인식합니다. 이 명령은 아이템
    스크립트에서도 사용할 수 있습니다.

    이미 설명한 것과 같이, 몬스터 ID는 해당 몬스터를 영구 소환하는데 사용되는 몬스터 ID와
    동일한 의미로 사용됩니다. 이 명령으로 소환된 몬스터는 사망시 다시 소환되지 않습니다.

    영구 몬스터 소환과 달리, 몬스터 ID가 -1인 경우 서버에서 데드 브랜치에 대한 구성에 따라 전체
    데이터베이스에서 무작위 몬스터가 선택됩니다. 이는 다른 종류의 비 영구적인 몬스터 소환에
    대해서도 작동합니다.

    이 명령어에서 유일하게 특별한 것은 이벤트 라벨(event label)로, 선택적인 매개변수입니다.
    이 라벨은 '<NPC 오브젝트 이름>::<라벨 이름>'과 같이 작성되며, 몬스터가 죽으면 해당
    NPC 오브젝트에서 지정된 라벨부터 스크립트를 실행합니다. 실행 중인 플레이어의 RID는
    죽인 캐릭터의 RID가 됩니다. 'killedrid' 변수는 죽은 몬스터의 Class(몬스터 ID)로 설정되며,
    'killedgid' 변수는 죽은 몬스터의 ID(고유 몬스터 게임 ID)로 설정됩니다.

    <size>는 다음중 하나입니다:
    Size_Small (0) (default)
    Size_Medium (1)
    Size_Large (2)

    <ai>는 다음중 하나입니다:
    AI_NONE (0) (default)
    AI_ATTACK (1) (attack/friendly)
    AI_SPHERE (2) (Alchemist skill)
    AI_FLORA (3) (Alchemist skill)
    AI_ZANZOU (4) (Kagerou/Oboro skill)
    AI_LEGION (5) (Sera skill)
    AI_FAW (6) (Mechanic skill)
    AI_WAVEMODE (7) Normal monsters will ignore attack from AI_WAVEMODE monsters

    monster "place",60,100,"Poring",1002,1,"NPCNAME::OnLabel";

    좌표가 0,0인 경우 몬스터는 맵의 임의의 위치에 스폰됩니다.

    'areamonster' 명령어는 'monster' 명령어와 거의 같은 방식으로 작동하지만 x1/y1-x2/y2로
    정의된 사각형 안에 몬스터를 스폰합니다.

    반환 값은 스폰된 몬스터의 게임 ID가 포함된 배열입니다. 스폰된 수에 따라 배열이
    $@mobid[]에 저장됩니다.

    간단한 몬스터 스크립트:

    <일반적인 NPC 오브젝트 정의. NPCNAME으로 호출한다고 가정>
    mes "[Summon Man]";
    mes "포링 사냥을 시작하시겠어요?";
    next;
    if (select("예:아니오") == 2) {
    mes "[Summon Man]";
    mes "나중에 다시 와주세요.";
    close;
    }

    // 10마리의 포링 소환
    // 좌표 0,0을 사용하면 임의의 위치에 스폰됩니다.
    monster "prontera",0,0,"퀘스트 포링",1002,10,"NPCNAME::OnPoringKilled";

    mes "[Summon Man]";
    mes "이제 내가 소환한 포링들을 모두 처치하세요.";
    close;

    OnPoringKilled:
    $PoringKilled++;
    if ($PoringKilled >= 10) {
    announce "Summon Man: 잘했어요. 모든 포링을 처치했군요!",3;
    $PoringKilled = 0;
    }
    end;

    더 많은 좋은 예제는 공식 2-1 또는 2-2 직업 퀘스트 스크립트를 참조하세요.

    ---------------------------------------

    *areamobuseskill "<map name>",<x>,<y>,<range>,<mob id>,<skill id>,<skill level>,<cast time>,<cancelable>,<emotion>,<target type>;
    *areamobuseskill "<map name>",<x>,<y>,<range>,<mob id>,"<skill name>",<skill level>,<cast time>,<cancelable>,<emotion>,<target type>;
    *areamobuseskill "<map name>",<x>,<y>,<range>,"<mob name>",<skill id>,<skill level>,<cast time>,<cancelable>,<emotion>,<target type>;
    *areamobuseskill "<map name>",<x>,<y>,<range>,"<mob name>","<skill name>",<skill level>,<cast time>,<cancelable>,<emotion>,<target type>;

    해당 명령어는 지정된 영역에 있는 모든 몬스터들에게 특정 스킬을 사용하도록 합니다.
    <mob id> 혹은 <mob name>은 몬스터의 아이디나 이름으로 지정하며,
    <map name>, <x>, <y>는 해당 지역의 중심을 지정하고 <range>는 그 중심에서 몇 칸 떨어진
    곳까지 영향을 미치게 할 지 정합니다. 스킬은 <skill id> 혹은 <skill name>으로 지정하며,
    <cast time>은 스킬 캐스팅에 걸리는 시간을 밀리세컨드 단위로 지정합니다.
    나머지는 해당되는 값을 지정하면 됩니다.

    <target type>은 다음중 하나입니다:
    0 = 자신
    1 = 몬스터가 현재 타겟으로 삼은 대상
    2 = 몬스터의 마스터
    3 = 랜덤타켓

    예제:

    // (155,188)을 중심으로 5x5 영역에 빛나는 식물 1마리 소환
    areamonster "prontera",153,186,157,190,"Shining Plant",1083,1;
    //빛나는 식물이 랜덤한 대상에게 레벨 10의 Cold Bolt 스킬을 시전
    areamobuseskill "prontera",155,188,2,1083,"MG_COLDBOLT",10,3000,1,ET_KEK,3;

    ---------------------------------------

    *killmonster "<map name>","<event label>"{,<type>};

    이 명령어는 이벤트 레이블이 지정된 'monster'나 'addmonster'로 소환된 모든 몬스터를 제거합니다.
    일반적으로 퀘스트 몬스터가 남아있는 경우 해당 퀘스트가 종료되면 사용됩니다.

    레이블로 "All"이 지정된 경우, 해당 지도에 대해 재생성 시간이 -1로 설정된 모든 몬스터
    (즉, 'monster' 또는 'areamonster' 스크립트 명령으로 소환된 모든 몬스터와 GM 명령으로
    소환된 모든 몬스터)가 이벤트 레이블 값과 관계없이 제거됩니다.

    r12876부터 killmonster는 선택적으로 type 인수를 지원합니다. type을 1로 설정하면 명령의
    결과로 사망한 모든 몬스터에서 "OnMyMobDead" 이벤트를 발생시킵니다.

    ---------------------------------------

    *killmonsterall "<map name>"{,<type>};

    이 명령어는 몬스터가 어떻게 소환되었는지나 그들의 종류와 상관없이 특정 맵에서 모든 몬스터를
    죽입니다. r12873 이후로 이 명령어의 동작이 약간 변경되었습니다. 이전 버전에서 몹 스폰
    명령어에서 라벨 동작을 수정하면 라벨이 없는 경우에도 이벤트가 실행되게 되어 이것을
    지원하기 위해 새로운 방법이 추가되었습니다.

    이전 방법을 사용하는 경우 라벨은 플레이어가 몬스터를 공격하거나 죽인 경우에만 트리거됩니다.
    이는 이전 스크립트와의 호환성이 깨지기 때문입니다. 그러나 새로운 라벨 유형을 이 명령어와
    함께 사용하려면 타입으로 1을 사용하면 됩니다. 다른 숫자는 인식되지 않습니다.

    ---------------------------------------

    *strmobinfo(<type>,<monster id>);

    이 함수는 데이터베이스에 있는 몬스터 레코드의 정보를 반환합니다.
    유효한 타입은 다음과 같습니다:
    몬스터가 없는 경우 0을 반환하거나, 요청한 몬스터의 이름인 경우 빈 문자열을 반환합니다.

    1 - 데이터베이스의 '영어 이름' 필드, 문자열
    2 - 데이터베이스의 '일본어 이름' 필드, 문자열
    그 외의 반환 값은 숫자입니다:
    3 - 레벨
    4 - 최대 HP
    5 - 최대 SP
    6 - 경험치 보상
    7 - Job 경험치 보상

    *mobcount("<map name>","<event label>")

    이 함수는 지정된 맵에서 특정 이벤트 레이블이 있는 모든 몬스터를 카운트하고, 찾을 수 없는 경우
    0을 반환합니다. 자연스럽게도, 'monster' 및 'areamonster' 스크립트 명령으로 스폰된 몬스터만
    비어 있지 않은 이벤트 레이블을 가질 수 있습니다.
    이벤트 레이블을 비어 있는 문자열로 전달하면 이벤트 레이블이 없는 몬스터의 총 수가 반환되며,
    영구적으로 스폰되는 몬스터도 포함됩니다. 동적 몹 시스템이 활성화된 경우, 실제로 플레이어가
    없는 맵에 대해 메모리에 몹을 유지하지 않으므로 0이 반환됩니다.
    이벤트 레이블이 "all"로 지정된 경우, 이벤트 레이블이 부착되어 있지 않은 모든 몬스터를 카운트
    합니다.

    맵 이름이 "this"로 지정된 경우, 호출하는 캐릭터가 위치한 맵이 사용됩니다.
    맵이 찾을 수 없거나 호출하는 것이 캐릭터가 아닌 경우 "this" 맵을 사용하는 경우 -1을 반환합니다.

    ---------------------------------------

    *clone "<map name>",<x>,<y>,"<event>",<char id>{,<master_id>{,<mode>{,<flag>,<duration>}}}

    이 명령은 다른 플레이어의 복사본인 몬스터를 생성합니다. 처음 네 가지 인수는 몬스터 스크립트
    명령과 동일한 용도를 합니다. <char id>는 복제할 플레이어의 캐릭터 ID입니다
    (플레이어는 온라인이어야 함). 만약 <master id>가 지정되면, 복제본은 그의 '슬레이브'가 됩니다.
    Master_id는 온라인 상태의 다른 캐릭터 ID여야합니다.

    모드는 복제본의 동작 방식을 결정하기 위해 지정될 수 있습니다. 그 값은 mob_db의 모드 필드에서
    사용되는 것과 동일합니다. 기본 모드는 공격적이며, 도와줌, 이동 가능하고, 공격 가능합니다.

    플래그는 현재 0 또는 1 일 수 있습니다. 0이면 복제본은 플레이어를 대상으로 하는 일반 몬스터이고,
    1이면 소환된 몬스터로 간주되어 다른 몬스터를 대상으로합니다. 기본값은 0입니다.

    지속 시간은 복제본이 자동으로 제거되기 전에 살아있는 시간을 지정합니다. 초 단위로 지정되며,
    제한이 없는 기본값은 0입니다.

    반환 값은 생성된 복제본의 몬스터 ID입니다. 명령이 실패하면 반환 값은 0입니다.

    ---------------------------------------

    *summon "monster name",<monster id>{,<Time Out>{,"event label"}};

    이 명령어는 몬스터를 소환합니다. ('monster' 명령어 설명 참조) 다른 명령어로 소환된 몬스터와
    달리, 소환된 몬스터는 소환한 캐릭터를 보호하기 위해 싸우도록 설정됩니다. 몬스터 이름과
    몹 ID는 'monster' 명령어에서 설명한 것과 동일한 규칙을 따르며, 해당 명령어에서 설명한
    예외를 제외하고도 동일합니다.

    'Call Homunculus' 스킬의 효과가 소환한 캐릭터를 중심으로 표시됩니다.

    타임아웃은 소환 시간을 밀리초 단위로 설정하며, 기본값은 60000 (1분)입니다. 또한 값 0은
    타이머를 기본값으로 설정하며, 무기한으로 생성할 수 없습니다. 이벤트 라벨이 지정된 경우,
    몬스터가 죽으면 'donpcevent' 명령어로 실행됩니다.

    반환 값은 소환된 몬스터의 게임 ID입니다.

    // 이 캐릭터를 위해 dead branch-style 몬스터를 소환합니다.
    summon "--ja--",-1;

    ---------------------------------------

    *addmonsterdrop <monster id>,<item id>,<rate>,{<steal protected>,{<random option group id>}};
    *addmonsterdrop "<monster name>",<item id>,<rate>,{<steal protected>,{<random option group id>}};
    *delmonsterdrop <monster id>,<item id>;
    *delmonsterdrop "<monster name>",<item id>;

    이 명령은 모든 일시적인 몬스터 드롭에 대해 추가 또는 삭제를 수행하며,
    몬스터 데이터베이스가 리로드되거나 서버가 종료되면 재설정됩니다.
    성공할 경우 true를 반환하고, 그렇지 않으면 false를 반환합니다.

    몬스터가 이미 지정된 아이템을 드롭하는 경우, 지정된 비율 (100 = 1%)로 드롭 비율이
    업데이트됩니다.

    <steal protected>가 true로 설정된 경우, TF_STEAL로부터 아이템이 보호됩니다 (기본값 false).
    <random option group id>는 주어진 무작위 옵션 그룹 ID로 아이템을 바인딩합니다 (기본값 0).
    ID는 db/[pre-]re/item_randomopt_group.yml에 정의된 것과 같이 유효해야 합니다.

    예제:
    // Owl Baron이 꿀을 80%의 비율로 드롭하게 만듭니다.
    addmonsterdrop 1295,518,8000;

    // Owl Baron이 나이프를 80%의 비율로 드롭하고, TF_STEAL로부터 보호되며,
    // 무작위 옵션 그룹 ID가 5로 지정됩니다.
    addmonsterdrop 1295,1202,8000,true,5;

    //Rybio에서 Executioner's Mitten을 삭제합니다.
    delmonsterdrop 1201,7017;

    ---------------------------------------

    *mob_setidleevent <GID>,<event>;

    이 명령은 주어진 <GID>를 가진 몬스터에 이벤트 레이블을 부착하여,
    <GID>가 비활성 상태일 때 실행됩니다.

    예제:
    monster "prontera",0,0,"Quest Poring",1002,1;
    mob_setidleevent $@mobid[0], "NPC NAME::OnIdle";
    end;

    OnIdle:
    mobchat getattachedrid(),0,0x00FF00,"I'm IDLE!";
    end;

    ---------------------------------------

    *disablenpc {"<NPC object name>"};
    *enablenpc {"<NPC object name>"};

    이 두 가지 명령어는 각각 지정된 이름으로 NPC 오브젝트를 비활성화하고 활성화합니다.
    비활성화된 NPC는 시야에서 사라지며 보통의 방법으로 트리거되지 않습니다. 'donpcevent'
    및 기타 트리거 명령을 통해 여전히 접근할 수 있는지는 확실하지 않지만 아마도 가능할
    것입니다. NPC 오브젝트 이름을 알고 있다면 워프 NPC도 비활성화할 수 있으며,
    이것은 맵을 절반은 걷는 것으로만 접근 가능하게 만드는 쉬운 방법입니다. 그런 다음
    'enablenpc'로 다시 활성화할 수 있습니다.

    또한 이러한 명령을 사용하여 NPC가 여러 위치 간을 전환하는 효과를 만들 수 있습니다.
    이것은 NPC를 실제로 이동시키는 것보다 더 나은 경우가 많습니다. 가시적인 부분과 숨은
    부분이 있는 하나의 NPC 오브젝트를 만들고 여러 개의 복사본을 만든 다음 하나를 제외한
    모든 복사본을 비활성화하면 됩니다.

    ---------------------------------------

    *hideonnpc {"<NPC object name>"};
    *hideoffnpc {"<NPC object name>"};

    이러한 명령은 실제로 비활성화되지 않았지만, 숨겨진/표시된 상태로 NPC 오브젝트를 지정할
    수 있습니다. 도적의 은신 스킬처럼 숨겨지지만 Ruwach 또는 Sight에서 감지되지 않습니다.

    현재 이러한 명령어는 의미가 없으며 'disablenpc'/'enablenpc'를 사용하는 것이 좋습니다.
    이 두 명령은 실제로 메모리에서 NPC 스프라이트 위치 및 관련 데이터를 사용하지 않을
    때 언로드합니다. 그러나 이 명령어는 일부 퀘스트 아이디어에 사용할 수 있습니다
    (숨겨져있는 NPC가 말하고 나타난 다음... 주변을 돌아다닐 수 있습니다).



    ---------------------------------------

    *unloadnpc "<NPC object name>";

    이 명령어는 NPC 오브젝트와 해당 복사본 모두를 완전히 언로드합니다.

    ---------------------------------------

    *duplicate "<NPC name>","<map>",<x>,<y>{,"<Duplicate NPC name>"{,<sprite>{,<dir>{,<xs>{,<xy>}}}}};

    이 명령어는 <map> 맵의 <x>/<y> 위치에 있는 <NPC name>을 복제합니다.
    만약 <Duplicate NPC name>, <sprite>, <dir>, <xs>, <ys> 중 하나가 제공되지 않은 경우,
    원래 NPC의 값을 사용합니다. 성공시 새로운 복제된 NPC의 고유 이름이 반환되며,
    실패시 빈 문자열이 반환됩니다.

    참고:
    복제된 NPC는 항상 원래 NPC와 동일한 NPC 변수를 가지게 됩니다.
    복제본 NPC 또는 원래 NPC의 NPC 변수를 편집하면 다른 NPC도 변경됩니다.

    ---------------------------------------

    *duplicate_dynamic("<NPC name>"{,<character ID>});

    이 명령어는 플레이어에 가까운 위치에 <NPC name>을 복제합니다. <character ID>가
    주어진 경우 해당 플레이어 근처에 복제합니다.
    성공시 새로운 복제된 NPC의 고유 이름이 반환되며, 실패시 빈 문자열이 반환됩니다.

    참고:
    복제된 NPC는 항상 원래 NPC와 동일한 NPC 변수를 가지게 됩니다.
    복제본 NPC 또는 원래 NPC의 NPC 변수를 편집하면 다른 NPC도 변경됩니다.

    ---------------------------------------

    *cloakonnpc {"<NPC object name>"{,<character ID>}};
    *cloakoffnpc {"<NPC object name>"{,<character ID>}};

    이 명령어들은 주어진 NPC 객체를 클로킹하거나 언클록킹합니다. 즉, 비활성화되지 않지만
    NPC 트리거 영역이 비활성화됩니다. 플레이어는 클로킹한 NPC와 상호작용 할 수 있습니다
    (NPC 클릭, 몬스터 이벤트 등).

    <character ID>가 지정되면 NPC는 해당 플레이어에게만 표시됩니다. 그렇지 않으면 영역
    내의 모든 플레이어에게 표시됩니다.

    ---------------------------------------

    *cloakonnpcself {"<NPC object name>"};
    *cloakoffnpcself {"<NPC object name>"};

    위와 동일한 명령이지만 첨부된 플레이어가 필요합니다. NPC는 첨부된 플레이어에게만 표시됩니다.

    ---------------------------------------

    *isnpccloaked {"<NPC object name>"{,<character ID>}};

    NPC가 첨부된 플레이어 또는 주어진 <character ID>에게 클로킹 한경우 true를 반환하고,
    그렇지 않으면 false를 반환합니다. 이것은 특정 캐릭터를 대상으로 할 때 cloakonnpc와
    함께 작동합니다

    ---------------------------------------

    *doevent "<NPC object name>::<event label>";

    이 명령은 지정된 NPC 객체에서 지정된 레이블에서 새로운 실행 스레드를 시작합니다.
    이 명령을 실행하는 스크립트의 실행이 중지되지 않으며 'doevent' 명령으로 호출된 이벤트는
    호출 스크립트가 종료될 때까지 실행되지 않습니다.
    doevent 호출에는 매개 변수를 전달할 수 없습니다.

    이 방법으로 호출된 NPC 객체의 스크립트는 'doevent'를 발행한 스크립트에서 활성화 된 RID로
    호출된 것처럼 실행됩니다. 따라서 RID가 연결되지 않으면 명령이 작동하지 않습니다.

    place,100,100,1%TAB%script%TAB%NPC%TAB%53,{
    mes "This is what you will see when you click me";
    close;
    OnLabel:
    mes "This is what you will see if the doevent is activated";
    close;
    }

    ....

    doevent "NPC::OnLabel";

    ---------------------------------------

    *donpcevent "<NPC object name>::<event label>";

    이 명령어는 다른 NPC 또는 여러 NPC 내의 이벤트 라벨 코드를 호출합니다.
    새로운 실행 인스턴스가 시작되며, 호출하는 NPC는 즉시 실행을 재개합니다.

    만약 제공된 이벤트 라벨이 "NpcName::OnLabel" 형식이면, 주어진 NPC의 이벤트 라벨만
    호출됩니다(다른 NPC로 'goto'하는 것과 같음). "::OnLabel" (NPC 이름 생략) 형식이면,
    해당 라벨을 가진 모든 NPC의 이벤트 코드가 하나씩 호출됩니다. 이 두 경우 모두, 호출된
    스크립트는 RID가 없는 상태로 실행되며, 호출 스크립트가 플레이어에게 연결되어 있는지
    여부에 상관없이 실행됩니다. 이벤트 라벨 이름은 "On"으로 시작해야 합니다.

    이 명령어는 다른 NPC가 동작하도록 만들 수 있습니다. 예를 들어, 감정을 사용하거나
    말하는 것처럼, 호출하는 NPC의 작업에 응답하는 것처럼 다른 NPC가 동작하게 만들 수 있습니다.

    place,100,100,1%TAB%script%TAB%NPC1%TAB%53,{
    mes "NPC2 copies my actions!";
    close2;
    donpcevent "NPC2::OnEmote";
    end;
    OnEmote:
    emotion rand(1,30);
    end;
    }

    place,102,100,1%TAB%script%TAB%NPC2%TAB%53,{
    mes "NPC1 copies my actions!";
    close2;
    donpcevent "NPC1::OnEmote";
    end;
    OnEmote:
    emotion rand(1,30);
    end;
    }

    두 NPC 중 어느 쪽이든 말을 걸면 두 NPC가 동시에 랜덤한 감정을 표현합니다.

    r16564부터 이 명령은 성공 또는 실패에 따라 1 또는 0을 반환하며, 이벤트가 트리거되지
    않은 경우 디버그 메시지가 콘솔에 표시됩니다.

    ---------------------------------------

    *cmdothernpc "<npc name>","<command>";

    이것은 간단히 "donpcevent <npc name>::OnCommand<command>" 입니다.
    이는 공식 서버 스크립트 언어 'cmdothernpc'의 근사치입니다.

    만약 명령어가 성공적으로 다른 NPC에서 실행되면 true를 반환하고, 그렇지 않으면
    false를 반환합니다.

    ---------------------------------------

    *npctalk "<message>"{,"<NPC name>",<flag>{,<color>}};

    이 명령어는 이를 실행하는 NPC 오브젝트가 플레이어로서 대화를 하는 것처럼 메시지를 표시합니다.
    메시지는 플레이어의 머리 위에 그리고 채팅 창에 나타납니다.
    메시지 앞에 NPC 오브젝트의 표시 이름이 추가되지 않습니다.
    만약 <NPC name> 옵션이 주어지고 비어있지 않으면 해당 NPC가 메시지를 표시합니다.
    그렇지 않으면 연결된 NPC가 메시지를 표시합니다.
    색상 형식은 RGB(0xRRGGBB)입니다. 색상은 기본적으로 흰색입니다.

    <flag> 옵션으로 지정할 대상:

    - bc_all : 채팅창을 통해 서버 전체에 메시지를 전송합니다.
    - bc_map : 해당 NPC와 같은 맵에 있는 모든 플레이어에게 메시지를 전송합니다.
    - bc_area : 기본값으로, 해당 NPC 주변 플레이어에게 메시지를 전송합니다.
    - bc_self : 메시지를 호출한 플레이어에게만 전송합니다.

    // 다음 예제는 호출한 캐릭터를 인사하는 NPC 메시지를 해당 지역에 있는 모든
    // 플레이어가 볼 수 있도록 전송합니다.
    npctalk "안녕하세요 " + strcharinfo(0) + "님, 어떻게 지내시나요?";

    ---------------------------------------

    *chatmes "<message>"{,"<NPC name>"};

    해당 명령어는 NPC가 대기실에서 대기중인 경우에만 대기실 채팅창에 메시지를 출력합니다.
    만약 <NPC 이름> 옵션이 제공된 경우 해당 NPC가 메시지를 출력하고, 그렇지 않은 경우
    NPC가 부착된 상태에서 메시지가 표시됩니다.

    // 대기실에 있는 모든 사람들이 이 메시지를 볼 수 있습니다.
    chatmes "5분 후 다음 경기가 시작됩니다.";
    ---------------------------------------

    *setnpcdisplay("<npc name>", "<display name>", <class id>, <size>)
    *setnpcdisplay("<npc name>", "<display name>", <class id>)
    *setnpcdisplay("<npc name>", "<display name>")
    *setnpcdisplay("<npc name>", <class id>)

    대상 NPC의 표시 이름과 / 또는 표시 클래스를 변경합니다.
    NPC가 존재하지 않는 경우 1을 반환하며 성공하면 0을 반환합니다.
    사이즈는 0 = normal , 1 = small, 2 = big 입니다.

    ---------------------------------------
    \\
    5,1.- 시관 관련 명령어
    \\
    ---------------------------------------

    *addtimer <ticks>,"NPC::OnLabel";
    *deltimer "NPC::OnLabel";
    *addtimercount <ticks>,"NPC::OnLabel";

    이 명령어들은 카운트다운 타이머를 생성, 제거, 지연하는 데 사용됩니다.
    'addtimer'를 사용하여 생성하고, 'deltimer'를 사용하여 제거하며, 'addtimercount'를 사용하여
    지연시킵니다. 세 가지 경우 모두 이벤트 라벨은 해당 타이머의 식별자입니다.
    타이머는 스크립트에 연결된 캐릭터 오브젝트에서 실행되며, 여러 인스턴스를 가질 수 있습니다.
    라벨이 실행되면 해당 플레이어가 NPC를 클릭한 것처럼 실행됩니다.

    타이머가 끝나면 지정된 NPC 오브젝트에서 지정된 라벨에서 새 실행 스레드가 시작됩니다.

    틱은 1/1000 초 단위로 지정됩니다.

    한 가지 더, 이러한 타이머는 플레이어 데이터의 일부로 저장됩니다. 플레이어가 로그아웃하면
    스크립트를 실행하지 않고 즉시 삭제됩니다.
    이러한 동작이 원하지 않는 경우 'sleep'와 같은 다른 타이머 메커니즘을 사용하십시오.

    예제:
    <NPC Header> {
    dispbottom "5초 타이머 시작...";
    addtimer 5000, strnpcinfo(3) + "::On5secs";
    end;
    On5secs:
    dispbottom "5초가 지났습니다!";
    end;
    }

    ---------------------------------------

    *initnpctimer{ "<NPC name>" {, <Attach Flag>} } |
    { "<NPC name>" | <Attach Flag> };
    *stopnpctimer{ "<NPC name>" {, <Detach Flag>} } |
    { "<NPC name>" | <Detach Flag> };
    *startnpctimer{ "<NPC name>" {, <Attach Flag>} } |
    { "<NPC name>" | <Attach Flag> };
    *setnpctimer <tick>{,"<NPC name>"};
    *getnpctimer(<type of information>{,"<NPC name>"})
    *attachnpctimer {"<character name>"};
    *detachnpctimer {"<NPC name>"};

    이 명령어와 함수 집합은 NPC 기반 타이머를 생성하고 관리합니다.
    NPC 이름은 생략될 수 있으며, 그 경우 호출하는 NPC가 대상으로 사용됩니다.

    한 NPC에서 다양한 타이머를 가지며 각각의 카운트다운과 레이블을 참조하는
    addtimer/deltimer 명령어와 달리, 'initnpctimer'는 NPC당 하나의 타이머만
    가질 수 있습니다. 그러나 많은 레이블을 트리거하고 이미 트리거 된 것과
    아직 트리거 되지 않은 것의 수를 알려줄 수 있습니다.

    이 타이머는 1/1000 초 단위로 증가하며 0에서 시작합니다. 이 타이머를 생성하면
    실행이 중지되지 않고 계속 진행됩니다. 그리고 타이머는 NPC 객체의 'OnTimer<time>:'
    레이블에서 새로운 실행 스레드를 호출합니다.

    타이머를 만들려면 'initnpctimer'를 사용하고 실행을 시작합니다.
    'stopnpctimer'는 현재 틱을 지우지 않고 타이머를 일시 정지하고,
    'startnpctimer'는 일시 정지한 타이머를 다시 시작합니다.

    기본적으로 타이머에는 RID가 연결되어 있지 않으며, 이를 통해 해당 플레이어가
    로그아웃해도 계속 진행됩니다. RID를 타이머에 연결하려면 'initnpctimer/startnpctimer'을
    사용할 때 옵션 "attach flag"를 사용하거나 'detachnpctimer'를 사용하여 수동으로 연결할 수
    있습니다.

    일반적으로 NPC당 하나의 타이머만 있지만, 플레이어를 타이머에 연결하는 경우
    플레이어별로 여러 개의 타이머를 실행할 수 있습니다. 이는 이러한 타이머가 NPC가 아닌
    플레이어에 저장되기 때문입니다.

    참고: 플레이어에 연결된 타이머를 얻으려면 타이머를 시작하기 전에 RID를 연결해야 합니다.
    그렇지 않으면 NPC 타이머가 유지됩니다(영향 없음).

    NPC 타이머에 연결된 플레이어가 로그아웃하면 해당 NPC의 "OnTimerQuit:" 이벤트 레이블이
    트리거되어 적절한 정리를 할 수 있습니다.

    'setnpctimer' 명령어는 타이머를 명시적으로 설정할 수 있습니다. 'getnpctimer'는 타이머 정보를
    제공합니다. 매개변수에 따라 다음과 같은 정보를 반환합니다.

    0 - 현재 타이머 틱 수를 반환합니다.
    1 - 대기 중인 "OnTimer<ticks>:" 레이블이 남아 있으면 1을 반환합니다.
    2 - 타이머가 트리거되어 "OnTimer<ticks>:" 레이블이 지정된 NPC에서 실행될
    횟수를 반환합니다.

    예제 1:

    <NPC Header> {
    // attachnpctimer 사용 필요. mes 명령문 때문에 RID를 붙여야 하기 때문입니다.
    attachnpctimer;
    initnpctimer;
    npctalk "지금은 대화 할 수 없어요, 10초만 주세요";
    end;
    OnTimer5000:
    npctalk "5초만 더 기다려주세요";
    end;
    OnTimer6000:
    npctalk "4";
    end;
    OnTimer7000:
    npctalk "3";
    end;
    OnTimer8000:
    npctalk "2";
    end;
    OnTimer9000:
    npctalk "1";
    end;
    OnTimer10000:
    stopnpctimer;
    mes "[Man]";
    mes "좋아, 이제 대화 할 수 있어요.";
    detachnpctimer;
    // NPC 타이머가 동작하지 않는 동안 attachnpctimer 및
    // detachnpctimer만 사용할 수 있음에 유의하십시오!
    }

    예제 2:

    OnTimer15000:
    npctalk "15초가 더 지났습니다.";
    // 'setnpctimer 0' 대신 'initnpctimer'를 사용해야합니다.
    // 이는 'setnpctimer 0' + 'startnpctimer'와 같습니다.
    // 또는 타이머가 멈추지 않도록 다른 'OnTimer15001' 레이블을 추가할 수도 있습니다.
    initnpctimer;
    end;

    // 이 OnInit 레이블은 스크립트가 로드될 때 즉시 실행되므로 서버가 시작될 때
    // 즉시 타이머가 초기화됩니다. NPC가 무언가 말할 때마다 0으로 돌아가므로
    // 계속해서 순환합니다.
    OnInit:
    initnpctimer;
    end;

    예제 3:

    mes "[Man]";
    mes "당신을 기다린지 " + (getnpctimer(0)/1000) + " 초가 지났습니다.";
    // 반환된 타이머를 1000으로 나누어 밀리초를 초로 변환합니다.
    close;

    예제 4:

    mes "[Man]";
    mes "좋아, 30초 더 시간을 주겠습니다...";
    close2;
    setnpctimer (getnpctimer(0)-30000);
    // 'close2'는 "메시지 상자 닫기" 명령어입니다. 만약 'next' 명령어가 있다면
    // 플레이어가 '다음' 버튼을 누르기 전까지 타이머가 변경되지 않습니다.
    end;

    ---------------------------------------

    *sleep {<milliseconds>};
    *sleep2 {<milliseconds>};
    *awake "<NPC name>";

    이 명령어들은 NPC의 일시 정지를 제어하기 위해 사용됩니다.
    sleep와 sleep2는 주어진 밀리초 동안 스크립트를 일시 정지합니다.
    Awake는 sleep를 취소하는 데 사용됩니다. NPC에 대해 awake가 호출되면,
    sleep 타이머가 끝난 것처럼 실행되어 스크립트가 계속됩니다.
    Sleep와 sleep2는 기본적으로 동일한 일을 수행하지만, sleep는 RID를 유지하지 않지만,
    sleep2는 유지합니다. 또한 sleep2는 유닛이 첨부되지 않은 경우 스크립트를 중지합니다.

    예제:
    sleep 10000; //스크립트를 10초 동안 일시 중지하고 RID를 버립니다
    //(따라서 더 이상 플레이어가 첨부되지 않음)
    sleep2 5000; //스크립트를 5초 동안 일시 중지하고 RID가 첨부된 채로 계속합니다.
    awake "NPC"; //NPC 'NPC'에서 실행중인 sleep 타이머를 취소합니다.

    ---------------------------------------

    *progressbar "<color>",<seconds>;

    이 명령어는 sleep2와 거의 유사하지만 캐릭터의 머리 위에 (시전 바와 같이) 진행 바를 표시합니다.
    지정된 시간이 지나면 스크립트가 다시 실행됩니다. 캐릭터가 진행 바가 진행되는 동안 움직이면
    진행이 중단되고 스크립트가 종료됩니다. 색상 형식은 RGB(0xRRGGBB)입니다. 클라이언트에서는
    색상이 무시되고 항상 초록색으로 표시됩니다.

    참고:
    Ragexe 클라이언트는 메시지 창이 여전히 열려있는 경우 무작위로 충돌하는 것으로 알려져
    있습니다. 가능하면 progressbar 명령어를 트리거하기 전에 모든 메시지 창을 닫도록 해주세요.

    ---------------------------------------

    *progressbar_npc "<color>",<seconds>{,<"NPC Name">};

    이 명령어는 progressbar와 비슷하지만, 현재 부착된 NPC의 머리 위에 진행 막대를 표시합니다.
    주어진 시간이 경과하면 스크립트가 재개됩니다. 색상 형식은 RGB (RRGGBB)입니다.
    현재 클라이언트에서는 색상이 무시되어 항상 녹색으로 나타납니다.

    ---------------------------------------
    //
    5,1.- 시간 관련 명령어 끝
    //
    ---------------------------------------

    *announce "<text>",<flag>{,<fontColor>{,<fontType>{,<fontSize>{,<fontAlign>{,<fontY>{,<char_id>}}}}}};

    이 명령어는 @kami/@kamib GM 명령어와 유사하게 모든 플레이어에게 메시지를 전달합니다.

    announce "모든 플레이어에게 노란색으로 표시되는 메시지입니다.",0;

    방송이 수신되는 대상, 방송의 송신원, 메시지가 표시되는 색상은 각각 플래그로 결정됩니다.

    플래그 값은 'src/map/script_constants.hpp' 파일에 상수로 코딩되어 있어 사용하기 쉽게 만들어졌습니다.

    타겟 flags:
    - bc_all: 서버 전체에 방송 메시지를 전송합니다 (기본값).
    - bc_map: 메시지가 송신된 대상과 동일한 지도에 있는 모든 플레이어에게 전송됩니다 (아래 참조).
    - bc_area: 근처 플레이어에게 메시지가 전송됩니다.
    - bc_self: 메시지가 현재 플레이어에게만 전송됩니다. 소스 플래그가 bc_pc 인 경우 캐릭터 ID가
    제공되면 해당 캐릭터에게도 메시지를 보낼 수 있습니다.
    대상 플래그는 하나 이상 사용할 수 없습니다.


    소스 flags:
    - bc_pc: 방송 송신원은 현재 스크립트에 연결된 플레이어 또는 캐릭터 ID(기본값)입니다.
    - bc_npc: 방송 송신원은 플레이어가 연결되지 않았거나 메시지를 NPC 근처
    플레이어에게 보내야하는 경우 NPC입니다.
    소스 플래그는 하나 이상 사용할 수 없습니다.

    스페셜 flags:
    - bc_yellow : 브로드캐스트가 노란색으로 표시됩니다(기본값).
    - bc_blue : 브로드캐스트가 파란색으로 표시됩니다.
    - bc_woe : 클라이언트 측에서 비활성화 할 수있는 "전쟁 상황"브로드캐스트임을 나타냅니다.
    스페셜 플래그는 bc_blue와 bc_woe를 동시에 설정할 수 없습니다

    옵션 파라미터를 사용하면 커스텀 색상, 폰트 두께, 크기 등으로 공지를 사용할 수 있습니다.
    옵션 파라미터 중 하나라도 사용하면 특수 플래그는 무시됩니다.
    게임 클라이언트에 따라 옵션 파라미터가 전혀 작동하지 않을 수도 있습니다.

    색상 파라미터는 16진수 표기법으로 표현 가능한 단일 숫자입니다.

    announce "이것은 녹색으로 모두에게 표시됩니다.",bc_all,0x00FF00;
    와 같이 사용하면 초록색으로 전체 공지가 표시됩니다. 색상 형식은 RGB(0xRRGGBB)입니다.

    공식 스크립트에서는 두 가지 폰트 두께만 사용됩니다.
    - normal (FW_NORMAL = 400, default),
    - bold (FW_BOLD = 700).

    기본 폰트 크기는 12입니다.

    플레이어에게 개인 메시지를 보내기 위해 이것을 사용하는 것은 아마 좋은 생각이 아닙니다.
    하지만 이것은 대신 NPC에서 공지를 "미리보기"할 때 사용될 수 있습니다.

    // 이것은 공지를 만든 NPC를 사용하는 플레이어에 대한 개인 메시지가 될 것입니다.
    announce "이것은 당신을 위한 메세지입니다.",bc_blue|bc_self;

    // 이것은 NPC에 시야 내에 있는 모든 사람들의 화면에 표시됩니다.
    announce "이것은 당신 주변에 있는 사람들에게 보내는 메세지입니다.",bc_npc|bc_area;

    // 이것은 캐릭터 ID 150000에 대한 개인 메시지가 될 것입니다.
    announce "이것은 캐릭터 id 150000에게 보내는 메세지입니다.",bc_self,0xFFF618,FW_NORMAL,12,0,0,150000;

    ---------------------------------------

    *mapannounce "<map name>","<text>",<flag>{,<fontColor>{,<fontType>{,<fontSize>{,<fontAlign>{,<fontY>}}}}}};

    이 명령어는 'announce'와 같이 작동하지만 특정 맵에 거주하는 캐릭터에게만 방송됩니다.
    플래그 및 선택적 매개변수는 'announce'와 동일하지만 대상 및 출처 플래그는 무시됩니다.

    ---------------------------------------

    *areaannounce "<map name>",<x1>,<y1>,<x2>,<y2>,"<text>",<flag>{,<fontColor>{,<fontType>{,<fontSize>{,<fontAlign>{,<fontY>}}}}}};

    이 명령어는 'announce'와 비슷하게 작동하지만, 지정된 맵의 지정된 x1/y1-x2/y2 사각형 내에
    있는 캐릭터들에게만 방송합니다. 플래그 및 선택적 매개 변수는 'announce'와 동일하지만
    대상 및 소스 플래그는 무시됩니다.

    areaannounce "prt_church",0,0,350,350,"신은 천국에 있으며, 세상 모든것이 잘될겁니다.",0;

    ---------------------------------------

    *callshop "<name>"{,<option>};

    이것은 동적 상점을 만드는 데 사용되는 일련의 명령어입니다.
    'callshop' 함수는 (view -1)로 표시되는 투명 상점을 호출하여 플레이어가 클릭한 것처럼 작동합니다.

    옵션은 다음과 같습니다:
    0 = 일반 창 (구매, 판매 및 취소) (기본값)
    1 = 구매 창
    2 = 판매 창

    참고: <option> 매개변수는 'shop' 타입 NPC에서만 작동합니다.

    이 명령으로 호출된 상점은 "OnBuyItem" 및 "OnSellItem" 라벨을 트리거합니다.
    (해당 NPC에서 npcshop* 명령이 실행되는 한, 아래 참고사항 참조)
    이러한 라벨을 사용하면 항목 구매 및 판매을 처리하는 방식을 대체하여 동적 상점을
    만들 수 있습니다.

    라벨 "OnBuyItem"은 다음 배열을 설정합니다:
    @bought_nameid - 구매 아이템 ID
    @bought_quantity - 구매 양

    라벨 "OnSellItem"은 다음 배열을 설정합니다:
    @sold_nameid - 판매 아이템 ID
    @sold_quantity - 판매 양
    @sold_refine - 아이템 제련수치
    @sold_attribute - 아이템이 손상되었는지 여부 (1: 손상, 0: 정상)
    @sold_identify - 아이템이 감정되었는지 여부 (1: 식별, 0: 미식별)
    @sold_enchantgrade - 인챈트 등급
    @sold_card1 - 카드 슬롯 1
    @sold_card2 - 카드 슬롯 2
    @sold_card3 - 카드 슬롯 3
    @sold_card4 - 카드 슬롯 4
    @sold_option_id1 - 랜덤 옵션 ID 1
    @sold_option_val1 - 랜덤 옵션 값 1
    @sold_option_param1 - 랜덤 옵션 파라미터 1
    @sold_option_id2 - 랜덤 옵션 ID 2
    @sold_option_val2 - 랜덤 옵션 값 2
    @sold_option_param2 - 랜덤 옵션 파라미터 2
    @sold_option_id3 - 랜덤 옵션 ID 3
    @sold_option_val3 - 랜덤 옵션 값 3
    @sold_option_param3 - 랜덤 옵션 파라미터 3
    @sold_option_id4 - 랜덤 옵션 ID 4
    @sold_option_val4 - 랜덤 옵션 값 4
    @sold_option_param4 - 랜덤 옵션 파라미터 4
    @sold_option_id5 - 랜덤 옵션 ID 5
    @sold_option_val5 - 랜덤 옵션 값 5
    @sold_option_param5 - 랜덤 옵션 파라미터 5

    참고: 이 라벨은 npcshop* 명령이 실행될 때만 트리거됩니다. 이 명령들은 마스터 명령어
    노드 (master_nd) 라는 특수 데이터를 상점 NPC에 설정하기 때문입니다.
    위의 라벨은 상점에서 주어진 마스터 명령어 노드를 가진 NPC에서 트리거됩니다.

    다이나믹 샵의 상세 예제는 doc/sample/npc_dynamic_shop.txt에서 찾을 수 있습니다.

    ---------------------------------------

    *npcshopitem "<name>",<item id>,<price>{,<item id>,<price>{,<item id>,<price>{,...}}};
    *npcshopitem "<name>",<item id>,<price>,<stock>{,<item id>,<price>,<stock>{,<item id>,<price>,<stock>{,...}}};

    기존 NPC 상점 또는 캐시샵의 내용을 덮어쓸 수 있는 명령입니다. 현재 판매 목록이 지워지며,
    지정된 가격으로만 판매할 아이템이 등록됩니다.

    함수는 상점이 성공적으로 업데이트되면 1을 반환하고, 찾을 수 없으면 0을 반환합니다.

    참고:
    - 기본 판매 가격을 지정하려면 -1을 사용할 수 없습니다!
    - 만약 현재 상점 타입이 market shop인 경우, 가격 뒤에 추가적인 매개변수
    <stock>이 존재합니다. 중복 항목을 추가하지 않도록 주의하세요!
    무제한 재고를 원하면 -1을 사용하세요.

    ---------------------------------------

    *npcshopadditem "<name>",<item id>,<price>{,<item id>,<price>{,<item id>,<price>{,...}}};
    *npcshopadditem "<name>",<item id>,<price>,<stock>{,<item id>,<price>,<stock>{,<item id>,<price>,<stock>{,...}}};

    이 명령어는 지정된 NPC 상점 또는 캐시 상점의 판매 목록 끝에 더 많은 아이템을 추가합니다.
    이미 판매 중인 아이템을 지정하면 해당 아이템은 판매 목록에 두 번 나타납니다.

    함수는 상점이 성공적으로 업데이트되면 1을 반환하고, 찾을 수 없으면 0을 반환합니다.

    참고:
    - 본 판매 가격을 지정하기 위해 -1을 사용할 수 없습니다!
    - 만약 현재 상점 타입이 market shop인 경우, 가격 뒤에 추가적인 매개변수
    <stock>이 존재합니다. 중복 항목을 추가하지 않도록 주의하세요!
    무제한 재고를 원하면 -1을 사용하세요.

    ---------------------------------------

    *npcshopdelitem "<name>",<item id>{,<item id>{,<item id>{,...}}};

    이 명령어는 지정한 NPC 상점이나 캐쉬샵에서 아이템을 제거하는데 사용됩니다.
    제거할 아이템이 상점에 여러 개 존재하는 경우, 모든 인스턴스가 제거됩니다.

    함수는 아이템이 제거되지 않은 경우에도 1을 반환합니다. 반환값은 상점이
    실제로 찾아졌는지 확인하기 위한 것입니다.

    ---------------------------------------

    *npcshopattach "<name>"{,<flag>};

    이 명령은 현재 스크립트를 주어진 NPC 상점에 연결합니다. 스크립트가 상점에 첨부되면,
    이벤트 "OnBuyItem"과 "OnSellItem"이 실행됩니다. 또한, @bought_nameid[],
    @bought_quantity[] 또는 @sold_nameid[]와 @sold_quantity[]와 같은 배열에
    구입/판매한 아이템과 수량이 채워집니다.

    옵션 매개변수는 상점에 첨부 ("1")할 것인지 또는 분리("0")할 것인지를 지정합니다.
    분리하면, 다른 스크립트에 첨부된 NPC가 있더라도 모두 분리됩니다. 첨부하는 경우,
    이미 연결된 스크립트를 덮어씁니다.

    이 함수는 상점을 찾을 수 없으면 0을 반환하고, 그렇지 않으면 1을 반환합니다.

    참고:
    - 첨부된 상점 유형이 market shop인 경우 'buy' 창을 기본으로 호출합니다.

    ---------------------------------------

    *npcshopupdate "<name>",<item_id>,<price>{,<stock>}

    상점에서 항목을 업데이트합니다. 가격이 0이면 변경되지 않습니다. 마켓 상점에서도
    사용 가능하며, 재고 수량을 업데이트할 수 있습니다. 무제한 재고는 -1을 사용합니다.
    다른 상점 유형의 경우 재고 값은 영향을 미치지 않습니다.

    ---------------------------------------

    *waitingroom "<chatroom name>",<limit>{,"<event label>"{,<trigger>{,<required zeny>{,<min lvl>{,<max lvl>}}}}};

    이 명령어는 현재 스크립트를 실행하는 NPC 오브젝트가 소유하는 채팅방을 생성합니다.
    NPC 스프라이트 위에 표시됩니다.
    채팅방 이름의 최대 길이는 60자입니다.

    최대 인원은 채팅방에 허용되는 최대 인원 수입니다.
    NPC가 이 숫자에 포함됩니다. 이 선택적 이벤트 및 트리거 매개 변수가 제공된 경우,
    인원수가 주어진 트리거 값에 도달할 때 'doevent'로 실행하는
    이벤트 레이블("<NPC object name>::<label name>")을 발생시킵니다.

    // NPC는 그냥 자신의 머리 위에 "Hello World"라고 쓴 상자를 표시할 것입니다.
    //클릭하면 아무 일도 일어나지 않습니다. 왜냐하면 한도가 0이기 때문입니다.
    waitingroom "Hello World",0;

    // NPC는 그의 머리 위에 상자를 가지고 있을 것입니다.
    // "Disco - 대기실"이라고 쓰여 있으며 8 개의 대기 슬롯이 있습니다. 클릭하면 플레이어가
    // 채팅방에 들어갈 수 있으며,플레이어는 7명의 플레이어가 축적될 때까지 대기할 수 있습니다.
    // 이것이 발생하면 NPC "Bouncer"가 레이블 "OnStart"를 실행합니다.

    waitingroom "Disco - 대기실",8,"Bouncer::OnStart",7;

    // NPC는 그의 머리 위에 상자를 가지고 있을 것입니다.
    // "파티 - 대기실"이라고 쓰여 있으며 8 개의 대기 슬롯이 있습니다.
    // 클릭하면 5000 제니와 50 ~ 99 레벨의 플레이어가 채팅방에 들어갈 수 있으며,
    // 플레이어는 7 명의 플레이어가 축적될 때까지 대기할 수 있습니다.
    // 이것이 발생하면 NPC "Bouncer"가 레이블 "OnStart"를 실행합니다.

    waitingroom "파티 - 대기실",8,"Bouncer::OnStart",7,5000,50,99;

    대기실을 만드는 것은 스크립트 실행을 중지하지 않으며 다음 줄로 계속 진행됩니다.

    더 많은 예제는 2-1 및 2-2 직업 퀘스트 스크립트에서 대기실을 광범위하게 사용하므로
    참고할 수 있습니다.

    ---------------------------------------

    *delwaitingroom {"<NPC object name"};

    이 명령은 대기실을 삭제합니다. 파라미터가 없는 경우, 이 명령을 실행하는 NPC 객체에
    연결된 대기실을 삭제하며, 그렇지 않은 경우 다른 NPC 객체가 소유한 대기실을
    삭제합니다. 이것이 대기실을 없애는 유일한 방법이며, 다른 방법으로는 없앨 수 없습니다.

    그러나 'disablenpc' 명령으로 NPC를 비활성화하는 경우 대기실이 어떻게 되는지는
    분명하지 않습니다.

    ---------------------------------------

    *enablewaitingroomevent {"<NPC object name>"};
    *disablewaitingroomevent {"<NPC object name>"};
    *enablearena;
    *disablearena;

    이 명령어는 대기방 이벤트를 활성화하거나 비활성화합니다( 'waitingroom' 참조).
    선택적으로 NPC 객체 이름을 지정하여 지정된 NPC 객체에 대해 수행할 수 있습니다.
    이 방식으로 활성화 및 비활성화하면 대화방이 사라지지 않으며 플레이어가 나가지 않습니다.
    대화방 이벤트를 활성화하면 즉시 사용자 수가 트리거 임계값을 초과했는지 확인하고
    이에 따라 이벤트를 트리거합니다.

    보통 대기방은 캐릭터 하나가 작업 퀘스트 트라이얼을 패스하려고 할 때
    다른 캐릭터가 방에 있어 스크립트가 혼란스러워지는 것을 방지하기 위해 생성됩니다.

    'enablearena'/'disablearena' 명령어는 매개변수가 없는 별칭입니다.
    이것들은 공식 서버 스크립트와의 호환성을 위해 남겨졌지만 현재 rAthena 스크립트에서는
    사용되지 않습니다.

    ---------------------------------------

    *getwaitingroomstate(<information type>{,"<NPC object name>"})

    이 함수는 연결된 대기실 또는 지정된 NPC에 연결된 대기실에 대한 정보를 반환합니다.

    유효한 정보 유형은 다음과 같습니다:

    0 - 현재 채팅 중인 사용자 수
    1 - 허용되는 최대 사용자 수
    2 - 대기실이 트리거가 설정되어 있으면 1을 반환합니다. 그렇지 않으면 0을 반환합니다.
    3 - 대기실이 현재 비활성화되어 있는 경우 1을 반환합니다. 그렇지 않으면 0을 반환합니다.
    4 - 대기실의 제목 (문자열)
    5 - 대기실의 비밀번호 (있는 경우). 현재 대기실에 비밀번호를 설정할 방법이 없기 때문에
    무의미합니다.
    16 - 대기실의 이벤트 이름 (문자열)
    32 - 대기실이 가득 찼는지 여부
    33 - 대기실에있는 사용자 수가 트리거 수보다 높은지 여부

    ---------------------------------------

    *warpwaitingpc "<map name>",<x>,<y>{,<number of people>};

    이 명령어는 이 명령을 실행하는 NPC 오브젝트에 연결된 대기실 채팅의 트리거 번호와 같은
    인원 수만큼의 캐릭터를 지정된 맵과 좌표로 이동시켜 대화방에서 추방합니다. 가장 오래
    기다린 사람부터 이동하게 됩니다. 동일한 맵에서 무작위 이동("Random") 및 세이브포인트로
    이동할 수도 있습니다.

    캐릭터 목록은 채팅방 멤버 목록에서 가져옵니다. 채팅방에 없는 캐릭터는 대상이 아니며,
    해당 NPC와 대화 중이더라도 고려되지 않습니다. 이동할 인원 수가 주어지면 해당 인원
    수만큼 인원을 이동시킵니다.

    이 명령어는 이동된 캐릭터의 계정 ID가 저장된 변수인 $@warpwaitingpc[]과 이동된
    캐릭터 수가 저장된 변수인 $@warpwaitingpcnum을 설정함으로써 이동된 캐릭터를
    추적할 수 있습니다. 이 변수들의 사용 방법에 대해서는 'getpartymember'를 참조하세요.

    예를 들어, 1대1 결투를 위해 대기실을 설정하고 무작위 PVP 맵으로 2명의 캐릭터를
    이동시키는 것이 가능합니다.

    ---------------------------------------

    *waitingroomkick "<NPC object name>" , "<character name>";

    이 명령어는 지정된 NPC에 연결된 대기실에서 주어진 캐릭터를 강제로 퇴장시킵니다.

    ---------------------------------------

    *getwaitingroomusers "<NPC object name>";

    이 명령어는 지정된 NPC의 대기실에 있는 모든 캐릭터를 가져와 그들의 계정 ID를
    .@waitingroom_users[] 배열에 저장합니다. 또한, 대기실에 있는 캐릭터 수를
    .@waitingroom_usercount 변수에 저장합니다.

    ---------------------------------------

    *kickwaitingroomall {"<NPC object name>"};

    이 명령어는 지정된 대기실 채팅에서 모든 사람을 퇴장시킵니다.

    ---------------------------------------

    *setmapflagnosave "<map name>","<alternate map name>",<x>,<y>;

    이 명령어는 지정된 맵에 'nosave' 플래그를 설정하고 대체 리스폰 지점을 설정합니다.

    이 명령어는 일반적으로 생각하는 것처럼 맵에서 세이브 포인트를 만들 수 없습니다.
    하지만 'savepoint' 명령어는 여전히 작동합니다. 이 명령어는 다시 연결된 플레이어를
    대체 좌표로 퇴장시킵니다.

    ---------------------------------------

    *setmapflag "<map name>",<flag>{,<zone>{,<type>}};

    이 명령어는 지도에 지도 플래그를 설정하여 지도의 동작을 변경합니다.
    지도 플래그의 전체 목록은 'src/map/script_constants.hpp'에 'mf_' 접두사를 사용하여 있으며,
    관련 설명은 'doc/mapflags.txt'에서 확인할 수 있습니다.

    지도 플래그는 이동 (mf_nomemo, mf_noteleport, mf_nowarp, mf_nogo), 접속 종료 시
    위치 저장 (mf_nosave), 데드 브랜치 사용 (mf_nobranch),
    죽음 시 패널티 (mf_nopenalty, mf_nozenypenalty),
    PVP 동작 (mf_pvp, mf_pvp_noparty, mf_pvp_noguild),
    워 오브 엠페러스(WoE) 동작 (mf_gvg, mf_gvg_noparty),
    스킬 또는 거래창 열기 (mf_notrade, mf_novending, mf_noskill, mf_noicewall),
    현재 날씨 효과 (mf_snow, mf_fog, mf_sakura, mf_leaves, mf_rain, mf_clouds, mf_fireworks) 및
    이 지도에서 밤이 적용되는지 여부(mf_nightenabled)와 같은 요소를 변경합니다.

    선택적 매개변수 <zone>은 'restricted' 지도 플래그에 대한 영역, 'nocommand'에
    대한 GM 레벨 우회, 'bexp'/'jexp'에 대한 기본/직업 경험치 및 'battleground'에
    대한 플래그를 설정하는 데 사용됩니다.

    'skill_damage' 맵플래그:
    - 여기서 플래그를 설정하면 맵 전역(모든 스킬)의 데미지가 조정됩니다.
    - <zone>는 스킬의 -100에서 100000의 데미지 조정 값입니다.
    - 다른 <type> 값은 'getmapflag'을 참조하십시오.

    'skill_duration' 맵플래그:
    - <zone>는 조정할 스킬 ID입니다.
    - <type>은 0에서 100000의 조정 백분율입니다.

    ---------------------------------------

    *removemapflag "<map name>",<flag>{,<zone>};

    이 명령어는 특정 맵에서 mapflag를 제거합니다. 맵플래그 목록은 'setmapflag'를 참조하세요.

    옵션 파라미터 'zone'은 제한된 맵플래그에서 존을 제거하는 데 사용됩니다.

    ---------------------------------------

    *getmapflag("<map name>",<flag>{,<type>})
    이 명령어는 주어진 맵 플래그의 상태를 확인하고 맵 플래그의 상태를 반환합니다.
    0은 꺼져 있음을 나타내고, 1은 켜져 있음을 나타냅니다. 맵 플래그의 목록은 'setmapflag'에서
    확인할 수 있습니다.

    MF_RESTRICTED의 경우 맵의 영역 값이 반환됩니다.

    'skill_damage' 맵 플래그에 사용된 선택적 매개 변수 'type' :
    SKILLDMG_MAX: 맵 플래그가 설정되어 있으면 (기본값)
    SKILLDMG_PC: 플레이어 대상 데미지
    SKILLDMG_MOB: 몬스터 대상 데미지
    SKILLDMG_BOSS: 보스 대상 데미지
    SKILLDMG_OTHER: 기타 대상 데미지
    SKILLDMG_CASTER: 시전자 유형

    ---------------------------------------

    *setbattleflag "<battle flag>",<value>{,<reload>};
    *getbattleflag("<battle flag>")

    이 명령어는 주어진 전투 플래그의 값을 설정하거나 반환합니다.
    전투 플래그는 battle / *.conf 파일에서 찾을 수 있는 플래그이며 Lupus의 변수 비율
    스크립트에서도 사용됩니다.
    재로드 값이 주어지면, 새로운 비율을 적용하기 위해 몬스터 데이터를 다시 로드하려고
    시도합니다. 이것은 EXP / 드롭 유형 구성에만 적용됩니다. 서버는 특정 구성만
    다시 로드하려고 시도합니다.

    예제:

    // 기본 경험치 비율을 20배(2000%)로 설정합니다
    // 몬스터 데이터는 서버 시작 시 이전 비율을 계속 사용합니다.
    setBattleFlag "base_exp_rate",2000;

    // 기본 경험치 비율을 20배(2000%)로 설정합니다
    // 몬스터 데이터가 새 값으로 다시로드됩니다.
    setBattleFlag "base_exp_rate",2000,true;

    // 기본 경험치 비율의 값을 반환합니다 (위 예제 사용 후 사용하면 2000을 출력합니다).
    mes getBattleFlag("base_exp_rate");

    ---------------------------------------

    *warpportal <source x>,<source y>,"<map name>",<target x>,<target y>;

    어콜라이트의 "워프 포탈" 스킬과 동일한 워프 포탈을 생성합니다.
    원본 좌표는 호출한 NPC의 맵에서 포탈 위치를 지정하며,
    대상 맵과 좌표는 포탈의 목적지를 결정합니다.

    예제:

    // NPC의 맵 좌표 150,150에 프론테라, 좌표 150,180으로 이어지는 워프 포탈을 생성합니다.
    warpportal 150,150,"prontera",150,180;

    ---------------------------------------

    *mapwarp "<from map>","<to map>",<x>,<y>{,<type>,<ID>};

    이 명령은 From 맵에 위치한 모든 캐릭터를 대량으로 수집하여 To map의 같은 지점으로
    전송하거나, 좌표가 0이면 거기에 무작위로 분산합니다. "Random"은 특별한 To map 이름으로
    이해되며 같은 맵의 모든 사람들을 무작위로 섞는 것을 의미합니다.

    옵션으로 유형과 ID를 지정할 수도 있습니다. 사용 가능한 유형은 다음과 같습니다.

    0 - 모두
    1 - 길드
    2 - 파티

    예제:

    // 길드 ID 63의 모든 멤버를 맵 prontera에서 맵 alberta로 이동시킵니다.
    mapwarp "prontera","alberta",150,150,1,63;

    ---------------------------------------
    \\
    5,2.- 길드관련 명령어
    \\
    ---------------------------------------

    *maprespawnguildid "<map name>",<guild id>,<flag>;

    이 명령어는 지정된 맵을 검사하고 찾은 각 플레이어와 몬스터에 대해 작업을 수행합니다.

    Flag는 비트 마스크입니다(원하는 효과를 얻으려면 숫자를 더합니다)
    1 - 모든 길드원을 그들의 세이브 포인트로 이동시킵니다.
    2 - 길드원이 아닌 모든 플레이어(길드 없는 플레이어 포함)를 그들의 세이브
    포인트로 이동시킵니다.
    4 - 수호자 또는 엠페리움이 아닌 모든 몬스터를 제거합니다.

    따라서 플래그 7은 '가디언과 엠페리움을 제외한 모든 몹을 제거하고 모든 캐릭터를
    퇴출시킵니다'를 의미하며, 이는 성 함락 후 공식 스크립트에서 수행하는 작업입니다.
    WoE 시작시 스크립트는 2(침입자 모두를 추방)를 수행합니다.

    예제로 배포된 WoE 스크립트를 확인하세요.

    ---------------------------------------

    *agitstart;
    *agitend;
    *agitstart2;
    *agitend2;
    *agitstart3;
    *agitend3;

    이명령은 War of Emperium FE, War of Emperium SE 또는 War of Emperium TE를
    시작하고 끝내는 명령어입니다.

    이 명령어는 듣기에는 복잡해 보이지만, 실제로는 매우 흥미로운 일은 하지 않습니다.
    대신 모든 'OnAgitStart:', 'OnAgitEnd:', 'OnAgitStart2:', 'OnAgitEnd2:', 또는
    'OnAgitStart3:' 및 'OnAgitEnd3:' 이벤트를 실행하도록 전체 서버에서 트리거를
    실행하는 데 사용됩니다. 후자 두 명령의 경우, 각각 시작시 및 종료시 이벤트가 모두
    실행됩니다. 이 명령은 복잡한 스크립트를 전체 서버에서 실행하기 위한 간단한
    트리거로 사용됩니다. 이 트리거는 시계에 의해 실행되며, 'OnClock<time>:'
    시간 트리거 라벨을 사용하여 실행됩니다.

    ---------------------------------------

    *gvgon "<map name>";
    *gvgoff "<map name>";

    These commands will turn GVG mode for the specified maps on and off, setting up
    appropriate map flags. In GVG mode, maps behave as if during the time of WoE,
    even though WoE itself may or may not actually be in effect.

    ---------------------------------------

    *gvgon3 "<map name>";
    *gvgoff3 "<map name>";

    이 명령어들은 gvgon/gvgoff와 완전히 동일하게 동작하지만 GVG_TE 맵플래그를 적용합니다.

    ---------------------------------------

    *flagemblem <guild id>;

    이 명령은 스프라이트 ID가 722 인 3D 길드 플래그 스프라이트를 가진 NPC 객체에서
    실행될 때만 작동합니다. 그렇지 않으면 데이터가 변경되지만 누구에게도 보이지 않습니다.
    이 명령이 그런 방식으로 호출되면, 지정된 길드의 엠블렘이 깃발에 나타납니다.
    그러나 현재 이를 지켜보는 플레이어가 있다면, 그들은 깃발에서 멀어져서 돌아올 때까지
    엠블렘의 변경 사항을 볼 수 없습니다.

    이는 일반적으로 공식 길드전 스크립트에서 길드 ID를 반환하는 함수 호출과 함께 사용됩니다:

    // 이 명령은 "guildcastle"를 소유한 길드의 엠블렘을 깃발에 나타내게 됩니다.
    flagemblem GetCastleData("guildcastle",1);

    ---------------------------------------

    *guardian "<map name>",<x>,<y>,"<name to show>",<mob id>{,"<event label>"{,<guardian index>}};

    이 명령어는 'monster'와 거의 동등하지만 성문 가디언와 함께 사용하도록 설계되었으며
    이들 가디언과만 작동합니다. 성을 투자한 값에 따라 가디언의 특성을 설정하고, 가디언이
    필요로 하는 것들을 설정합니다.

    r12524부터:
    'mob id'가 지정되지 않은 경우 일시적인 가디언를 생성합니다.
    일시적인 가디언은 성과 함께 저장되지 않으며 guardianinfo에서 액세스할 수 없습니다.
    성문 수호자를 생성하고 mob id를 반환합니다. 오류가 발생하면 0을 반환합니다.

    ---------------------------------------

    *guardianinfo("<map name>", <guardian number>, <type>);

    이 함수는 특정 가디언에 대한 다양한 정보를 반환합니다. 오류가 발생하면 -1이 반환됩니다.
    이 함수는 주로 성채 관리자 NPC에서 사용됩니다.

    지도 이름과 수호자 번호 (0에서 7 사이 값)는 대상을 정의합니다. 유형은 반환할 정보를 나타냅니다:
    0 - 가시성 (수호자가 설치되었는지 여부)
    1 - Max HP
    2 - 현재 HP

    ---------------------------------------

    *getguildalliance(<guild id1>, <guild id2>);

    주의: 이 명령어는 맵 서버가 캐릭터 서버에 정보를 요청해야 하므로 'requestguildinfo'와 함께
    사용해야합니다.

    반환 값:
    -2 - 길드 ID1이 존재하지 않음
    -1 - 길드 ID2가 존재하지 않음
    0 - 두 길드 모두 관계가 없거나 길드 ID가 제공되지 않음
    1 - 두 길드가 동맹 관계에 있음
    2 - 두 길드가 적대 관계에 있음

    ---------------------------------------
    //
    5,2.- 길드관련 명령어 끝
    //
    ---------------------------------------

    *npcspeed <speed value>;
    *npcwalkto <x>,<y>;
    *npcstop;

    이 명령어들은 NPC 객체가 지도에서 움직일 수 있게 만드는 명령어입니다. 현재 버그가 있어,
    NPC가 지도에서 무작위로 움직이는 것 이외에는 별로 유용하지 않습니다.

    'npcspeed' 명령어는 NPC의 걷는 속도를 지정된 값으로 설정합니다. @speed GM 명령어와
    마찬가지로, 200은 가능한 가장 느린 속도를 의미하고, 0은 가능한 가장 빠른 속도(즉시 이동)를
    의미합니다. 100은 캐릭터 걷기 속도의 기본값입니다.

    'npcwalkto' 명령어는 NPC 스프라이트가 현재 있는 지도에서 지정된 좌표로 이동을 시작합니다.
    NPC가 이동을 시작한 후 즉시 다음 스크립트 단계가 진행됩니다.

    'npcstop' 명령어는 NPC의 이동을 중지합니다.

    NPC가 이동 중인 동안, 그 NPC를 클릭할 수는 있지만, 이를 클릭하면 NPC의 이동이 멈추며,
    클라이언트가 속도와 이동 좌표를 기반으로 계산한 좌표와 다른 좌표가 되므로 이는 상당히
    불안정한 효과를 가져옵니다.

    걷는 애니메이션을 갖는 NPC 스프라이트는 일부에 불과하며, 이러한 애니메이션을 갖는
    NPC 스프라이트는 NPC를 이동시키면 애니메이션이 작동하지 않으며, NPC 이동 코드의
    문제 때문에 좀 어색합니다. 이 명령어는 'db/mob_avail.yml'에서 직업 스프라이트 기반의
    스프라이트 ID를 정의함으로써 더 나은 결과를 얻을 수 있습니다.

    ---------------------------------------

    *movenpc "<NPC name>",<x>,<y>{,<dir>};

    이 명령어는 NPCWalkToxy 함수와 유사하지만 약간 다릅니다.

    NPCWalkToXY는 주어진 좌표로 NPC가 '걷도록' 만드는 것입니다. 그러나 경로가
    일직선이 아니거나 객체가 있으면 문제가 발생할 수 있습니다. 이 명령어는 NPC를
    이동시킵니다. 현재 위치와 주어진 위치에서 '순간이동'하는 것입니다. 방향은 NPC의
    면을 변경하는 데 사용할 수 있습니다.

    예제:

    // 이 예제는 Bugga를 이전 좌표에서 100,20의 새 좌표로 이동합니다(유효한 좌표인 경우).
    moveNPC "Bugga",100,20;

    ---------------------------------------

    =====================
    |6.- 기타명령어 |
    =====================
    ---------------------------------------

    *debugmes "<message>";

    이 명령어는 디버그 메시지를 서버 콘솔(맵 서버 창)에 보냅니다. 이 메시지는 다른 곳에는
    표시되지 않습니다.

    // "NAME has clicked me!" 라는 디버그 메시지를 맵 서버 창에 표시합니다.
    debugmes strcharinfo(0) + " has clicked me!";

    ---------------------------------------

    *errormes "<message>";

    이 명령은 서버 콘솔 (맵 서버 창)에 오류 메시지를 전송합니다. 다른 곳에서는 표시되지 않습니다.

    // "NAME has clicked me!" 메시지를 맵 서버 창에 표시합니다.
    errormes strcharinfo(0) + " has clicked me!";

    ---------------------------------------

    *logmes "<message>";

    이 명령어는 주어진 메시지를 맵 서버 NPC 로그 파일에 씁니다. 로그 파일은
    'conf/log_athena.conf'에서 지정된 대로 설정됩니다. TXT 버전의 서버에서 로그 파일은
    기본적으로 'log/npclog.log'입니다. SQL 버전에서는 SQL 로깅이 활성화되어
    있으면 메시지가 'npclog' 테이블로 전달되고, 그렇지 않으면 동일한 로그 파일로 전달됩니다.

    로그가 활성화되어 있지 않으면 아무 일도 일어나지 않습니다.

    ---------------------------------------

    *globalmes "<message>"{,"<NPC name>"};

    모든 현재 접속한 캐릭터의 채팅 창에 메시지를 보냅니다.

    NPC 이름이 지정된 경우, 해당 이름을 가진 NPC가 보낸 것처럼 메시지가 전송됩니다.
    NPC의 표시 이름은 메시지 앞에 추가되지 않습니다.

    ---------------------------------------

    *rand(<number>{,<number>});

    이 함수는 숫자를 반환합니다...
    (숫자를 하나 지정하면) ... 0부터 지정한 숫자 -1 사이에서 무작위로 선택합니다.
    (숫자를 두 개 지정하면) ... 두 숫자 사이에서 무작위로 선택합니다.

    rand(10)는 0,1,2,3,4,5,6,7,8 또는 9 중 하나를 반환합니다.
    rand(0,9)는 0,1,2,3,4,5,6,7,8 또는 9 중 하나를 반환합니다.
    rand(2,5)는 2,3,4 또는 5 중 하나를 반환합니다.

    ---------------------------------------

    *viewpoint <action>,<x>,<y>,<point number>,<color>{,<Char ID>};

    이 명령은 호출된 캐릭터에 연결된 클라이언트 미니 맵에 장소를 표시합니다. 이는 메인 맵의
    일반적인 X와 Y 좌표를 사용합니다. 마크의 색상은 16진수 숫자를 사용하여 정의되며,
    'mes' 출력에서 텍스트를 색상 지정하는 데 사용되는 것과 동일한 방법으로 C에서 16진수로
    쓰여집니다 (0x<여섯자리 숫자>로 보입니다).

    'Action'은 지점에서 수행할 작업입니다. 1은 마크를 설정하고, 2는 마크를 지웁니다.
    0은 마크를 설정하지만 15초 후 자동으로 제거합니다. 'Point number'는 포인트 번호이며,
    여러 개를 가질 수 있습니다. 동일한 좌표에 여러 개의 포인트가 그려지면, 깜빡이는 마크를
    만들 수 있습니다.

    // 이 명령은 좌표 X 30 Y 40에 표식을 표시하며, 마크 번호는 1이며, 빨간색으로
    // 표시됩니다.
    viewpoint 1,30,40,1,0xFF0000;

    이렇게 하면 세 개의 지점이 생성됩니다.

    viewpoint 1,30,40,1,0xFF0000;
    viewpoint 1,35,45,2,0xFF0000;
    viewpoint 1,40,50,3,0xFF0000;

    이것은 그것들을 제거하는 방법입니다.

    viewpoint 2,30,40,1,0xFF0000;
    viewpoint 2,35,45,2,0xFF0000;
    viewpoint 2,40,50,3,0xFF0000;

    클라이언트는 마크를 완전히 처리합니다. 서버는 마크가 설정된 위치를 기억하지 않습니다.

    ---------------------------------------

    *viewpointmap "<map name>",<action>,<x>,<y>,<point number>,<color>;

    이 명령은 현재 정의된 맵에 있는 모든 플레이어의 미니맵에 마크를 표시합니다. 주어진 맵의
    일반적인 X 및 Y 좌표를 사용합니다. 마크의 색상은 'mes' 출력에서 사용되는 것과 동일한
    16진수 번호를 사용하지만 C에서 16진수 번호로 씁니다. (0x <6자리 숫자>와 같습니다.)

    Action은 포인트에 대해 수행 할 작업입니다. 1은 설정하고 2는 지웁니다. 0은 설정하지만
    15초 후 자동으로 포인트를 제거합니다. 포인트 번호는 포인트 번호입니다. 여러 개의 포인트가
    동일한 좌표에 그려지면 사이클링됩니다.

    // 이 명령은 좌표 X 30 Y 40에서 마크를 표시하며 마크 번호는 1이며 빨강색입니다.
    viewpointmap "prontera",1,30,40,1,0xFF0000;

    이것은 세 개의 포인트를 생성합니다.
    .@map$ = "prontera";
    viewpointmap .@map$,1,30,40,1,0xFF0000;
    viewpointmap .@map$,1,35,45,2,0xFF0000;
    viewpointmap .@map$,1,40,50,3,0xFF0000;

    그리고 이것은 그것들을 제거하는 방법입니다.
    .@map$ = "prontera";
    viewpointmap .@map$,2,30,40,1,0xFF0000;
    viewpointmap .@map$,2,35,45,2,0xFF0000;
    viewpointmap .@map$,2,40,50,3,0xFF0000;

    클라이언트는 포인트에 대해 수행 할 작업을 전적으로 결정합니다. 서버는 포인트가 설정된
    위치에 대한 기억을 전혀 유지하지 않습니다.

    ---------------------------------------

    *cutin "<filename>",<position>;

    이 명령어는 현재 연결된 클라이언트에게 일러스트, 즉 일반적으로 NPC 일러스트인 컷인을
    표시합니다. 위치 매개변수는 일러스트의 배치를 결정하며 다음과 같은 값을 사용합니다:

    0 화면 좌측 하단
    1 화면 중앙 하단
    2 화면 우측 하단
    3 빈 제목 표시줄이 있는 이동 가능한 창에서 화면 중앙에 위치
    4 창 제목이 없는 화면 중앙에 위치하지만 이동 가능
    255 표시 중인 모든 컷인 삭제

    이미지는 data\texture\유저인터페이스\illust에서 GRF 아카이브와 데이터 폴더에서 읽혀지며
    비트맵이어야합니다. 파일 확장자 .bmp는 생략할 수 있습니다. 자홍색(#ff00ff)은 투명으로
    처리됩니다. 클라이언트는 일러스트 크기에 대한 제한이 없지만, 대형 이미지(약 700x700 이상)를
    로드하면 클라이언트가 잠시 멈추는 랙이 발생합니다. 일반적으로 일러스트 크기는 약 320x480
    정도입니다. 새 일러스트를 추가하려면 위의 위치에 새 파일을 넣으면됩니다.

    클라이언트는 한 번에 하나의 컷인만 표시 할 수 있으며 새로운 컷인이 표시되면 이전 컷인은
    사라집니다. 현재 표시된 일러스트를 새로운 일러스트 없이 삭제하려면 빈 파일 이름과 위치 255를
    사용해야합니다.

    // 코모도 카프라 일러스트를 오른쪽 아래 모서리에 표시합니다.
    cutin "kafra_07",2;

    // 플레이어와 대화하는 동안 일러스트를 표시한 스크립트를 일반적인 방법으로
    // 종료합니다.
    mes "See you.";
    close2;
    cutin "",255;
    end;

    ---------------------------------------

    *emotion <emotion number>{,<target>};

    이 명령은 개체가 감정 스프라이트를 자신 위에 나타내도록합니다. 전체 감정 번호 목록은
    'src/map/script_constants.hpp'에서 'ET_' 아래를 참조하십시오. ET_QUESTION(물음표)과
    ET_SURPRISE(느낌표)같이 명확하지 않은 것들도 있습니다.

    선택적인 대상 매개변수는 머리 위의 감정을받을 대상을 지정합니다. 대상 Game ID (GID)를
    사용하십시오.

    ---------------------------------------

    *misceffect <effect number>;

    이 명령은 스프라이트가있는 NPC 개체에서 실행되면 지정된 효과 번호를 호출하여 NPC
    스프라이트를 중심으로합니다. 실행 중인 코드가 개체 ID ( '부유' NPC)를 가지지 않거나
    전혀 NPC 개체에서 실행되지 않는 경우 (항목 스크립트), 효과는 스크립트에 첨부 된 RID를
    가진 캐릭터를 중심으로합니다. 사용 가능한 아이템 스크립트의 경우이 명령은 항목을
    사용하는 플레이어를 중심으로하는 효과를 만듭니다.

    알려진 효과의 전체 목록은 'doc/effect_list.txt'에서 찾을 수 있습니다. 실제로 작동하는
    효과 목록은 클라이언트 버전에 따라 크게 다를 수 있습니다.

    ---------------------------------------

    *soundeffect "<effect filename>",<type>;
    *soundeffectall "<effect filename>",<type>{,"<map name>"}{,<x0>,<y0>,<x1>,<y1>};

    이 두 개의 명령어는 호출된 캐릭터에게 ('soundeffect') 또는 여러 캐릭터에게 ('soundeffectall')
    효과음을 재생합니다. 실행중인 코드에 오브젝트 ID가 없는 경우 ( '플로팅' NPC) 또는 전혀
    NPC 오브젝트에서 실행되지 않는 경우 (아이템 스크립트) 소리는 스크립트에 첨부된 RID를
    가진 캐릭터를 중심으로 재생됩니다. 그렇지 않으면 해당 오브젝트 (NPC 스프라이트)를 중심으로
    재생됩니다.

    효과 파일 이름은 GRF의 파일 이름입니다. .wav 확장자를 가져야합니다.

    'type'이 실제로 무엇을 하는지는 분명하지 않으며 직접 클라이언트로 전송됩니다. 아마도 어느
    디렉토리에서 효과를 재생할지 결정할 것입니다. 숫자를 0으로 지정하면 '\data\wav'에서
    사운드 파일을 재생하지만, 다른 숫자에서 읽을 위치는 불분명합니다.

    효과음 파일 자체는 PCM 형식이어야하며 파일 이름은 .wav 확장자를 포함하여
    최대 23 자여야합니다.

    soundeffect "1234567890123456789.wav", 0; // 이 명령은 효과음을 재생합니다.
    soundeffect "12345678901234567890.wav", 0; // gravity 에러 발생

    이러한 방식으로 직접 새로운 효과음 파일을 추가할 수 있습니다.

    ---------------------------------------

    *playBGM "<BGM filename>";
    *playBGMall "<BGM filename>"{,"<map name>"{,<x0>,<y0>,<x1>,<y1>}};

    이 두 개의 명령어는 호출된 캐릭터만을 대상으로 배경 음악을 재생하거나, 여러 캐릭터를 대상으로
    배경 음악을 재생합니다.

    BGM 파일 이름은 /BGM/ 폴더에 저장된 파일 이름입니다. .mp3 확장자를 사용해야 합니다.

    확장자를 생략하고 파일 이름만 사용할 수 있습니다.
    좌표가 지정되지 않은 경우, BGM은 맵 전체에 플레이됩니다. 만약 맵 이름도 지정되지 않은 경우
    서버 전체에 BGM이 재생됩니다.

    이러한 방식으로 직접 새로운 BGM 파일을 추가할 수 있습니다.

    ---------------------------------------

    *pvpon "<map name>";
    *pvpoff "<map name>";

    이 명령어들은 지정된 맵에서 PVP 모드를 켜고 끕니다. 'setmapflag'에서 설정된 플래그를
    설정하는 것 외에도, 'pvpon'은 PVP 타이머와 랭킹도 생성합니다. @pvpon GM 명령어와
    같은 기능을 합니다.

    ---------------------------------------

    *atcommand "<command>";

    이 명령어는 GM 레벨이 99인 계정에 속한 플레이어가 키보드에서 직접 입력한 것처럼 주어진
    명령줄을 실행합니다.

    // 이것은 invoker에게 캐릭터 이름을 요청하고, 그들을 무참하게 죽이는
    // '@nuke' GM 명령을 사용합니다.
    input .@player$;
    atcommand "@nuke " + .@player$;

    'bindatcmd'를 사용하여 바인드된 atcommands의 경우, 이 명령은 스크립트에 바인드된
    atcommand가 아닌 원래 atcommand를 실행합니다.

    ---------------------------------------

    *charcommand "<command>";

    이 명령어는 GM 레벨 99를 가진 계정에 속한 캐릭터처럼 입력된 명령어 라인을 실행합니다.
    rid가 첨부되어 있지 않아도 명령어를 실행할 수 있습니다.

    // 이 명령어는 위와 동일하게 동작하지만, 이제는
    // 기본적으로 플레이어가 첨부되어 있지 않습니다.
    charcommand "#option 0 0 0 Roy";

    *bindatcmd "<command>","<NPC object name>::<event label>"{,<atcommand level>,<charcommand level>};

    이 명령어는 NPC 이벤트 라벨을 atcommand에 바인딩합니다. atcommand 실행시, 사용자는
    NPC 이벤트 라벨을 호출합니다. 각각의 atcommand는 하나의 바인딩만 허용됩니다.
    바인딩을 다시하면 원래의 바인딩을 덮어쓰게 됩니다.
    참고: atcommand의 기본 레벨은 0이고 charcommand의 기본 레벨은 100입니다.

    이 명령어는 실행 시 다음 변수가 설정됩니다
    .@atcmd_command$ = 사용된 @명령어의 이름
    .@atcmd_parameters$[] = 인덱스 0부터 시작하는 주어진 매개 변수의 배열
    .@atcmd_numparameters = 정의된 매개 변수 수

    예제:

    사용자가 "@test" 명령어를 입력하면 천사 이펙트가 표시됩니다

    - script atcmd_example -1,{
    OnInit:
    bindatcmd "test",strnpcinfo(3) + "::OnAtcommand";
    end;
    OnAtcommand:
    specialeffect2 EF_ANGEL2;
    end;
    }

    ---------------------------------------

    *unbindatcmd "<command>";

    이 명령은 NPC 이벤트 라벨에서 atcommand를 바인딩 해제합니다.

    ---------------------------------------

    *useatcmd "<command>";

    이 명령은 RID가 첨부 된 경우 스크립트 바인딩 atcommand를 실행합니다. 제공된 명령이
    스크립트에 바인딩되어 있지 않은 경우이 명령은 'atcommand'와 같이 작동하며 소스 정의
    명령을 실행하려고 시도합니다.

    이렇게 스크립트 바인딩 된 atcommand를 호출 할 때 .@atcmd_ ***** 변수 세 개가
    설정되지 않습니다.

    ---------------------------------------

    *camerainfo <range>,<rotation>,<latitude>{,<char id>};

    이 명령은 클라이언트의 카메라 정보를 주어진 값으로 업데이트합니다. 클라이언트는 첨부된
    캐릭터 또는 char id 매개 변수로 지정된 플레이어 일 수 있습니다.
    참고 : 2016-05-25aRagexeRE 이상이 필요합니다.

    주어진 값은 부동 소수점 수로 전송되며 100으로 나눕니다.

    range 카메라의 줌 팩터입니다.
    기본값 : 완전히 확대 된 경우 230000 (230.0)
    최대값 : 완전히 확대 된 경우 400000 (400.0)

    rotation 카메라의 회전입니다.
    기본값 : 회전이 적용되지 않은 경우 0 (0.0)
    최대값 : 완전히 회전 된 경우 360000 (360.0°)

    latitude 카메라의 각도입니다.
    기본값 : -50000 (-50.0)
    최대값 : -75000 (-75.0)

    ---------------------------------------

    *refineui({<char id>})

    대상 플레이어나 지정된 캐릭터 ID에 대해 제련 UI를 엽니다.

    이 기능은 2016-10-12aRagexeRE 이상을 필요로합니다.

    ---------------------------------------

    *openstylist({<char id>})

    대상 플레이어나 지정된 캐릭터 ID에 대해 스타일리스트 UI를 엽니다.

    이 기능은 2015-11-04 이상의 패킷 버전을 필요로합니다.

    ---------------------------------------

    *laphine_synthesis({<item id>})
    *laphine_synthesis({<"item name">})

    대상 플레이어에 대해 <item ID> 또는 <item name>의 라핀 합성 UI를 엽니다.
    아이템 스크립트 내에서 실행되면 <item ID> 또는 <item name>은 선택 사항입니다.

    이 기능은 2016-06-01 이상의 패킷 버전을 필요로합니다.

    ---------------------------------------

    *laphine_upgrade()

    대상 플레이어에 대해 라핀 업그레이드 UI를 엽니다.

    이 기능은 2017-07-26 이상의 패킷 버전을 필요로합니다.

    이 함수는 아이템 스크립트에서 사용하도록 제작되었습니다.

    ---------------------------------------

    *openbank({<char id>})

    현재 접속한 캐릭터 또는 주어진 캐릭터 ID를 가진 플레이어의 은행 UI를 엽니다.

    이 명령은 2015-12-02 이후 패킷 버전에서 작동합니다.

    ---------------------------------------

    *enchantgradeui {<char id>};

    현재 접속한 캐릭터 또는 주어진 캐릭터 ID를 가진 플레이어의 인첸트 등급 UI를 엽니다.

    이 명령은 2020-07-24 이후 패킷 버전에서 작동합니다

    ---------------------------------------

    *set_reputation_points(<type>,<points>{,<char id>})

    <points>를 사용하여 연관된 타입(type)의 평판 점수를 설정합니다. 이 명령은 현재 접속한
    캐릭터 또는 주어진 캐릭터 ID를 가진 플레이어에 대해 작동합니다.
    <type>은 reputation.yml 데이터베이스 파일의 Id 필드에 저장된 클라이언트 측 인덱스입니다.

    ---------------------------------------

    *get_reputation_points(<type>{,<char id>})

    현재 접속한 캐릭터 또는 주어진 캐릭터 ID를 가진 플레이어에 대한 연관된 타입(type)의 평판
    점수를 가져옵니다.
    <type>은 reputation.yml 데이터베이스 파일의 Id 필드에 저장된 클라이언트 측 인덱스입니다.

    ---------------------------------------

    *add_reputation_points(<type>,<points>{,<char id>})

    <points>를 사용하여 연관된 타입(type)의 평판 점수를 추가합니다. 이 명령은 현재 접속한
    캐릭터 또는 주어진 캐릭터 ID를 가진 플레이어에 대해 작동합니다.
    <type>은 reputation.yml 데이터베이스 파일의 Id 필드에 저장된 클라이언트 측 인덱스입니다.

    ---------------------------------------

    *item_reform({<item id>{,<char id>}})
    *item_reform({<"item name">{,<char id>}})

    이 명령은 부착된 플레이어나 주어진 캐릭터 ID를 위한 아이템 개조 UI를 엽니다. 아이템
    스크립트 내에서 실행하는 경우 <아이템 ID>나 <아이템 이름>은 선택 사항입니다.

    이 기능은 패킷 버전 2021-11-03 이상이 필요합니다.



    ---------------------------------------

    *item_enchant(<client side LUA index>{,<char ID>});

    부착된 캐릭터나 <캐릭터 ID> 매개변수로 주어진 플레이어를 위해 인챈트 UI를 엽니다.
    플레이어가 무게 70%를 초과하면 클라이언트에서 인챈트 UI를 열지 않고 오류 메시지를
    트리거합니다.

    이 명령은 패킷 버전 2021-11-03 이상이 필요합니다.

    ---------------------------------------
    \\
    6,1.- Unit 관련 명령어
    \\
    ---------------------------------------

    *unitwalk <GID>,<x>,<y>{,"<event label>"};
    *unitwalkto <GID>,<Target GID>{,"<event label>"};

    이 명령은 일련의 좌표 또는 다른 오브젝트로 정의된 위치로 <GID>가 걷도록합니다. 명령은
    성공하면 1을 반환하고 실패하면 0을 반환합니다.

    좌표가 전달되면 <GID>는 현재 맵에서 지정된 x,y 좌표로 이동합니다. 1번의 명령으로
    전체 맵을 이동할 수는 없지만 반복문에서 사용하여 긴 거리를 이동할 수 있습니다.

    객체 ID가 전달되면 초기 <GID>는 <Target GID>에 걷기 시작합니다(공격하기 위해 걸어갑니다).
    이는 <GID>에서 <Target ID>까지의 거리에 기초합니다. 이 명령은 하드 걷기 확인을
    사용하므로 장애물이 있는 걷기 경로를 계산합니다. 잘못된 대상 ID를 보내면 오류가 발생합니다.

    선택적으로 이벤트 레이블을 전달할 수도 있으며 이는 <GID>가 지정된 좌표 또는
    <Target GID>에 도달했을 때 실행됩니다.

    예제:

    // 플레이어를 좌표 (150,150)으로 이동시킵니다.
    unitwalk getcharid(3),150,150;

    // 명령어로 조건 확인 후, 성공 또는 실패를 플레이어에게 알립니다.
    if (unitwalk(getcharid(3),150,150))
    dispbottom "목적지로 이동중입니다...";
    else
    dispbottom "너무 멀리 있습니다.";

    //플레이어를 "WalkToMe"라는 이름을 가진 다른 캐릭터로 이동시킵니다.
    unitwalkto getcharid(3),getcharid(3,"WalkToMe");

    ---------------------------------------

    *unitattack <GID>,<Target ID>{,<action type>};
    *unitattack <GID>,"<Target Name>"{,<action type>};

    이 명령어는 <GID>가 지정된 대상을 공격하도록합니다. 성공하면 true, 그 외에는 모두 false를
    반환합니다.

    만약 <GID>가 플레이어이고, <action type>이 0이 아니라면, 유닛은 단일 공격 대신 연속
    공격을 수행합니다.

    참고:
    <GID> 0으로 unitattack을 사용하면 현재 연결된 유닛을 사용하게 됩니다.
    플레이어의 경우 몬스터를 공격하는 것을 방지하기 위해 NPC와 대화하는 것이 필요하기
    때문에, 어떤 공격 요청도 실패합니다.
    따라서이 명령을 사용하기 전에 플레이어를 NPC에서 분리해야합니다.

    ---------------------------------------

    *unitkill <GID>;

    이 명령어는 <GID>를 죽입니다.

    ---------------------------------------

    *unitwarp <GID>,"<map name>",<x>,<y>;

    이 명령어는 <GID>를 지정된 맵과 좌표로 이동시킵니다.

    <GID>가 0이면, 이 명령은 스크립트를 호출한 유닛에 대해 실행됩니다. 이것은 몬스터를
    이동시키는데 "OnTouch"와 함께 사용할 수 있습니다:

    OnTouch:
    unitwarp 0,"this",-1,-1;

    ---------------------------------------

    *unitstopattack <GID>;

    이 명령은 <GID>가 공격을 멈추도록합니다.

    ---------------------------------------

    *unitstopwalk <GID>{,<flag>};

    이 명령은 <GID>가 움직임을 멈추도록합니다.

    참고 : OnTouch에서 호출 된 경우 유닛에 부착된 워크 타이머가 OnTouch에서 제거되어이
    명령이 유닛의 이동을 중지하지 않게됩니다. OnTouch로 유닛을 강제로 중지하려면
    'unitblockmove'를 사용하는 것이 좋습니다.

    <flag> 값은 유닛이 중지되는 방식에 영향을 줍니다. 다음 플래그는 비트 연산 값을
    나타냅니다 (파이프 연산자를 사용하여 결합 할 수 있음) :
    USW_NONE = 유닛이 원래 대상지로 계속 이동합니다.
    USW_FIXPOS = 이후에 fixpos 패킷을 발행합니다.
    USW_MOVE_ONCE = 유닛이 아직 이동하지 않은 경우 유닛을 강제로 한 칸 이동하도록합니다.
    USW_MOVE_FULL_CELL = 이미 절반 이상 이동했을 때 다음 셀로 이동하도록합니다
    (스크립트 맵 변경과 같은 on-touch/place 부작용이 발생할 수 있음).
    USW_FORCE_STOP = 강제로 이동을 중지합니다.

    이 명령은 'unitwalk' 및 'unitwalkto'에 사용되는 상태 추적도 제거합니다.

    ---------------------------------------

    *unittalk <GID>,"<text>"{,flag};

    이 명령은 <GID>가 메시지를 말하게 합니다. <GID>의 표시 이름은 메시지 앞에 추가되지 않습니다.
    flag: 대상 지정
    bc_area - 메시지가 소스 근처에 있는 플레이어에게 전송됩니다 (기본값).
    bc_self - 메시지가 연결된 플레이어에게만 전송됩니다.

    ---------------------------------------

    *unitskilluseid <GID>,<skill id>,<skill lvl>{,<target id>,<casttime>,<cancel>,<Line_ID>};
    *unitskilluseid <GID>,"<skill name>",<skill lvl>{,<target id>,<casttime>,<cancel>,<Line_ID>};
    *unitskillusepos <GID>,<skill id>,<skill lvl>,<x>,<y>{,<casttime>,<cancel>,<Line_ID>};
    *unitskillusepos <GID>,"<skill name>",<skill lvl>,<x>,<y>{,<casttime>,<cancel>,<Line_ID>};

    이전 버전의 명령어와 대체되었으며, 다른 unit* 명령어들과 마찬가지로 GID 값을 사용합니다.
    (GID 참조)

    skill ID는 스킬의 ID이고, skill level은 스킬 레벨입니다. Cast time은 스킬에 추가하거나
    제거할 시간(초)입니다. 추가할 때는 양수 값을 사용하고, 제거할 때는 음수 값을 사용합니다.
    0 또는 값을 지정하지 않으면 기본 스킬 캐스트 시간을 사용합니다. 위치에 대해서는
    x와 y가 UnitSkillUsePos에서 지정됩니다.

    <cancel>은 캐스트가 중단될 수 있는지 여부를 정의합니다(true/false). CastCancel은
    skill_db.yml에서 <cancel>의 기본값입니다.

    <Line_ID>가 정의되면(양수, 기본값 0), 몬스터는 스킬 캐스트 시 mob_chat_db.yml에서
    'Line_ID'의 메시지를 전달합니다.

    ---------------------------------------

    *unitexists <GID>;

    주어진 게임 ID가 존재하는지 확인합니다. 개체가 존재하지 않으면 false를 반환하고,
    존재하면 true를 반환합니다.

    ---------------------------------------

    *getunittype <GID>;

    주어진 게임 ID가 존재하는지 확인합니다. 객체가 존재하지 않으면 false를 반환하고,
    존재하면 true를 반환합니다.

    반환 값:
    BL_PC - 캐릭터 객체
    BL_MOB - 몬스터 객체
    BL_PET - 펫 객체
    BL_HOM - 호문 객체
    BL_MER - 용병 객체
    BL_NPC - NPC 객체
    BL_ELEM - 정령 객체

    ---------------------------------------

    *getunitname <GID>;

    주어진 유닛의 이름을 가져옵니다. 지원되는 유형은 몬스터, 호문, 펫 및 NPC입니다.
    용병과 정령은 사용자 지정 이름을 지원하지 않습니다.

    유닛이 찾을 수 없으면 "Unknown"을 반환합니다.

    ---------------------------------------

    *setunitname <GID>,"<new name>";

    주어진 유닛의 이름을 새 이름으로 변경합니다. 지원되는 유형은 몬스터, 호문 및 펫입니다.
    NPC의 이름을 변경하려면 'setnpcdisplay'를 참조하십시오. 용병과 정령은 사용자 지정
    이름을 지원하지 않습니다.

    호문큘러스 또는 펫 이름을 변경하면 영구적으로 변경됩니다.

    유닛을 찾을 수 없으면 "Unknown"을 반환합니다.

    ---------------------------------------

    *setunittitle <GID>,<title>;

    <GID>에게 <title>을 부여합니다.

    참고: 이 명령어는 플레이어가 아닌 대상에만 작동합니다. 또한 battle_config.show_mob_info가
    활성화되어 있지 않은 경우에만 몹에 대해서 작동합니다.

    ---------------------------------------

    *getunittitle <GID>;

    Returns the title of the given <GID>.

    ---------------------------------------

    *getunitdata <GID>,<arrayname>;
    *setunitdata <GID>,<parameter>,<new value>;

    이 명령어는 유닛과 관련된 특별한 데이터를 가져오거나 설정하는 데 사용됩니다.
    getunitdata의 경우, 주어진 배열은 현재 데이터로 채워집니다. setunitdata의 경우
    배열의 인덱스는 해당 데이터를 유닛에 설정하는 데 사용됩니다.

    getunitdata와 setunitdata는 모두 주어진 GID가 존재하지 않는 경우 -1을 반환합니다.

    참고: 유닛의 스탯(STR, AGI 등)을 조정할 때 해당 스탯에 따라 유닛의 상태(HIT, FLEE 등)가
    자동으로 재계산됩니다. 그러나 일부 스탯은 유닛의 상태에 영향을 미치지 않으므로
    직접 수정해야 할 수도 있습니다.

    몬스터의 일부 매개 변수 (인덱스)는 다음과 같습니다:
    UMOB_SIZE
    UMOB_LEVEL
    UMOB_HP
    UMOB_MAXHP
    UMOB_MASTERAID
    UMOB_MAPID
    UMOB_X
    UMOB_Y
    UMOB_SPEED
    UMOB_MODE
    UMOB_AI
    UMOB_SCOPTION
    UMOB_SEX
    UMOB_CLASS
    UMOB_HAIRSTYLE
    UMOB_HAIRCOLOR
    UMOB_HEADBOTTOM
    UMOB_HEADMIDDLE
    UMOB_HEADTOP
    UMOB_CLOTHCOLOR
    UMOB_SHIELD
    UMOB_WEAPON
    UMOB_LOOKDIR
    UMOB_CANMOVETICK
    UMOB_STR
    UMOB_AGI
    UMOB_VIT
    UMOB_INT
    UMOB_DEX
    UMOB_LUK
    UMOB_SLAVECPYMSTRMD
    UMOB_DMGIMMUNE
    UMOB_ATKRANGE
    UMOB_ATKMIN
    UMOB_ATKMAX
    UMOB_MATKMIN
    UMOB_MATKMAX
    UMOB_DEF
    UMOB_MDEF
    UMOB_HIT
    UMOB_FLEE
    UMOB_PDODGE
    UMOB_CRIT
    UMOB_RACE
    UMOB_ELETYPE
    UMOB_ELELEVEL
    UMOB_AMOTION
    UMOB_ADELAY
    UMOB_DMOTION
    UMOB_TARGETID
    UMOB_ROBE
    UMOB_BODY2
    UMOB_GROUP_ID
    UMOB_IGNORE_CELL_STACK_LIMIT
    UMOB_RES
    UMOB_MRES
    UMOB_DAMAGETAKEN

    -----

    호문의 매개변수(인덱스)는 다음과 같습니다:
    UHOM_SIZE
    UHOM_LEVEL
    UHOM_HP
    UHOM_MAXHP
    UHOM_SP
    UHOM_MAXSP
    UHOM_MASTERCID
    UHOM_MAPID
    UHOM_X
    UHOM_Y
    UHOM_HUNGER
    UHOM_INTIMACY
    UHOM_SPEED
    UHOM_LOOKDIR
    UHOM_CANMOVETICK
    UHOM_STR
    UHOM_AGI
    UHOM_VIT
    UHOM_INT
    UHOM_DEX
    UHOM_LUK
    UHOM_DMGIMMUNE
    UHOM_ATKRANGE
    UHOM_ATKMIN
    UHOM_ATKMAX
    UHOM_MATKMIN
    UHOM_MATKMAX
    UHOM_DEF
    UHOM_MDEF
    UHOM_HIT
    UHOM_FLEE
    UHOM_PDODGE
    UHOM_CRIT
    UHOM_RACE
    UHOM_ELETYPE
    UHOM_ELELEVEL
    UHOM_AMOTION
    UHOM_ADELAY
    UHOM_DMOTION
    UHOM_TARGETID
    UHOM_GROUP_ID

    -----

    펫의 매개변수(인덱스)는 다음과 같습니다:
    UPET_SIZE
    UPET_LEVEL
    UPET_HP
    UPET_MAXHP
    UPET_MASTERAID
    UPET_MAPID
    UPET_X
    UPET_Y
    UPET_HUNGER
    UPET_INTIMACY
    UPET_SPEED
    UPET_LOOKDIR
    UPET_CANMOVETICK
    UPET_STR
    UPET_AGI
    UPET_VIT
    UPET_INT
    UPET_DEX
    UPET_LUK
    UPET_DMGIMMUNE
    UPET_ATKRANGE
    UPET_ATKMIN
    UPET_ATKMAX
    UPET_MATKMIN
    UPET_MATKMAX
    UPET_DEF
    UPET_MDEF
    UPET_HIT
    UPET_FLEE
    UPET_PDODGE
    UPET_CRIT
    UPET_RACE
    UPET_ELETYPE
    UPET_ELELEVEL
    UPET_AMOTION
    UPET_ADELAY
    UPET_DMOTION
    UPET_GROUP_ID

    -----

    용병의 매개변수(인덱스)는 다음과 같습니다:
    UMER_SIZE
    UMER_HP
    UMER_MAXHP
    UMER_MASTERCID
    UMER_MAPID
    UMER_X
    UMER_Y
    UMER_KILLCOUNT
    UMER_LIFETIME
    UMER_SPEED
    UMER_LOOKDIR
    UMER_CANMOVETICK
    UMER_STR
    UMER_AGI
    UMER_VIT
    UMER_INT
    UMER_DEX
    UMER_LUK
    UMER_DMGIMMUNE
    UMER_ATKRANGE
    UMER_ATKMIN
    UMER_ATKMAX
    UMER_MATKMIN
    UMER_MATKMAX
    UMER_DEF
    UMER_MDEF
    UMER_HIT
    UMER_FLEE
    UMER_PDODGE
    UMER_CRIT
    UMER_RACE
    UMER_ELETYPE
    UMER_ELELEVEL
    UMER_AMOTION
    UMER_ADELAY
    UMER_DMOTION
    UMER_TARGETID
    UMER_GROUP_ID

    -----

    정령의 매개변수(인덱스)는 다음과 같습니다:
    UELE_SIZE
    UELE_HP
    UELE_MAXHP
    UELE_SP
    UELE_MAXSP
    UELE_MASTERCID
    UELE_MAPID
    UELE_X
    UELE_Y
    UELE_LIFETIME
    UELE_MODE
    UELE_SPEED
    UELE_LOOKDIR
    UELE_CANMOVETICK
    UELE_STR
    UELE_AGI
    UELE_VIT
    UELE_INT
    UELE_DEX
    UELE_LUK
    UELE_DMGIMMUNE
    UELE_ATKRANGE
    UELE_ATKMIN
    UELE_ATKMAX
    UELE_MATKMIN
    UELE_MATKMAX
    UELE_DEF
    UELE_MDEF
    UELE_HIT
    UELE_FLEE
    UELE_PDODGE
    UELE_CRIT
    UELE_RACE
    UELE_ELETYPE
    UELE_ELELEVEL
    UELE_AMOTION
    UELE_ADELAY
    UELE_DMOTION
    UELE_TARGETID
    UELE_GROUP_ID

    -----

    NPC 매개변수(인덱스)는 다음과 같습니다:
    UNPC_LEVEL
    UNPC_HP
    UNPC_MAXHP
    UNPC_MAPID
    UNPC_X
    UNPC_Y
    UNPC_LOOKDIR
    UNPC_STR
    UNPC_AGI
    UNPC_VIT
    UNPC_INT
    UNPC_DEX
    UNPC_LUK
    UNPC_PLUSALLSTAT
    UNPC_DMGIMMUNE
    UNPC_ATKRANGE
    UNPC_ATKMIN
    UNPC_ATKMAX
    UNPC_MATKMIN
    UNPC_MATKMAX
    UNPC_DEF
    UNPC_MDEF
    UNPC_HIT
    UNPC_FLEE
    UNPC_PDODGE
    UNPC_CRIT
    UNPC_RACE
    UNPC_ELETYPE
    UNPC_ELELEVEL
    UNPC_AMOTION
    UNPC_ADELAY
    UNPC_DMOTION
    UNPC_SEX
    UNPC_CLASS
    UNPC_HAIRSTYLE
    UNPC_HAIRCOLOR
    UNPC_HEADBOTTOM
    UNPC_HEADMIDDLE
    UNPC_HEADTOP
    UNPC_CLOTHCOLOR
    UNPC_SHIELD
    UNPC_WEAPON
    UNPC_ROBE
    UNPC_BODY2
    UNPC_DEADSIT
    UNPC_GROUP_ID

    *주의:
    - *_SIZE: 작은(0); 중간(1); 큰(2)
    - *_MAPID: 이것은 src/map/map.cpp의 map_data 인덱스를 참조합니다. mapindex_db의 mapindex 인덱스와 다릅니다.
    -- 'setunitdata'에서 map name도 유효한 값으로 사용할 수 있습니다.
    - *_SPEED: 20 - 1000
    - *_MODE: doc/mob_db_mode_list.txt 참조
    - *_LOOKDIR: 북쪽(0), 북서(1), 서(2) 등
    - *_CANMOVETICK: 초 * 1000 동안 유닛은 움직일 수 없습니다.
    - *_DMGIMMUNE: 유닛이 피해를 입지 않음(1) 또는 입음(0)
    - *_HUNGER: 0 - 100
    - *_INTIMACY: 0 - 1000
    - *_LIFETIME: 초 * 1000 동안 유닛이 '살아' 있음
    - *_AMOTION: doc/mob_db.txt 참조
    - *_ADELAY: doc/mob_db.txt 참조
    - *_DMOTION: doc/mob_db.txt 참조
    - *_BODY2: 대체 디스플레이를 활성화(1) 또는 비활성화(0)
    - *_TARGETID: 0으로 설정하면 유닛은 대상을 놓고 공격을 멈춥니다.

    - UMOB_AI: none (0); attack (1); marine sphere (2); flora (3); zanzou (4); legion (5); faw (6)
    - UMOB_SCOPTION: 이 문서 상단의 'Variables' 섹션 참조
    - UMOB_SLAVECPYMSTRMD: 슬레이브가 마스터의 모드를 복사할지(1) 아니면 복사하지 않을지(0)

    - UNPC_PLUSALLSTAT: 'bAllStats'와 같음; 모든 스탯을 주어진 양만큼 증가/감소시킴
    - UNPC_DEADSIT: 서 있음(0), 죽음(1), 앉음(2)

    예제:
    // 'Poring' 몬스터를 생성하고 그 게임 ID를 저장합니다.
    // - 'monster' 스크립트 명령을 사용할 때,
    // - 생성된 모든 몬스터의 게임 ID는 $@mobid[] 배열에 저장됩니다.
    monster "prontera",149,190,"Poring",1002,10;
    .GID = $@mobid[9]; // 10번째 생성된 포링의 게임 ID를 저장하고 강하게 만들어 봅시다!

    // 'getunitdata' 함수를 사용하여 이 강한 포링의 몹 데이터를 .@por_arr[] 변수에 저장합니다. (.@por_arr[1]은 레벨이고, .@por_arr[13]은 클래스 등입니다.)
    // 이 데이터를 사용하여 NPC가 몹을 원하는 대로 표시하거나 조작할 수 있습니다. 'setunitdata' 이전에 실행할 필요는 없습니다.
    getunitdata .GID,.@por_arr;

    // 이 포링의 최대 HP를 1000으로 설정합니다. (현재 HP도 1000으로 업데이트됩니다.)
    setunitdata .GID,UMOB_MAXHP,1000;

    ---------------------------------------

    *geteleminfo <type>{,<char_id>};

    Attached player의 속성정령 또는 char_id로 플레이어의 속성정령 정보를 가져옵니다. 다른 정보는
    'getunitdata' 명령으로 얻을 수 있습니다.

    유효한 유형:
    0: 속성정령 ID
    1: 속성정령 Game ID
    ---------------------------------------
    \\
    6,1.- 유닛 관련 명령 끝
    \\
    ---------------------------------------

    *npcskill <skill id>,<skill lvl>,<stat point>,<NPC level>;
    *npcskill "<skill name>",<skill lvl>,<stat point>,<NPC level>;

    이 명령은 현재 NPC 개체가 게임에 붙어있는 플레이어에게 스킬을 사용하게 합니다. 이 스킬은
    시전 시간이나 쿨다운이 없습니다. 플레이어는 기본 스킬 범위 내에 있어야하며, 그렇지 않으면
    명령이 무시됩니다.

    "stat point" 매개 변수는 모든 NPC 스탯을 지정된 값으로 일시적으로 설정하고 "NPC 레벨"은
    NPC의 일시적인 레벨입니다(일부 스킬에서 사용됨). 어떤 값도 config에서 정의된 최대 레벨보다
    높을 수 없으며, NPC에 mob sprite가 있는 경우 제대로 작동하지 않습니다.

    스킬을 사용하기 전에, NPC는 사용되는 스킬에 따라 기본 스탯을 적용해야 합니다:
    UNPC_ATKMIN, UNPC_ATKMAX, UNPC_MATKMIN, UNPC_MATKMAX, UNPC_STR, UNPC_AGI,
    UNPC_VIT, UNPC_INT, UNPC_DEX, UNPC_LUK.

    자세한 정보는 'setunitdata'를 참조하세요.

    // 모든 스탯이 99이고 베이스 레벨이 60 인 플레이어에게 Level 10 Heal 스킬을 시전합니다
    npcskill "AL_HEAL",10,99,60;

    ---------------------------------------

    *day;
    *night;

    이 두 명령은 서버 전체를 각각 낮과 밤 모드로 전환합니다. 서버가 설정에 따라 낮과 밤 사이를
    순환하도록 설정된 경우, 이전 순환 모드로 돌아갑니다.


    예제:

    - script DayNight -1,{
    OnClock0600:
    day;
    end;
    OnInit:
    // setting correct mode upon server start-up
    if (gettime(DT_HOUR)>=6 && gettime(DT_HOUR)<18) end;
    OnClock1800:
    night;
    end;
    }

    이 스크립트는 서버에서 하는 것처럼 낮/밤 순환을 흉내내지만, 변경시 추가적인 효과를
    트리거할 수 있습니다. 예를 들어 공지, 선물 등이 있습니다. 이 스크립트를 사용할 때는
    설정에서 낮/밤 순환 모드를 비활성화해야합니다.

    ---------------------------------------

    *defpattern <set number>,"<regular expression pattern>","<event label>";
    *activatepset <set number>;
    *deactivatepset <set number>;
    *deletepset <set number>;

    이 명령어는 정규식 라이브러리가 활성화된 서버에서만 사용할 수 있습니다. 기본 컴파일과
    대부분의 이진 배포판은 그렇지 않습니다. 하지만, 정규식은 사용이 복잡하지만 매우 매력적인
    기능입니다.

    NPC 오브젝트는 플레이어가 공개적으로 말한 텍스트를 수신하고 정규식 패턴과 일치시켜
    이 패턴과 연관된 라벨을 트리거하는 명령어 집합입니다.

    패턴은 세트로 구성되어 있으며 세트 번호로 참조됩니다. 여러 세트의 패턴을 가질 수 있으며,
    한 번에 여러 패턴을 활성화할 수 있습니다. 패턴 세트 번호는 1에서 시작합니다.

    'defpattern'은 정규식 패턴과 이벤트 라벨을 연결합니다. 패턴이 활성화되면 이 패턴에 일치하는
    플레이어의 발언이있는 경우 이 이벤트가 트리거됩니다.

    'activatepset'은 지정된 패턴 세트를 활성 상태로 만듭니다. 활성 패턴은 'defpattern'으로
    정의된 라벨을 트리거하게 합니다.

    'deactivatepset'은 지정된 패턴 세트를 비활성화합니다. 이 경우 패턴 세트 번호로 -1을
    지정하면 정의된 모든 패턴 세트를 비활성화합니다.

    'deletepset'은 패턴 세트를 삭제하여 새 패턴 세트를 생성할 수 있습니다.

    정규식을 사용하는 것은 고위 마법입니다. 하지만 이 고위 마법은 문장 처리의 전문성을
    제공합니다. 정규식 패턴이란 무엇인지에 대한 설명은 웹 페이지를 참조하세요.

    http://www.regular-expressions.info/
    http://www.weitz.de/regex-coach/

    이를 사용한 예제는 doc/sample/npc_test_pcre.txt를 참고하세요.

    이를 통해 공공장소에서 Zeny를 요구하는 플레이어에게 자동으로 벌을 가하거나, 그들이
    Zeny를 원한다면 Zeny를 자동으로 제공할 수 있습니다.

    ---------------------------------------

    *pow(<number>,<power>)

    이 명령어는 <number>를 <power> 제곱한 결과를 반환합니다.

    예제:
    .@i = pow(2,3); // .@i will be 8

    ---------------------------------------

    *sqrt(<number>)

    숫자의 제곱근을 반환합니다.

    예제:
    .@i = sqrt(25); // .@i will be 5

    ---------------------------------------

    *distance(<x0>,<y0>,<x1>,<y1>)

    두 지점 사이의 거리를 반환합니다.

    예제:
    .@i = distance(100,200,101,202);

    ---------------------------------------

    *min(<number or array>{,<number or array>,...})
    *minimum(<number or array>{,<number or array>,...})
    *max(<number or array>{,<number or array>,...})
    *maximum(<number or array>{,<number or array>,...})

    주어진 파라미터 중에서 가장 작은 (또는 큰) 값을 반환합니다. 이 파라미터들은 숫자나
    숫자 배열이어야 합니다.

    예제:
    .@minimum = min( 1, -6, -2, 8, 2 ); // .@minimum은 -6과 같습니다.
    .@maximum = max( 0, 5, 10, 4 ); // .@maximum은 10과 같습니다.
    .@level = min( BaseLevel, 70 ); // .@level은 캐릭터의 베이스 레벨과 70 중 작은 값이 됩니다.

    setarray .@testarray, 4, 5, 12, 6, 7, 3, 8, 9, 10;

    .@minimum = min( .@testarray ); // .@minimum은 3과 같습니다.
    .@maximum = max( .@testarray ); // .@maximum은 12와 같습니다.

    .@minimum = min( -6, 1, 2, 3, .@testarray ); // .@minimum은 -6과 같습니다.
    .@maximum = max( -6, 1, 2, 3, .@testarray ); // .@maximum은 12와 같습니다.

    ---------------------------------------

    *cap_value(<number>, <min>, <max>)

    주어진 수를 최소값(min)과 최대값(max) 사이로 제한하여 반환합니다.

    예제:
    // 0~100 사이로 제한합니다.
    .@value = cap_value(10, 0, 100); // .@value는 10이 됩니다.
    .@value = cap_value(1000, 0, 100); // .@value는 100이 됩니다.
    .@value = cap_value(-10, 3, 100); // .@value는 3이 됩니다.

    ---------------------------------------

    *round(<number>,<precision>);
    *ceil(<number>,<precision>);
    *floor(<number>,<precision>);

    입력한 숫자(number)를 입력한 정밀도(precision)의 배수로 반올림한 결과를 반환합니다.

    round 함수는 입력한 숫자(number)를 입력한 정밀도(precision)로 나눈 나머지가 정반올림을
    기준으로 precision/2보다 같거나 크면 숫자(number)를 반올림한 값을 반환합니다.
    이외의 경우에는 내림한 값을 반환합니다.

    ceil 함수는 입력한 숫자(number)를 입력한 정밀도(precision)로 나눈 나머지와 상관없이
    무조건 올림한 값을 반환합니다.

    floor 함수는 입력한 숫자(number)를 입력한 정밀도(precision)로 나눈 나머지와 상관없이
    무조건 내림한 값을 반환합니다.

    ---------------------------------------

    *md5("<string>")

    숫자나 문자열의 md5 체크섬을 반환합니다.

    예제:
    mes md5(12345);
    mes md5("12345"); // 둘 다 827ccb0eea8a706c4c34a16891f84e7b를 표시합니다.
    mes md5("qwerty"); // d8578edf8458ce06fbc5bb76a58c5ca4를 표시합니다.

    ---------------------------------------

    *query_sql("your MySQL query"{, <array variable>{, <array variable>{, ...}}});
    *query_logsql("your MySQL query"{, <array variable>{, <array variable>{, ...}}});

    SQL 쿼리를 실행합니다. 'select' 쿼리는 최대 20억개의 행으로 구성된 배열 변수를 채울
    수 있으며, 실패 시 행 수(즉, 배열 크기) 또는 -1을 반환합니다.

    'query_sql'은 주 데이터베이스에서 실행되며 'query_logsql'은 로그 데이터베이스에서 실행됩니다.

    예제:
    .@nb = query_sql("select name,fame from `char` ORDER BY fame DESC LIMIT 5", .@name$, .@fame);
    mes "Hall Of Fame: TOP5";
    mes "1." + .@name$[0] + "(" + .@fame[0] + ")"; // largest fame value.
    mes "2." + .@name$[1] + "(" + .@fame[1] + ")";
    mes "3." + .@name$[2] + "(" + .@fame[2] + ")";
    mes "4." + .@name$[3] + "(" + .@fame[3] + ")";
    mes "5." + .@name$[4] + "(" + .@fame[4] + ")";

    ---------------------------------------

    *escape_sql(<value>)

    주어진 값을 문자열로 변환하고 query_sql()에서 사용하기 안전하도록 특수 문자를
    이스케이프합니다. 주어진 값의 이스케이프 된 형태를 반환합니다.

    예제:
    .@name$ = "John's Laptop";
    .@esc_str$ = escape_sql(.@name$); // 이스케이프된 문자열: John\'s Laptop

    ---------------------------------------

    *setiteminfo(<item id>,<type>,<value>)
    *setiteminfo(<aegis item name>,<type>,<value>)

    이 함수는 아이템의 일부 값을 설정합니다.
    성공하면 새 값이 반환되고, 실패하면 -1이 반환됩니다
    (아이템 ID를 찾을 수 없거나 유효한 유형이 아님).

    유효한 타입은 다음과 같습니다:
    ITEMINFO_BUY (0) - Buy Price
    ITEMINFO_SELL (1) - Sell Price
    ITEMINFO_TYPE (2) - Type
    ITEMINFO_MAXCHANCE (3) - Max 드랍율 (1 = 0.01%)
    if = 0, then monsters don't drop it at all (rare or a quest item)
    if = 10000, then this item is sold in NPC shops only
    ITEMINFO_GENDER (4) - Gender
    ITEMINFO_LOCATIONS (5) - Location(s)
    ITEMINFO_WEIGHT (6) - Weight
    ITEMINFO_ATTACK (7) - ATK
    ITEMINFO_DEFENSE (8) - DEF
    ITEMINFO_RANGE (9) - Range
    ITEMINFO_SLOT (10) - Slot
    ITEMINFO_VIEW (11) - View
    ITEMINFO_EQUIPLEVELMIN (12) - equipment LV
    ITEMINFO_WEAPONLEVEL (13) - weapon LV
    ITEMINFO_ALIASNAME (14) - AliasName
    ITEMINFO_EQUIPLEVELMAX (15) - equipment LV Max
    ITEMINFO_MAGICATTACK (16) - matk if RENEWAL is defined
    ITEMINFO_ARMORLEVEL (19) - armor LV

    예제:
    setiteminfo 7049,ITEMINFO_WEIGHT,9990; // 무게를 999.0으로 변경합니다.

    ---------------------------------------

    *setitemscript(<item id>,<"{ new item script }">{,<type>});

    아이템에 새로운 스크립트 보너스를 설정합니다. 이는 게임 이벤트에 매우 유용합니다.
    아이템 스크립트를 제거하려면 itemscript 매개변수를 비워 두세요.

    성공 시 1을 반환하며, 실패하면(아이템 ID가 없거나 새로운 아이템 스크립트가 잘못된 경우)
    0을 반환합니다.

    타입 매개변수를 사용하여 설정할 스크립트 유형을 지정할 수 있습니다(기본값은 0입니다):
    0 - 스크립트
    1 - 장착 시 스크립트
    2 - 장착 해제 시 스크립트

    예제:
    setitemscript 2637,"{ if (isequipped(2236) == 0)end; if (getskilllv(26)){skill 40,1;}else{skill 26,1+isequipped(2636);} }";
    setitemscript 2637,"";

    ---------------------------------------

    *atoi("<string>")
    *axtoi("<string>")
    *strtol("<string>", base)

    'atoi'는 주어진 문자열을 10진수로 해석하고, 'axtoi'는 16진수로 해석합니다. 'strtol'은 기본값으로
    10진수를 사용하지만, 사용자는 범위가 2에서 36까지이거나 자동 감지(0)를 사용할 수 있는
    기본 값을 지정할 수 있습니다.

    'atoi'와 'strtol' 함수는 같은 이름의 C 함수를 준수하며, 'axtoi'는 16진수를 사용하는
    strtol과 같습니다. 결과는 부호 있는 32 비트 int 범위(INT_MIN ~ INT_MAX)로 클램프됩니다.

    예제:

    .@var = atoi("11"); // .@var는 11이 됨
    .@var = axtoi("FF"); // .@var는 255가 됨
    mes axtoi("11"); // 17이 출력됨 (1 = 1, 10 = 16)
    .@var = strtol("11", 10); // .@var는 11이 됨 (10진수 11)
    .@var = strtol("11", 16); // .@var는 17이 됨 (16진수 11)
    .@var = strtol("11", 0); // .@var는 11이 됨 (10진수 11, 자동 감지)
    .@var = strtol("0x11", 0); // .@var는 17이 됨 (16진수 11, "0x" 접두어 때문에 자동 감지)
    .@var = strtol("011", 0); // .@var는 9가 됨 (8진수 11, "0" 접두어 때문에 자동 감지)
    .@var = strtol("11", 2); // .@var는 3이 됨 (2진수 11)
    ---------------------------------------

    *compare("<string>","<substring>")

    이 명령어는 대소문자를 구분하지 않고, 문자열 내에 하위 문자열이 포함되어 있는지 여부에
    따라 1 또는 0을 반환합니다.

    예제:
    // 'Blood'가 'Bloody Murderer'에 포함되므로 'dothis'가 실행됩니다.
    if (compare("Bloody Murderer","Blood"))
    dothis;

    //'Bloody'가 'Blood Butterfly'에 포함되지 않으므로 'dothat'은 실행되지 않습니다.
    if (compare("Blood Butterfly","Bloody"))
    dothat;

    ---------------------------------------

    *strcmp("<string>","<string>")

    이 명령은 두 문자열을 비교하고 다음 값을 반환합니다.
    1 : 문자열 1 > 문자열 2
    0 : 두 문자열이 같음
    -1 : 문자열 1 < 문자열 2

    ---------------------------------------

    *getstrlen("<string>")

    이 함수는 인수로 주어진 문자열의 길이를 반환합니다. 플레이어가 입력한 것이 이름 길이
    제한과 같은 길이 제한을 초과하는지 확인하고 다른 값을 입력하도록 요청하는 데 유용합니다.

    ---------------------------------------

    *charisalpha("<string>",<position>)

    이 함수는 문자열에서 주어진 위치(Position)에 있는 문자가 문자인 경우 1을 반환하고,
    숫자나 공백인 경우 0을 반환합니다. 첫 글자는 위치 0입니다

    ---------------------------------------

    *charat(<string>,<index>)

    주어진 위치의 문자를 반환합니다. 인덱스가 범위를 벗어나면 빈 문자열을 반환합니다.
    문자열의 첫 글자는 인덱스 0입니다.

    예제:
    charat("This is a string", 10); //returns "s"

    ---------------------------------------

    *setchar(<string>,<char>,<index>)

    인덱스 위치의 문자열을 지정한 문자열로 변경하여 반환합니다. 인덱스가 범위를 벗어나면
    원래 문자열이 반환됩니다. <char> 매개변수에서는 첫번째 문자만 사용됩니다.

    예제:
    setchar("Cat", "B", 0); // "Bat" 반환

    ---------------------------------------

    *insertchar(<string>,<char>,<index>)

    Returns the original string with the specified char inserted at the specified
    index. If index is out of range, the char will be inserted on the end of the
    string that it is closest. Only the 1st char in the <char> parameter will be used.

    예제:
    insertchar("laughter", "s", 0); // "slaughter" 반환

    ---------------------------------------

    *delchar(<string>,<index>)

    특정 위치에 삽입된 지정된 문자가 있는 원래 문자열을 반환합니다. 위치가 범위를 벗어나면,
    문자는 가장 가까운 끝에 삽입됩니다. <char> 매개 변수의 첫 번째 문자만 사용됩니다.

    예제:
    delchar("Diet", 3); // "Die" 반환

    ---------------------------------------

    *strtoupper(<string>)
    *strtolower(<string>)

    문자열을 대문자/소문자로 변환하여 반환합니다. 알파벳이 아닌 문자는 그대로 유지됩니다

    예제:
    strtoupper("The duck is blue!!"); // "THE DUCK IS BLUE!!" 반환

    ---------------------------------------

    *charisupper(<string>,<index>)
    *charislower(<string>,<index>)

    지정된 문자열의 지정된 인덱스 위치의 문자가 대/소문자인 경우 1을, 그렇지 않은 경우
    0을 반환합니다. 알파벳이 아닌 문자는 0을 반환합니다.

    예제:
    charisupper("rAthena", 1); // 1 반환

    ---------------------------------------

    *substr(<string>,<start_index>,<end_index>)

    정해진 문자열에서 시작 인덱스와 종료 인덱스 사이에 포함된 하위 문자열을
    반환합니다. 인덱스가 범위를 벗어나거나 시작 인덱스가 종료 인덱스 이후인
    경우 빈 문자열이 반환됩니다.


    예제:
    substr("foobar", 3, 5); // "bar" 반환

    ---------------------------------------

    *explode(<dest_array>,<string>,<delimiter>)

    주어진 구분자(delimiter)에 기반하여 문자열을 하위 문자열(substrings)로 나눕니다.
    하위 문자열은 지정된 문자열 배열에 저장됩니다. 구분자 파라미터의 1번째 글자만 사용됩니다.
    구분자로 빈 문자열을 전달하면, 문자열은 원래 형태 그대로 배열에 배치됩니다.

    예제:
    explode(.@my_array$, "Explode:Test:1965:red:PIE", ":");
    //.@my_array$ contents will be...
    //.@my_array$[0]: "Explode"
    //.@my_array$[1]: "Test"
    //.@my_array$[2]: "1965"
    //.@my_array$[3]: "red"
    //.@my_array$[4]: "PIE"

    ---------------------------------------

    *implode(<string_array>{,<glue>})

    주어진 문자열 배열 내 모든 하위 문자열(substrings)을 하나의 문자열로 결합합니다. glue
    파라미터가 지정된 경우, 하위 문자열 간에 해당 문자열이 삽입됩니다.

    예제:
    setarray .@my_array$[0], "This", "is", "a", "test";
    implode(.@my_array$, " "); //returns "This is a test"

    ---------------------------------------

    *sprintf(<format>[,param[,param[,...]]])

    C 스타일 sprintf. 결과 문자열은 PHP와 동일하게 반환됩니다. sprintf@www.cplusplus.com에서
    %n을 제외한 모든 C 형식 지정자를 지원합니다. 파라미터의 수는 rA의 스크립트 엔진만큼
    제한됩니다.

    예제:
    .@format$ = "The %s contains %d monkeys";
    dispbottom(sprintf(.@format$, "zoo", 5)); //prints "The zoo contains 5 monkeys"
    dispbottom(sprintf(.@format$, "barrel", 82)); //prints "The barrel contains 82 monkeys"

    ---------------------------------------

    *sscanf(<string>,<format>[,param[,param[,...]]])

    C 스타일의 sscanf 함수입니다. C 포맷 스펙에 따른 포맷 문자열을 사용하여 문자열에서
    원하는 데이터를 추출합니다. C 포맷 스펙 문자열의 자세한 사용법은
    www.cplusplus.com을 참조하십시오. 파라미터의 수는 rA의 스크립트 엔진에서 제한되지 않습니다.

    예제:
    sscanf("This is a test: 42 foobar", "This is a test: %d %s", .@num, .@str$);
    dispbottom(.@num + " " + .@str$); //prints "42 foobar"

    ---------------------------------------

    *strpos(<haystack>,<needle>{,<offset>})

    PHP 스타일의 strpos 함수입니다. 문자열 haystack에서 문자열 needle을 검색합니다.
    offset 매개 변수는 검색을 시작할 문자열의 인덱스를 나타냅니다. 성공적인 검색의 경우
    하위 문자열의 인덱스를 반환하고, 그렇지 않으면 -1을 반환합니다. 대소문자를 구분합니다.

    예제:
    strpos("foobar", "bar", 0); //returns 3
    strpos("foobarfoo", "foo", 0); //returns 0
    strpos("foobarfoo", "foo", 1); //returns 6

    ---------------------------------------

    *replacestr(<input>, <search>, <replace>{, <usecase>{, <count>}})

    입력 문자열에서 검색 문자열을 모두 대체 문자열로 교체합니다. 기본적으로 대소문자를 구분하며,
    usecase가 0으로 설정되면 대소문자를 구분하지 않습니다. count 매개 변수가 지정되면 해당
    수만큼 인스턴스만 교체합니다.

    예제:
    replacestr("testing tester", "test", "dash"); //returns "dashing dasher"
    replacestr("Donkey", "don", "mon", 0); //returns "monkey"
    replacestr("test test test test test", "test", "yay", 0, 3); //returns "yay yay yay test test"

    ---------------------------------------

    *countstr(<input>, <search>{, <usecase>})

    입력 문자열에서 검색 문자열의 모든 인스턴스를 계산합니다. 기본적으로 대소문자를 구분하며,
    usecase가 0으로 설정되면 대소문자를 구분하지 않습니다.

    예제:
    countstr("test test test Test", "test"); //returns 3
    countstr("cake Cake", "Cake", 0); //returns 2

    ---------------------------------------

    *preg_match(<regular expression pattern>,<string>{,<offset>})

    정규 표현식과 일치하는 문자열을 검색합니다. offset 매개 변수는 검색을 시작할 문자열의 인덱스를
    나타냅니다. 캡처 된 하위 문자열의 오프셋 또는 일치하는 항목을 찾을 수 없는 경우 0을 반환합니다.

    이 명령은 서버가 정규 표현식 라이브러리를 사용하여 컴파일된 경우에만 사용할 수 있습니다.

    ---------------------------------------

    *setfont <font>;

    이 명령은 현재 사용 중인 RO 클라이언트 인터페이스 폰트를 폰트 ID를 사용하여 data*.eot에 저장된
    폰트 중 하나로 설정합니다. 현재 사용 중인 폰트 ID를 사용하면 기본 인터페이스 폰트가 다시
    사용됩니다.

    0 - Default
    1 - RixLoveangel
    2 - RixSquirrel
    3 - NHCgogo
    4 - RixDiary
    5 - RixMiniHeart
    6 - RixFreshman
    7 - RixKid
    8 - RixMagic
    9 - RixJJangu

    ---------------------------------------

    *showdigit <value>{,<type>};

    '값'이라는 수치를 화면 상단에 큰 디지털 시계 폰트로 표시합니다. 선택적 매개변수 '유형'은
    "시계"의 시각적 측면을 지정하며 다음 값 중 하나일 수 있습니다.

    0 - 값이 5초 동안 표시됩니다 (기본값).
    1 - 증가 카운터 (1 초당 1 틱).
    2 - 감소 카운터 (1 초당 1 틱). 0에서 멈추지 않고 오버플로됩니다.
    3 - 감소 카운터 (1 초당 2 틱). 두 자리만 있으며 0에서 멈춥니다.

    유형 3을 제외한 값은 시간 단위로 해석되어 일, 시간, 분 및 초로 서식이 지정됩니다.
    참고로, 공식 스크립트 명령에는 선택적 매개변수가 없습니다.

    // 23:59:59를 5초 동안 표시
    showdigit 86399;

    // 60에서 시작하고 30초 동안 실행되는 카운터
    showdigit 60,3;

    ---------------------------------------

    *setcell "<map name>",<x1>,<y1>,<x2>,<y2>,<type>,<flag>;

    각 맵 셀은 걷기, 사격, 물의 존재와 같은 지형 속성, 바실리카, 랜드 프로텍터와 같은 스킬,
    그리고 NPC 인접 여부, 거래 불가 등과 같은 다른 속성을 지정하는 여러 '플래그'를 갖습니다.
    이러한 플래그는 각각 '켜기' 또는 '끄기'가 가능하며, 함께 사용하여 셀의 동작을 정의합니다.

    이 명령은 지정된 (x1,y1)-(x2,y2) 직사각형 내의 모든 맵 셀의 플래그를 수정할 수 있습니다.
    '플래그'는 0 또는 1일 수 있으며(0: 플래그 제거, 1: 플래그 설정), '종류'는 수정할 플래그를
    정의합니다. 가능한 옵션은 'src/map/script_constants.hpp'을 참조하십시오.

    예제:
    setcell "arena",0,0,300,300,cell_basilica,1;
    setcell "arena",140,140,160,160,cell_basilica,0;
    setcell "arena",135,135,165,165,cell_walkable,0;
    setcell "arena",140,140,160,160,cell_walkable,1;

    이는 맵 중앙에 임시 링을 추가합니다. 링은 바깥에서의 간섭을 방지하기 위해 5개 셀 넓이의
    '갭'으로 둘러싸여 있으며, 나머지 맵은 'basilica'로 표시되어 옵저버가 공격 스킬을 시전하거나
    서로 싸우는 것을 방지합니다. 벽은 클라이언트에서 표시되지 않거나 알려지지 않아 움직임
    문제를 유발할 수 있습니다.

    다른예제:

    OnBarricadeDeploy:
    setcell "schg_cas05",114,51,125,51,cell_walkable,0;
    end;
    OnBarricadeBreak:
    setcell "schg_cas05",114,51,125,51,cell_walkable,1;
    end;

    이 스크립트는 WoE:SE 스크립트 일부로서, 공격자가 모든 바리케이드를 파괴하기 전에는
    전진할 수 없도록합니다. 이 스크립트는 바리케이드 몹 다음에 지나갈 수 없는 셀의 행을
    배치하고 제거합니다.

    ---------------------------------------

    *checkcell ("<map name>",<x>,<y>,<type>);

    이 명령은 지정된 셀이 'type' 플래그가 설정되어 있는지 여부에 따라 1 또는 0을 반환합니다.
    체크할 수 있는 다양한 유형이 있으며, 서버의 cell_chk 열거형을 모방합니다. 유형은
    'src/map/script_constants.hpp'에서 찾을 수 있습니다.

    개별 유형의 의미는 혼란 스러울 수 있으므로, 여기에 개요를 제공합니다.
    - cell_chkwall/water/cliff
    이들은 지정된 셀의 '지형 구성 요소'를 직접 확인합니다.
    - cell_chkpass/reach/nopass/noreach
    지나갈 수 있는 = 벽이 아니고 절벽이 아님, 도달 가능함 = 지나갈 수 있음 wrt. No-stacking mod
    - cell_chknpc/basilica/landprotector/novending/nochat
    이들은 특정 동적 플래그를 확인합니다 (이름은 그들이 하는 것을 나타냅니다)

    예제:
    mes "Pick a destination map.";
    input .@map$;
    mes "Alright, now give me the coordinates.";
    input .@x;
    input .@y;
    if ( !checkcell(.@map$,.@x,.@y,cell_chkpass) ) {
    mes "Can't warp you there, sorry!";
    close;
    } else {
    mes "Ok, get ready...";
    close2;
    warp .@map$, .@x, .@y;
    end;
    }

    ---------------------------------------

    *getfreecell "<map name>",<rX>,<rY>{,<x>,<y>,<rangeX>,<rangeY>,<flag>};

    이 명령어는 지정한 맵에서 빈 셀을 찾아 <rX>와 <rY>에 참조를 저장합니다.
    <x>와 <y>에 <rangeX>와 <rangeY>를 전달하면 지정된 영역에서 검색할 수 있습니다.

    <flag>는 비트 마스크이며 다음과 같은 가능한 값이 있습니다:
    - 1 = 지도 전체 또는 <x>, <y> 범위에서 무작위 셀 찾기 (기본값).
    - 2 = 대상 타일로 걸어갈 수 있어야합니다.
    - 4 = 대상 타일 주변에 플레이어가 없어야합니다 (no_spawn_on_player 설정 사용).

    예제:
    getfreecell("prontera",.@x,.@y); // Prontera에서 무작위 빈 셀을 찾아 .@x와 .@y에 저장합니다.
    getfreecell("prontera",.@x,.@y,150,150,5,5); // Prontera에서 150,150 (5x5 범위)에서 무작위 빈 셀을 찾아 .@x와 .@y에 저장합니다.

    ---------------------------------------

    *setwall "<map name>",<x>,<y>,<size>,<dir>,<shootable>,"<name>";
    *delwall "<name>";

    지정된 맵에서, 주어진 방향으로 주어진 크기의 범위에서 x, y에서 시작하는 "setcell" 배열을
    만들어서 보이지 않는 벽을 생성합니다. 이 명령어는 "setcell"과는 달리 클라이언트 부분을
    업데이트해서 문제가 발생하지 않도록 합니다. 방향은 NPC 스프라이트 방향과 동일합니다.
    0=북쪽, 1=북서쪽, 2=서쪽 등입니다. "delwall" 명령을 사용하여 이름으로 벽을 제거할 수 있습니다.

    ---------------------------------------

    *checkwall "<name>";

    지정한 이름을 가진 벽이 존재하는 경우 true를 반환하고, 그렇지 않은 경우 false를 반환합니다.

    ---------------------------------------

    *readbook <book id>,<page>;

    지정한 페이지에서 책 아이템을 엽니다.

    ---------------------------------------

    *open_roulette( {char_id} )

    현재 연결된 캐릭터 또는 지정된 캐릭터 ID의 캐릭터를 대상으로 룰렛 창을 엽니다.

    ---------------------------------------

    *naviregisterwarp("<Name of Link>", "<dest_map>", <dest_x>, <dest_y>)

    맵 서버 생성기를 사용할 때만 유용합니다. 이 NPC에서 목적지 맵/좌표로 추가 워프를 등록합니다.

    ---------------------------------------

    *navihide

    맵 서버 생성기를 사용할 때만 유용합니다. 이 NPC와 이 NPC에서의 모든 링크를 내비게이션
    생성에서 숨깁니다.

    ---------------------------------------

    ========================
    |7.- 인스턴스 명령어. |
    ========================
    ---------------------------------------

    *instance_create("<instance name>"{,<instance mode>{,<owner id>}});

    이 명령은 <mode>의 <owner id>에게 인스턴스를 생성합니다. 인스턴스 이름과 다른 모든
    인스턴스 데이터는 'db/(pre-)re/instance_db.yml'에서 읽힙니다. 성공하면 명령은 고유한
    인스턴스 ID를 생성하고 모든 목록된 맵 및 NPC를 복제하며, 생존 시간을 설정하고 인스턴스
    내의 모든 NPC에서 "OnInstanceInit" 레이블을 트리거합니다.

    인스턴스 모드 옵션:
    IM_NONE : 아무것에도 연결되지 않습니다.
    IM_CHAR : 단일 캐릭터에 연결됩니다.
    IM_PARTY : 파티에 연결됩니다. (기본 인스턴스 모드)
    IM_GUILD : 길드에 연결됩니다.
    IM_CLAN : 클랜에 연결됩니다.

    성공 시 명령은 인스턴스 ID를 반환하고, 실패 시 다음 값 중 하나를 반환합니다.
    -1 : 유효하지 않은 유형.
    -2 : 캐릭터/파티/길드/클랜을 찾을 수 없습니다.
    -3 : 인스턴스가 이미 존재합니다.
    -4 : 무료 인스턴스 없음 (MAX_INSTANCE를 초과함).

    ---------------------------------------

    *instance_destroy {<instance id>};

    이 명령어는 지정된 <instance id>로 현재 플레이어를 이동합니다. 만약 ID가 지정되어 있지
    않은 경우, 실행중인 플레이어가 속한 IM_PARTY 인스턴스가 사용됩니다.

    맵과 좌표는 'db/(pre-)re/instance_db.yml'에 위치합니다.

    이 명령은 성공시 IE_OK를 반환하며, 다음과 같은 경우에는 다른 값을 반환합니다.
    IE_NOMEMBER: 파티/길드/클랜이 없음(파티/길드/클랜 모드에 해당하는 경우).
    IE_NOINSTANCE: 케릭터/파티/길드/클랜이 인스턴스를 가지고 있지 않음.
    IE_OTHER: 기타 오류(잘못된 인스턴스 이름, 케릭터/파티/길드/클랜과 일치하지 않는 인스턴스 등).

    만약 x와 y에 -1을 입력하면, 기본 입구 좌표로 플레이어가 이동됩니다.

    ---------------------------------------

    *instance_npcname("<npc name>"{,<instance id>})

    인스턴스화된 스크립트의 고유 이름을 반환합니다. ID가 지정되지 않은 경우, 현재 스크립트가
    속한 인스턴스가 사용됩니다. 그렇지 않으면 스크립트가 중지됩니다.

    ---------------------------------------

    *instance_mapname("<map name>"{,<instance id>})

    인스턴스화된 맵의 고유 이름을 반환합니다. 인스턴스 ID가 지정되지 않은 경우, 현재 스크립트가
    속한 인스턴스가 사용됩니다. 그렇지 않으면 빈 문자열이 반환됩니다.

    ---------------------------------------

    *instance_id({<instance mode>})

    지정된 모드의 고유 인스턴스 ID를 반환합니다.

    기본적으로 (매개 변수가 지정되지 않은 경우)이 명령은 현재 NPC에서 인스턴스 ID를 반환합니다.
    <instance mode>가 제공되면 현재 연결된 플레이어의 인스턴스 ID가 반환됩니다. 그렇지 않으면
    함수는 0을 반환합니다.

    참고: 플레이어의 인스턴스 ID를 얻으려면 이 명령에 항상 <instance mode> 매개 변수가 필요합니다.

    Instance Mode 옵션:
    IM_CHAR: 캐릭터에 연결됨.
    IM_PARTY: 캐릭터의 파티에 연결됨.
    IM_GUILD: 캐릭터의 길드에 연결됨.
    IM_CLAN: 캐릭터의 클랜에 연결됨.

    예제:
    // 연결된 플레이어를 사용하는 예 :
    npctalk "현재 연결된 플레이어의 인스턴스 ID (파티 모드)는 다음과 같습니다: " + instance_id(IM_PARTY);
    // 인스턴스 맵에서 연결된 NPC를 사용하는 예 :
    npctalk "현재 연결된 NPC의 인스턴스 ID는 다음과 같습니다: " + instance_id();

    ---------------------------------------

    *instance_warpall "<map name>",<x>,<y>{,<instance id>,{<flag>}};

    인스턴스 내의 모든 플레이어를 지정한 좌표로 이동시킵니다. <instance id>가 지정되지 않으면,
    호출한 플레이어가 속한 IM_PARTY 인스턴스를 사용합니다. 이에 실패할 경우,
    스크립트가 중단됩니다.

    <flag> 비트마스크를 사용하여 제한을 추가할 수 있습니다.

    <flag> 비트마스크를 위한 가능한 값:
    IWA_NONE 제한 없음 (기본값).
    IWA_NOTDEAD 사망한 플레이어를 이동시킬지 여부

    ---------------------------------------

    *instance_announce <instance id>,"<text>",<flag>{,<fontColor>{,<fontType>{,<fontSize>{,<fontAlign>{,<fontY>}}}}};

    인스턴스 맵에 있는 <instance id> 내의 모든 플레이어에게 메시지를 방송합니다.
    <instance id>가 0으로 지정된 경우, 스크립트가 첨부된 인스턴스를 사용합니다.

    다른 매개변수에 대한 자세한 내용은 'announce'를 참조하십시오.

    ---------------------------------------

    *instance_check_party(<party id>{,<amount>{,<min>{,<max>}}})

    이 함수는 파티가 특정 요구 사항을 충족하는지 확인하여, 모든 조건이 충족되면 1을 반환하고
    그렇지 않으면 0을 반환합니다. 온라인 캐릭터만 확인합니다.

    amount - 온라인 파티 멤버 수 (기본값은 1).
    min - 파티 내 모든 캐릭터의 최소 레벨 (기본값은 1).
    max - 파티 내 모든 캐릭터의 최대 레벨 (기본값은 설정 파일에서 지정된 최대 레벨).

    예제:

    if (instance_check_party(getcharid(1),2,2,149)) {
    mes "파티원들이 메모리얼 던전 진입 조건을 충족합니다.",
    mes "온라인 멤버가 1-150 레벨 범위 내에 있으며, 적어도 두 명이 온라인 중입니다.";
    close;
    } else {
    mes "죄송합니다, 파티 조건을 충족하지 못했습니다.";
    close;
    }





    ---------------------------------------

    *instance_check_guild(<guild id>{,<amount>{,<min>{,<max>}}})

    이 함수는 온라인 캐릭터만 확인하여 길드의 특정 요구사항이 충족되는지 확인하고, 충족되면 1을 반환하고
    그렇지 않으면 0을 반환합니다.

    amount - 온라인 길드원 수 (기본값은 1).
    min - 길드의 모든 캐릭터의 최소 레벨 (기본값은 1).
    max - 길드의 모든 캐릭터의 최대 레벨 (기본값은 구성 파일에서 최대 레벨).

    예제:

    if (instance_check_guild(getcharid(2),2,2,149)) {
    mes "당신의 길드는 메모리얼 던전의 요구 조건을 충족합니다.",
    mes "모든 온라인 멤버가 1-150 레벨 사이이며 적어도 두 명이 온라인 중입니다.";
    close;
    } else {
    mes "죄송합니다, 당신의 길드는 요구 조건을 충족시키지 못합니다.";
    close;
    }

    ---------------------------------------

    *instance_check_clan(<clan id>{,<amount>{,<min>{,<max>}}})

    이 함수는 온라인 캐릭터만 확인하여 클랜의 특정 요구사항이 충족되는지 확인하고, 충족되면 1을 반환하고 그렇지 않으면 0을 반환합니다.

    amount - 온라인 클랜원 수 (기본값은 1).
    min - 클랜의 모든 캐릭터의 최소 레벨 (기본값은 1).
    max - 클랜의 모든 캐릭터의 최대 레벨 (기본값은 구성 파일에서 최대 레벨).

    예제:

    if (instance_check_clan(getcharid(5),2,2,149)) {
    mes "당신의 클랜은 메모리얼 던전의 요구 조건을 충족합니다.",
    mes "모든 온라인 멤버가 1-150 레벨 사이이며 적어도 두 명이 온라인 중입니다.";
    close;
    } else {
    mes "죄송합니다, 당신의 클랜은 요구 조건을 충족시키지 못합니다.";
    close;
    }

    ---------------------------------------

    *instance_info("<instance name>",<info type>{,<instance_db map index>});

    <instance name>의 <info type>을 인스턴스 DB로부터 반환 합니다.
    <instance name>이 잘못되었거나 올바르지 않은 <info type>이 제공되면 -1이 반환됩니다.

    유효한 info type:
    IIT_ID : 인스턴스 데이터베이스 ID (정수)
    IIT_TIME_LIMIT : 인스턴스 데이터베이스 총 생존 시간 (정수)
    IIT_IDLE_TIMEOUT : 인스턴스 데이터베이스 타임 아웃 시간 (정수)
    IIT_ENTER_MAP : 인스턴스 데이터베이스 진입 맵 (문자열)
    IIT_ENTER_X : 인스턴스 데이터베이스 진입 X 위치 (정수)
    IIT_ENTER_Y : 인스턴스 데이터베이스 진입 Y 위치 (정수)
    IIT_MAPCOUNT : 인스턴스 데이터베이스 총 맵 (정수)
    IIT_MAP : <instance_db map index>에서 가져온 인스턴스 데이터베이스 맵 이름 (문자열).
    인덱스가 잘못되면 빈 문자열이 반환됩니다.

    예제:

    .@name$ = "엔드리스 탑";
    mes .@name$ + "는(은) " + instance_info(.@name$,IIT_IDLETIMEOUT) + "초 동안 인원이 없으면 파괴됩니다.";
    // 엔드리스 탑은 인원이 없을 경우 300초 후에 파괴됩니다. (instance_info의 값에 따라 다를 수 있음)

    ---------------------------------------

    *instance_live_info(<info type>{,<instance id>});

    이 함수는 NPC와 연관된 인스턴스의 <info type>을 반환하며, 인스턴스 ID가 지정된 경우 해당 인스턴스의
    <info type>을 반환합니다.

    유효한 <info type>:
    ILI_NAME - 인스턴스 이름
    인스턴스 이름 또는 실패시 ""를 반환합니다.
    ILI_MODE - 인스턴스 모드
    IM_NONE, IM_CHAR, IM_PARTY, IM_GUILD, IM_CLAN 또는 실패시 -1을 반환합니다.
    ILI_OWNER - 소유자 ID
    NPC와 연관된 인스턴스의 모드에 따른 ID를 반환하거나 실패시 -1을 반환합니다.
    인스턴스 모드가 IM_NONE인 경우, ILI_OWNER는 인스턴스를 생성한 NPC ID를 반환합니다.
    IM_CHAR - 소유자 캐릭터 ID
    IM_PARTY - 파티 ID
    IM_GUILD - 길드 ID
    IM_CLAN - 클랜 ID

    예제:
    // NPC와 연관된 인스턴스 이름 반환.
    .@instance_name$ = instance_live_info(ILI_NAME);

    // 지정된 인스턴스 ID의 길드 소유자 ID 반환.
    .@owner = instance_live_info(ILI_OWNER, instance_id(IM_GUILD));

    ---------------------------------------

    *instance_list(<"map name">{,<instance mode>});

    지정된 <map name>과 선택적인 <mode>에 대해 가능한 인스턴스 ID가 포함된 '.@instance_list' 배열을 생성합니다.
    '.@instance_list' 배열의 크기를 반환합니다.

    Instance mode 옵션: IM_NONE, IM_CHAR, IM_PARTY, IM_GUILD, 또는 IM_CLAN
    인스턴스 모드가 지정되지 않으면 해당 지도에서 모든 인스턴스 ID를 반환합니다.

    예제:
    // 이 예제는 Prontera 맵에 여러 인스턴스가 있다고 가정합니다.
    .@size = instance_list("prontera");
    for ( .@i = 0; .@i < .@size; ++.@i )
    mes instance_mapname("prontera", .@instance_list[.@i]);
    // 출력 결과는 서버에서 활성화된 모든 Prontera 복제본의 목록입니다.

    ---------------------------------------

    *getinstancevar(<variable>,<instance id>);

    특정 인스턴스 ID의 인스턴스 변수(접두사)에 대한 참조를 반환합니다.
    이것은 변수를 가져 오는 데만 사용할 수 있습니다.


    예제:
    // 이것은 .@s 변수를 특정 인스턴스 ID의 'var 변수 값으로 설정합니다.
    set .@s, getinstancevar('var, instance_id(IM_PARTY));

    // 이것은 특정 인스턴스 ID의 'var 변수를 1로 설정합니다.
    set getinstancevar('var, instance_id(IM_GUILD)), 1;

    ---------------------------------------

    *setinstancevar(<variable>,<value>,<instance id>);

    이 명령은 인스턴스 변수를 결과 표현식의 값으로 설정합니다. 자세한 정보는 'set' 명령어를 참조하십시오.

    변수 참조를 반환합니다.

    예제:
    // 이 명령은 특정 인스턴스 ID의 'var' 변수를 9로 설정합니다.
    setinstancevar('var, 9, instance_id(IM_GUILD));

    ---------------------------------------

    =========================
    |8.- 퀘스트 로그 명령어 |
    =========================
    ---------------------------------------

    *questinfo <Icon>{,<Map Mark Color>{,"<condition>"}};

    이 명령은 OnInit/OnInstanceInit 레이블에서만 사용해야 합니다.
    NPC 상단에 감정 표현을 표시하고, 선택적으로 미니맵에 "viewpoint" 또는 "viewpointmap"과 같은
    색상으로 표시합니다.
    사용자가 어떤 작업을 수행할 때마다 각 NPC는 지도에 설정된 questinfo를 확인합니다.
    questinfo가 있으면 플레이어가 조건을 충족하는지 확인합니다.
    만약 그렇다면 또는 조건이 없으면 말풍선이 나타납니다.

    Available <Icon>:

    No Icon : QTYPE_NONE
    ! Quest Icon : QTYPE_QUEST
    ? Quest Icon : QTYPE_QUEST2
    ! Job Icon : QTYPE_JOB
    ? Job Icon : QTYPE_JOB2
    ! Event Icon : QTYPE_EVENT
    ? Event Icon : QTYPE_EVENT2
    Warg : QTYPE_WARG (Only for packetver < 20170315)
    Warg Face : QTYPE_WARG2 (Only for packetver >= 20120410 and < 20170315)
    Click Me : QTYPE_CLICKME (Only for packetver >= 20170315)
    Daily Quest : QTYPE_DAILYQUEST (Only for packetver >= 20170315)
    ! Event Icon : QTYPE_EVENT3 (Only for packetver >= 20170315)
    Job Quest : QTYPE_JOBQUEST (Only for packetver >= 20170315)
    Jumping Poring : QTYPE_JUMPING_PORING (Only for packetver >= 20170315)

    <Map Mark Color>는 사용하면 사용자의 미니맵에서 NPC의 위치에 표식이 생깁니다.
    사용 가능한 색상 값은 다음과 같습니다:

    QMARK_NONE - No Marker (default)
    QMARK_YELLOW - Yellow Marker
    QMARK_GREEN - Green Marker
    QMARK_PURPLE - Purple Marker

    <condition>는 'if' 명령어의 <condition>과 유사하게 표현식(expression)이 될 수 있습니다.

    퀘스트 정보(questinfo)를 트리거하기 위한 플레이어 액션 목록:

    - 플레이어 인벤토리에 아이템 추가/제거
    - 기본/직업 레벨 변경
    - 직업 변경
    - 퀘스트 수락/삭제/완료
    - 퀘스트 목표 업데이트(캐릭터가 몬스터 퀘스트 대상을 처치함)
    - 워프


    예제:
    izlude,100,100,4 script Test 844,{
    mes "[Test]";
    mes "안녕하세요.";
    close;

    OnInit:
    // 주어진 사냥 퀘스트를 완료하고 'unknown_var' 변수가 0보다 큰 경우 해당 아이콘을 표시합니다.
    questinfo QTYPE_QUEST, QMARK_YELLOW, "checkquest(1001,HUNTING) == 2 && unknown_var > 0";

    //.. 레드포션을 1개 가지고 있고 주어진 퀘스트를 시작하지 않은 경우 해당 아이콘을 표시합니다.
    questinfo QTYPE_QUEST, QMARK_YELLOW, "!isbegin_quest(1001) && countitem(501) == 1";
    end;
    }

    ---------------------------------------

    *questinfo_refresh {<char_id>};

    이 명령어는 해당/지정된 플레이어에 대한 questinfo 조건에 따라 맵에 설정된
    각 quest bubble을 새로고침합니다.

    ---------------------------------------

    *setquest <ID>{,<char_id>};

    < ID >의 퀘스트를 사용자의 퀘스트 로그에 배치하며, 상태는 "활성화"입니다.

    *questinfo가 설정되어 있고, 여기에 동일한 ID가 지정된 경우, 퀘스트가
    설정되면 아이콘은 지워집니다.

    ---------------------------------------

    *completequest <ID>{,<char_id>};

    주어진 <ID>에 대한 상태를 "완료"로 변경하고 사용자의 퀘스트 로그에서 제거합니다.

    ---------------------------------------

    *erasequest <ID>{,<char_id>};

    주어진 <ID>에 대한 퀘스트를 사용자의 퀘스트 로그에서 제거합니다.

    ---------------------------------------

    *changequest <ID>,<ID2>{,<char_id>};

    주어진 <ID>의 퀘스트를 사용자의 퀘스트 로그에서 제거합니다.
    <ID2>의 퀘스트를 퀘스트 로그에 추가하고, 상태는 "활성화"입니다.

    ---------------------------------------

    *checkquest(<ID>{,PLAYTIME|HUNTING{,<char_id>}})

    추가적인 인자가 없을 때, 퀘스트의 상태를 반환합니다:
    -1 = 퀘스트 시작하지 않음 (퀘스트 로그에 없음)
    0 = 퀘스트 받음, 하지만 상태가 "비활성화"임
    1 = 퀘스트 받음, 상태가 "활성화"임
    2 = 퀘스트 완료됨

    "PLAYTIME" 매개변수가 제공되면:
    -1 = 퀘스트 시작하지 않음 (퀘스트 로그에 없음)
    0 = 시간 제한이 아직 도래하지 않음
    1 = 시간 제한은 도래하지 않았지만 퀘스트가 완료되었음
    2 = 시간 제한이 도래했음

    "HUNTING" 매개변수가 제공되면:
    -1 = 퀘스트 시작하지 않음 (퀘스트 로그에 없음)
    0 = 목표 몬스터를 모두 처치하지 않았으며, 시간 제한이 도래하지 않았음.
    1 = 목표 몬스터를 모두 처치하지 않았지만 시간 제한이 도래했음.
    2 = 목표 몬스터를 모두 처치했음

    ---------------------------------------

    *isbegin_quest(<ID>{,<char_id>})

    퀘스트의 상태를 반환합니다:
    0 = 퀘스트를 시작하지 않았습니다 (퀘스트 로그에 없음)
    1 = 퀘스트가 주어졌습니다 (상태는 "비활성" 또는 "활성" 중 하나입니다)
    2 = 퀘스트를 완료했습니다

    ---------------------------------------

    *showevent <icon>{,<mark color>{,<char_id>}}

    NPC 위에 감정 표시를 표시하고 필요에 따라 미니 맵에 색상 마크
    ("viewpoint" 또는 "viewpointmap"과 유사)를 표시합니다.
    이것은 특정 플레이어에게 NPC가 퀘스트 또는 이벤트를 가지고 있음을
    나타내기 위해 사용됩니다.

    사용 가능한 아이콘:

    Remove Icon : QTYPE_NONE
    ! Quest Icon : QTYPE_QUEST
    ? Quest Icon : QTYPE_QUEST2
    ! Job Icon : QTYPE_JOB
    ? Job Icon : QTYPE_JOB2
    ! Event Icon : QTYPE_EVENT
    ? Event Icon : QTYPE_EVENT2
    Warg : QTYPE_WARG
    Warg Face : QTYPE_WARG2 (패킷버전 20120410 이상에서만 가능)

    마크 색상:
    QMARK_NONE - No Marker (default)
    QMARK_YELLOW - Yellow Marker
    QMARK_GREEN - Green Marker
    QMARK_PURPLE - Purple Marker

    ---------------------------------------

    *open_quest_ui {<quest ID>,{<char ID>}};

    이 명령은 NPC에게 붙어 있는 플레이어나 주어진 캐릭터 ID에 대해 퀘스트 UI를 엽니다.
    quest ID로 0을 사용하여 메인 퀘스트 UI를 열 수 있습니다. quest ID가 0이
    아니면 해당 퀘스트 UI가 열리며, 클라이언트 LUB에 퀘스트 데이터가 존재하지
    않으면 퀘스트가 존재하지 않는다는 메시지가 표시됩니다.

    이 명령은 패킷 버전 2015-12-02 이상이 필요합니다.

    ---------------------------------------

    ============================
    |9.- 전장 명령어. |
    ============================
    ---------------------------------------

    *waitingroom2bg_single(<battle group>,{"<map name>",<x>,<y>{,"<npc name>"}});

    대기방에서 처음으로 대기중인 플레이어를 선택하여 지정된 배틀그라운드 그룹에 추가합니다.
    그 플레이어는 배틀그라운드 그룹의 기본 스폰 지점으로 워프되거나 지정된 좌표 <x> 및
    <y>로 워프됩니다.

    주의: 지정된 <map>은 MF_BATTLEGROUND 맵 플래그를 가지고 있어야합니다.
    그렇지 않으면 플레이어는 배틀그라운드 팀에서 제외됩니다.

    ---------------------------------------

    *waitingroom2bg("<map name>",<x>,<y>,{"<On Quit Event>","<On Death Event>"{,"<NPC Name>"}});

    <map name>,<x>,<y>는 "리스폰" 기준 위치이며, 그 위치에 있는 그룹의 플레이어가
    사망했을 때 리스폰하는 지점입니다.
    <On Quit Event>는 캐릭터에 첨부되는 NPC 레이블로,
    다시 로그인 할 때 실행됩니다. (선택 사항)
    <On Death Event>는 캐릭터에 첨부되는 NPC 레이블로,
    캐릭터가 사망했을 때 실행됩니다. (선택 사항)

    <map name>에 "-"를 지정하면 플레이어가 1초 후 지정된 위치에 자동으로 리스폰하지 않습니다.
    이를 통해 <On Death Event>를 더 잘 조작할 수 있습니다. 플레이어는 <On Death Event>가
    끝날 때 원하는 위치로 워프해야합니다.

    이전 명령과 달리 후자는 대기실에서 GROUP을 배틀그라운드에 추가하고 $@arenamembers [0]
    배열을 설정합니다. 0은 첫 번째 그룹의 ID를 보유하고 1은 두 번째 그룹의 ID를 보유합니다.

    선택적 NPC 이름 매개 변수를 생략하면 현재 NPC의 대기실이 사용됩니다.

    예제:
    // 배틀 그룹은 $@KvM01BG_id1로 참조하며, 사망하면 bat_c01,52,129에서 리스폰합니다.
    set $@KvM01BG_id1, waitingroom2bg("bat_c01",52,129,"KvM01_BG::OnGuillaumeQuit","KvM01_BG::OnGuillaumeDie");
    end;

    ---------------------------------------

    *bg_create("<map name>",<x>,<y>{,"<On Quit Event>","<On Death Event>"});

    전장 인스턴스를 생성합니다. 다른 전장 명령어와 함께 사용할 수 있습니다.

    <map name>,<x>,<y>는 "리스폰" 위치를 나타내며, 플레이어 그룹이 사망 시 되살아날 위치입니다.
    <On Quit Event>는 캐릭터에 부착되어 로그인할 때 실행되는 NPC 레이블입니다(선택사항).
    <On Death Event>는 캐릭터에 부착되어 죽을 때 실행되는 NPC 레이블입니다(선택사항).

    <map name> 대신 "-"을 사용하면 플레이어가 1초 후 자동으로 리스폰되지 않으며 이를 통해
    <On Death Event>를 더욱 유연하게 조작할 수 있습니다. 플레이어는
    <On Death Event>의 끝에서 원하는 위치로 이동해야 합니다.

    전장 인스턴시 생성 성공시 전투 그룹 ID를 반환하고, 실패 시 0을 반환합니다.

    ---------------------------------------

    *bg_join(<battle group>,{"<map name>",{<x>,<y>{,<char id>}});

    기존 전장에 연결된 플레이어 또는 <char id>(지정된 경우)를 추가합니다. 플레이어는 기본적으로
    전장의 리스폰 지점 또는 <map>에서 지정된 좌표<x>,<y>로 이동합니다.
    (플레이어가 전투터 맵에 속해 있지 않은 경우 제외)

    성공 시 true를 반환하고, 실패 시 false를 반환합니다.



    ---------------------------------------

    *bg_team_setxy <Battle Group ID>,<x>,<y>;

    주어진 전장의 리스폰 지점을 동일한 맵 상의 x, y로 업데이트합니다. <Battle Group ID>는
    getcharid(4)를 사용하여 검색할 수 있습니다.

    Example:
    bg_team_setxy getcharid(4),56,212;
    mapannounce "bat_a01", "Group [1] 이 작업장을 가져갔습니다. 이제 거기에서 리스폰합니다.",bc_map,"0xFFCE00";
    end;

    ---------------------------------------

    *bg_reserve("<battleground_map_name>"{,<ended>});

    배틀그라운드 UI 시스템을 위해 배틀그라운드 맵을 예약합니다. 맵이 예약되면
    다른 유사한 대기열 생성을 방지하고 활성 배틀그라운드 이벤트에 참여할 수 있습니다.

    <ended>가 true인 경우 배틀그라운드가 끝난 것으로 표시되어 새로운 플레이어가
    참여하지 못하게 됩니다. 이 상태는 플레이어가 배지를 얻을 수 있는 기간을 위한 것입니다.

    ---------------------------------------

    *bg_unbook("<battleground_map_name>");

    배틀그라운드 UI 시스템에서 배틀그라운드 맵을 제거합니다.
    맵이 제거되면 대기열이 생성될 수 있습니다.

    ---------------------------------------

    *bg_desert({<char_id>});

    'bg_leave'와 같지만, 플레이어가 배틀그라운드 DB(기본적으로 10분)에 정의된
    시간 동안 다른 대기열에 참여하지 못하도록 하는 데저터 상태로 만듭니다.

    배틀그라운드 큐 시스템을 사용하는 경우, 이 명령은 플레이어를 이전에 참여했던
    위치로 이동시키거나 맵이 MF_NOSAVE인 경우 저장 지점으로 이동시킵니다.

    ---------------------------------------

    *bg_warp <Battle Group>,"<map name>",<x>,<y>;

    'warp' 명령과 유사합니다.
    <Battle Group>의 모든 구성원을 지정된 맵과 좌표에 배치합니다.

    예제:
    //Tierra Gorge 배틀그라운드에 대한 배틀그룹 1을 시작 위치에 배치합니다.
    bg_warp $@TierraBG1_id1,"bat_a01",352,342;
    end;

    ---------------------------------------

    *bg_monster <Battle Group>,"<map name>",<x>,<y>,"<name to show>",<mob id>,"<event label>";
    *bg_monster(<Battle Group>,"<map name>",<x>,<y>,"<name to show>",<mob id>,"<event label>");

    'monster' 명령과 유사합니다.
    주어진 Battle Group에 대한 충성도를 가진 몬스터를 소환합니다.
    여러 마리의 몬스터를 소환하는 것은 불가능합니다.
    몬스터는 공성전에 있는 몬스터와 유사합니다.

    예제:
    // 두 가지 다른 방법으로 사용할 수 있습니다.
    bg_monster $@TierraBG1_id2,"bat_a01",167,50,"Food Depot",1910,"Feed Depot#1::OnMyMobDead";
    end;

    // 또한 "set"을 사용하여 몬스터에 ID를 설정할 수 있습니다.
    // 아래 명령과 함께 사용할 때 유용합니다
    set $@Guardian_3, bg_monster($@TierraBG1_id2,"bat_a01",268,204,"Guardian",1949,"NPCNAME::OnMyMobDead");
    end;

    ---------------------------------------

    *bg_monster_set_team <GID>,<Battle Group>;

    이 명령은 전장에서 몬스터의 충성도를 변경합니다.
    'bg_monster' 명령을 통해 몬스터를 소환할 때 GID를 설정할 수 있습니다.

    Example:

    end;

    OnEnable:
    mapannounce "배틀그룹2에 가디언이 소환되었습니다.!",bc_map,"0xFFCE00";
    set $@Guardian, bg_monster($@BG_2,"bat_a01",268,204,"Guardian",1949,"NPCNAME::OnMyMobDead");
    initnpctimer;
    end;

    OnTimer1000:
    stopnpctimer;
    mapannounce "이거, 죄송해요! 이 몬스터는 배틀그라운드 1을 위한 것이었습니다.",bc_map,"0xFFCE00";
    bg_monster_set_team $@Guardian, $@BG_1;
    end;

    ---------------------------------------

    *bg_leave {<char_id>};

    해당 참가자를 해당 배틀그라운드(Battle Group)에서 제거합니다.

    배틀그라운드 대기열 시스템에서는, 참가자를 이전 위치로 이동시키거나,
    맵에 MF_NOSAVE가 설정되어 있는 경우 세이브 포인트로 이동시킵니다.

    ---------------------------------------

    *bg_destroy <Batte Group>;

    해당 배틀그라운드(Battle Group)를 파괴합니다.

    ---------------------------------------

    *areapercentheal "<map name>",<x1>,<y1>,<x2>,<y2>,<hp>,<sp>;

    특정 영역 내 플레이어의 최대 HP/SP의 백분율만큼 회복합니다.
    이 명령은 주로 배틀그라운드 스크립트에서 사용됩니다.

    예제:
    areapercentheal "bat_a01",52,208,61,217,100,100;
    end;

    ---------------------------------------

    *bg_get_data(<Battle Group>,<type>);

    주어진 배틀그라운드(Battle Group)와 관련된 데이터를 검색합니다.
    타입(type)은 다음 중 하나일 수 있습니다:

    0 - 현재 그룹에 속한 플레이어 수
    1 - $@arenamembers 임시 전역 배열에 <Battle Group>의 참가자 GID를 저장하고,
    현재 그룹에 속한 플레이어 수를 $@arenamemberscount에 저장하고 반환합니다.

    ---------------------------------------

    *bg_getareausers(<Battle Group>,"<map name>",<x0>,<y0>,<x1>,<y1>);

    지정된 직사각형 영역 내에서 지정된 배틀그라운드 그룹에 속한 플레이어 수를 가져옵니다.

    ---------------------------------------

    *bg_updatescore "<map name>",<Guillaume Score>,<Croix Score>;

    이 명령은 점수판을 강제로 업데이트합니다.
    맵이 Type 2 배틀그라운드로 정의되어 있는 경우에만 사용할 수 있습니다.:
    mapflag <map name> battleground 2

    ---------------------------------------

    *bg_info("<battleground name>", <type>);

    데이터베이스에서 지정된 <battleground name>과 관련된 데이터를 검색합니다.
    배틀그라운드 대기열이 활성화되어 있어야 합니다.

    <Type>은 다음 중 하나일 수 있습니다:

    BG_INFO_ID: Battleground ID.
    BG_INFO_REQUIRED_PLAYERS: 배틀그라운드 시작에 필요한 플레이어 수(한 쪽당).
    BG_INFO_MAX_PLAYERS: 배틀그라운드에서 허용되는 최대 플레이어 수.
    BG_INFO_MIN_LEVEL: 배틀그라운드 참가에 필요한 최소 레벨.
    BG_INFO_MAX_LEVEL: 배틀그라운드 참가에 필요한 최대 레벨.
    BG_INFO_MAPS: 배틀그라운드의 맵 수. @bgmaps[]에 맵 이름 배열과
    @bgmapscount에 개수가 저장됩니다.
    BG_INFO_DESERTER_TIME: 플레이어가 이탈자로 표시되는 시간(초).

    ---------------------------------------

    ====================
    |10.- Pet 명령어. |
    ====================
    ---------------------------------------

    *bpet;
    *birthpet;

    이 명령어는 펫알 부화 윈도우를 켜줍니다. 해당 캐릭터에 연결된 클라이언트에서 사용됩니다.
    펫알 부화기 아이템 스크립트에서 사용되며, 보유한 알을 부화시킬 수 있게 해줍니다.
    만약 캐릭터가 알을 가지고 있지 않으면 빈 부화기 창이 열립니다.
    이 명령어는 아이템 스크립트 외부에서도 사용 가능합니다.

    ---------------------------------------

    *pet <pet id>;
    *catchpet <pet id>;

    이 명령어는 모든 길들이기 아이템 스크립트에서 사용됩니다. 해당 명령어를 실행하면,
    해당 캐릭터에 연결된 클라이언트에서 길들이기 커서가 나타나며, 지정된 펫 ID 번호를
    가진 몬스터에 사용할 수 있습니다. 아이템 스크립트 외부에서도 동작합니다.
    <pet id>가 PET_CATCH_UNIVERSAL이면, 해당 몬스터가 펫 데이터베이스에
    있으며, MD_STATUS_IMMUNE 몬스터 모드가 없는 경우, 몬스터를 잡으려고 시도합니다.
    <pet id>가 PET_CATCH_UNIVERSAL_ITEM이면, 해당 몬스터가 펫 데이터베이스에
    있으며, 해당 몬스터가 사용된 미끼 아이템을 필요로하는 경우, 몬스터를 잡으려고 시도합니다.
    몬스터 모드에 대한 자세한 내용은 'doc/mob_db_mode_list.txt'에서 확인할 수 있습니다.

    펫 ID의 전체 목록은 'db/(pre-)re/pet_db.yml'에서 확인할 수 있습니다.

    ---------------------------------------

    *makepet <pet id>;

    이 명령어는 펫 ID 번호로 지정된 종류의 펫 알을 만들어서 명령어를 호출한 캐릭터의
    인벤토리에 넣습니다. 펫 ID 번호는 'db/(pre-)re/pet_db.yml'에 나열되어 있습니다.
    이 명령어를 사용하면 일반적인 방법으로 펫을 성공적으로 잡은 것과 동일한 방식으로
    알이 생성됩니다.

    // 이렇게 입력하면 포링 펫이 생성됩니다:
    makepet 1002;

    반드시 이 명령어를 사용하여 펫 알을 생성해야 합니다. 'getitem'으로 펫 알을
    얻으려고 하면 캐릭터 서버에서 펫 데이터가 생성되지 않으므로 펫 알을 부화할 때
    사라집니다.

    ---------------------------------------

    *getpetinfo(<type>{,<char_id>})

    이 함수는 현재 활성화된 펫에 대한 정보를 반환합니다.
    유효한 타입은 다음과 같습니다:

    PETINFO_ID - 펫 id
    PETINFO_CLASS - 'db/(pre-)re/pet_db.yml'에 지정된 펫 클래스 번호 - 어떤 종류의 펫인지 알려줍니다.
    PETINFO_NAME - 펫 이름. 펫이 없는 경우 "null"을 반환합니다.
    PETINFO_INTIMATE - 펫 친밀도 레벨 (친밀도 점수). 1000이 최대입니다.
    PETINFO_HUNGRY - 펫 만복도 레벨. 100이 가장 배부른 상태입니다.
    PETINFO_RENAMED - 펫 이름 변경 플래그. 0은 이 펫이 아직 이름이 지어지지 않았음을 의미합니다.
    PETINFO_LEVEL - 펫 레벨
    PETINFO_BLOCKID - 펫 게임 id
    PETINFO_EGGID - 펫 알 아이템 id
    PETINFO_FOODID - 펫 푸드 아이템 id

    PETINFO_INTIMATE는 다음과 같은 상수와 함께 값을 확인하는 데 사용할 수 있습니다:
    PET_INTIMATE_NONE = 0
    PET_INTIMATE_AWKWARD = 1 ~ 99
    PET_INTIMATE_SHY = 100 ~ 249
    PET_INTIMATE_NEUTRAL = 250 ~ 749
    PET_INTIMATE_CORDIAL = 750 ~ 909
    PET_INTIMATE_LOYAL = 910 ~ 1000

    PETINFO_HUNGRY는 다음과 같은 상수와 함께 값을 확인하는 데 사용할 수 있습니다:
    PET_HUNGRY_NONE = 0
    PET_HUNGRY_VERY_HUNGRY = 1 ~ 10
    PET_HUNGRY_HUNGRY = 11 ~ 25
    PET_HUNGRY_NEUTRAL = 26 ~ 75
    PET_HUNGRY_SATISFIED = 76 ~ 90
    PET_HUNGRY_STUFFED = 91 ~ 100

    Example:
    mes "[Vet]";
    mes "당산의 펫 + " getpetinfo(PETINFO_NAME);
    if (getpetinfo(PETINFO_INTIMATE) < PET_INTIMATE_LOYAL)
    mes "당신에게 애정이 부족합니다!";
    else
    mes "당신을 매우 사랑하는 것 같습니다!";
    close;

    ---------------------------------------

    =============================
    |10.1.- The Pet AI commands.|
    =============================
    ---------------------------------------

    이 명령어들은 호출하는 캐릭터가 애완동물을 소유하고 있을 때만 작동하며, 애완동물 스크립트에서
    실행될 것을 목적으로 합니다. 이들은 호출하는 캐릭터의 현재 애완동물에 대한 AI 결정 방식을
    수정하며, 각각 하나씩만 해당 애완동물에 대해 동시에 작동할 수 있습니다. 이들 명령어는 스크립트
    실행에 의해 독립적인 효과를 발휘하지 않으므로, 애완동물은 'petloot', 'petskillbonus',
    'petskillattack' 또는 'petpetskillattack2' 및 'petskillsupport' 중
    하나만 가질 수 있습니다.

    지연 및 지속 시간을 가진 모든 명령어는 지정된 시간(초) 동안 동작을 활성화하며, 활성화
    간격은 지정된 초 수로 지연됩니다. 비율은 효과 발생 가능성을 백분율로 나타내며,
    'bonusrate'는 애완동물 친밀도가 최대치일 때 정상 비율에 추가됩니다.

    아래 명령어로 수정된 동작은 애완동물이 충실하고 'battle_athena.conf'에서 적절한
    구성 옵션이 설정된 경우에만 표시됩니다.

    데이터베이스의 애완동물 스크립트는 해당 종류의 애완동물이 부화할 때마다 실행됩니다.
    사용 가능한 항목 스크립트( 'bonus' 참조)에서도 작동합니다. 아마도 애완동물별
    명령어도 NPC 스크립트에서 작동하며, 현재 애완동물의 동작을 수정하고 다시 부화될
    때까지 계속 유지됩니다. (애완동물이 아직 알에서 부화된 상태에서 캐릭터가
    다시 로그인 할 때도 마찬가지로 발생합니다.) NPC 스크립트에서 실행되는 이러한 명령의
    효과가 최종적으로 얼마나 오래 지속될지는 확실하지 않지만, 사용 가능한 항목
    스크립트에서 유용한 애완동물 버프 아이템을 만들기 위해 사용할 수 있습니다.

    누구도 이전에 시도해 보지 않았으므로, 여기에서는 혼자 진행해야합니다.

    ---------------------------------------

    *petskillbonus <bonus type>,<value>,<duration>,<delay>;

    이 명령은 애완동물이 일정 시간마다 일정 간격으로 주인의 스탯에 추가 보너스를 부여합니다.
    보너스 목록은 'doc/item_bonus.txt' 파일을 참고하세요.

    주의: 현재 보너스 스크립트에서 사용하는 보너스에 대해서만 지원됩니다.

    ---------------------------------------

    *petrecovery <status type>,<delay>;

    이 명령은 애완동물이 특정 상태 조건을 치료합니다. 딜레이 간격으로 치료 행동이
    발생합니다. 치료 가능한 상태 조건 목록은 'src/map/script_constants.hpp'
    파일의 'SC_' 상태 조건 상수 목록을 참고하세요.

    ---------------------------------------

    *petloot <max items>;

    이 명령은 애완동물이 아이템을 획득하도록 설정하며, 최대 아이템 수를 지정합니다.
    애완동물은 아이템을 저장하고 최대 아이템 개수에 도달하거나 애완동물 동작을 실행할 때
    아이템을 반환합니다.

    ---------------------------------------

    *petskillsupport <skill id>,<skill level>,<delay>,<percent hp>,<percent sp>;
    *petskillsupport "<skill name>",<skill level>,<delay>,<percent hp>,<percent sp>;

    이 명령은 애완동물이 지정된 지속시간마다 소유자의 HP와 SP가 지정된 백분율 이하일 때
    지정된 보조 스킬을 사용하도록 합니다. 스킬 번호는 'db/(pre-)re/skill_db.yml'
    파일에서 확인할 수 있습니다.

    스킬 시전 시, 주인의 스탯을 사용할지, 애완동물의 스탯을 사용할지는 정확하게 알 수 없습니다.
    이에 대해서는 Skotlex에게 문의해보시는 것이 좋습니다.

    ---------------------------------------

    *petskillattack <skill id>,<skill level>,<rate>,<bonusrate>;
    *petskillattack "<skill name>",<skill level>,<rate>,<bonusrate>;
    *petskillattack2 <skill id>,<damage>,<number of attacks>,<rate>,<bonusrate>;
    *petskillattack2 "<skill name>",<damage>,<number of attacks>,<rate>,<bonusrate>;

    이 두 명령어는 펫이 소유자가 현재 싸우고 있는 적에게 공격 스킬을 시전하게 합니다.
    스킬 ID와 레벨은 'petskillsupport'와 같습니다. 'petskillattack2'는
    고정된 데미지와 지정된 공격 수를 갖는 스킬을 시전하게 합니다.

    'rate' 값은 1과 100 사이입니다. 100은 100%를 의미합니다.

    ---------------------------------------

    *petautobonus <bonus script>,<rate>,<duration>{,<flag>,{<other script>}};
    *petautobonus2 <bonus script>,<rate>,<duration>{,<flag>,{<other script>}};
    *petautobonus3 <bonus script>,<rate>,<duration>,<skill id>,{<other script>};
    *petautobonus3 <bonus script>,<rate>,<duration>,"<skill name>",{<other script>};

    자세한것은 'autobouns'를 참조하세요

    ---------------------------------------

    ===========================
    |11.- 호문 명령. |
    ===========================
    ---------------------------------------

    *homevolution;

    이 명령어는 현재 플레이어의 호문을 진화시킵니다.
    만약 진화가 되지 않는다면, /swt 이모션을 보여줍니다.

    호문을 진화시키기 위해서는, 명령어를 실행한 플레이어가 호문을
    소유하고 있어야 하며, 호문이 마지막 진화 단계가 아니어야 하고,
    호문의 친밀도가 91000 이상이어야 합니다.

    ---------------------------------------

    *morphembryo;

    이 명령은 호출된 플레이어의 호문을 호문S로 변이시키기 위해
    호출할 수 없는 상태로 만듭니다. 플레이어는 성공하면 이상한 엠브리오
    (아이디 6415)를 인벤토리에 받으며 변이시 삭제됩니다.
    명령은 호출된 플레이어가 99 레벨 이상으로 진화한 호문이 없으면 실패합니다.
    실패 시 /swt 감정 표현이 나타납니다.

    성공 시 1, 실패 시 0을 반환합니다.

    ---------------------------------------

    *hommutate {<ID>};

    이 명령은 호출된 플레이어의 호문을 호문S로 변이시키려고 시도합니다.
    성공하면 이상한 엠브리오(아이디 6415)가 삭제됩니다.

    명령은 호출된 플레이어가 99 레벨 이상으로 진화한 호문이 없거나, 호문이
    배아 상태가 아니거나, 호출된 플레이어가 이상한 엠브리오를 가지고
    있지 않은 경우 실패합니다. 실패 시 /swt 감정 표현이 나타납니다.

    선택적 매개변수 <ID>를 설정하면 호출된 플레이어의 호문이
    지정된 호문큘러스 ID로 변경됩니다.
    그렇지 않으면 무작위 호문S가 선택됩니다.
    전체 ID 목록은 'db/homunculus_db.txt'를 참조하십시오.

    성공 시 1, 실패 시 0을 반환합니다.

    ---------------------------------------

    *checkhomcall()

    이 함수는 붙어있는 플레이어의 호문이 활성화되어 있는지 확인하고,
    다음과 같은 값을 반환합니다:
    -1: 플레이어가 호문큘러스를 보유하고 있지 않음.
    0: 플레이어의 호문큘러스가 활성화됨.
    1: 플레이어의 호문큘러스가 파괴됨.
    2: 플레이어의 호문큘러스가 변이 상태임.

    ---------------------------------------

    *gethominfo(<type>{,<char_id>})

    이 함수는 호출하는 캐릭터의 호문에 대한 정보를 반환합니다.
    호문이 없는 경우 0 또는 "null"을 반환합니다.

    유효한 유형은 다음과 같습니다:
    0 - 호문 ID
    1 - 호문 클래스
    2 - 호문 이름
    3 - 호문 친밀도 레벨 (친밀도 점수). 100000은 완전한 충성심입니다.
    4 - 호문 만복도 레벨. 100은 완전히 배불러졌음을 나타냅니다.
    5 - 호문 이름 변경 플래그. 0은 이 호문큘러스가 아직 이름이 지정되지 않았음을 나타냅니다.
    6 - 호문 레벨
    7 - 호문 게임 ID

    ---------------------------------------

    *homshuffle;

    이 명령은 현재 호출하는 캐릭터의 호문 레벨에 따라 호문 스탯을 재계산합니다.

    ---------------------------------------

    *addhomintimacy <amount>{,<char_id>};

    주어진 <amount>만큼 호문큘러스의 친밀도(intimacy)를 증가시키거나 감소시킵니다.
    100000은 최대 친밀도입니다.

    ---------------------------------------

    ==========================
    |12.- 용병 명령어. |
    ==========================
    ---------------------------------------

    *mercenary_create <class>,<contract time>;

    이 명령어는 특정 시간(밀리초) 동안 용병을 소환합니다.
    사용 가능한 모든 클래스는 'db/mercenary_db.txt'를 참조하십시오.

    이 명령어는 일반적으로 용병 스크롤의 아이템 스크립트에서 사용됩니다.

    ---------------------------------------

    *mercenary_delete {<char id>{,<reply>}};

    이 명령어는 플레이어의 용병을 제거합니다.
    '응답' 매개변수는 다음 값 중 하나일 수 있습니다:

    0 - 용병의 근무 시간이 끝났으며 충성심이 1 증가했습니다. (기본값)
    1 - 귀하의 용병이 죽었으며 충성심이 1 감소했습니다.
    2 - 귀하의 용병이 해고되었습니다.
    3 - 귀하의 용병이 도망갔습니다.

    ---------------------------------------

    *mercenary_heal <hp>,<sp>;

    이 명령어는 'heal'과 같이 작동하지만 현재 연결된 캐릭터의 용병에 영향을 미칩니다.

    ---------------------------------------

    *mercenary_sc_start <type>,<tick>,<val1>;

    이 명령어는 'sc_start'와 같이 작동하지만 현재 연결된 캐릭터의 용병에 영향을 미칩니다.

    ---------------------------------------

    *mercenary_get_calls(<guild>);
    *mercenary_set_calls <guild>,<value>;

    현재 캐릭터의 길드에서 용병 호출 값을 가져오거나 설정합니다.
    길드는 다음 상수 중 하나일 수 있습니다:

    ARCH_MERC_GUILD
    SPEAR_MERC_GUILD
    SWORD_MERC_GUILD

    ---------------------------------------

    *mercenary_get_faith(<guild>);
    *mercenary_set_faith <guild>,<value>;

    현재 캐릭터의 길드에서 용병 충성도 값을 가져오거나 설정합니다.
    길드는 다음 상수 중 하나일 수 있습니다:

    ARCH_MERC_GUILD
    SPEAR_MERC_GUILD
    SWORD_MERC_GUILD

    ---------------------------------------

    *getmercinfo(<type>{,<char id>});

    현재 캐릭터의 용병 정보를 가져옵니다. Char id가 주어지면 해당 캐릭터의
    정보를 가져옵니다. Type은 검색할 정보를 지정하며, 다음 중 하나일 수 있습니다:

    0 - 용병 ID
    1 - 용병 클래스
    2 - 용병 이름
    3 - 용병 길드의 이 용병에 대한 충성도 값 (있는 경우)
    4 - 용병 길드의 이 용병에 대한 호출 값 (있는 경우)
    5 - 용병 킬 카운트
    6 - 용병 잔여 수명 (밀리초)
    7 - 용병 레벨
    8 - 용병 게임 ID

    캐릭터가 용병을 보유하지 않으면 이름은 ""이고
    다른 모든 유형에 대해 0을 반환합니다.

    ---------------------------------------

    ======================
    |13.- 파티 명령어. |
    ======================
    ---------------------------------------

    *getpartyname(<party id>)

    이 함수는 지정된 ID 번호를 갖는 파티의 이름을 반환합니다.
    해당 파티 ID가 없는 경우 "null"이 반환됩니다.

    예를 들어, 파티 ID가 전역 변수로 저장된 경우:

    // 이렇게 하면 변수에 저장된 ID의 파티 이름을 반환합니다
    mes "당신은 '" + getpartyname($@var) + "' 파티에 속해 있어요!";

    ---------------------------------------

    *getpartymember <party id>{,<type>{,<array_variable>}};

    이 명령은 지정된 파티의 모든 멤버를 찾아 그들의
    이름(또는 캐릭터 ID 또는 계정 ID)을 임시 전역 변수 배열에 반환합니다.
    이와 같은 여러 명령이 있으며, 실행시 특수 변수에 데이터를 채워주는 것
    외에 아무 일도 하지 않습니다.

    이를 실행하면,

    $@partymembername$[] 모든 파티 멤버의 이름이 포함된
    임시 전역 문자열 배열입니다
    (타입이 0 또는 지정되지 않은 경우만 설정됨)

    $@partymembercid[] 이들 파티 멤버의 캐릭터 ID가 포함된
    전역 임시 숫자 배열입니다.
    (타입이 1인 경우만 설정됨)

    $@partymemberaid[] 이들 파티 멤버의 계정 ID가 포함된
    전역 임시 숫자 배열입니다.
    (타입이 2인 경우만 설정됨)

    $@partymembercount 찾은 파티 멤버의 수입니다.

    파티 멤버는 (아마도) 온라인 또는 오프라인 여부와 관계없이 찾아집니다.
    주의: 이름은 특정한 순서로 제공되지 않습니다.

    이 배열을 반복하려면 $@partymembercount를 사용하십시오.
    'getpartymember'를 실행할 때마다 초기화되지 않으므로 'getarraysize()'
    대신에 정확한 수를 얻으려면 $@partymembercount를 사용해야 합니다.
    예를 들어, 7명의 파티 멤버가 있는 사람이 이 스크립트를 실행하면,
    배열은 7개의 요소를 갖게 됩니다.

    그러나 누군가가 NPC를 클릭하고 'getpartymember'를 호출하면,
    서버는 $@partymembercount를 제외한 모든 값을 덮어씁니다.

    그래서 또 다른 플레이어가 이 NPC를 호출하고 그들의 파티에 5명이 있다면,
    마지막 호출에서 남아있는 6번째와 7번째 요소를 덮어쓰면서 새로운 사람의
    파티에 속하지 않는 5명의 멤버와 함께 7명의 멤버가 반환됩니다.

    $@partymembercount는 항상 정확한 숫자를 포함하며(getpartymember 함수가
    실행된 후 해당 파티 멤버의 수), 'getarraysize()'와 같은 다른 함수는
    이 경우 7을 반환할 수 있습니다.

    'array_variable'이 설정된 경우, 결과는 전역 변수 대신 해당 변수에 저장됩니다.

    예제 1: 파티 멤버 이름 목록

    // 파티 멤버 이름 가져오기
    getpartymember getcharid(1),0;

    // 만약 이 스크립트에 'sleep', 'sleep2', 'next', 'close2', 'input',
    // 'menu', 'select', 'prompt'와 같은
    // 일시 중지 명령이 포함되어 있다면, 다른 플레이어가 이 NPC를 클릭하여
    // 'getpartymember'를 실행하고 $@partymember***** 변수를 덮어
    // 쓸 수 있으므로, 전역 임시 $@partymember***** 변수를
    // 복사하는 것이 좋습니다.
    .@count = $@partymembercount;
    copyarray .@name$[0], $@partymembername$[0], $@partymembercount;

    // 파티 멤버 이름 나열
    for (.@i = 0; .@i < .@count; .@i++)
    mes (.@i +1) + ". ^0000FF" + .@name$[.@i] + "^000000";
    close;


    예제 2: // 몇 명의 파티 멤버가 필요한가?

    .register_num = 5; // 몇 명의 파티 멤버가 필요한가?

    // 캐릭터의 파티 멤버의 charID 및 accountID 가져오기
    getpartymember getcharid(1), 1;
    getpartymember getcharid(1), 2;

    if ( $@partymembercount != .register_num ) {
    mes "계속하려면 " + .register_num + "명의 파티를 구성하십시오";
    close;
    }

    // 루프를 통해 'isloggedin'을 사용하여 온라인 파티 멤버 수를 계산합니다.
    for ( .@i = 0; .@i < $@partymembercount; .@i++ )
    if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) )
    .@count_online++;

    // 단일 파티에서 동일한 계정의 여러 캐릭터가 있을 수 있으므로
    // charID를 통해 검색하지 않으면 한 명이 온라인이지만 같은 계정의
    // 두 개의 캐릭터를 가질 경우
    // 그들의 온라인 캐릭터가 두 번 계산됩니다.

    if ( .@count_online != .register_num ) {
    mes "모든 파티 멤버가 온라인에 접속해 있나요?";
    close;
    }

    // 이 배열을 복사하여 플레이어들이 시스템을 속이는 것을 방지합니다.
    copyarray .@partymembercid, $@partymembercid, .register_num;

    mes "준비되셨나요?";
    next; // 주의하세요
    select("예");

    // 스크립트가 next, menu, sleep, input 등에서 일시 중지되면,
    // 플레이어들이 초대하거나 파티에서 나가는 등의 변경 사항이 있을 수 있습니다.
    // 이를 방지하기 위해 getpartymember를 다시 호출하고 원래 값과 비교합니다.

    getpartymember getcharid(1), 1;
    if ( $@partymembercount != .register_num ) {
    mes "파티를 변경하셨습니다!";
    close;
    }
    for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
    if ( .@partymembercid[.@i] != $@partymembercid[.@i] ) {
    mes "파티를 변경하셨습니다!";
    close;
    }
    }

    // 이제 안전하게 이벤트를 시작할 수 있습니다!
    warpparty "event_map", 0,0, getcharid(1);

    ---------------------------------------

    *getpartyleader(<party id>{,<type>})

    이 함수는 지정된 파티 ID의 리더에 대한 정보를 반환합니다. 타입을 지정하지 않으면,
    기본적으로 리더의 이름이 반환됩니다.
    가능한 타입은 다음과 같습니다:

    1: 리더 계정 ID
    2: 리더 캐릭터 ID
    3: 리더의 클래스
    4: 리더의 현재 위치한 맵 이름
    5: 파티 구조체에 저장된 리더의 현재 레벨
    (리더가 최근에 레벨 업했을 경우 현재 레벨이 아닐 수 있음)

    만약 조회에 실패하면 (리더를 찾을 수 없거나 파티가 없는 경우) 이 함수는 캐릭터 이름 대신
    "null"을, 다른 타입에 대해서는 -1을 반환합니다.

    ---------------------------------------

    *is_party_leader({<party ID>})

    이 명령어는 스크립트에 연결된 플레이어가 자신의 파티의 리더인 경우 또는 파티 ID가
    지정된 경우 해당 파티의 리더인 경우 true를 반환합니다.

    ---------------------------------------

    *party_create("<party name>"{,<character id>{,<item share>,<item share type>}});

    현재 캐릭터 또는 지정된 캐릭터를 리더로 하는 파티를 만듭니다. 성공하면,
    명령은 1을 반환하고 생성된 파티 ID를 나타내는 전역 임시 변수
    "$@party_create_id"를 설정합니다.

    또한, 아이템 공유 옵션을 제공할 수 있습니다:
    - Item Share: 0-각자 가져가기 (기본값), 1-파티 공유
    - Item Share Type: 0-각자 가져가기 (기본값), 1-공평하게 분배

    실패시 다음과 같은 값을 반환합니다:
    0: 알 수 없는 오류
    -1: 플레이어를 찾을 수 없음
    -2: 플레이어가 이미 파티에 참여 중
    -3: 파티 이름이 이미 존재함

    ---------------------------------------

    *party_destroy(<party id>);

    파티를 해산합니다. 성공하면 명령은 1을 반환하고, 실패하면 0을 반환합니다.

    ---------------------------------------

    *party_addmember(<party id>,<character id>);

    명령어는 이미 존재하는 파티에 새로운 플레이어를 추가합니다.

    명령어는 성공할 시 1을, 실패할 시 아래와 같은 값을 반환합니다:
    0: 알 수 없는 오류.
    -1: 플레이어를 찾을 수 없음.
    -2: 플레이어가 이미 파티에 있음.
    -3: 파티를 찾을 수 없음.
    -4: 파티가 이미 가득 참.
    -5: 같은 계정에서 다른 캐릭터가 이미 파티에 있음.

    ---------------------------------------

    *party_delmember({<character id>,<party id>});

    명령어는 지정된 플레이어를 파티에서 제거합니다. 플레이어가 지정되지 않은 경우,
    명령어는 호출한 플레이어를 대상으로 실행됩니다. 대상 플레이어가 파티의 마지막
    멤버인 경우, 파티는 해체됩니다.

    명령어는 성공할 시 1을, 실패할 시 아래와 같은 값을 반환합니다:
    0: 알 수 없는 오류.
    -1: 플레이어를 찾을 수 없음.
    -2: 파티를 찾을 수 없음.
    -3: 대상 플레이어가 파티에 속해 있지 않음.

    ---------------------------------------

    *party_changeleader(<party id>,<character id>);

    파티의 리더를 지정한 캐릭터로 변경합니다.

    이 명령은 성공시 1을 반환하며, 실패시 다음 값을 반환합니다:
    0: 알 수 없는 오류
    -1: 파티를 찾을 수 없음
    -2: 플레이어를 찾을 수 없음
    -3: 플레이어가 파티에 속해 있지 않음
    -4: 플레이어가 이미 파티 리더입니다.

    ---------------------------------------

    *party_changeoption(<party id>,<option>,<flag>);

    파티 옵션을 변경합니다.

    유효한 옵션은 다음과 같습니다:
    0: 경험치 분배 (플래그: 0-개별 획득, 1-공평한 분배)
    1: 아이템 분배 (플래그: 0-개별 획득, 1-파티 내 아이템 공유)
    2: 아이템 분배 타입 (플래그: 0-개별 획득, 1-공평한 분배)

    이 명령은 성공시 1을 반환하며, 실패시 다음 값을 반환합니다:
    0: 잘못된 옵션
    -1: 파티를 찾을 수 없음

    ---------------------------------------

    *opendressroom(<flag>{,<char_id>});

    이 명령은 명령어를 실행한 캐릭터에 연결된 클라이언트에서 드레스룸 창을 엽니다.

    mes "이 창을 닫으면 드레스룸 창이 열립니다.";
    close2;
    opendressroom(1);
    end;

    유효한 플래그는 다음과 같습니다:
    1 - 드레스룸 창을 엽니다.

    ---------------------------------------

    *navigateto("<map>"{,<x>,<y>,<flag>,<hide_window>,<monster_id>,<char_id>});

    지정된 캐릭터 또는 NPC가 이동할 위치까지의 길을 찾아줍니다.
    클라이언트 버전 2011-10-10aRagEXE 이상에서 사용 가능합니다.

    flag 매개 변수는 클라이언트가 경로를 계산하는 방법을 지정합니다.

    유효한 flag는 다음과 같습니다:
    NAV_NONE - 이동 서비스 없음
    NAV_AIRSHIP_ONLY - 비행선 이용만 가능
    NAV_SCROLL_ONLY - 스크롤 이용만 가능
    NAV_AIRSHIP_AND_SCROLL - 비행선 및 스크롤 이용 가능
    NAV_KAFRA_ONLY - 카프라 이용만 가능
    NAV_KAFRA_AND_AIRSHIP - 카프라 및 비행선 이용 가능
    NAV_KAFRA_AND_SCROLL - 카프라 및 스크롤 이용 가능
    NAV_ALL - 모든 서비스 이용 가능

    flag를 지정하지 않으면 기본값은 NAV_KAFRA_AND_AIRSHIP입니다.

    hide_window 매개 변수는 네비게이션 창을 표시(0)하거나
    숨기기(1)를 지정합니다. 기본적으로 창은 숨겨집니다.

    몬스터 ID를 mapname과 함께 지정하면 네비게이션 시스템에서 몬스터에
    도달했음을 알려줄 수 있습니다.

    참고:
    사용자 정의 몬스터 스폰을 클라이언트 내장 Navigation 기능에서
    올바르게 사용하려면, 해당 몬스터 스폰이 네비게이션 파일에 있어야
    합니다. 이 경우 몬스터가 스폰되는 맵으로 플레이어를 보내는 것이
    목표에 도달하는 더 간단한 방법입니다.

    ---------------------------------------

    *hateffect(<Hat Effect ID>,<State>);

    이 명령어는 플레이어에게 햇 액세서리 효과를 설정합니다.
    state 매개 변수는 플레이어에 대한 효과를 활성화(true) 또는
    비활성화(false)하는 데 사용됩니다.
    HAT_EF_*로 시작하는 햇 액세서리 상수는
    'src/map/script_constants.hpp'에서 찾을 수 있습니다.

    클라이언트 버전 2015-05-13aRagEXE 이상에서 사용 가능합니다.

    ---------------------------------------

    *getrandomoptinfo(<type>);

    현재 랜덤 옵션의 속성 값을 반환합니다.

    유효한 속성은 다음과 같습니다:
    ROA_ID - 현재 옵션의 ID
    ROA_VALUE - 현재 옵션의 값 필드
    ROA_PARAM - 현재 옵션의 매개변수 필드

    이 스크립트 명령어는 랜덤 옵션 스크립트에서 사용하도록 제작되었습니다.

    ---------------------------------------

    *getequiprandomoption(<equipment index>,<index>,<type>{,<char id>});

    장착한 아이템의 무작위 옵션 중 하나의 속성 값을 반환합니다.

    유효한 장비 슬롯은 'getequipid'를 참조하십시오.

    index 매개변수는 0부터 MAX_ITEM_RDM_OPT-1(기본값은 0~4)까지 일 수 있습니다.

    속성 타입에 대한 유효한 값은 getrandomoptinfo 명령어 참조를 참고하십시오.

    ---------------------------------------

    *setrandomoption(<equipment slot>,<index>,<id>,<value>,<param>{,<char id>});

    <equipment slot>에 장착한 장비의 <index+1>번째 무작위 옵션을
    <id>, <value>, <param>으로 설정합니다.

    유효한 장비 슬롯은 'getequipid'를 참조하십시오.

    index 매개변수는 0부터 MAX_ITEM_RDM_OPT-1(기본값은 0~4)까지 일 수 있습니다.

    ID - 랜덤옵션 ID. 상수값은 db/item_randomopt_db.yml 참조
    Value - 랜덤옵션 값
    Param - 랜덤옵션 매개변수

    ---------------------------------------

    *randomoptgroup <random option group ID>;

    이 명령어는 랜덤 옵션 그룹 ID로부터 다음 배열을 결과로 채웁니다.
    랜덤 옵션 그룹 ID는 'db/(pre-)re/item_randomopt_group.yml'에 지정됩니다.

    인덱스 0부터 MAX_ITEM_RDM_OPT-1까지의 배열:
    .@opt_id[] - 랜덤 옵션 ID 배열.
    .@opt_value[] - 값 배열.
    .@opt_param[] - 파라미터 배열.

    예제:
    // Group 5 (진홍 무기용 그룹)을 사용하여 배열을 채웁니다..
    randomoptgroup(5);

    // Group 5를 적용한 +9 진홍의 대거[2]를 생성합니다.
    getitem3 28705,1,1,9,0,0,0,0,0,.@opt_id,.@opt_value,.@opt_param;

    ---------------------------------------

    *clan_join(<clan id>{,<char id>});

    현재 접속 중인 플레이어가 <clan id>를 가진 클랜에 가입합니다. 가입에 성공하면
    true를 반환하며, 가입에 실패하면 false를 반환합니다.
    <char id>를 지정하면 현재 접속 중인 플레이어 대신 해당 플레이어가 사용됩니다.

    ---------------------------------------

    *clan_leave({<char id>});

    현재 플레이어가 속한 클랜을 떠납니다. 성공 시 true를 반환하고 실패 시 false를 반환합니다.
    <char id>가 지정되면, 현재 플레이어 대신 지정된 플레이어가 사용됩니다.

    ---------------------------------------

    *itemlink(<item_id>{,<refine>{,<card0>{,<card1>{,<card2>{,<card3>,{<enchantgrade>{,<RandomIDArray>,<RandomValueArray>,<RandomParamArray>}}}}}}});

    아이템 링크 문자열을 생성하여 npctalk, message, dispbottom 및 broadcast
    명령에 사용할 수 있습니다. 결과는 클릭 가능한 아이템 이름으로, 플레이어의
    인벤토리/카트/장비 창에서 SHIFT + 클릭과 같이 작동합니다. 이 명령은
    메세지에 사용할 때는 메세지 내 아이템 이름이 클릭 가능하지 않습니다.
    클라이언트가 이 기능을 지원하는 경우 메세지 대화 상자에서 아이템 링크를
    표시하려면 script 명령어 "mesitemlink"를 사용해야 합니다.


    예제:

    npctalk "Knife [3] : "+itemlink(1201)+"";
    npctalk "+16 Knife [3] : "+itemlink(1201,16)+"";
    npctalk "+13 BXB Bapho+VR+EA2+EA1 : "+itemlink(18110,13,4147,4407,4833,4832)+"";
    setarray .@opt_ids[0],RDMOPT_VAR_ATKPERCENT,RDMOPT_VAR_ATKPERCENT,RDMOPT_VAR_ATTMPOWER,0,0;
    setarray .@opt_values[0],3,5,20,0,0;
    setarray .@opt_params[0],0,0,0,0,0;
    npctalk "+13 BXB Bapho+VR+EA2+EA1 + 3 Options : "+itemlink(18110,13,4147,4407,4833,4832,0,.@opt_ids,.@opt_values,.@opt_params)+"";


    RandomIDArray, RandomValueArray 및 RandomParamArray는 클라이언트(및 서버)가
    아이템 랜덤 옵션 기능을 지원하는 경우에만 작동합니다(PACKETVER >= 20150225).

    ---------------------------------------

    *mesitemlink(<item_id>{,<use_brackets>{,<display_name>});

    NPC 메시지에서 아이템을 링크할 수 있는 문자열을 생성합니다.
    NPC 메시지에서 아이템 이름을 클릭하면 클라이언트 측에서 아이템 정보가 열립니다.
    기본적으로 <대괄호사용여부>가 true로 설정되어 있어 링크를 대괄호로 둘러싸고,
    <표시할아이템명>은 아이템 데이터베이스에 저장된 이름으로 설정됩니다. 그
    러나 경우에 따라 <표시할아이템명>을 다른 것으로 덮어써야 할 수 있습니다.

    예제:

    mes mesitemlink( 1201 ); // "[Knife]"와 같이 표시되고 클릭하면 Knife [3]의 설명이 열립니다.
    mes "Bring me a " + mesitemlink( 1201 ) + "."; // "Bring me a [Knife]."와 같이 표시되고 "[Knife]"를 클릭하면 Knife [3]의 설명이 열립니다.
    mes "Bring me a " + mesitemlink( 1201, false ) + "."; // "Bring me a Knife."와 같이 표시되고 "Knife"를 클릭하면 Knife [3]의 설명이 열립니다.
    mes "Bring me a " + mesitemlink( 1201, true, "슈퍼 커팅 나이프" ) + "."; // "[슈퍼 커팅 나이프]"와 같이 표시되고 "[슈퍼 커팅 나이프]"를 클릭하면 Knife [3]의 설명이 열립니다.

    --------------------------------------

    ========================
    |14.- 채널 명령. |
    ========================
    ---------------------------------------

    *channel_create "<chname>","<alias>"{,"<password>"{<option>{,<delay>{,<color>{,<char_id>}}}}};

    <chname>을 채널 이름으로 하는 퍼블릭 채널을 생성합니다. 채널 보안을 위해 <password>를
    사용할 수 있으며, 비밀번호를 사용하지 않으려면 "null"을 입력하면 됩니다.
    채널 이름은 '#'로 시작하며, 맵 채널이름이나 제국 연합 채널 이름과 동일하게 할 수 없습니다.

    <alias>는 채널 메시지가 표시될 때 채널 이름을 변경하는 데 사용됩니다.

    <option> 값은 다음과 같습니다:
    CHAN_OPT_BASE - CHAN_OPT_ANNOUNCE_SELF|CHAN_OPT_MSG_DELAY|CHAN_OPT_CAN_CHAT|CHAN_OPT_CAN_LEAVE 포함한 기본 옵션
    CHAN_OPT_ANNOUNCE_SELF - 채널에 참여/나가는 플레이어에 대한 정보를 플레이어 본인에게 보여줍니다.
    CHAN_OPT_ANNOUNCE_JOIN - 플레이어가 채널에 참여하는 경우 메시지를 표시합니다.
    CHAN_OPT_ANNOUNCE_LEAVE - 플레이어가 채널을 나가는 경우 메시지를 표시합니다.
    CHAN_OPT_MSG_DELAY - 채널에서 채팅 지연을 활성화합니다.
    CHAN_OPT_COLOR_OVERRIDE - 플레이어의 고유한 폰트 색상이 채널의 색상을 덮어씁니다.
    CHAN_OPT_CAN_CHAT - 플레이어가 채널에서 채팅할 수 있도록 합니다.
    CHAN_OPT_CAN_LEAVE - 플레이어가 채널을 나갈 수 있도록 합니다.
    CHAN_OPT_AUTOJOIN - 플레이어는 로그인 시 자동으로 채널에 참여합니다.

    <delay>는 플레이어가 동일한 채널에서 다시 채팅할 수 있는 최소 채팅 지연 시간(밀리초)입니다.

    <color>에는 채널 색상을 지정하는 16진수 코드를 사용합니다. 지정되지 않은 경우 기본 채널 색상을 사용합니다.

    <char_id>가 정의된 경우 채널은 프라이빗 채널이 되고 해당 플레이어가 채널 소유자가 됩니다.

    성공하면 1을 반환합니다.


    /**
    * 이 예제는 이 채널에서 메시지가
    * [rAthena] Admin : Hello world!
    * 대신
    * #rathena Admin : Hello world!
    * 로 표시 됩니다.
    **/
    channel_create("#rathena","[rAthena]");
    channel_create("#vip","[VIP]","vipmemberonly");

    ---------------------------------------

    *channel_setopt "<chname>",<option>,<value>;

    채널의 옵션을 설정합니다. <value>에 1을 지정하여 설정하거나 0을
    지정하여 해제할 수 있습니다.
    <option> 값은 'channel_create' 옵션과 동일합니다.

    CHAN_OPT_MSG_DELAY의 경우, 밀리초 단위의 지연 시간을
    지정해야 합니다. 지연 시간을 제거하려면 0을 사용합니다.

    성공 시 1을 반환합니다.

    // 예: 지연 시간 설정
    channel_setopt("#global",CHAN_OPT_MSG_DELAY,5000);

    공개 및 비공개 채널에 대해서만 사용 가능합니다.

    ---------------------------------------

    *channel_getopt "<chname>",<option>;

    채널의 옵션 값을 가져옵니다. <option> 값은 'channel_create'
    옵션과 동일합니다. CHAN_OPT_MSG_DELAY를 제외한 옵션에 대해서는
    true 또는 false가 반환됩니다.

    CHAN_OPT_MSG_DELAY의 경우 정수가 반환됩니다.

    // 예: 지연 시간 가져오기
    .delay = channel_getopt("#global",CHAN_OPT_MSG_DELAY);

    공개 및 비공개 채널에 대해서만 사용 가능합니다.

    ---------------------------------------

    *channel_setcolor "<chname>",<color>;

    채널의 색상을 변경합니다.
    <color>는 hex RGB 값을 사용합니다.

    성공시 1을 반환합니다.

    ---------------------------------------

    *channel_setpass "<chname>","<password>";

    채널의 비밀번호를 설정, 해제 또는 변경합니다.
    "null"을 사용하여 비밀번호를 제거할 수 있습니다.

    성공시 1을 반환합니다.
    공개 및 개인 채널에 대해서만 적용됩니다.

    ---------------------------------------

    *channel_setgroup "<chname>",<group_id>{,...,<group_id>};
    *channel_setgroup2 "<chname>",<array_of_groups>;

    채널에 그룹 제한을 설정합니다. 일치하는 <group_id>를 가진
    플레이어만 채널에 참여할 수 있습니다.

    첫 번째 그룹 채널에서 0을 사용하면 채널 구성에서 그룹 제한이 제거됩니다.

    'channel_setgroup2'는 그룹 목록을 배열로 입력 받습니다.

    실패하면 0을 반환하고, 성공하면 1(또는 n 그룹 수)을 반환합니다.

    // 예제 1: 그룹 제거
    channel_setgroup("#event",0);

    // 예제 2: 다중 값
    channel_setgroup("#vip",2,5);

    // 예제 3: 배열 사용
    setarray .@staffs[0],2,3,4,10,99;
    channel_setgroup("#staff",.@staffs);

    공개 및 개인 채널에 대해서만 적용됩니다.

    ---------------------------------------

    *channel_chat "<chname>","<message>"{,<color>};

    채널에 메시지를 보냅니다.
    성공시 1을 반환합니다.

    // 채널에 별칭이 없을 경우 예제
    channel_chat(#rathena,"Hello World!"); // #rathena Hello World!

    // 채널에 별칭이 있을 경우 예제
    channel_chat(#rathena,"Hello World!"); // [rAthena] Hello World!

    ---------------------------------------

    *channel_ban "<chname>",<char_id>;

    공개 채널이나 비공개 채널에서 플레이어를 차단합니다.
    채널의 소유자나 PC_PERM_CHANNEL_ADMIN 그룹은 차단할 수 없습니다.
    성공시 1을 반환합니다.

    ---------------------------------------

    *channel_unban "<chname>",<char_id>;

    공개 채널이나 비공개 채널에서 차단된 플레이어를 차단 해제합니다.
    성공시 1을 반환합니다.

    ---------------------------------------

    *channel_kick "<chname>",<char_id>;
    *channel_kick "<chname>","<char_name>";

    공개 채널이나 비공개 채널에서 플레이어를 강제 퇴장시킵니다.
    채널의 소유자나 PC_PERM_CHANNEL_ADMIN 그룹은 강제 퇴장시킬 수 없습니다.
    성공시 1을 반환합니다.

    ---------------------------------------

    *channel_delete "<chname>";

    기존의 공개 또는 비공개 채널을 삭제합니다. 동맹 채널이나 지역 지도 채널은 삭제할 수 없습니다.
    성공 시 0을 반환합니다.

    ---------------------------------------

    ============================
    |15.- 달성과제 명령어 |
    ============================
    ---------------------------------------

    *achievementadd(<achievement id>{,<char id>})

    이 함수는 연결된 플레이어 또는 제공된 <캐릭터 ID>에 대해 업적을 플레이어 로그에 추가합니다.
    이 함수를 사용할 때 목표 요구 사항은 무시되지 않습니다.
    성공 시 true를 반환하고 실패 시 false를 반환합니다.

    ---------------------------------------

    *achievementremove(<achievement id>{,<char id>})

    이 함수는 현재 플레이어나 주어진 <char id>에 대한 업적 로그에서 업적을 제거합니다.
    성공시 true를 실패시 false를 반환합니다.

    ---------------------------------------

    *achievementinfo(<achievement id>,<type>{,<char id>})

    현재 접속한 플레이어 또는 지정된 <char id>의 업적 중 지정된 <type> 값의 업적 정보를
    반환합니다.
    만약 플레이어가 해당 업적을 활성화하지 않았다면(진행 중이지 않다면):
    해당 업적이 없을 경우 -1이 반환되고, 다른 오류가 발생하면(예: 유효하지 않은 <type>) -2가
    반환됩니다.

    유효한 <type>은 다음과 같습니다:

    ACHIEVEINFO_COUNT1
    ACHIEVEINFO_COUNT2
    ACHIEVEINFO_COUNT3
    ACHIEVEINFO_COUNT4
    ACHIEVEINFO_COUNT5
    ACHIEVEINFO_COUNT6
    ACHIEVEINFO_COUNT7
    ACHIEVEINFO_COUNT8
    ACHIEVEINFO_COUNT9
    ACHIEVEINFO_COUNT10
    ACHIEVEINFO_COMPLETE
    ACHIEVEINFO_COMPLETEDATE
    ACHIEVEINFO_GOTREWARD
    ACHIEVEINFO_LEVEL(<achievement id>는 사용하지않음)
    ACHIEVEINFO_SCORE(<achievement id>는 사용하지않음)

    ---------------------------------------

    *achievementcomplete(<achievement id>{,<char id>})

    이 함수는 플레이어나 지정된 <char id>의 도전과제가 완료되었는지 여부를 반환합니다.
    성공하면 true, 실패하면 false를 반환합니다.

    ---------------------------------------

    *achievementexists(<achievement id>{,<char id>});

    This function will return if the achievement exists on the player or the supplied
    <char id> and is completed.
    Returns true on success and false on failure.

    ---------------------------------------

    *achievementupdate(<achievement id>,<type>,<value>{,<char id>})

    이 함수는 연관된 플레이어 또는 제공된 <char id>의 업적 값에 대한 업데이트를 수행합니다.
    만약 플레이어가 업적을 획득한 적이 없으면(진행 상황이 없으면) 먼저 플레이어의 로그에
    업적을 추가한 후 <type> 값을 업데이트합니다. 성공하면 true, 실패하면 false를 반환합니다.

    유효한 <type> 값은 'achievementinfo'를 참조하세요.
    - ACHIEVEINFO_COMPLETE, ACHIEVEINFO_COMPLETEDATE, ACHIEVEINFO_GOTREWARD는
    'gettimetick(2)'에서 반환된 특정 값이 필요합니다.
    - ACHIEVEINFO_LEVEL과 ACHIEVEINFO_SCORE는 제외됩니다.

    ---------------------------------------

    *addfame(<amount>,{,<char id>})

    입력된 양 만큼 해당 플레이어 또는 지정된 <char id>의 명성을 증가시킵니다.
    참고: 명성 랭킹 시스템을 사용하는 클래스에만 작동합니다.

    ---------------------------------------

    *getfame({<char id>})

    입력된 캐릭터의 명성 포인트를 반환합니다. 첨언하자면, 명성 랭킹 시스템을 사용하는
    클래스에서만 작동합니다.

    ---------------------------------------

    *getfamerank({<char id>})

    fame을 기반으로 한 랭킹 시스템이 있는 직업군에서만 해당되며, 플레이어의 명성 랭킹을
    반환합니다. 랭킹은 1부터 MAX_FAME_LIST(최대 명성 랭킹 개수)까지 지정됩니다.
    해당 직업군이 명성 랭킹 시스템을 사용하지 않는다면, 0이 반환됩니다.

    ---------------------------------------

    *isdead({<account id>})

    이 명령어는 플레이어가 죽었으면 true, 살아있으면 false를 반환합니다.

    ---------------------------------------
  • ---------------------------------------

    포인트 랭킹


    최근글


    새댓글


    알림 0