개인 자료란 (JE)

  서버 커뮤니티

Profile JSD-ITHAN 대표칭호 없음
Profile

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

[4강]마인크래프트 플러그인 개발하기 - 블럭 파괴/설치 이벤트

2020.01.22 조회 수 2542 추천 수 5
분야 플러그인 
게임버전 모든버전 

4cdd1db2d8e991ed226292133bc26715.png

안녕하세요! 오늘은 마인크래프트 개발하기- 4강으로 찾아왔습니다. 오늘은 블럭 파괴/설치 이벤트에 대해서 알아보도록 

하겠습니다.

저의 강좌에 대한 피드백은 언제나 환영이고 문제나 잘못 된 점을 지적 해주시면 감사하겠습니다:D

혹시 마인크래프트에서 대형 서버 스폰 장소에서 블럭을 캐보신 적 있으시나요? 저는 있었습니다. 근데 안 캐지더군요.

그래서! 오늘은 그것을 만들어보도록 하겠습니다. 서버 관리자는 캐져야 하니까 오피가 아닌 사람만 블럭이 안 캐지고 설치도 안 되도록 해보겠습니다.


0.프로젝트 생성

먼저 새 프로젝트를 만들어 주도록 합니다. 

File -> New -> JavaProject ->  프로젝트 이름 설정 뒤 Finish -> 스피곳 Build Path하기(모르시는 분은 2강 참조) -> 프로젝트 우클릭 해서 패키지, 클래스 생성 (다른 클래스 생성은 똑같이 하면 됩니다.)

오늘은 다른 점이 하나 있습니다! 오늘은 클래스를 두개 사용할 것입니다.

Project Name --------> Event

package name ------->event

class name -------------> Main

또다른 클래스 이름 -------> Event

저는 이름을 이렇게 할 것입니다. 여러분들이 원하시는 이름으로 하셔도 됩니다:D


1.코드 작성하기

package event;

import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin {

   @Override
   public void onEnable() {
      System.out.println("플러그인이 활성화 되었습니다");
      getServer().getPluginManager().registerEvents(new Event(), this);
   }
   @Override
   public void onDisable() {
      System.out.println("플러그인이 비활성화 되었습니다");
   }
}

자 이렇게 Main 클래스가 완성 되었습니다. 이제 나머지 남은 Event 클래스를 적고 코드를 해석하도록 하겠습니다


package event;

import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class Event implements Listener {

    @EventHandler
    public void onBreak(BlockBreakEvent e) {
        Player player = e.getPlayer();
        if(player.isOp()) {
          e.setCancelled(false);
         }
        else {
          e.setCancelled(true);
          player.sendMessage("스폰에서 블럭 파괴는 불가능합니다");
        }
   }
     @EventHandler
     public void onPlace(BlockPlaceEvent e) {
         player p = e.getPlayer();
         if(player.isOp()) {
           e.setCancelled(false);
          }
          else {
            e.setCancelled(true);
           player.sendMessage("스폰에서 블럭 설치는 불가능합니다");
          }
   }


2. 코드 해석

이제 코드를 해석 해드리도록 하겠습니다.

먼저. Main 클래스는 보시다시피 활성화/비활성화 밖에 없습니다.

하지만 다른 것이 추가 되었죠.

바로 getServer().getPluginManager().registerEvents(new Event(), this);  입니다.

이것은 Listener가 있는 곳을 정의 해준 것입니다.

간단하게 말하자면 이벤트를 등록하기 위해 메인 클래스에 정의 해준것입니다.

그리고 Main에만 Javaplugin을 정의 해주었습니다.

이 이유는 JavaPlugin의 두번째 인스턴스가 생성되기 때문입니다. 어떤 상황에서도 메인 클래스의 다른 인스턴스를 만들면 안됩니다.  그러면 인스턴스란 무엇일까요?

제가 용어 정리를 해드리겠습니다.

객체: 실제로 존재 하는 것, 사물 또는 개념,  포괄적으로 모든 사물이나 개념을 말합니다. ex) 모니터, 키보드, 자동차 등을 모두 객체라고 부릅니다.

객체의 용도: 객체의 속성과 기능에 따라 다릅니다.


클래스: 객체를 정의해 놓은 것

클래스의 용도: 객체를 생성하기 위해 사용 됩니다.


인스턴스:  의미상으로는 객체랑 비슷함, 객체는 인스턴스를 포함

인스턴스화: 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 합니다.

//인스턴스 생성법:  Keyboard a = new Keyboard();

클래스로부터 만들어진 객체를 그 클래스의 인스턴스(객체)라고 합니다.

클래스 Class객체 Object
핸드폰 설계도
핸드폰
키보드 설계도기보드
붕어빵 틀
붕어빵

위의 용어 정리는 PYH님의 블로그 글을 토대로 만들었습니다.

 


어쨋든 조금 이야기가 길어졌는데 JavaPlugin은 Main 클래스에만 정의 해주시면 됩니다! 클래스를 여러개 생성 할 때

JavaPlugin을 다시 쓰시면 안됩니다!

