스크립트(Skript)가 무엇인가요? -https://mon0rail.tistory.com/2

 

 

 

 

오늘은 채팅 포맷(chat format)에 대하여 알아볼 예정이다.

 

 

Skript에서는 채팅을 자유자래로 꾸밀 수 있도록 on chat 이벤트와 chat format을 바꿀 수 있도록 한다.

 

아래 예제를 통하여 살펴보자.

 

on chat:
    set chat format to "&6%player%&7: &f%message%"

예제 1 - chat format

 

(색깔 코드는 이 사이트 참고)

 

채팅을 쳤을 때 원래대로라면 <player> message의 형식대로 보였겠지만, 스크립트가 이를 지정한 양식으로 바꾸어 출력해주게 된다.

 

 

 

 

 

그러면 채팅을 쳤을 때 이렇게 채팅 양식이 바뀐 것을 확인할 수도 있다.

 

여기서 만족하고 끝낼 수 있지만, 만약 특정 플레이어의 채팅을 부각시키는 방법은 없을까?

 

예를 들면 OP의 채팅은 좀 더 화려하고 눈에 띄는 색으로 보이게 하려면 어떻게 해야 할까?

 

 

 

 

on chat:
    if player is op:
        set chat format to "&c[Admin]&d%player%&7: &e%message%"
    else:
        set chat format to "&7[User]&6%player%&7: &f%message%"

예제 2 - OP와 일반 플레이어의 채팅 차별화

 

 

이는 조건문으로 간단히 해결할 수 있다.

 

위 스크립트는 OP 권한을 가진 플레이어는 앞에 [Admin]칭호가 따로 붙고 채팅 색도 노란색이 된다.

 

만약 if player is op 조건문을 if player has permission "group.vip" 등으로 바꾸면 특정 권한을 가짐으로써 채팅 양식도 알아서 바뀌도록 할 수 있다.

 

 

아직 스크립트를 모른다면? -https://mon0rail.tistory.com/2

 

 

 

하이픽셀의 MOTD

MOTD란, 서버 추가를 하면 뜨게 되는 일종의 서버 소개 문구이다.

 

보통은 서버 폴더의 server.properties 파일의 motd=A Minecraft Server 에서 수정하거나 플러그인을 사용한다.

 

하지만 스크립트를 사용하면 재부팅을 하거나 별도의 플러그인 없이 간단하게 MOTD를 수정할 수 있다.

 

 

on server list ping:
	set motd to "&bMOTD &6테스트 서버"

 

on server list ping이라는 이벤트와 set motd를 통해서 MOTD를 설정한 모습니다.

 

한글과 특수문자, 색깔 코드를 사용할 수 있고, %nl%을 중간에 넣어 2줄까지 적을 수 있다.

 

 

MOTD를 커스텀한 모습

 

 

on server list ping:
	set {helloworld} to "Hello world!"
	set motd to "&f%{helloworld}% %nl% &eYour IP: %ip%"

 

MOTD 설정 역시 텍스트를 사용하기 때문에, 변수를 사용할 수도 있다.

 

스크립트가 무엇인가요? - mon0rail.tistory.com/2

 

 

야생을 기반으로 한 서버에서 빼놓을 수 없는 기능이라면 셋홈이 있다.

 

가장 자주 쓰이지만 비교적 간단하게 구현할 수 있기 때문에 비교적 빠르게 다루게 되었다.

 

셋홈은 실제로도 유용하게 사용될 수 있는 스크립트로, 변수조건문 활용이 중요하다.

 

 

on join:
	set {list::%player%} to "Hello, %player%!"

command /test:
	trigger:
		send {list::%player%}

 

먼저 본문에 들어가기 전에 리스트라는 것에 대하여 알아볼 필요가 있다.

 

리스트는 변수라는 상자들을 한 곳에 모아 보관하는 창고라고 할 수 있다.

 

리스트를 만드려면 변수의 이름에 :: (콜론 2개)를 넣으면 된다.

 

