이해도 | 초보자 |
---|---|
게임버전 (JE) | 1.19.2 |
게임버전 (BE) | 관련없음 |
펫 소환서를 만드려고 합니다
인벤토리에 책을 넣기만 하면 펫이 바로 소환되는 시스템입니다
사람에게 태그를 붙여서 책을 소유한 사람에게만 소환가능하게까지는 만들었는데
문제는 한명만 책을 넣어도 태그를 가진 모두에게 펫이 사라진다는 겁니다
또한 다른사람에게 태그만 부여하면 소환서가 없어도 또 다른사람이 인벤토리에 소환서를 넣기만 하면 모두에게 소환됩니다
이건 소환명령어이고
(반복,무조건,항상)
execute as @a[nbt={Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}] run tag @s add 1
(반복,무조건,항상)
execute if entity @a[tag=1,nbt={Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}]
<<<< 이 사이에는 레드스톤 비교기로 신호를 한번만 보내게 했습니다.
(반응,무조건,레드스톤필요)
execute at @a[tag=1,nbt={Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}] run summon minecraft:armor_stand ~ ~ ~ {Tags:["PS1"],Invisible:1b,NoGravity:1b,Marker:1}
펫을 없앨때는
(반복,무조건,항상)
execute unless entity @a[tag=1,nbt={Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}]
(연쇄,조건,항상)
kill @e[tag=PS1]
유투브로는 한계가 있어 질문을 올려봅니다
yusin12
2023.06.08여기서 중요한것이 바로 as,at 와 if unless의 차이입니다!!
as는 대상
at은 대상의 위치
를 정해주지만
if는 만약
unless는 만약 아니라면
이라는 경우가 더 큽니다
즉 if entity @e[tag=a]라고 적으면 태그가 a인 엔티티가 있으면 작동해버립니다!
하지만 as at으로 대상을 정해주지 않았기에 모든 엔티티로 인식해버립니다!
즉! if unless와 as at을 잘 섞어 이용하면 위 문제를 해결할 수 있지만..
더 쉬운 방법은
execute as @a[] at @s run ..
이게 제일 좋은 방법임다!
알려주세요1
2023.06.08인벤토리에 아이템이 있고 없고를 감지하려면 if,unless를 사용해야 할거같은데
어떻게 코드를 짜면 잘섞어 쓸수있을까요?
yusin12
2023.06.08정말 신기하게도
execute as @a[nbt=!{}] at @s run 으로 없고를
execute as @a[nbt={}] at @s run 으로 있고를 감지 할 수 있음다
________
그래도 하시겠다면!
execute as @a at @s if ... run ..
을 이용해서 할 수 있음다!
알려주세요1
2023.06.08오 저렇게 할수있나보네요.
한번 시도해보겠습니다
알려주세요1
2023.06.08unless를 execute as @a[nbt=!{Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}]
이렇게 바꾸니 다음 커맨드블록으로 신호가 가지않습니다. 뭐가 문제인가요?
yusin12
2023.06.08as와 at은 대상과 위치를 정해주는 친구입니다!!
if와 unless는 만약을 정해주는 친구입니다!!
as at을 쓰는 것 만으로 테스트가 진행되지 안으며
if unless를 쓰는 것만으로 테스트가 진행됩니다!
즉! as at을 할때는
execute as @a[nbt=!{Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}] at @s run kill @e[tag=PS1] 으로 써야함다
알려주세요1
2023.06.08지금까지 신호가 안갔던 이유가 저거였군요
이해가 확 되네요 정말감사합니다!
yusin12
2023.06.08꾸벅꾸벅
알려주세요1
2023.06.08계속 질문하게 되어 죄송합니다.
execute as @a[nbt={Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}] at @s run tag @s add 1
다음 커맨드 블록
execute as @a[tag=1] at @s run say 1
테스트로 이렇게 하니 태그가 1인 모든 사람들이 채팅1을 치게 되는데 어떻게 저만 채팅을 치게 할수있나요?
yusin12
2023.06.08질문이 이해가지 않습니다..
tag 1을 가진 사람만 say 1 을 하고싶으신걸로 해석되는데
왜 자신만 챗을 쳐야하는검까??
알려주세요1
2023.06.08펫 소환서를 보유하게 되면 자신에게 태그1이 부여되면서 채팅이 쳐지게 되는데
다른사람이 이미 소환서를 보유하고 있으면 그사람도 같이 채팅이 쳐지게 됩니다.
태그1을 가지고 있는 사람중에 인벤토리에 소환서가 들어오는 사람만 따로 감지를 할수는 없나요?
yusin12
2023.06.08왜 챗을 쳐야하는지 이유가 있을까욤?
알려주세요1
2023.06.08원래 목적은 각자 원할때마다 펫을 소환할수 있는 기능을 만드는 겁니다.
테스트로 구분하기 위해 임시로 채팅 기능을 넣어놨습니다.
알려주세요1
2023.06.08일일히 F를 눌러서 소환하기 보다는 인벤토리에 특정아이템을 넣기만 하면 소환되는 시스템을 만드려고 했는데
여러명이 소환서를 인벤토리에 넣으면 가장 최근에 인벤에 넣은사람에게 펫이 이동되는 문제도 생기고 그러네요 ㅠㅠ
yusin12
2023.06.08으흠! 그런건 컴퓨터 프로그래밍 할 때 많이 쓰는 방법을 쓰면 됨다!
다만 프로그램에서는 open_pet = False 을 해놓고
if pet_book = True:
open_pet = True
이런 식으로 펫 북이 있을 때와 없을 때를 감지합니다!
마크에서는 True, False라는 개념이 없기에...
복잡한 방법을 쓰기 싫다면 스코어보드를 통해서 만들 수 있음다!
예를 들어 펫 북이 없을 때는 점수를 1점
있을 때는 2점으로 하여
[반복 / 무조건 / 레드 활성화]
execute as @a[scores={<점수 이름>=1},nbt={Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}] at @s run say 1
[체인 / 조건 / 항상 활성화]
execute as @a[scores={<점수 이름>=1},nbt={Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}] at @s run tag @s add 1
[체인 / 조건 / 항상 활성화]
execute as @a[scores={<점수 이름>=1},nbt={Inventory:[{id:"minecraft:writable_book",tag:{display:{Name:"{\"text\":\"펫\"}",Lore:["{\"text\":\"펫 소환\"}"]}}}]}] at @s run scoreboard players set @s <점수 이름> 2
이런 식으로 False에서 True로 만드는 법이 있고 반대로 없어졌을 땐 !을 넣어 감지 할 수 있음다!
tp를 할때는 좀더 구체적으로 대상을 적어주는게 좋슴다!
summon을 이용하여 pet을 소환하였다면
tp @e[tag=,limit=1,sort=]등을 활용하면 펫이 이동되거나 하지 않슴다
알려주세요1
2023.06.08상세한 답변 감사합니다! 해보고 막히는게 있으면 또 다시 질문하겠습니다 ㅎㅎ
알려주세요1
2023.06.09알려주신 덕분에 명령어로 개인을 지정할 수 있게 되었습니다.
이제 펫으로 소환한 아머스탠드(태그:PS1)를 소환한사람에게 붙어있게 하기 위해서
<반복, 무조건, 항상활성화>
execute at @a[tag=1,scores={pet=2}] run teleport @e[tag=PS1,limit=1] ^-1.2 ^.2 ^-.7
이렇게 하였더니 여전히 가장 최근에 펫을 소환한사람에게 붙어있습니다. 모두에게 붙어있게 하려면 어떻게 해야 하나요?
사람 명수 만큼 커맨드블록을 설치하여야 하나요?
yusin12
2023.06.092가지 방법이 있습니다!
sort를 쓰는 방법이 있습니다!
가장 빠르고 간편하지만 오류가 생길 위험이 많다는 점이 단점입니다!
(예를 들어 펫 소환한 두 유저가 가까워지면 펫이 봐꿔치기가 된다던가..등등)
그 다음 방법은 UUID를 이용하는 방법입니다!
UUID는 절때적으로 봐뀌지 않기 때문에
펫을 소환하고 UUID를 스코어보드에 저장한 뒤
펫과 가장 가까운 플레이어가 소환한 플레이어 이므로, 가장 가까운 플레이어의 점수도 펫의 UUID랑 같게 하여
execute as @a at @s if score를 이용해 점수가 같은 아머스탠드만 따라 붙게 할 수 있습니다!
알려주세요1
2023.06.09말하신 오류 딱 일어나서 곤란하던 찰나인데 정말 감사합니다!
알려주세요1
2023.06.10펫이 한명만 인식하지 않고 플레이어 여러명을 인식하네요
계속 고민중인데 도저히 모르겠습니다 ㅠㅠ
사람이 태그2이고, 펫이 태그A1입니다
<연쇄,조건,항상>
execute as @e[tag=A1] at @s store result score r random run data get entity @s UUID[0]
<연쇄,조건,항상>
execute as @a[tag=2,scores={pet=1}] at @s run scoreboard players operation @e[tag=A1,limit=1,distance=..1] random = @p[scores={pet=1},tag=2,distance=..1] random
<반복,무조건,항상>
execute as @e[tag=A1,distance=3..] at @s if score @s random = @p random run teleport @a[tag=A1,limit=1,distance=3..5] @p