엔믹스 지우를 위한 코딩고수계정
[Skript] 1. 커맨드와 커맨드 옵션 (Command, Command's Options) 본문
마인크래프트 1.20.4 버전을, 플러그인도 해당 버전을 기준으로 작성되었습니다.
애드온 : Skacket, SkBee, Skellett, SkQuery, skript-reflect, skRayFall
*해당 게시글에 적용된 문법이 오류가 난다면 플러그인 버전이 달라 일어난 이슈일 가능성이 높습니다.
*게시글에 나오는 일부 함수들은 개인적으로 분류한 함수로 따로 추가해야 합니다.
/내이름은뭐야, 이런 창의적인 명령어 만들고 싶어
여러 마인크래프트 서버를 하다 보면 뭐 이런 명령어도 있을까하는, 그 서버만의 특별한 명령어가 있다.
스크립트의 첫 시작은 나만의 명령어를 만드는 것으로 해보고자 한다. 가장 쉽고, 원하는 걸 간편하게 만들어볼 수 있는 좋은 수단이기 때문이다.
키워드 command, 그리고 Hello World!
command 키워드를 사용하여 Hello World!를 출력하는 명령어를 만들어보자.
기본적으로 코드 적는 규칙에 대해서 알아보자.
1. command 키워드 뒤에 오는 커맨드는 대문자를 인식하지 못한다. 그래서 코드 상에서 대문자로, 예를 들어 helloWorld라고 작성해도 실제 인게임상에는 helloworld라는 명령어로 설정된다.
2. 콜론 표시로 해당 기능의 상세 설정을 할 수 있다. 파이썬과 유사한 모습이다.
3. command 키워드 안에는 무조건 trigger가 있어야 한다. 내가 아직 개발 경력이 적어서 모를 수 있으나, 내가 본 바로는 모든 command 에는 trigger가 있었다. trigger를 옵션(Option)이라고 하는데 trigger 이외에 많이 있지만 주로 사용할법한 것들만 소개하겠다.
| 옵션 | 설명 |
| aliases: | 해당 명령어의 별명, command 키워드 다음에 설정된 명령어 말고 다른 형태로도 칠 수 있게 한다. |
| usage: | 특정 상황에서 명령어를 잘못 사용했을 경우 어떻게 사용하는지 친절히 가르쳐준다. |
| permission: | 권한을 설정할 수 있다. 보통 op를 사용하여 일반 유저들은 사용하지 못하도록 한다. |
| cooldown: <timespan> | 명령어 사용에 재사용 대기시간을 부여한다. |
| cooldown message: | 명령어가 재사용 대기시간일 때 출력할 메시지를 설정한다. |
message " " to player
말 그대로 플레이어에게 메시지를 전송하는 코드다. Skript 언어의 가장 큰 장점은 따로 내가 설명하지 않아도 알아먹기 쉬운 구조로 되어 있다는 것이다.
message 이외에 send도 있으니 입맛대로 결정하자. 추가로 모든 유저들에게 보내는 것은 broadcast를 사용하면 된다.

잘 나온다.
인자 Argument
마인크래프트에 가장 유명한 명령어라면 나는 gamemode 라고 말하고 싶다. 우리가 gamemode를 채팅창에 입력하면 어떻게 뜨는가?

저렇게 뒤에 여러 옵션들이 생긴다.
그런데 우리가 만든 /helloworld 명령어는 저것만 치면 그만인데, 우리도 gamemode처럼 뒤에 뭔가 더 넣고 싶다. 명령어 뒤에 따라오는 선택지를 우리는 앞으로 인자(Argument), 또는 파라미터(Parameter)라고 부를 것이다. 인자, 알규먼트, 파라미터라고 앞으로 이야기하면, 아 명령어 뒤에 오는 옵션들을 이야기하는구나 라고 이해하면 된다.
인자를 넣는 방식은 두 가지가 있다.
꺽쇠를 넣는 방법과 대괄호와 꺽쇠를 같이 쓰는 방법이다.
첫 번째 표시는 무조건이다. 이 명령어에는 무슨 일이 있어도 처음에 옵션은 꼭 들어가야 한다.
두 번째 표시는 선택이다. 이 명령어에 저 인자가 없어도 큰 문제가 없다는 것이다.
우리는 저 인자를 이용하여 내가 입력한 숫자를 출력하도록 코드를 짜볼 것이다. 인자를 명령어 내부에서 이곳 저곳 써먹어야 하는데 우린 앞으로 저 친구를 arg 1 이라고 부를 것이다. 인자를 부르고 싶어? 그럼 "arg 1아 나와줘~"라고 하면 달려나올 것이다. 두 번째 친구는 arg 2겠지?
출력하기 위해서 message를 이용했고, arg 1아 나와줘~라고 불렀고. 그런데 막상 명령어를 입력해보면 아래와 같이 나온다.

우리가 기대한 바는 "입력한 숫자는 <내가 입력한 숫자>입니다."이다. 그런데 다짜고짜 인자의 이름을 불러버린다.
message는 쌍따옴표, 그러니까 문자열이라고 하는 것의 내부를 원본 그대로 가져온다. 우리는 문자열 안에 다짜고짜 이름을 넣어놨으니 당연하게도 인자의 이름인 arg 1이 나온다.
우리는 인자의 이름이 아닌 인자의 모습을 가져오고 싶다. 그러기 위해서는 퍼센트 기호(%)를 사용하여 넣어야 한다.
(변수에 대한 내용은 나중에 다룰 것임으로 지금은 쉽게 쉽게 기록하고자 한다.)
예를 들어 1을 입력했다고 가정하자. arg 1이라는 이름의 친구를 딱 보는데 숫자 1이다. 너는 숫자 1이야? 아니 내 이름은 arg 1이야. 그런데 생긴 건 숫자 1이야. 이렇게 이해하면 된다.
앞으로 문자열 안에 이름이 아닌 모습을 넣고 싶으면 무조건 퍼센트 기호 사이에 이름을 넣도록 하자.

매우 잘 나온다.
필수 인자와 선택 인자
다음의 코드를 볼까
예를 들어 1을 입력했다고 가정하자. 그러면 어떻게 될까? arg 1이라는 친구의 모습은 숫자 1, arg 2는 어떤 모습일까? 뭐 투명인간이라고 가정해보자. 우리는 아직 명령어를 쳐보지 않았으니까.

<none>이라고 뜬다. none은 쉽게 말해 없음을 뜻한다. 그냥 없다. 유령이라는 존재 자체도 아닌 그냥 없음을 뜻한다.
그래, 선택 인자이니까 명령어에서 전달하지 않아도 작동을 한다는 건 알았다. 그러면 다음 코드는 어떨까?
선택 인자가 먼저 왔다. 그리고 똑같이 /helloworld 1을 입력하면 어떻게 될까?
보통의 경우 "고장나는 거 아니예요?"라고 할 수 있다. C언어같은 경우에서 보면 이런 코드가 있는데
void myFunction(int a, int b = 10) {
}
기본적으로 a에 입력하고 b는 입력 안 하면 10이라는 값으로 정해진다. 뭐 a 입력하고 b도 입력하면 b의 값이 10이 아니게 되긴 하다. 그러나 c에서는 int b = 10을 a보다 앞에 쓰면 오류가 뜬다. 왜냐면 처음에 입력한 값이 a를 말하는 건지 b를 말하는 건지 모르기 때문이다. (이거는 C코드여서 몰라도 된다.)
그러나 다음의 결과가 나온다.

오... 우리는 선택 인자가 먼저 있었고 그걸 1이라고 했는데 필수 인자 내용이 1로 되었다.
그럼 /helloworld 1 2 라고 해볼까?

선택 인자가 이번엔 1이 되고 필수 인자가 2가 되었다.
이를 통해 알 수 있는 것은
1. 인자는 필수 인자부터 차례대로 채워진다.
2. 만약 선택 인자가 채워지게 된다면 순서는 앞에 있는 인자부터 채워지게 된다.
그런데 해주고 싶은 말은 굳이 이렇게 더러운 방식으로 코딩 안 할 것이기에 몰라도 무방하다.
인자라는 것을 이해하도록 자세히 설명하다보니 이렇게 되었다. 우리는 그냥 깔끔하게 필수 인자를 앞에 쓰고 선택 인자를 뒤에 쓰도록 하자.
마치며
다음엔 변수에 대해서 알아보고자 한다. 한동안은 가르치는 느낌으로 작성될 거 같다. 어느 정도 레벨이 쌓이면 나도 배우는 단계에 들어설 거기 때문에 같이 논의하고 발전해나가자.
그럼 우리 오래봐요!
'[Skript] 공부' 카테고리의 다른 글
| [Skript] 4. 자료형 (2) | 2024.11.19 |
|---|---|
| [Skript] 3. 변수 심화 (2) | 2024.11.16 |
| [Skript] 2. 변수 (지역 변수, 전역 변수, 배열 변수) (1) | 2024.11.12 |