늘솜보름
정품인증자
JIMIN2457 69b92cf6d9194ba7a57a668b093cb822
이해도 | 1.12 |
---|---|
게임버전 (JE) | 스피곳 |
스크립트 버전 | 중급자(필요한 애드온을 찾아서 만들 수 있어요) |
스크립트 애드온 | 2.5.3 |
예를들어 다이아몬드 블록을 설치하면 해당 블록에 설치한 사람 같은 data를 저장해서
부수려고하면 블록에 저장된 data를 인식해서 비교하고 싶은데 어떤 방식으로 접근해야하는지 모르겠습니다.
도움부탁드립니다!
늘솜보름
2021.07.25on place:
if {placeOfLocation::*} is not set:
set {placeOfLocation::*} to "%uuid of player%/%event-location%/%player's world%"
else:
add "%uuid of player%/%event-location%/%player's world%" to {placeOfLocation::*}
on break:
loop {placeOfLocation::*}:
set {_split::*} to loop-value split at "/"
if "%{_split::3}%" is "%player's world%":
if "%{_split::2}%" is "%event-location%":
if "%{_split::1}%" is "%uuid of player%":
remove loop-value from {placeOfLocation::*}
stop
else:
cancel event
stop
늘솜보름
2021.07.25블럭 설치시 player, 위치, 월드 저장후
블럭 파괴시 월드>위치>플레이어 순으로 비교한 다음에 모두 일치하면 배열에서 해당 변수만 지우고,
틀리면 이벤트 캔슬하는 원리입니다.
막 예를들어 백만개 블록 설치되도 문제없을까요?
스크립터브혼
2021.07.26조금은 비효율적인 방법입니다. 인덱스를 활용하면 루프를 하지않아도 바로 원하는 변수를 참조 할 수 있습니다.
key-value 개념인데요.
예를들어 플레이어의 uuid로 바로 참조가 가능한 변수를 만들고싶다면, uuid를 중첩한 변수 {uuid.%uuid of player%} 를 사용하면 됩니다.
이러한 변수들을 리스트로 관리하고 싶다면 {uuid::%uuid of player%}의 형태로 사용하게 되는 것이죠.
여기서 key는 uuid of player가 되는것이고 value는 저장할 값이 됩니다.
마찬가지로 "%uuid of player%/%event-location%/%player's world%"를 key로 한다면
리스트를 루프하지 않고 key를 인덱스로하여 바로 값을 참조 할 수 있는 것입니다.
또한 코드에서 add를 사용하여 리스트에 값을 추가하는 경우 중복 등록의 문제가 있습니다.
중복을 없에려면 set으로 인덱스를 지정하여 값을 추가하거나,
추가하기 전에 contains 컨디션으로 값을 가지고 있는지 확인을 해야합니다.
인덱스를 활용하면 다음과 같이 수정됩니다.
key를 만들때 해당 key를 어떤 값으로 생성할 것인지를 잘 생각해야합니다.
이 기능은 블록이 어떤 값을 가지고있느냐를 판단해야하기 때문에 블록으로부터 key가 생성됩니다.
그리고 그 생성된 key값을가지고 설치한 유저인 player를 참조해야하는 구조입니다.
그렇기 때문에 key는 오로지 블록으로부터 얻어진 데이터여야 하므로 location과 world가 사용된 것입니다.
그리고 해당 키를 가지고 플레이어를 참조해야하기 때문에 값으로 플레이어가 저장됩니다.
변수의 구조는 .player나 ::player나 큰 차이는 없습니다.
만약 해당 키를 가지고 여러개의 데이터를 관리해야한다면 리스트를 사용하는 것이 좋겠죠.
늘솜보름
2021.07.26답변 감사합니다! 이렇게 또 배워가네요~
알려주신 방법 참고해서 해보겠습니다!