지난 시간에 체력바 구현을 해봤는데
이번 시간에는 좀 더 디테일한 체력바를 구현해 봅시다
오늘 적용할 리소스팩 입니다
체력바 위치를 조정하고 싶어서
Translation에 x 값을 -80로 변경하여 9번 칸에 있는 이미지 위치를 정중앙으로 변경해 줬습니다
지난 시간에 블록벤치에서 설명한 부분입니다
빨간 동그라미 : x
초록 동그라미 : y
파란 동그라미 : z
근데 인벤토리를 열어보니 체력바 이미지가 인벤토리를 가리고 있네요?..
오늘은 이 현상을 없애는 방법을 배워봅시다
하지만 이 현상도 안타깝지만 인벤토리에 한 슬롯을 소비해야 한다는 단점이 있습니다
체력바를 리소스팩을 구현하다보니 좀 까다로운 부분이 많습니다
결국 체력바를 원하는 위치대로 표현하려면 총 인벤토리 공간에서 2칸을 소비해야 합니다
리소스팩을 열어보면
textures > gui 폴더 내부에 인벤토리 이미지가 있을 겁니다 ( 따로 제가 만든겁니다 )
1번 부분에 인벤토리 이미지 모델이 입힌 아이템이 들어갈 겁니다
2번 부분은 위에 체력바 모델이 들어갑니다
models > gui > inv 파일을 드래그하여 블록벤치에 놓으면 여기서 위치값을 수정할 수 있지만
현재 1번 위치에서 Translation 을 수정했습니다 [ 블록벤치에는 4번에 아이템이 있다는 가정하에 보이는 위치입니다 ]
그래서 위치를 변경할 때 직접 서버에서 Translation 값을 수정해 주세요
리소스팩 리로드 : F3+T
models > gui > inv 파일을 열어보면
텍스쳐 경로 다시 한번 확인해 보세요
스케일은 1.12.2 버전에 맞게 4크기로 고정해 주셔야 알맞게 보입니다
이미지 크기는 꼭 정사각형으로 맞춰 저장해 주세요
models > item > golden_hoe 아이템이 있는데
인벤토리 부분은 금괭이로
체력바 부분은 철괭이로 설정했습니다
models > gui > inv을 모델 위치는 내구도 1이 단 금괭이에 모델 위치로 설정한 거고
inv는 textures > gui > inventory 이미지를 입힌 모델입니다
헷갈릴 수 있는데 하다 보면 익숙해질 겁니다
파일 경로는 매번 중요하므로 작업할 때마다 확인해 주세요!
{ "predicate": {"damaged": 0, "damage": 0}, "model": "item/golden_hoe"},
{ "predicate": {"damaged": 0, "damage": 0.0303030303030303}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.0606060606060606}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.0909090909090909}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.1212121212121212}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.1515151515151515}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.1818181818181818}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.2121212121212121}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.2424242424242424}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.2727272727272727}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.303030303030303}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.3333333333333333}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.3636363636363636}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.3939393939393939}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.4242424242424242}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.4545454545454545}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.4848484848484848}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.5151515151515151}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.5454545454545454}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.5757575757575757}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.606060606060606}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.6363636363636363}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.6666666666666666}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.6969696969696969}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.7272727272727272}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.7575757575757575}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.7878787878787878}, "model": ""},
{ "predicate": {"damaged": 0, "damage": 0.8181818181818181}, "model": ""}
리소스팩에서 내구도 1까지 밖에 표시 안 했는데
따로 필요한 분은 참고하세요 [ 금괭이 모델 밑에서부터 내구도 1입니다 ]
이제 서버에서 금괭이 내구도를 1로 설정하고 1번 슬롯에 넣어주면
체력바가 가려진 걸 확인할 수 있습니다!!
이게 왜? 가려질까 의문이 들 텐데
Translation에 파란동그라미 : z 값을 이용한 겁니다
지난 시간에 설명하다 말았는데 오늘 설명해 드리겠습니다
"translation": [ -80, 33, -70 ] // 체력바 z 위치는 -70 입니다
"translation": [ 70, 20, -50 ] // inv 인벤토리 z 위치는 -50 입니다
즉 인벤토리 z 위치 값이 체력바 z 위치값보다 크기 때문에 해당 이미지가 더 앞쪽으로 보이게 되어
체력바 이미지가 우리가 만든 인벤토리에 가려져 보입니다
ex ) 체력바 z 값이 3이라면 인벤토리 z 값이 3보다 커야 체력바 이미지를 가릴 수 있습니다
만약 인벤토리 z 위치를 체력바 z 위치보다 작다면
인벤토리 이미지를 뚫게 됩니다
이거 주의해주세요!
스크립트 설명은 지난 강좌 참조
[ 스크립트 연동 ]
해당 스크립트 버전 : 2.4.1
애드온 : Skellett, SkQuery, skRayFall, skUtulutues, SK-NBeeT
function setbar(p: player):
set {_a} to iron hoe with nbt "{Unbreakable:1,HideFlags:6}"
set slot 8 of {_p} to {_a} named "&f"
wait 1 ticks // 추가 구문
set {_c} to gold hoe with nbt "{Unbreakable:1,HideFlags:6}" // 추가 구문
set durability of {_c} to 1 // 추가 구문
set slot 9 of {_p} to {_c} named "&f" // 추가 구문
function reloadhealthbar(p: player):
set durability of slot 8 of {_p} to 102-(({_p}'s health/{_p}'s max health)*100)
set {health::%{_p}%} to round down (({_p}'s health/{_p}'s max health)*100)
every 0.1 second:
loop all players:
set {_p} to loop-player
if {health::%{_p}%} is not round down (({_p}'s health/{_p}'s max health)*100):
reloadhealthbar(loop-player)
on inventory close:
setbar(player)
reloadhealthbar(player)
on inventory open:
set {_b} to iron hoe with nbt "{Unbreakable:1,HideFlags:6}"
set durability of {_b} to 1
set slot 8 of player to {_b} named "&f"
set {_a} to gold hoe with nbt "{Unbreakable:1,HideFlags:6}" // 추가 구문
set durability of {_a} to 0 // 추가 구문
set slot 9 of player to {_a} named "&f" // 추가 구문
on tool change:
if name of player's tool is "&f":
if item type is iron hoe or gold hoe: // 아이템 타입명 추가 나머지도 동일
cancel event
on inventory click:
if name of click item is "&f":
if item type is iron hoe or gold hoe:
cancel event
on drop:
if name of player's tool is "&f":
if item type is iron hoe or gold hoe:
cancel event
on death:
loop all items in player's inventory:
if name of loop-item is "&f":
if item type is iron hoe or gold hoe:
remove loop-item from drops
on rightclick:
if player's tool is iron hoe or gold hoe:
repair player's tool
요거를 서버에 적용하시면 됩니다
모드 없이 자신만에 체력바를 구현하여 서버에 적용해 보세요
많은 시간과 노력이 필요합니다!