리스트의 형태는 {리스트이름::변수이름}이며, 리스트에서 변수 이름은 인덱스(index)라고도 한다.

 

리스트는 주로 플레이어마다 다르게 해야되는 값들을 하나로 묶는데 사용된다. (예를 들면 게임머니)

 

여러 개의 값들을 리스트로 묶으면 관리가 매우 쉬워지기 때문에 리스트의 활용은 필수적이다.

 

 

 

 

command /sethome:
	aliases: /셋홈
	trigger:
		set {homes::%player%} to player's location
		send "&a이 위치를 새 홈으로 지정하였습니다. /home 명령어로 텔레포트 가능합니다."

 

이제 /sethome 명령어를 살펴보도록 하자.

 

홈의 위치는 플레이어마다 모두 다르기 때문에 homes라는 리스트 안에 넣어줘야 한다.

 

변수명은 플레이어의 이름으로 지정해둔다. 이렇게 하면 다른 명령어의 트리거나 스크립트에서 쉽게 꺼내 쓸 수 있다.

 

 

 

명령어가 잘 작동이 되는 지 확인해보자.

 

 

 

 

 

 

아직 스크립트를 모른다면? -https://mon0rail.tistory.com/2

 

 

명령어를 입력했을 때, 만약 플레이어가 특정 월드에 있다면 다른 곳으로 텔레포트시킨다.

 

플레이어가 접속했을 때, 만약 동시 접속자가 10명을 넘는다면 모두에게 아이템을 준다.

 

누군가가 죽었을 때, 만약 플레이어가 몬스터를 죽인 것이라면 경험치를 추가로 준다.

 

 

위 문장들의 공통점이 있다

 

특정한 사건(이벤트)이 일어났을 때, 무조건 어떤 일을 수행하는 것이 아니라 특정한 조건에 의하여 수행된다.

 

이는 스크립트에서 if(만약 ~ 이라면) 문법을 통해 구현할 수 있고, 이러한 조건을 판단하는 코드를 조건문이라고 한다.

 

좀 더 복잡한 스크립트를 제작하려면 조건문은 필수적으로 사용해야 한다.

 

 

 

command /givetest:
	trigger:
		if player is online:
			give 1 diamond to player
	

 

 

위 조건문에서는 if player is online, 즉 "플레이어가 온라인이면" 이라는 조건을 걸고 있다.

 

그리고 만약 그 조건이 충족된다면 그 밑에 들여쓰기된 코드를 실행한다.

 

플레이어가 직접 위 명령어를 실행하면 플레이어는 온라인이어야 하기 때문에 항상 다이아몬드를 지급한다.

 

 

 

command /givetest2:
	trigger:
		if player has 1 diamond:
			send "1+1 행사 상품입니다!"
			give 1 diamond to player
		send "명령어 종료"
	

 

두 번째 예제에서는 A is B 형식이 아닌, A has B 형식을 갖추고 있다.

 

player has 1 diamond는 플레이어가 1개 이상의 다이아몬드가 인벤토리에 있어야지만 조건이 충족된다.

 

즉, 이미 다이아몬드가 1개 있는 경우엔 "1+1 행사 상품입니다!" 라는 메시지와 함께 다이아몬드를 1개 더 준다.

 

그 뒤에 "명령어 종료"라는 텍스트 출력 코드는 조건문 안에 들여쓰기가 되어있지 않으므로,

 

조건을 만족시키는 것과 상관없이 항상 실행된다.

 

 

command /givetest3:
	trigger:
		set {diamonds} to 3
		if {diamonds} is 1:
			send "Yes"
		else:
			send "No"
	

 

만약 if문 아래에 else(그렇지 않으면~)문을 추가하면, if의 조건을 충족시키지 못했을 때 else문의 코드가 실행된다.

 

위 코드에서는 {diamonds}라는 변수의 값이 1이 아니기 때문에 else로 넘어가서 "No"라는 텍스트가 출력된다.

 

 

 

