이번 시간에는 Skript를 이용하여 간단한 총 시스템을 만들어 보도록 하겠습니다. 이번 시간의 스크립트에는 어떤 애드온도 필요하지 않습니다.
1. 총 만들기
총 시스템을 만드려면 우선 총부터 만들어야겠죠? 명령어로 총 아이템을 지급하도록 만들어 봅시다. 아래는 그 코드입니다.
command /gun <text> <number> <number> [<integer>]:
executable by: players
usage: /gun 이름 피해량 탄속 (customModelData)
trigger:
if arg-3 <= 0:
send "탄속은 양의 실수로 입력해 주세요"
exit
set {_gun} to 1 diamond hoe named colorCodeTranslate(arg-1) with lore "", "&7피해량 : %arg-2%", "&7탄속 : %arg-3%" and ""
if arg-4 < 0:
send "customModelData의 값은 0 이상 99999999 이하의 정수만 가능합니다" to player
exit
if arg-4 > 99999999:
send "customModelData의 값은 0 이상 99999999 이하의 정수만 가능합니다" to player
exit
if arg-4 is set:
set custom model data of {_gun} to arg-4
give {_gun} to player
function colorCodeTranslate(t : text) :: text:
replace all "&&" with "%%%%%%%%%%%%" in {_t}
replace all "&" with "§" in {_t}
replace all "%%%%%%%%%%%%" with "&" in {_t}
return {_t}
이렇게 커스텀 명령어를 만들어서. 총의 이름, 피해량 그리고 탄속은 필수로 입력하게 해 주었고, customModelData의 값은 선택으로 입력 가능하도록 해 주었습니다. customModelData에 대해 간단하게 설명드리자면, 아이템에 고유한 태그 비슷한 것을 부여해서, 같은 종류의 아이템인데, 커스텀모델데이터 값에 따라 다른 리소스팩을 적용시킨다거나 하는 형식으로 사용할 수 있는 기능입니다. customModelData의 값을 지정하지 않는다면 기본값은 0이 됩니다.
colorCodeTranslate라는 이름의 함수가 하나 있는데, 반드시 필요한 것은 아닌 아이템 이름에 색깔코드를 사용 가능하도록 하기 위해서, 사용한 함수입니다. &를 이용하여 색깔코드를 사용할 수 있고, '&' 문자 자체를 입력하고 싶다면 &&를 입력하시면 됩니다.
2. 총알 발사하기
이제 총을 만들었으니, 총을 우클릭했을 시에 총알이 발사되도록 만들어주어야하겠죠? 아래는 그 코드입니다.
on right click:
if event-item is not diamond hoe:
exit
set {_lores::*} to uncolored lore of event-item
loop {_lores::*}:
set {_split::*} to loop-value split at " : "
set {_lores::%loop-index%} to {_split::2}
set {_damage} to {_lores::2} parsed as number
set {_bulletSpeed} to {_lores::3} parsed as number
make event-player shoot a snowball with speed {_bulletspeed}
set {_bullet} to last shot entity
set metadata value "damage" of {_bullet} to {_damage}
set metadata value "bullet" of {_bullet} to true
다이아몬드 호미를 들고 우클릭을 했을 시, 아이템 설명에 있는 탄속 및 피해량 값을 가져와서, 탄속 값 만큼의 속도로 눈덩이를 던지게 합니다.
https://docs.skunity.com/syntax/search/id:5029
그리고 피해량 값은 메타데이터를 이용하여 저장해 줍니다. 메타데이터는 서버가 재시작될 때 삭제되는 변수로, 오래 저장해야 하는 값이 아닌, 엔티티나 블록과 관련된 일시적인 값을 저장해야할 때 사용할 수 있는 변수라 생각하시면 됩니다.
https://docs.skunity.com/syntax/search/id:5192
이 때, 메타데이터 값을 지정해 줄 시에 {_bullet}에 last shot entity를 이용하여 발사한 눈덩이를 저장해 주었습니다.
https://docs.skunity.com/syntax/search/id:5171
3. 총알이 맞았을 시 피해 주기
총알을 발사시켰으니 이제 그 총알이 상대에게 맞았을 시 피해를 주도록 코드를 짜 봅시다. 아래는 그 코드입니다.
on projectile hit:
if event-projectile does not have metadata value "bullet":
exit
if event-projectile's metadata value "bullet" is not true:
exit
set {_damage} to event-projectile's metadata value "damage"
damage victim by {_damage}
https://docs.skunity.com/syntax/search/id:4863
위 링크의 이벤트문을 이용하여 눈덩이가 맞았을 시에 이벤트문이 발동되도록 해 주었습니다. 한 가지 유의점은 위 이벤트문은 엔티티에 맞았을 때 뿐만 아니라 블록에 맞았을 시에도 발동됩니다.
그 후 메타데이터 값을 이용하여 총알인지 아닌지 판단한 후, 총알이라면 피해량 값을 다시 메타데이터 값에서 가져와서 그 값 만큼의 피해를 맞은 엔티티에게 부여합니다.
이렇게 이번 시간에는 애드온 없이 Skript만의 기능을 이용하여 약간 부실하긴 하지만 총 시스템을 만들어 보았습니다. 질문이 있으시다면 이 글의 댓글에 적어주시면 답변해드리도록 하겠습니다.
아래는 스크립트 파일들입니다
주석미포함
'마인크래프트 > Skript 기초 활용편' 카테고리의 다른 글
스크립트 기초 활용 13편(원 그리기) (0) | 2023.01.08 |
---|---|
스크립트 기초 활용 시즌 2 로드맵 (0) | 2023.01.07 |
스크립트 기초 활용 12편(엘리베이터) (0) | 2023.01.06 |
스크립트 기초 활용 11편(오늘의 날씨) (1) | 2023.01.04 |
스크립트 기초 활용 10편(자동심기) (1) | 2023.01.02 |
댓글