개인 자료란 (JE)

  서버 커뮤니티

Profile kesswick 대표칭호 없음

kesswick1006 ead0919c59314658b6c69d91acfee3c4

Profile

질문하기 스크립트

스크립트 변수가 궁금해요

2025.07.11 조회 수 130 추천 수 0
이해도 초보자 
게임버전 (JE) 관련없음 
게임버전 (BE) 관련없음 

제가요 지역변수?전역변수? 를 알게 되었는데요.

이코드에는 _uuid가 들어가있는데 그러면 보관함에있는 아이템은 저장 안되지 않나요.

근데 왜 되징..;;

가방 스크립트입니당.

command /가방 [<offline player>]:

    trigger:

        if arg-1 is not set:

            set {_target} to player

            set {_uuid} to uuid of {_target}

        else:

            if player is not op:

                send "&c다른 사람의 보관함은 OP만 열 수 있습니다!"

                stop

            set {_target} to arg-1

            set {_uuid} to uuid of {_target}


        set {_gui} to chest inventory with 1 rows named "가방 - %{_target}%"

        loop 9 times:

            set slot loop-number - 1 of {_gui} to {chest.%{_uuid}%::%loop-number%}

        open {_gui} to player

        set {openStorage::%player%} to {_uuid}

        play sound "minecraft:item.armor.equip_leather" to player


on inventory close:

    if name of event-inventory starts with "가방":

        set {_uuid} to {openStorage::%player%}

        loop 9 times:

            set {chest.%{_uuid}%::%loop-number%} to slot loop-number - 1 of event-inventory

        delete {openStorage::%player%}

        play sound "minecraft:entity.item.pickup" to player


on swap hand items:

    if player is sneaking:

        cancel event

        execute player command "/가방"





1개의 댓글

WooJ1n
2025.07.20


kesswick님, 안녕하세요! 스크립트 변수에 대해 궁금하시군요. 특히 _uuid와 아이템 저장 방식에 대해 질문 주셨네요. 보내주신 가방 스크립트 코드를 바탕으로 왜 아이템이 저장되는지 설명해 드릴게요. 🤔


지역 변수 vs. 전역 변수 (스칼라 변수 vs. 리스트 변수)

스크립트에는 크게 두 가지 종류의 변수가 있습니다.

  1. 지역 변수 (Local Variables):

    • 이름 앞에 _ (언더바)가 붙습니다. 예: {_target}, {_uuid}, {_gui}

    • 특정 이벤트나 명령어의 trigger 안에서만 유효하며, 해당 블록이 끝나면 사라집니다.

    • 일시적인 값을 저장하는 데 사용됩니다.

  2. 전역 변수 (Global Variables) 또는 리스트 변수:

    • 이름 앞에 _가 붙지 않습니다. 예: {chest.uuid::1}, {openStorage::player}

    • 서버가 실행되는 동안 계속 유지되며, 서버가 재시작되거나 스크립트가 리로드되기 전까지는 값이 남아있습니다.

    • 영구적으로 데이터를 저장하는 데 사용됩니다. Skript는 기본적으로 이 전역 변수들을 자동으로 파일(Skript 폴더 내 variables.yml 또는 다른 파일)에 저장하여 서버가 꺼져도 데이터가 유지되도록 합니다.


가방 스크립트의 작동 원리

kesswick님이 궁금해하신 {_uuid}지역 변수가 맞습니다. 하지만 아이템이 저장되는 핵심은 이 지역 변수가 아니라, 지역 변수 {_uuid}값을 사용하여 만들어지는 전역 변수에 있습니다.

스크립트 코드를 다시 볼까요?


1. 가방 열기 (command /가방)


