데이터팩을 아예 모르면 보기 좀 힘들수도있음... 내가 글을 잘 못쓰기도하고


간단하게 방법을 설명하자면, 플레이어 근처에 커스텀구조물이 없다면 스폰하는건데



viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19e4ef86729c57280830646816956aa0c7b356866e8037ed


전체적인 구조는 이렇게 만들었고, 대략적으로 이런 흐름이다만 봐두셈


viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19e4ef86729c572808306468459c3cf1cab255816e8037ed


폴더구조는 이렇게 되있음


current_biome에서 플레이어가 현재 서있는 바이옴을 인식해주고

custom_structures에서 구조물을 스폰하는 핵심 폴더고

minecraft는 바닐라 데이터팩을 덮어씌워서 데이터팩 로드시/매 틱마다 함수를 실행해주는 역할을 해줌.



제일 처음 데이터 팩 로드시 minecraft:load가 실행되고, 여기서 custom_structures:load 를 실행해서


더미 스코어보드 currentBiome, main_tick, random, s_random 네개를 추가해줌.


이후 매틱마다 실행되는 minecraft:tick 에 의해서 custom_structures:tick이 계속 실행됨.


custom_structures:tick에서는 random 스코어를 1~100으로 순차적으로 더해주고,


s_random 도 1~40으로, main_tick 도 1~10으로 순차적으로 더해줌.


마크에 랜덤함수가 없어서 궁여지책으로 쓰는 방법인데 뭐 완전 랜덤은 아니더라도


엇비슷하게 작동하니까 그냥저냥 이렇게 쓰고있음.


그리고 바이옴을 인식하는 current_biome:plains 가 평원에 가면 currentBiome 스코어를 1로 만들어줌.


바이옴 인식부분은 발전과제꼼수를 사용했음.


viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19e4ef86729c572808306468479339a39fb555d76e8037ed

current_biome:plains 발전과제는 이렇게 되어있는데, 플레이어가 plains 바이옴에 있으면


current_biome:plains 발전과제를 얻고 current_biome:plains 함수를 실행시켜주는데 이 함수는


viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19e4ef86729c57280830646814906bf49de45ad76e8037ed


이렇게 되어있어서 current_biome:plains 발전과제를 지우고 currentBiome 스코어를 1로 해줘서


plains 바이옴에 있다면 무한정 반복되게 되어있음.


다른 바이옴들도 똑같이 이런구조로 되있음



그리고 custom_structures:tick 함수에서 main_tick 스코어가 10이되면 custom_structures:main 함수를 실행시켜줌.


10틱당 한번 구조물을 생성해주는거임. 원래는 1틱당 한번으로 했었는데 그러니까 렉이 너무걸리더라고


그래서 적당히 타협해서 10틱정도로 설정하니까 무난하더라고.


그리고 젤 중요한 custom_structures:main 함수는


viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19a0bfd01f97572fcded1cbdd432f83ea3bfd119ca3761f1d39bf725


이렇게 되있음.


스코어셋부분은 싱글에서는 굳이 필요하진 않은데, 멀티섭이면 나중에 들어온 사람한테도 스코어보드 만들어줘야해서 넣어준거임



#near_bedrock? 부분에서 스폰주변 (내가 테스트하는 월드에서는 스폰이 x=0, z=0이라서 그 주변 60*60으로 잡은거) 바닥을 베드락으로 만들고

그것과 플레이어 주변 바닥(y좌표 0)을 비교해서 플레이어 주변 바닥도 전부 베드락이라면 custom_structures:summon_armor 를 실행시켜줌.


이렇게 한것은 이미 생성을 시도한곳에서 또다시 생성 시도하는것을 막아 렉을 최대한 줄이고


이미 생성된 구조물에 또다시 구조물이 겹쳐서 생성되는것을 방지할려고 한거임.


구조물이 성공적으로 생성되면 그 구조물의 바닥부분을 barrier로 교체해서 반복실행을 막아줌.


그래서 엔드유적같은곳에 구조물이 겹처서 생성되는걸 방지하고싶으면


엔드유적 바닥부분을 barrier 로 덮어주면 해결할 수 있음


그리고 주변 바닥이 전부 베드락이라는걸 만족한다면 실행하는 custom_structures:summon_armor 함수는


viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19a0bfd01f97572fcded1cbdd432f83ef0b9d11dce6163aee83899bc


젤 처음의 명령어로 cs_armor,spawn_structure 태그를 가진 아머스탠드를 플레이어의 상대좌표 ~ 0 ~에 소환함.


