본문 바로가기
마인크래프트/Skript 기초 활용편

스크립트 기초 활용 9편(자동완성)

by 스터디립트 2022. 2. 26.

마인크래프트의 명령어들을 보면 /tp를 친 뒤에 탭을 누를 시 온라인 플레이어의 목록 중에서 자동완성이 되는 기능이 있습니다. /tp 명령어뿐만이 아니라 다른 명령어들도 이런 자동완성 기능들을 가지고 있습니다. 여러 서버들을 돌아다니다 보면 마인크래프트 기본 명령어가 아닌 커스텀 명령어인데 자동완성 기능을 가진 명령어들을 찾아볼 수 있습니다. 물론 자동완성까지 사용할 정도로 명령어를 철저하게 만든다면 애초에 플러그인으로 명령어를 만들겠지만, 이번 시간에는 스크립트로 명령어 자동완성 기능을 사용해보도록 하겠습니다.

 

 

 

우선 기본적으로 스크립트에는 자동완성 기능이 없습니다. 따라서 skquery 애드온이 필요합니다. 아래는 애드온 다운로드 링크입니다.

SkQuery [1.13-1.18+] | SpigotMC - High Performance Minecraft

 

자동완성을 시도할 때, 라는 이벤트문이 필요하겠지요? 아래는 그 역할을 하는 이벤트문입니다.

on tab complet(er|ion) [for [command]] %string%
ex) on tab completion for "/tp"

위 이벤트문 내에서 completions를 통해서 자동완성을 할 때 뜨는 텍스트들을 변경할 수 있습니다. 아래는 전에 만들었던 금지명령어 스크립트에 자동완성 기능을 더해주는 스크립트의 코드입니다.

 

2022.02.21 - [마인크래프트/Skript 기초 활용편] - 스크립트 기초 활용 4편(금지명령어)

 

on tab completer for "/금지명령어":
	set {_c::*} to "콘솔", "오피" and "초기화"
	loop {_c::*}:
		add loop-value to completions

"콘솔", "오피" 그리고 "초기화" 이 3개의 텍스트를 completions에 추가하여 /금지명령어 명령어를 친 후 자동완성 기능을 사용할 시 콘솔, 오피, 초기화 중 하나가 자동완성 되도록 설정할 수 있습니다.

 

자, 그런데 전에 소개시켜드렸던 금지명령어 스크립트 같은 경우에는 /금지명령어 [콘솔/오피/초기화] 후 뒤에 명령어까지 입력해야 했습니다. 이렇게 여러 arguments가 있을 시에는 어떻게 해야할까요? 그럴 경우에는 argument at %number% 구문으로 자동완성 기능을 사용할 수 있습니다. 예시 구문을 보여드리겠습니다.

on tab completer for "/금지명령어":
	if argument at 2 is set:
		if argument at 3 is not set:
			loop all commands:
				add "/%loop-value%" to {_c::*}
	else if argument at 1 is set:
		if argument at 2 is not set:
			set {_c::*} to "콘솔", "오피" and "초기화"
	loop {_c::*}:
		add loop-value to completions

구문을 쓰실 때 한가지 유의하셔야 할 점이 있습니다. "/금지명령어 " <- 이 텍스트에서 argument at 1은 not set 으로 생각하시겠지만, ""으로 set 되어있습니다. 따라서 위 구문과 같이 설정하셔야 합니다.

 

이 자동완성 기능을 사용하실 때 한가지 유의하셔야 할 점은, on tab completer 이벤트문은, 그 명령어가 존재해야 오류가 나지 않습니다. 만약 /금지명령어 명령어가 존재하지 않는다면, 이 구문은 오류가 납니다. 따라서 먼저 커스텀 명령어가 정의되고 난 후, 자동완성 구문을 사용해야 합니다. 그럼 단순히 한 스크립트 파일 내에서 자동완성 구문만 커스텀 명령어 구문 뒤에 넣으면 되는것이냐? 그것도 아닙니다. 자동완성 구문은 반드시 커스텀 명령어가 존재하는 스크립트 파일과 다른 파일에 존재해야 하며, 그 자동완성 구문이 들어있는 파일은 반드시 커스텀 명령어가 존재하는 스크립트 파일보다 나중에 로드되어야 합니다.

 

 

예시를 하나 들어보자면, 

#금지명령어a.sk
command /금지명령어 [<text>] [<text>]:
	permission: *
	trigger:
		if "%the 2nd argument%" is "<none>":
			send "&c[ &r사용방법 &c]"
			send "&c[ &r/금지명령어 [콘솔/오피/초기화] [금지할 명령어] &c]"
			exit
		if arg 1 is "콘솔":
			set {금지명령어::%arg 2%} to "console"
			send "명령어 %arg 2%(이)가 콘솔만 사용할 수 있도록 설정되었습니다"
		else if arg 1 is "오피":
			set {금지명령어::%arg 2%} to "op"
			send "명령어 %arg 2%(이)가 오피만 사용할 수 있도록 설정되었습니다"
		else if arg 1 is "초기화":
			clear {금지명령어::%arg 2%}
			send "명령어 %arg 2%(이)가 초기화되었습니다"
		else:
			send "&c[ &r사용방법 &c]"
			send "&c[ &r/금지명령어 [콘솔/오피/초기화] [금지할 명령어] &c]"



on command:
	set {_c} to "/%command%"
	if {금지명령어::%{_c}%} is set:
		if {금지명령어::%{_c}%} is "console":
			if sender is not console:
				cancel event
				send "&c콘솔만 사용이 가능한 명령어입니다"
		if {금지명령어::%{_c}%} is "op":
			if sender is not op:
				cancel event
				send "&c오피만 사용이 가능한 명령어입니다"

#금지명령어b.sk
on tab completer for "/금지명령어":
	set {_c::*} to "콘솔", "오피" and "초기화"
	loop {_c::*}:
		add loop-value to completions

위 소스코드와 같이 금지명령어a.sk에는 커스텀 명령어 구문이, 금지명령어b.sk에는 자동완성 구문이 들어가있다고 가정해봅시다. 스크립트는 a부터z의 순서대로 스크립트를 로드합니다. 따라서 커스텀 명령어 구문이 들어가있는 금지명령어a.sk가 먼저 로드될 것이고, 금지명령어b.sk는 그 후에 로드될 것입니다. 위 경우에는 커스텀 명령어 구문이 먼저 로드된 후, 자동완성 구문이 로드되었기 때문에 오류가 일어나지 않습니다.

 

 

이번 시간에는 스크립트의 명령어 자동완성 기능에 대해서 알아보았습니다. 질문이 있으시다면 이 글의 댓글에 적어주시면 답변해드리도록 하겠습니다.

 

아래는 스크립트 파일들입니다.

주석미포함

금지명령어b.sk
0.00MB

주석포함

금지명령어b(주석 포함).sk
0.00MB

 

댓글