command /가방 [<offline player>]:
    trigger:
        # ... (생략)
        set {_uuid} to uuid of {_target} # 여기서 {_uuid}는 지역 변수. 예: "1234-abcd-..."

        set {_gui} to chest inventory with 1 rows named "가방 - %{_target}%"
        loop 9 times:
            # 보관함에 있는 아이템을 GUI에 불러오는 부분
            set slot loop-number - 1 of {_gui} to {chest.%{_uuid}%::%loop-number%} 
            # 이 부분의 {chest.%{_uuid}%::%loop-number%} 가 핵심입니다.
            # 예시: {chest.1234-abcd-...::1}, {chest.1234-abcd-...::2} ...
            # 즉, 플레이어의 UUID를 이름의 일부로 가진 '전역 변수'를 사용합니다.
        open {_gui} to player
        set {openStorage::%player%} to {_uuid} # 현재 플레이어가 열고 있는 가방의 UUID를 저장 (전역 변수)
  • 여기서 set {_uuid} to uuid of {_target}_uuid라는 지역 변수에 플레이어의 고유 ID(UUID)를 임시로 저장합니다. 이 {_uuid} 자체는 명령어 실행이 끝나면 사라집니다.

  • 하지만 그 아래에 있는 {chest.%{_uuid}%::%loop-number%}는 다릅니다. 이는 {chest.고유ID::슬롯번호} 형태의 전역 변수입니다. Skript는 .이나 ::를 사용하여 리스트 변수를 만들고 데이터를 저장할 수 있습니다.

  • 예를 들어, 어떤 플레이어의 UUID가 1234-abcd-5678이라면, 이 플레이어의 가방 슬롯 1번 아이템은 {chest.1234-abcd-5678::1}이라는 전역 변수에 저장됩니다.

  • Skript는 {변수이름} 형태의 전역 변수 데이터를 서버의 plugins/Skript/variables.yml 파일에 자동으로 저장합니다. 그래서 서버를 껐다 켜도 아이템 정보가 남아있는 거죠!


2. 가방 닫기 (on inventory close)

on inventory close:
    if name of event-inventory starts with "가방":
        set {_uuid} to {openStorage::%player%} # {openStorage::플레이어이름} 전역 변수에서 UUID를 불러와 {_uuid} 지역 변수에 저장
        loop 9 times:
            # GUI의 아이템을 전역 변수에 저장하는 부분
            set {chest.%{_uuid}%::%loop-number%} to slot loop-number - 1 of event-inventory
            # 여기서도 동일하게 {chest.고유ID::슬롯번호} 형태의 전역 변수를 업데이트합니다.
        delete {openStorage::%player%} # 열려있는 가방 정보는 이제 필요 없으니 삭제
  • 플레이어가 가방을 닫으면, 이전에 열 때 저장해두었던 {openStorage::%player%} (이것 역시 전역 변수입니다!)에서 해당 플레이어의 UUID를 다시 가져옵니다.

  • 가져온 UUID를 {_uuid}라는 지역 변수에 넣고, 이 {_uuid}를 사용하여 {chest.고유ID::슬롯번호} 전역 변수를 현재 GUI의 아이템으로 업데이트하는 것입니다.


정리

_uuid는 현재 명령어를 실행하는 동안만 존재하는 지역 변수가 맞습니다. 하지만 이 지역 변수 _uuid의 '값'을 이용해서 {chest.고유ID::슬롯번호}{openStorage::플레이어이름} 같은 '전역 변수'를 만들고 조작합니다.

스크립트의 전역 변수(이름에 언더바가 없는 변수)는 기본적으로 서버의 variables.yml 파일에 영구적으로 저장되기 때문에, 서버를 껐다 켜도 아이템 정보가 그대로 유지되는 것이죠.

Skript의 변수 시스템은 처음에는 조금 헷갈릴 수 있지만, 이처럼 지역 변수를 임시 데이터로 사용하고 전역 변수를 영구 데이터로 활용한다는 개념을 이해하시면 스크립트 작성이 훨씬 수월해질 거예요! 궁금한 점이 해결되셨기를 바랍니다. 😊

뉴스 및 창작물
/files/thumbnails/259/181/004/262x150.crop.jpg?20260412161348

건축

Project hail mary 우주선

SHALDOPlus

2026-04-12

1

/files/thumbnails/798/179/004/262x150.crop.jpg?20260406214105

건축

프로젝트 헤일메리 [Minecraft] 1

SHALDOPlus

2026-04-06

1

/files/thumbnails/528/169/004/262x150.crop.jpg?20260301145407

건축

정신병원 탈출맵을 제작중이예요 :> 3

SHALDOPlus

2026-03-01

3

/files/thumbnails/472/161/004/262x150.crop.jpg?20260208155607

나의 GPU ☠️💀 4

SHALDOPlus

2026-02-08

0

/files/thumbnails/602/157/004/262x150.crop.jpg?20260130141854

상품

《마인크래프트 대탈출 게임 만들기》 출간!

다코미

2026-01-30

0