이제 Event 클래스로 넘어가겠습니다.

이벤트를 만들 때 @EventHandler 태그가 필요합니다.

그리고 BlockBreakEvent를 e라고 정의 해 주었습니다.

한마디로 BlockBreakEvent = e라고 할 수 있겠네요.

Player은 player이라고 정의 해주었습니다.

이것도 한마디로 Player = player 가 되겠네요.

Player.isOp는 만약 플레이어가 오피일 때를 말합니다.

그때는 e.setCancelled(false);를 사용합니다.

아까 말했다시피 e 는 BlockBreakEvent입니다.

그래서 e.setCancelled는 

블럭 파괴 이벤트를 실행하는 것입니다.

오피일때는 false를 넣어서 블럭 파괴 이벤트를 실행시키지 않는거고

else에는 오피가 아닌 사람이 되겠습니다.

그때는 e.setCancelled를 true로 해주어서 블럭 파괴 이벤트를 실행시키면 됩니다.

그리고 만약 플레이어가 블럭을 부수면 "스폰에는 블럭을 파괴 할 수 없습니다" 라는 메세지를 출력하게 만들었습니다.

플레이어에게 메세지를 보낼 때는 .sendMessage를 사용합니다 ChatColor로 색을 입힐 수 있는데 이것은 5강에서 설명해드리도록 하겠습니다!

BlockPlaceEvent도 똑같습니다.

3.plugin.yml 작성하기

이번에 적을 것은 많이 없습니다.

왜냐하면 커맨드가 없기 때문이죠.

그래서 이름, 버전, 메인만 적어주시면 됩니다:D


name: Event
version: 1.0
main: event.Main

항상 말하는 것인데 main에는 패키지이름.Main을 쓰셔야 합니다.

그리고 자바 플러그인을 정의한 Main 클래스를 쓰셔야 합니다!

4.Jar Export

프로젝트 우클릭 -> Export -> Java 폴더에서 JAR file 선택 후 Next -> 자신의 프로잭트 선택, Jar 파일을 어느 폴더에다가 둘지 설정하기 -> Finish 누르면 끝.

그리고 자신이 만든 프로젝트를 버킷 서버의 plugins 폴더에 넣고 버킷을 실행시켜 줍니다.

op를 빼고 실험하시고 op를 넣고 실행 시키시면 결과가 다르게 나오겠죠?

ccc7428c76c2a428dfa328e807b0653b.png

이렇게 나옵니다!

그럼 오늘 강좌는 여기서 마치겠습니다!!

오늘도 제 강좌를 봐주셔서 감사합니다!




9개의 댓글

초스터
2020.01.22

와우 오늘은 블럭 설치파괴에 대한 내용이군요! 강좌 업로드 속도가 대단하십니다!

오늘도 감사해요 :D

JSD-ITHAN
2020.01.22
@초스터

제가 나이가 공부 할 나이라 새벽에 작성하고

낮에 올립니다:D

오늘도 와주셔서 감사합니다!!

프리루트
2020.01.22

질좋은 강좌는 닥추입니다!

JSD-ITHAN
2020.01.22
@프리루트

앞으로도 질 좋은 강좌를 많이 올리겠습니다!

DDang_
2020.01.23

감사합니다

JSD-ITHAN
2020.01.23
@DDang_

:)저야말로 감사합니다^^

4dblackhole
2020.05.07

좋은 강좌 감사드립니다 그런데 이렇게 하면 스폰장소가 아닌 곳에서도 설치/파괴가 안되지 않나요?

펜델(skyneton)
2020.05.07
@4dblackhole

플레이어 월드를 얻고 스폰위치를 얻은후 거리체크하면 되긴할거에요

asdfj
2020.12.07

isOP()라는 것은 어떻게 만들어야 하나요

뉴스 및 창작물
/files/thumbnails/115/774/003/262x150.crop.jpg?20240424234825

업데이트

마인크래프트 1.20.5 정식 업데이트

학교가기싫다

2024-04-24

0

/files/thumbnails/762/770/003/262x150.crop.jpg?20240418073724

레드스톤

T.B.H (고민중독) | 노트블럭 버전 | NoteBlock Cover [한국어 영어 중국어 가사 추가]

노트블럭전문가

2024-04-18

0

/files/thumbnails/218/767/003/262x150.crop.jpg?20240412130213

레드스톤

우리의 꿈 - 원피스 오프닝

노트블럭전문가

2024-04-12

0

/files/thumbnails/505/766/003/262x150.crop.jpg?20240411122306

레드스톤

기동전사 건담 수성의 마녀 | 노트블럭 커버 1

노트블럭전문가

2024-04-11

1

/files/thumbnails/932/765/003/262x150.crop.jpg?20240410124459

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

노트블럭전문가

2024-04-10

0

/files/thumbnails/403/765/003/262x150.crop.jpg?20240409190538

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

Sonttukk

2024-04-09

4

/files/thumbnails/161/758/003/262x150.crop.jpg?20240331105743

레드스톤

라마 침 분수대 1

GlassesFilm

2024-03-31

0