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

스크립트 기초 활용 2편(가방)

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

 

스터디립트의 마인크래프트 스크립트 기초 활용편의 2번째 시간입니다.

이번 시간에는 가방 스크립트에 대해서 알아보도록 하겠습니다.

 

이 스크립트는, SkQuery 애드온이 필요합니다.

 

 

 

SkQuery애드온은 기본적인 시스템들을 만들 때 여러가지로 활용할 곳이 많은 애드온 중 하나입니다. 애드온 없이 스크립트를 구축해가고 싶으신 분이 아니시라면, 거의 필수 애드온 중 하나라고 볼 수 있습니다.

 

 아래 링크에서 다운받으실 수 있습니다.

 

Addon - SkQuery [1.9-1.15+]

https://forums.skunity.com/resources/skquery-1-9-1-15.68/

 

우선 사용하는 모습 먼저 보시겠습니다.

 

 

가방 스크립트 도움말

/가방발급 [줄 수] [고유번호] 를 통해 가방을 발급받을 수 있습니다.

 

 

가방 발급

 

 

저는 2줄짜리 고유번호 1234번 가방을 발급받았습니다.

 

가방 열기

가방을 들고 우클릭을 하니, 제가 발급받은대로 2줄짜리 가방이 잘 열리는 것을 볼 수 있습니다.

 

 

 

가방에 아이템 넣기

 

 

이렇게 아이템들의 위치를 다 다르게 해 놓아도, 칸마다 아이템의 정보를 저장해놓는 방식이기 때문에

가방을 닫은 후 다시 열었을 때에도 가방에 넣어놨었던 아이템들의 위치 그대로 남아있게 됩니다.

 

 

 

 

자 그러면 이제 한번 상자 스크립트의 구문에 대해 알아보겠습니다.

options:
	s : &3&l[ &b&l가방 &3&l]
command /가방발급 [<number>] [<number>]:
	trigger:
		if player is op:
			if arg 1 and arg 2 is set:
				if arg 1 < 1:
					send "{@s} 1줄이 최소입니다"
				else:
					if arg 1 <= 6:
						if {고유번호.가방::*} contains arg 2:
							send "{@s} 이 고유번호는 이미 존재합니다. 다른 고유번호를 지정해주세요"
						else:
							give 1 chest named "&3&l[ &b&l가방 &3&l]" with lore " " and "&3&l줄 수:&l%arg 1%&3&l줄" and "&3&l고유번호:&l%arg 2%&3&l번" to player
							add arg 2 to {고유번호.가방::*}
							send "{@s} %arg 1%&3&l줄짜리 고유번호 &3&l%arg 2%&3&l번 가방이 발급되었습니다"
					else:
						send "{@s} 6줄이 최대입니다"
			else:
				send "&4[ &r사용방법 &4]"
				send "&4[ &r/가방발급 [줄 수] [고유번호] &4]"
		else:
			send "{@s} 당신은 오피가 아니기에 이 명령어를 사용할 수 없습니다"
on rightclick with chest:
	if name of player's tool contains "&3&l[ &b&l가방 &3&l]":
		cancel event
		set {_lore::*} to uncolored lore of player's tool
		loop {_lore::*}:
			if {_lore::%loop-index%} contains "줄":
				set {_줄수} to {_lore::%loop-index%}
				replace all "줄" and " " and "수" and ":" and "줄" with "" in {_줄수}
				set {_줄수} to {_줄수} parsed as integer
			if {_lore::%loop-index%} contains "고유번호":
				set {_고유번호} to {_lore::%loop-index%}
				replace all " " and "번" and ":" and "고유번호" with "" in {_고유번호}
		open chest with {_줄수} row named "&b&l가방" to player
		set {_count} to 0
		loop {bag.%{_고유번호}%::*}:
			set slot {_count} of current inventory of player to loop-value
			add 1 to {_count}
on inventory close:
	if icname contains "가방":
		set {_lore::*} to uncolored lore of player's tool
		loop {_lore::*}:
			if {_lore::%loop-index%} contains "줄":
				set {_줄수} to {_lore::%loop-index%}
				if {_줄수} contains "1":
					set {_줄수} to 1
				if {_줄수} contains "2":
					set {_줄수} to 2
				if {_줄수} contains "3":
					set {_줄수} to 3
				if {_줄수} contains "4":
					set {_줄수} to 4
				if {_줄수} contains "5":
					set {_줄수} to 5
				if {_줄수} contains "6":
					set {_줄수} to 6
			if {_lore::%loop-index%} contains "고유번호":
				set {_고유번호} to {_lore::%loop-index%}
				replace all " " and "번" and ":" and "고유번호" with "" in {_고유번호}
		delete {bag.%{_고유번호}%::*}
		set {_count} to 0
		loop 54 times:
			add slot {_count} of current inventory of player to {bag.%{_고유번호}%::*}
			add 1 to {_count}