command /myhand:
	trigger:
		if player's tool is diamond sword:
			send "그 검이 날카로워보이네요"
		else if player's tool is diamond pickaxe:
			send "오늘도 많은 수확이 있길 바래요"
		else if player's tool is diamond axe:
			send "묘목을 다시 심어두는 것도 잊어버리지 마세요"
		else:
			send "보낼 메시지가 없습니다."

 

만약 여러 개의 조건이 있고, 그것을 하나씩 걸러내야 된다면?

 

그렇다면 else if를 사용해야 한다. 위 코드에서는 플레이어가 들고 있는 도구가 무엇인지 판단한다.

 

만약 도구가 다이아몬드 검, 다이아몬드 곡괭이, 다이아몬드 도끼라면 해당 도구에 알맞은 문구를 출력해준다.

 

물론 if를 세 번 사용하더라도 각 도구에 알맞은 메시지를 출력시킬 수는 있다.

 

하지만 세 가지 경우가 모두 아니였을 때 메시지를 출력하려면 else if를 사용해야만 한다.

 

 

 

 

 

 

 

if부터는 활용할 수 있는 방법이 여러 가지라서 프로그래밍과 알고리즘에 대한 어느 정도 지식이 필요하다.

 

스크립트는 문법이 영어와 가까워 쉽지만, 여전히 프로그래밍 언어이기 때문에 상당한 활용 능력이 필요하다.

 

이후 올라오는 글의 예제에 사용되는 조건문은 그 조건문이 어떤 의미인지 간략한 설명을 해놓을 예정이다.

 

더 자세한 내용은 주로 스크립트-심화 카테고리에서 다룰 예정이다.

 

 

NameMC - ko.namemc.com/ (한글)

  플레이어의 UUID와 닉네임을 이용하여 프로필을 검색할 수 있다. 닉네임 변경 기록, 스킨 등을 표시해준다.

 

Digminecraft - www.digminecraft.com/ (영어)

  조합법, 시드, 인첸트, 엔티티, 색깔 코드 등 다양한 정보를 찾을 수 있다.

 

Minecraft Tools - www.digminecraft.com/minecraft.tools/en/ (영어)

  몹, 월드, 배너, MOTD 등 다양한 커스터마이징 명령어를 생성해준다.

 

Give command Generator - t.ly/Vmbm (단축링크,영어)

  몹, 월드, 배너, MOTD 등 다양한 커스터마이징 명령어를 생성해준다.

 

Optifine 1.16.2 - optifine.net/adloadx?f=preview_OptiFine_1.16.2_HD_U_G2.jar&x=5a43 (광고없음)

  셰이더 및 그래픽 설정이 추가되는 최적화모드이다.

 

Sodium 1.16.1-0.1.0 - www.curseforge.com/minecraft/mc-mods/sodium (영어)

  비교적 최근에 등장한 최적화 모드이다. Fabric 모드로더와 호환된다.

 

Minecraft heads - minecraft-heads.com/player-heads (영어)

  여러가지의 머리를 생성하는 명령어를 찾아볼 수 있다.

 

Minecraft ID list- minecraft-ids.grahamedgecombe.com/ (영어)

  모든 블럭과 엔티티의 이름과 아이디를 찾아볼 수 있다.

아직 스크립트를 모른다면? -https://mon0rail.tistory.com/2?category=909444

 

/plugins같은 명령어는 기본적으로 오피(OP)가 없어도 사용할 수 있다.

 

그렇기 때문에 특정 명령어의 사용을 제한하기 위하여 on command 이벤트를 사용해줄 것이다.

 

options:
	contains-ban: ":"
	is-ban: "pl" or "plugins"

on command:
	player is set
	player isn't op
	if command contains {@contains-ban}:
		cancel event
	else if command is {@is-ban}:
		cancel event
	else:
		stop
	send "Unknown command. Type ""/help"" for help."

 

/spigot:tps같은 명령어처럼 콜론(:)이 포함된 명령어와 /pl같은 서버 보안을 위한 명령어를 감지할 시,

 

이벤트를 캔슬하여 사용하지 못하게 막는 스크립트이다.

 

