시티즌NPC 연동하기 > 트리거 공유

본문 바로가기
사이트 내 전체검색


트리거 공유

시티즌NPC 연동하기

페이지 정보

작성자 wysohn 작성일19-08-26 17:06 조회333회 댓글1건

본문

시티즌 관련글이 많이 보이는데 답변이 많이 보이지 않아서 공략으로 써보려합니다

---


요구 지식: Custom 트리거, 변수, IF 문


---


0. 목표

일단 연동에 앞서서, 무엇을 할것인지를 정하는게 코드를 짜는것에 큰 도움이 됩니다.


오늘의 목표는 특정 시티즌을 클릭하면 "안녕" 이라는 메시지가 나오도록 해봅시다



​1. Custom 트리거 만들기 

이미 아시겠지만 트리거를 만들어야합니다.


시티즌의 경우 Player 엔티티 즉 실제 플레이어와 같은 엔티티를 사용하는데요


그렇기때문에 PlayerInteractEntityEvent(https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/player/PlayerInteractEntityEvent.html) 를 사용 할 수 있습니다.


PlayerInteractEntityEvent 를 통역하자면 플레이어가 어떤 엔티티를 눌렀을때 라고 번역 하시면 되겠습니다.


모두들 이미 아시는 것 처럼 커스텀 트리거를 만들어줍시다


/trg custom org.bukkit.event.player.PlayerInteractEntityEvent onCitizenClick



2-0. 계획

이제 에디터가 열렸을껀데 코드는 어떻게 짜야할까요?


일단 우리가 방금 PlayerInteractEntityEvent를 사용하도록 했기때문에 저장하는즉시 어떤 플레이어가 무슨 엔티티든 상관없이 코드가 실행되게됩니다. (PlayerInteractEntityEvent 특성상 시티즌만이 아닌 소, 양, 돼지, 사람, 좀비, 등등. 이런 모든것들이 여과없어 들어옵니다)


일단은 서버에 유저들이 접속중이라는 가정하에 약간의 안전장치를 만들어둡시다


IF !$haspermission:"some.random.per.mission"

    #STOP

ENDIF


위의 코드는 유저가 "some.random.per.mission" 이 없다면 코드를 바로 중지 하라는 것 입니다.


즉 오피의 경우 모든 퍼미션을 무시하니 저 IF 문을 통과해서 코드가 실행될것이고 일반유저의 경우 퍼미션이 없으니 저기서 코드가 끝나게 됩니다.



2-1. 정확한 엔피시 이름 구하기

시티즌 엔피시의 경우 이상하게도 이름 앞에 숨겨진 컬러 코드가 있습니다.


예를들어 "&6웃긴엔피시" 라고 시티즌 엔피시를 만들었다고 칩시다. 그럼 실제로 확인해보면 이름이 "&f&f&f&f&f&6웃긴엔피시" 이런식으로 되어있는경우가 많습니다. 아마 시티즌 엔피시 제작자가 넣어둔거같은데 목적은 잘 모르겠습니다.


여하튼 중요한건 저렇게 앞에 있는 컬러코드들은 실제로 눈으로 볼때는 안보이기때문에 많이들 속으시는데 코드를 짤때는 저 이름을 정확히 알아야합니다.


가장 쉬운방법은 코드를 이용해서 이름을 구하는 것 입니다.


이제 우리가 작성한 안전장치 코드 아래에 이름을 구하는 코드를 넣어봅시다


IF !$haspermission:"some.random.per.mission"

    #STOP

ENDIF


#MESSAGE event.getRightClicked().getName()


그런데 이런! 아쉽게도 이미 이름자체에 컬러코드가 들어있기 때문에 여전히 채팅창에는 실제로 보이는 이름과 같은 이름밖에 안나옵니다.


그럼 정확하게 이름을 찾으려면? 직접 로그파일을 뒤져보셔야합니다.


마인크래프트 폴더로 이동(윈도우키 + R 한 뒤 %appdata%\.minecraft) 하시면 logs 폴더 안에 보시면 latest.log 라는 버킷 서버의 logs서버와 아주 흡사한 형태의 파일이 존재합니다.


이것은 서버의 로그가 아닌 클라이언트의 로그를 나타내는곳인데 이곳에 채팅 메시지등이 로그 됩니다. 이제 여기서 찾아보시면 방금 #MESSAGE event.getRightClicked().getName() 를 이용해서 출력한 엔피시의 이름이 있을껍니다.


중요한것은 컬러코드가 &가 아니고 실제 마인크래프트 컬러코드인 § 로 되어있는데 이 점을 유념해서 기억 해 두세요.



2-2. 엔피시 검사

이제 엔피시 이름을 알았으니 유저가 클릭한 엔티티가 엔피시가 맞는지 확인을 하는 구문을 작성합시다. 여기에도 역시 IF문이 쓰이는데 방금 구한 엔피시의 이름이 중요합니다!


IF !$haspermission:"some.random.per.mission"

    #STOP

ENDIF


IF event.getRightClicked() != null

    IF event.getRightClicked().getName() == color("&f&f&f&f&f&6웃긴엔피시")

        #MESSAGE "엔피시를 클릭했습니다"

    ENDIF

ENDIF


위의 IF event.getRightClicked() != null 경우는 클릭 한 엔티티가 null인지 먼저 체크 해 주고 있습니다.

PlayerInteractEntityEvent의 경우 null이 나오는경우는 없는거로 알고있지만 안전성을 위해 체크 해 줍시다. (만약 null 이라면 event.getRightClicked().getName() 부분이 null.getName() 이 되어서 에러가 나겠죠?)


그런뒤 IF event.getRightClicked().getName() == color("&f&f&f&f&f&6웃긴엔피시") 는 클릭한 엔티티의 이름이 우리가 만든 엔피시의 이름과 같은지 체크를 해 주고 있습니다. 유의할점은 직접 컬러코드를 이용해서 저장할경우 UTF-8 에 § 라는 코드가 호환이 제대로 안되는 경우가 있기 때문에 color() 로 & 를 § 로 변환해주는게 제일 안전합니다. 


그 아래에는 #MESSAGE "엔피시를 클릭했습니다" 로 엔피시를 클릭했다는 메시지를 출력하고있습니다.



3. 테스트

이제 엔피시를 클릭했을때 "엔피시를 클릭했습니다" 라는 메시지가 나오는지 확인합시다.


만약에 나오지않는다면 이름이 완전히 같은지 다시 확인 해 보세요.



4. 응용

아마 이쯤되면 다 아시겠지만


    IF event.getRightClicked().getName() == color("&f&f&f&f&f&6웃긴엔피시")

        #MESSAGE "엔피시를 클릭했습니다"

    ENDIF


이 IF문 사이의 코드는 자신이 원하는것으로 아무거나 하실 수 있습니다. #CMDOP 등을 응용하면 엔피시 클릭시 텔레포트, 체력채워주기 등 사용 방법이 많습니다.


그리고 코드가 작동하는걸 확인한뒤에 꼭 


IF !$haspermission:"some.random.per.mission"

    #STOP

ENDIF


이 코드를 제거하는 것 잊지마세요! 이 코드가 있으면 일반 유저는 이 아래에 있는 코드가 실행되지 않습니다.

댓글목록

liver 작성일

다른 npc 추가 할때는
IF event.getRightClicked() != null

    IF event.getRightClicked().getName() == color("&f&f&f&f&f&6웃긴엔피시")

        #MESSAGE "엔피시를 클릭했습니다"

    ENDIF

ENDIF
이 구문을 더 넣으면 될까요?

상단으로


모바일 버전으로 보기