제발 나만 모르던 게 아니라고 해줘라


1. 블럭 캔 위치 감지하는 법


중요: 아무 아이템도 들지 않고 맨손으로 캐는 건 감지할 수 없음!


일단 커스텀 인챈트가 필요해!

인챈트 발동 조건 중 hit_block이라고 블럭을 캐기 시작하는 순간을 감지하는 조건이 있음.

근데 그게 블럭 캐는 플레이어와 캐지는 블럭의 위치를 감지함.

간단하게 하나 만들어 줘라.


{

"anvil_cost": 0,

"description": "이름은 안 중요하니 아무거나 쓰세요",

"max_cost": {

"base": 0,

"per_level_above_first": 0

},

"max_level": 1,

"min_cost": {

"base": 0,

"per_level_above_first": 0

},

"slots": [

"mainhand"

],

"supported_items": [

"minecraft:stick",

"minecraft:blaze_rod"

],

"weight": 2,

"effects": {

"minecraft:hit_block": [

{

"effect": {

"type": "minecraft:run_function",

"function": "example:function"

}

}

]

}

}


주의할 점: 예시의 경우, 무슨 짓을 해도 막대기와 블레이즈 막대를 들고 블럭을 두드릴 때만 감지할 수 있음. 그 두 개에만 이 인챈트가 붙거든. 그러므로 원하는 아이템을 supported_items 리스트에 모두 넣어줘라.


주의할 점2: 인챈트를 추가한 거라 맵 접속할 때마다 대충 이런 화면이 뜬다.


24b0d121e09c28a8699fe8b115ef046f5a4b9d96ac



다음으로 함수를 하나 만듬. 인챈트 파일의 function 항목에 적힌 대로 만들어야 해. 예시의 경우 example 폴더의 function이란 이름의 파일을 만들음. 이제 이 인챈트가 달린 아이템으로 블럭을 두드릴 때마다 이 함수가 작동된다.


주의할 점3: 이렇게 작동된 함수는 실행자의 위치와 실행 위치가 다름! (실행자는 블럭을 두드린 플레이어, 실행 위치는 플레이어가 두드린 블럭 위치) 그러니 at @s를 적절히 사용해줘라!


중요한 점: 이 방법은 플레이어가 블럭을 캐기 시작하는 것을 감지하며, 플레이어가 블럭을 캤는지 여부는 감지하지 않음. 블럭이 캐졌는지를 감지하고 싶으면 해당 위치에 마커를 소환하고, 다른 반복 명령어를 이용해서 그 마커 위치의 블럭이 공기가 되는 것을 감지하셈.


알아두면 편리할 점: 이 인챈트를 바른 도구가 빤딱빤딱거리거나 아무렇게나 지은 인챈트 이름이 나타나면 보기 흉할 수 있음! hide_tooltip과 enchantment_glint_override를 적절히 사용해줘라!


2. 블럭 놓는 위치 감지하는 법


사실 약간 사기쳤음!

엄밀히 말하자면 블럭을 놓는 위치를 구분하는 건 아니지만, 플레이어가 뭔가를 놓는 위치에 블럭을 설치해서 그렇게 보이게 만드는 방법임.

아무 스폰알에 원하는 블럭의 아이템 모델을 씌우고 entity_data를 마커로 교체하셈. 예시에서는 조약돌을 사용함.


/give @p minecraft:husk_spawn_egg[minecraft:item_model="cobblestone",minecraft:entity_data={id:"marker",Tags:[cobblestone]}]


반복 명령어를 이용해 마커가 소환된 곳에 블럭을 설치하셈. 예시에서는 아이템 모델로 조약돌을 사용했으니까 조약돌을 설치해보지.


execute at @e[tag=cobblestone] run setblock ~ ~ ~ cobblestone


실제로 블럭을 놓은 건 아니지만 플레이어 입장에선 구분하기 힘듬. 일단 자기가 우클릭한 자리에 진짜 블럭이 생기는 메커니즘이고, 인터렉션처럼 히트박스 같은 게 나타나는 것도 아니거든.


주의할 점: 이 방법은 진짜로 놓는 위치만을 가져오기 때문에 세세한 block state(예를 들어 놓는 위치에 따라 화로가 바라보는 방향이라든가, 횃불을 벽에 붙였는지 바닥에 놓았는지라던가)까지는 구분할 수 없음. 그래서 저 방법으로 횃불 놓기를 구현하면 벽에 붙여도 바닥에 놓인 횃불이 설치되고, 위쪽을 바라보고 반 블럭을 설치해도 아래 반 블럭이 설치된다. (그냥 벽 횃불이나 위 반 블럭이 필요하면 wall_torch를 설치하거나 type=top을 넣으면 되지만... 이러면 바닥 횃불이나 아래 반 블럭을 못 설치하니까)