오늘은 전장에 입장시 랜덤무기 뽑기권 지급과 자동으로 갑옷을 입는 기능을 만들어보겠습니다
우선 랜덤무기 뽑기권을 만들기 전에
우리가 만든 랜덤무기를 명령어를 통해 변수에 담고 그 변수에서 랜덤으로 뽑히는 기능을 만들어보겠습니다
새로운 스크립트 파일을 만들어주세요 ( 파일명 : 랜덤뽑기 )
options:
r : &7&l[ &f&l랜덤무기 &7&l]&f&l
command /랜덤무기 [<text>] [<integer>]: #해당 명령어를 입력했을때
trigger:
if player is op: # 플레이어가 오피일때
if arg 1 is not set: # [<text>] 부분이 설정이 안되어있다면
send "{@r} /랜덤무기 등록 = 손에 들고 있는 아이템을 추가합니다"
send "{@r} /랜덤무기 삭제 [번호] = 등록된 번호에 랜덤무기를 삭제합니다"
send "{@r} /랜덤무기 목록 = 현재 등록된 랜덤무기 리스트를 봅니다"
send "{@r} /랜덤무기 뽑기 = 현재 등록된 랜덤무기 리스트를 봅니다"
if arg 1 is "등록":
if player's tool is not air: # 플레이어 도구가 공기가 아니라면 ( 즉 손에 도구가 있을때)
add name of player's tool to {랜덤무기이름목록::*} #그 도구에 이름을 배열변수에 추가합니다
add player's tool to {랜덤무기목록::*} #도구를 해당 배열변수에 추가합니다
send "{@r} %name of player's tool% 아이템을 랜덤무기에 등록하였습니다" # 그 도구에 이름을 출력합니다
else:
send "{@r} 손에 랜덤무기를 들어주세요!"
if arg 1 is "삭제":
if arg 2 is set: # /랜덤무기 삭제 1 이라면 밑에 구문 실행
send "{@r} %{랜덤무기이름목록::%arg 2%}% 아이템을 랜덤무기에서 삭제하였습니다"
delete {랜덤무기이름목록::%arg 2%} # 해당배열변수에 1번 부분을 삭제함
delete {랜덤무기목록::%arg 2%} # 위에랑 동일
set {_임시이름배열::*} to {랜덤무기이름목록::*} # 임시배열 변수를 배열변수로 설정
set {_임시배열::*} to {랜덤무기목록::*} # 위와동일 (이름배열과 그냥 배열 둘다 설정함)
set {랜덤무기이름목록::*} to {_임시이름배열::*} # 다시 거꾸로 설정
set {랜덤무기목록::*} to {_임시배열::*} # 위와 동일
if arg 1 is "목록":
loop {랜덤무기이름목록::*}: #해당 랜덤무기이름목록 배열에 크기만큼 루프함
send "{@r} %loop-index% : %loop-value%" #지난 강좌 [ 11 ] 에서 배운대로 [ 번호 ] : [ 우리가 등록한 도구 이름 ] 으로 출력된다
if arg 1 is "뽑기":
set {_a} to random element out of {랜덤무기목록::*} # 해당 배열변수에서 랜덤으로 하나를 뽑는다
give {_a} to player # 뽑은 아이템을 해당 플레이어에게 준다
send "{@r} %name of {_a}% 아이템이 나왔습니다"
#여기서 배열변수를 2개를 선언해준 이유는 아이템이 책이고 옵션에 인첸트와 이름,로어가 있다 가정해보자
#배열변수를 하나로 정하면 출력되는 부분에서 book named [ 책 ]으로 출력이 되기 때문에 따로 이름 부분만 저장하여
#출력하게 했다
이 코드에서 set {_임시이름배열::*} to {랜덤무기이름목록::*} 임시배열을 만들어준 이유는
해당 배열변수에서 @번 자리를 삭제하면 해당 배열에 위치만 삭제되기 때문입니다
목록 명령어를 이용하여 배열에 자리를 보면 1,2,3,4,5 오름차순으로 되어있을텐데 여기서 2번을 삭제했다 가정해보자
그러면 1,3,4,5로 되어있습니다 이부분을 고치기 위해서 임시배열로 해당 무기이름배열을 설정해준다음 반대로 무기이름배열을 임시배열로 설정해주었습니다
(그러면 3번 위치가 2번이 되서 1,2,3,4 로 설정됩니다 )
서버에 적용후 서버내에서 전에 만든 랜덤무기를 등록해줍니다
on right click:
if name of player's tool is "&b&l[ &f&l무기 뽑기 &b&l]":
remove 1 of player's tool from player's inventory # 플레이어 도구 인벤토리에서 삭제
make player run cmd "/랜덤무기 뽑기" as op #해당 명령어 실행
적용이 끝났으면 이제 우클릭 아이템 구문을 랜덤무기 뽑기 시스템 구문 바로 밑에다가 적용해주세요
랜덤무기 시스템을 개발한 여러분들은 쉽게 구현이 가능할 겁니다
이제 무기도 다 추가하고 우클릭 아이템도 만들었습니다
마지막으로 전장에 들어가면 무기 뽑기 아이템을 주는 방법과 자동으로 세트옷을 입는 기능을 개발해보겠습니다.
지난 강좌에서 만든 메뉴 시스템 부분에 추가만 해주면 됩니다
give book named "&b&l[ &f&l무기 뽑기 &b&l]" with lore "&f" and "&c&l[+] &f우클릭시 랜덤으로 무기를 뽑습니다" to player
#책을 플레이어에게 줍니다 해당 아이템에 이름은 @@이고 로어는 @@이다
그리고 바로밑에
iron_equip(player)라는 구문이 있습니다 이거는 함수를 호출하는 구문입니다
iron_equip함수를 메뉴 윗부분에다가 추가해줍니다 ( on death 부분도요 )
function iron_equip(p:player): # iron_equip 라는 함수이름을 만들고 그안에 매개변수에 p에 타입은 player로 설정하였습니다
if {_p}'s helmet is air: #p=player가 헬멧이 없을경우
set {_p}'s helmet to iron helmet named "&b&l[ &f&l랜무서버 &b&l] &7&l철 모자" # 해당 플레이어에게 철모자를 씌웁니다
if {_p}'s chestplate is air:
set {_p}'s chestplate to iron chestplate named "&b&l[ &f&l랜무서버 &b&l] &7&l철 갑옷"
if {_p}'s leggings is air:
set {_p}'s leggings to iron leggings named "&b&l[ &f&l랜무서버 &b&l] &7&l철 레깅스"
if {_p}'s boots is air:
set {_p}'s boots to iron boots named "&b&l[ &f&l랜무서버 &b&l] &7&l철 부츠"
on death: # 죽을때 이벤트
loop all items in player's inventory: # 죽은 사람에 인벤토리를 반복시킵니다
if name of loop-item contains "&b&l[ &f&l랜무서버 &b&l] &7&l철 모자" or "&b&l[ &f&l랜무서버 &b&l] &7&l철 갑옷" or "&b&l[ &f&l랜무서버 &b&l] &7&l철 레깅스" or "&b&l[ &f&l랜무서버 &b&l] &7&l철 부츠": # 해당 문자열 아이템이 있을경우
remove loop-item from drops # 그 아이템은 바닥에 떨어지지 않고 삭제됩니다
#on death 이벤트는 플레이어가 죽은 후 갑옷을 떨어지는것을 방지하기 위해서 만들었습니다
#랜덤무기 서버에 사람이 많아진다면 그만큼 전장에서 많은 사람들이 죽어나갑니다
#그러면 바닥에 지저분한 갑옷이 깔려있는것을 방지하기 위해 구현했습니다
# (아무래도 바닥에 많은 아이템이 있으면 서버에 렉이 걸리니 이 기능을 추가했습니다)
이를 통하여 iron_equip(player)는 해당 플레이어가 iron_equip 함수를 호출하는 역할을 합니다
[ 함수 구조 ]
function <함수명> (<변수명>:<타입>, <변수명>:<타입>):
<몸체 안에 들어갈 구문>
함수명은 그냥 변수명이랑 지을때랑 똑같이 설정하시면 됩니다
타입은 player,text,number,integer 등을 사용합니다
주의사항
두개 이상에 매개변수를 사용할때 위에 코드처럼 쉼표(,)뒤에 한칸을 띄어야 합니다
함수를 사용하면 코드 재사용이 가능하여 복잡한 로직을 간결하게 만들 수 있습니다
원래는 함수는 크게
리턴있는 함수와 리턴없는 함수로 나뉘는데
여기선 자주사용하는 리턴없는 함수만 소개하였습니다
서버에 적용후 확인해보면 정상적으로 작동됩니다