분야 | 플러그인 |
---|---|
게임버전 | 모든버전 |
안녕하세요! 오늘은 마인크래프트 개발하기- 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를 넣고 실행 시키시면 결과가 다르게 나오겠죠?
이렇게 나옵니다!
그럼 오늘 강좌는 여기서 마치겠습니다!!
오늘도 제 강좌를 봐주셔서 감사합니다!
초스터
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:)저야말로 감사합니다^^
4dblackhole
2020.05.07좋은 강좌 감사드립니다 그런데 이렇게 하면 스폰장소가 아닌 곳에서도 설치/파괴가 안되지 않나요?
펜델(skyneton)
2020.05.07플레이어 월드를 얻고 스폰위치를 얻은후 거리체크하면 되긴할거에요
asdfj
2020.12.07isOP()라는 것은 어떻게 만들어야 하나요