이후 그 아머스탠드를 해당 바이옴에 맞는 구조물을 소환하기 위해 cs_aromo,plains_structure 태그를 가지는 아머스탠드로 교체함.


이제 다시 custom_structures:main 함수의 19번행으로 돌아가서


cs_armor태그를 가진 개체를 주변으로 퍼트려줌 (여기서는 해당 아머스탠드 근처 100칸)


이 과정에서 아머스탠드는 그 좌표의 가장 윗부분 (y좌표가 가장 큰 블럭)위로 이동하게 됨.


다음에 #구조물소환 부분에서 해당 바이옴에 맞게 custom_structures:cs_plains 함수를 호출해줌


viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19a0bfd01f97572fcded1cbdd432f83ea4bd841bcb3465fdd1078a98

이제 이 함수에서 실질적으로 구조물을 스폰해주는데, 복잡해보이지만 별건없음


#바닥이 잔디일때까지~ 부분에서 해당 아머스탠드를 아래에 잔디블럭이 있을때까지 내려주는데


이걸 왜 하냐면 가끔 구조물이 나무 위같은곳으로 올라가버리면 거기에 냅다 구조물이 스폰되버려서


평원 바이옴의 표면 블럭인 잔디블럭까지 내려주는거임.


만약 10번 반복했는데도 바닥에 잔디가 없으면 아머스탠드를 그냥 지워버려서


허공에 구조물이 생기고 이러는걸 최대한 막았음


1번 구조물은 테스트용으로 사용한거라 넘어가고


2번 구조물 : 마녀모자 타워에서


바로아래 execute 구문에서 random 스코어가 2~100 사이라면 plains_structures_2 태그를 가진 area_effect_cloud를 소환하고


이후 #방향1 에서 s_random 스코어가 1~10 사이라면


그 개체에 custom_structures:witch_hat_tower 을 불러오는 구조물 블럭을 소환해주고


바로 아래에 레드스톤 블럭을 깔아서 바로 custom_structures:witch_hat_tower이 불러와지게 해줌


#방향2,3,4 는 다 똑같고, 방향만 90도씩 꺽어줘서 구조물의 다양성? 을 만들어주는 부분임


그리고 plains_structures_2를 가진 area_effect_cloud 를 없애줌.


다시 custom_structures:main의 28행으로 돌아가서,


cs_armor태그를 가진 아머스탠드의 바닥에 barrier을 깔고,


그 아머스탠드에서 제일 가까운 플레이어의 바닥에도 barrier을 깔아주고


구조물을 불러오는데 사용한 구조물블럭과 레드스톤블럭도 없애줌


이제 구조물을 불러왔으니 사용한 아머스탠드는 더 필요 없으므로


마지막 #아머스탠드 없애기 부분에서 제거해줌


그리고 구조물 nbt파일을 만들때 가장 중요한거는



viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19a0bfd01f97572fcded1cbdd432f83ef3bd814c9b6335ae02db6701


저렇게 구조물 바닥 네 귀퉁이부분에 커맨드 블럭을 깔아주고


viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19a0bfd01f97572fcded1cbdd432f83ef7ebd64aca6461ac519e3806

이 함수를 실행시키도록 해줘야 구조물이 겹쳐지는걸 막을 수 있음


저 함수는 그냥 단순하게


setblock ~ 0 ~ minecraft:barrier replace

setblock ~ ~ ~ minecraft:air replace


이걸 실행해서 구조물 네 귀퉁이 바닥에 barrier을 설치하고 커맨드블럭을 지워주는거임.



이걸 이해했다면 알겠지만 구조물의 스폰율을 조정할려면

custom_structures:cs_plains 함수에서

viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19e4ef86729c57280830646840936bf4ccb557876e8037ed


밑줄친 부분을 수정해주면됨.

이대로 사용하면 99%의 확률로 마녀모자 타워가 스폰되는거임.

1%의 확률로 소환할려면 뭐 2..2 으로 하면됨

당연한 말이지만 다른 구조물과 범위가 겹쳐서는 안됨



위짤처럼 99퍼 확률로 평원에 소환하면


viewimage.php?id=20b4de23e6c039a07a&no=24b0d769e1d32ca73cee87fa11d02831d3049d5484b72b456f01af270ee020f995d4625c0e187fac19a0bfd01f97572fcded1cbdd432f83ea2e8811ec73334ab3e3cc8fe


이정도 빈도로 자주 소환됨.