추후에 수정이 간편하도록 options에 제한하는 명령어를 따로 적어두었다.

 

오피가 없는 플레이어는 /pl 명령어를 입력하면 플러그인 목록 대신 존재하지 않는 명령어라는 메시지만 출력된다.

아직 스크립트를 모른다면? - mon0rail.tistory.com/2?category=909444

 

 

오늘은 간단하면서도 응용하기 좋은 이벤트 캔슬을 이용하여 블럭의 설치와 파괴를 제한하려고 한다.

 

on block break:
	cancel event

 

 

두 줄 짜리 짧은 코드이지만, 이 스크립트를 적용하면 플레이어들은 어떤 블럭도 파괴하지 못한다.

 

왜냐하면 cancel event를 사용함으로써 블럭 파괴(block break)라는 행동을 취소(캔슬)했기 때문이다.

 

아주 간단하지만 유용하게 쓰이는 부분이 많이 때문에 꼭 알아둬야 하는 구문 중 하나이다.

 

블럭의 설치를 막는 것도 간단하다.

 

 

on block break:
	cancel event

on block place:
	cancel event

 

 

 

이렇게 block place 이벤트도 취소시키면, 플레이어들은 블럭의 설치나 파괴가 불가능하다.

 

하지만 이정도의 코드만으로는 서버에 실제로 적용하여 사용하기엔 무리가 있다.

왜냐하면 언제 어디서나, 오피(OP)까지이벤트 캔슬의 영향을 받아 블럭을 설치할 수 없기 때문이다.

 

그렇기 때문에 좀 더 실용적인 스크립트로 만드려면 코드를 더 추가해야된다.

 

 

on block place:
	player is in world "spawn"
	player isn't op
	cancel event
	send "&7이 월드에서는 블럭을 설치할 수 없습니다."

 

 

위 테스트에서는 월드명을 "world"으로 바꾸어 테스트하였다.

 

이렇게 만들면 별도의 설정이나 플러그인이 없이 간단하게 월드 전체를 보호할 수 있다.

 

블럭의 파괴 방지 역시 같은 코드를 작성해주면 블럭의 설치 및 파괴를 제한할 수 있다.

 

 

 

 

보통 서버에서 아이템을 그대로 사용하기만 하는 일은 드물다.

 

보통은 이름 및 설명을 붙이고 경우에 따라 마법을 부여하여 특별한 용도로 사용한다.

 

보통 아이템의 이름과 설명을 붙이기 위해 플러그인을 사용하지만, 스크립트 코드 내에서 이를 자체적으로 지원해준다.

 

command /givetest:
	trigger:
		give a diamond named "&b가공된 다이아몬드" to player

 

아이템 이름 뒤에 named "text" 을 붙이면 이름을 가진 아이템을 만들 수 있다.

 

command /givetest:
	trigger:
		give a diamond named "&b가공된 다이아몬드" with lore "&7오랜 시간에 거쳐 완성된 다이아몬드이다." and "&7매우 비싼 가격에 판매되고 있다." to player

 

아이템 설명을 붙이려면 with lore "text" 을 붙이면 가능하며, and로 여러 줄의 설명을 붙일 수 있다.

 

 

스크립트를 리로드하고 명령어를 입력하면 이름과 설명이 붙은 아이템을 받을 수 있다.

 

 

 

마법이 부여된 아이템 역시 스크립트로 제작할 수 있다.

 

command /givetest:
	trigger:
		give a diamond of unbreaking 1 named "&d마법의 다이아몬드" to player

 

<아이템> of <마법 이름> <레벨> 의 형식으로 붙일 수 없는 마법이나 비정상적인 레벨의 마법도 부여할 수 있다.

 

이 역시 리로드 후 명령어를 입력하면 내구성 I이 부여된 다이아몬드를 받을 수 있다.

 

마법을 여러 개 붙이려면 unbreaking 1, fortune 3, infinity 1과 같이 콤마(,)를 사용하면 된다.

 

 

+ Recent posts