(원래 사용했던 테마를 적용시키니, player's 의 '를 텍스트의 시작 부분으로 인식해서 글씨가 다 초록색으로 변해버려서 이것만 테마를 다른것으로 바꿨습니다.)

 

기본적인 원리는, 가방마다 고유번호가 다른것을 이용해, 고유번호의 이름으로 각각 배열변수에 가방을 닫을때는 가방의 아이템들을 저장하고, 열때는 다시 고유번호의 이름으로 된 배열변수에서 아이템들을 불러오는 방식입니다.

 

이제 여러분들이 모르실 것 같은 구문들에 대해서 알려드리겠습니다.

 

1. if name of player's tool contains ~

이건 말 그대로, 명령어를 실행한 대상의 손에 들려있는 아이템의 이름에 ~가 포함되어 있는지, 라는 구문입니다.

이 구문을 변형시켜서, if lore of player's tool contains(플레이어의 손에 들려있는 아이템의 설명에 ~가 포함되어 있는지) 등으로도 사용할 수 있습니다.

저는, 상자를 우클릭했을때, 상자의 이름이 &3&l[ &b&l가방 &3&l]" 을 포함할 때, 로 구문을 만들어서, 손에 든 아이템이 가방일 때만 GUI가 열리도록 했습니다.

 

 

2. ~ uncolored [lore/name] of [아이템]

위 구문은, [아이템] lore 또는 name의 색깔을 벗긴다는 이야기입니다.

 

 

set {_lore::*} to uncolored lore of player's tool
 

를 이용해서, {_lore::*} 에다가 상자 아이템의 설명들을 색깔을 벗긴 상태로 저장한 후,

loop와 replace를 이용해 {_줄수} 에다가 가방의 줄 수를, {_고유번호} 에다가는 고유번호를 저장하게 했습니다.

 

 

3. open chest

이건, GUI메뉴, 즉 가방을 열어준다는 구문입니다.

기본적인 구조는,

open chest with [줄 수] row named [이름] to [대상]

 

입니다.

 

 

open chest with {_줄수} row named "&b&l가방" to player

 

를 이용해,

&b&l가방 이라는 이름의 {_줄수} 짜리 GUI메뉴를 명령어를 실행한 대상에게 열어주게 만들었습니다.

 

 

4. set/add slot ~ of ~ inventiry of ~ to [변수/배열변수]

이 구문은, 3번째 ~의 두번째~ 인벤토리의 첫번째 ~ 슬롯에 있는 아이템을 변수 또는 배열변수에 더하거나, 반대로 변수 또는 배열변수에 있는 아이템을 그 슬롯에 놓는다는 구문입니다.

 

 

loop {bag.%{_고유번호}%::*}:
			set slot {_count} of current inventory of player to loop-value
			add 1 to {_count}
 

를 통해서, 가방을 열 때 고유번호의 이름으로 지정된 배열변수에 있는 아이템들을, 불러왔습니다.

 

 

또한,

delete {bag.%{_고유번호}%::*}
		set {_count} to 0
		loop 54 times:
			add slot {_count} of current inventory of player to {bag.%{_고유번호}%::*}
			add 1 to {_count}

 

를 통해서 가방을 닫을때 가방에 있는 아이템들을 고유번호의 이름으로 된 배열변수에 저장하도록 했습니다.

 

 

아래의 파일들은, 가방 스크립트 입니다.

주석이 포함된 스크립트는 추후 업로드 할 예정이며, 2차수정 및 2차배포는 가능하지만, 배포를 할 때에는 출처는 남겨주세요.

 

↓ 가방 스크립트 (주석 없음)

↓ 가방 스크립트 (주석 포함)

가방(주석 포함).sk
0.00MB

 

스터디립트의 마인크래프트 스크립트 기초 활용편 2편은 여기서 끝입니다.

다음 시간에는, 상점 스크립트에 대해 알려드리겠습니다

 

질문이 있으시다면 이 글의 댓글에 적어주시면 답변해드리겠습니다.

 

 

 

댓글