개인 자료란 (JE)

  서버 커뮤니티

Profile cch 대표칭호 없음
Profile

강좌 자바 에디션(JE) 플러그인 개발

[마인크래프트 플러그인 제작 강의] 7-1 강 클릭 가능한 채팅 구현하기.

2020.07.22 조회 수 1564 추천 수 0
분야 플러그인 
장르 개발자 툴 
게임버전 모든버전 
API 버킷, 스피곳, 페이퍼 

이 글은 개인 블로그에 작성한 내용을 공유하는 글 입니다.

( 해당 블로그에서 원본을 보실 수 있습니다.  https://cchplugin.tistory.com/ )


https://cchplugin.tistory.com/14
해당 강좌를 다 보신 후 보신다면 쉽게 응용 하실 수 있을 것이라 생각합니다.



 

안녕하세요. 

 

오늘은 클릭 가능한 채팅을 구현하는 방법에 대해서 알아보겠습니다.

 

bukkit 버전 1.12.2 기준에서 진행하도록 하겠습니다.

 

예시로 들어드릴 플러그인의 기능은 다음과 같습니다.

 

1. /대전 신청 [닉네임] 명령어를 입력

2. [닉네임]을 가진 플레이어에게 다음과 같은 메시지를 보냄.

ff7288c66d7708a96ecb1d221a15df07.jpeg

3. [수락] 을 클릭시 /대전 수락 이라는 명령어를 실행함.

4. [거절] 을 클릭시 /대전 거절 이라는 명령어를 실행함.

5. [수락], [거절] 에 마우스를 올릴 시 다음과 같은 메시지를 출력함.

 

439ed59fea5e1af7d566fac49f9eac56.jpeg


 

e177e20d8c7be8f2eaa92b50575d8c16.jpeg


 

전체 코드는 다음과 같습니다.


@Override
    public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
        try {
            Player player = (Player) sender;

            if (args.length == 1) {

                if (args[0].equals("수락")) {
                    
                    player.sendMessage("대전을 수락 했습니다");

                } else if (args[0].equals("거절")) {

                    player.sendMessage("대전을 거절 했습니다");

                } else {
                    player.sendMessage(plugin.getConfig().getString("메시지.대전설명"));
                }

            } else if (args.length == 2 && args[0].equals("신청")) {

                Player player1 = Bukkit.getPlayer(args[1]);
    
                player.sendMessage( "§l§2"+ player1.getName() + " 님께 대전 신청을 했습니다.");
                player1.sendMessage("§l§2" + player.getName() + " 님으로 부터 대전 신청이 왔습니다.");
                PlayerConnection connection = ((CraftPlayer) player1).getHandle().playerConnection;
                PacketPlayOutChat packet = new PacketPlayOutChat(ChatSerializer.a(
                        "{\"text\":\"§a[수락]\",\"bold\":true,\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/대전 수락\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":[\"\",{\"text\":\"§a대전을 수락합니다.\",\"bold\":true}]}}"));

                PacketPlayOutChat packet1 = new PacketPlayOutChat(ChatSerializer.a(
                        "{\"text\":\"§c[거절]\",\"bold\":true,\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/대전 거절\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":[\"\",{\"text\":\"§c대전을 거절합니다.\",\"bold\":true}]}}"));

                connection.sendPacket(packet);
                connection.sendPacket(packet1);

            } else {
                player.sendMessage(plugin.getConfig().getString("메시지.대전설명"));
            }

        } catch (Exception e) {

        }
        return true;
    }

단계 별로 설명 드리겠습니다.

 

1. 메시지를 받게 될 플레이어를 선언하고 입력하는 부분입니다.

        PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;

2. 다음 과 같이 입력 후 빈 공간에 json 형식으로 원하는 텍스트, 클릭이벤트 ,등의 정보를 입력합니다.

PacketPlayOutChat packet = new PacketPlayOutChat(ChatSerializer.a(" /*빈공간*/   "));
        

3. 아래 사이트에서 json 형식에 맞추어 쉽게 작성 할 수 있습니다.

https://minecraftjson.com/

 

4. 처음 접속하시면 이런 식으로 페이지가 구성되어 있습니다.

48c46d7e03c09345f4a11c280043422b.jpeg


5. 아래 그림처럼 따라 하시기 바랍니다.

 

fefdacb7aa5360b121f638d212365f6d.jpeg


 

6. 원하는 글씨, 클릭시 실행될 명령어 , 마우스 올릴 시 보여질 글씨 등을 입력후 save를 눌려주세요.

 

b62da9921b122e2d6123dca48ad44ddc.jpeg


 

7. save를 눌릴시 다음과 같은 결과가 나타납니다.

 

75233f73e45722c8646add60f0539992.jpeg


8. 저희가 필요한 부분은 { 부터 시작해서 } 까지 부분입니다. 저 부분만 복사 해줍니다.

71a6801d47f889aa2b6111793c7b1f07.jpeg


9. 아까 입력하려 했던 빈 공간에 붙혀넣어 줍니다.

PacketPlayOutChat packet = new PacketPlayOutChat(ChatSerializer.a(" /*빈공간*/   "));
        


PacketPlayOutChat packet = new PacketPlayOutChat(ChatSerializer.a("{"text":"[수락]","bold":true,"color":"green","clickEvent":{"action":"run_command","value":"/대전 수락"},"hoverEvent":{"action":"show_text","value":[""]}}"));
        


10. 보내고자 하는 클릭가능한 메시지를 선언, 입력하는 부분이 끝났습니다. 

 

11. 플레이어에게 메시지를 보내는 문구입니다.

        connection.sendPacket(packet);

 

실행 결과는 아래 영상에서 확인 가능합니다.

 

https://youtu.be/4UHZgkBWID0

 




2개의 댓글

roa9618
2021.10.27

좋은 정보 감사합니다.

업로드
2022.06.05

PacketPlayOutChat을 사용하면 에러만 뜨는데 따로 임포트 해야하는것이 있나요?

뉴스 및 창작물
/files/thumbnails/150/925/003/262x150.crop.jpg?20241123005717

건축

응답하라 1988 ?

팀뉴일리시

2024-11-23

4

/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 5

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2

/files/thumbnails/219/899/003/262x150.crop.jpg?20241009200950

건축

송전탑+도시 2

dbasd12

2024-10-09

2

/files/thumbnails/246/898/003/262x150.crop.jpg?20241008102328

레드스톤

단다단 - 오토노케(オトノケ) | 마인크래프트 노트블럭 커버

노트블럭전문가

2024-10-08

1

/files/thumbnails/348/896/003/262x150.crop.jpg?20241006103035

디도스/봇테러등등을 낚는 방법 4

물귀신

2024-10-06

3

/files/thumbnails/839/895/003/262x150.crop.jpg?20241006021227

SRV레코드는 보안도메인이 아닙니다. [서버오픈시 필독]

물귀신

2024-10-05

4