개인 자료란 (JE)

  서버 커뮤니티

Profile 마린잉엥 대표칭호 없음
Profile

질문하기 스크립트

1.16.3 상자 잠금 스크립트 오류 질문입니다.

2020.10.09 조회 수 1294 추천 수 0
이해도 1.16 
게임버전 (JE) 스피곳 

[ 구현하고 싶은 내용 ]


이름이 "잠금상자"라는 아이템을 설치했을 때 

그 "잠금상자"는 단 1가지 유형의 갈고리 아이템없이는 열 수가 없고

{어떤 변수의 이름}을 가진 갈고리 아이템으로 "잠금상자"를 처음 클릭했을 때 

이 "잠금상자"의 유일한 열쇠가 되게 구현을 하고 싶습니다.


예시:) "&4안녕하세요" 라는 이름을 가진 갈고리 아이템이 있다.

"&c잠금상자"라는 이름을 가진 chest(상자) 아이템이 있다.

"&c잠금상자"라는 이름을 가진 chest(상자) 아이템은 설치하자마자 어떠한 방법으로도 열 수가 없다.

하지만 갈고리 아이템을 들고 처음 상자를 향해 오른쪽 마우스 클릭한 

갈고리 아이템의 이름을 변수로 저장해서 유일한 열쇠가 되는 스크립트

"&4안녕하세요" 라는 이름을 가진 갈고리아이템으로 잠금상자를 클릭하면 

그 잠금상자의 유일한 열쇠가 된다. 를 구현하고 싶습니다.


[오류]

8aae4a6a6e3ba376a0a3ad9a7b766d5c.PNG


[ 스크립트 전체 ] 


4c4af26466937610d54711bc152eab7b.png


보시다시피 set {상자} to true  라는 것에서 오류가 생깁니다.





3개의 댓글

스크립터브혼
2020.10.09

1. line 4 - if name of clicked block is "&c잠금상자":
[Name of]는 이름을 가질수 있는 타입(엔티티, 아이템, 인벤토리 등)만 가능합니다.
설치된 상자의 이름이라는 건 없고
설치된 상자의 인벤토리의 이름은 변경할 수 없어요.


2. line 5 - set {열쇠} to player's tool's name:
어퍼스트로피 사용하지말고 풀어서 쓰세요.
> name of tool of player


3. line 15 - player's tool's name is "{열쇠}":
2번과 마찬가지로 풀어서 사용하시고
변수를 텍스트로 출력할땐 %%를 붙여야합니다.
> "%{열쇠}%"

스크립터브혼
2020.10.09
@스크립터브혼
on right click:
    clicked block is chest
    
    set {_chest_key} to {locked_chest::%location of clicked block%}
    set {_tool_key} to name of tool if tool is tripwire hook
    
    if {_chest_key} is not set:
        if {_tool_key} is set:
            set {locked_chest::%location of clicked block%} to {_tool_key}
            send "열쇠가 등록됐습니다. (%{_tool_key}%)"
            cancel event
    
    else:
        if {_tool_key} is not set:
            send "열쇠가 아닙니다"
            cancel event
            
        else if {_chest_key} is not {_tool_key}:
            send "열쇠가 맞지 않습니다."
            cancel event
        
        else:
            send "상자를 열었습니다"

아이템은 변수를 가질 수 없습니다.
변수는 알고리즘이 동작하는데 필요한 정보를 담는 곳이기 때문이죠.
고유한 아이템을 만들기위해서는 아이템의 메타정보(이름, 로어, 인첸트, 플래그, 태그) 등을 고유할 수 있도록 변경하는 것입니다.
그리고 이것이 쓰일 때 고유한 메타정보를 가지고 있는지를 비교하는 방식으로 구현됩니다.


설치된 상자는 이름을 가지지 못합니다.
스크립트에서 알수있는 설치된 상자의 정보는 블럭의 종류, 방향, 좌표 등과같은 것들입니다.
이러한 정보와 고유한 아이템의 메타정보가 서로 맵핑되어있음을 확인 할 수 있도록 구현해야합니다.


예문에서 {locked_chest::*} 리스트는 블럭의 좌표를 인덱스로, 텍스트를 값으로 가지고 있습니다.
블럭의 좌표로 리스트에서 텍스트 값을 가져와 그 값이 아이템의 이름과 같은지를 비교합니다.
블럭의 좌표와 아이템의 이름을 비교하여 서로 맵핑되어있음을 확인할 수 있도록 한 것 입니다.

마린잉엥
2020.10.11
@스크립터브혼

와.. 정말 감사합니다.

덕분에 원하는 기능 100%를 구현했어요

어찌 그렇게 스크립트를 보기 좋게 잘 정리를 하시고

고급지게 만들 수 있는지 정말 존경합니다!

1. else if 와 else의 조합 그리고

2. 아이템에 변수를 주는 것이 아닌 이름에 변수하고 위치 좌표에 변수를 부여한다는 것

 

간단한 기능임에도 은근히 복잡해서 남들은 쉽게 생각하지 못한 아이디어인 거 같아요!

브혼님은 매사 보는데 프로그래밍를 완전 마스터하신 분같아요

볼 때마다 경이롭습니다.

정말 이틀을 밤샘하다가 결국 찾기도 했었고

배운 점도 정말 많았네요 감사합니다!

 

브혼님께서 작성해주신 코드로 만들어봤습니다.

완벽히 구현되었습니다.

 

on place of chest:

if player's tool' name is "&c잠금상자":

set {상자.%location of block%} to true

message "&l&e[시스템] &f상자 보안가동중!" to player

 

on right click:

clicked block is chest

set {_chest_key} to {locked_chest::%location of clicked block%}

set {_tool_key} to name of tool if tool is tripwire hook

if {상자.%location of block%} is set:

if {_chest_key} is not set:

if {_tool_key} is not set:

send "&l&e[시스템] &f상자가 잠겨있습니다!"

cancel event

else:

set {locked_chest::%location of clicked block%} to {_tool_key}

send "&l&e[시스템] &f새로운 열쇠를 등록습니다! &a(%{_tool_key}%&a)"

cancel event

else:

if {_tool_key} is not set:

send "&l&e[시스템] &f상자가 잠겨있습니다!"

cancel event

else if {_chest_key} is not {_tool_key}:

send "&l&e[시스템] &f열쇠가 맞지 않습니다! &a(%{_tool_key}%&a)"

cancel event

else:

send "&l&e[시스템] &f상자를 열었습니다! &a(%{_tool_key}%&a)"