개인 자료란 (JE)

  서버 커뮤니티

Profile cch 대표칭호 없음
Profile

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

[마인크래프트 플러그인 제작 강의] 3강 변수, 자료구조 기본

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


이 글은 개인 블로그에 작성한 내용을 공유하는 글 입니다.
(공유 하는 과정에서 누락된 이미지나 글이 있을 수 있습니다. )

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



블로그글을 복사해서 붙혀넣기 시 이미지 첨부가 정상적으로 되지 않네요.

블로그 글을 참고하시는 것을 추천드립니다.

링크 : https://cchplugin.tistory.com/8


안녕하세요.

 

오늘은 저번 포스팅 (클릭 시 이동) 에서 작성된 플러그인을 발전시켜보겠습니다.

 

 

 

 

코드를 작성하기에 앞서 어떤 기능을 하는 플러그인을 만들지에 대해서 잠시 생각해봅니다.

 

저번 강좌에서 작성했던 플러그인의 기능은 크게 3가지로 나뉩니다.

1. 서버가 on 될 때 consol에 메시지 띄우기

2. 서버가 off 될때 consol에 메시지 띄우기

3. player가 접속했을 때 메시지 띄우기

 

이번 강좌에서 발전시킬 내용은 3번에 해당하는 내용입니다.

 

@EventHandler
    public void join(PlayerJoinEvent e) {
        
        e.setJoinMessage( ChatColor.RED + "입장했습니다!" );
        
    }

 

2강에서는 단순히 플레이어가 접속했을 때 정해진 메시지 ( 입장했습니다! )를 출력했다면

 

3강에서는 플레이어가 서버에 접속한 횟수를 출력해보도록 하겠습니다.

 

2강과 3강에서 하려는 것의 차이점이 무엇인지 한번 생각해보시기 바랍니다. 

 

바로 출력하려는 내용이 변한다는 점입니다.

 

우리는 이렇게 변하는 값을 변수라고 부릅니다.

 

변수가 어떤 것인지에 대해서 완벽히 이해하진 못하셨겠지만 아~~ 이런 것이구나 감이 오실 것입니다.

 

바로 코드를 작성하면서 변수가 어떤 것인지에 대해서 더 알아봅시다!

 

 

 

 

노란색 형광펜으로 표시한 부분이 바뀐 부분입니다.

 

아래 코드를 똑같이 복사하여 플러그인을 저장하고, 서버에 적용한 후 접속해 보시길 바랍니다.

( 만약 플러그인을 적용시키는 방법을 모르시겠다면 저번 포스팅 (클릭 시 이동) 을 다시 보시기 바랍니다.)

저희는 새로운 플러그인을 만들지 않을 것이고 2강에서 작성된 내용을 수정하여 사용할 것입니다!

2강에서 저장했던 플러그인 위에 덮어씌워 저장하시면 됩니다.

 


2cfa00c09ad755cda72506822e8a4b13.jpeg


 

 

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener {
    
    ConsoleCommandSender consol = Bukkit.getConsoleSender();
    int count = 1;
    
    @Override
    public void onEnable() {
        
        consol.sendMessage( ChatColor.AQUA + "[플러그인 활성화 중 입니다.]");
        
        getServer().getPluginManager().registerEvents(this, this);
        
    }
    
    @Override
    public void onDisable() {
        
        consol.sendMessage( ChatColor.AQUA + "[플러그인 비활성화 중 입니다.]");

    }
    
    @EventHandler
    public void join(PlayerJoinEvent e) {
        
        e.setJoinMessage( count +"번째 입장했습니다!" );
        count = count + 1 ;
        
    }
}

 

실행 결과는 아래와 같이 나오게 됩니다.

 

 


2cfa00c09ad755cda72506822e8a4b13.jpeg


 

결과가 잘 나오셨나요? 

 

결과가 나오는 것도 중요하겠지만 우리는 어떠한 과정으로 이런 결과가 나오게 되었는지 알 필요가 있습니다.

 

먼저

int count = 1;

이라는 부분에서 count라는 이름을 가진 int형 변수를 선언하고 1을 대입해줍니다.

 

int형은 아래 그림과 같이 생긴 숫자를 담을 수 있는 상자 정도로 생각하시면 될 것 같습니다.

 


2cfa00c09ad755cda72506822e8a4b13.jpeg


 

그리고 player가 서버에 입장을 하면 PlayerJoinEvent가 발생되는데, 

 

이때 우리가 작성한 아래 코드가 실행됩니다.

 

@EventHandler
    public void join(PlayerJoinEvent e) {
        
        e.setJoinMessage( count +"번째 입장했습니다!" );
        count = count + 1 ;
        
    }

 

첫 번째 접속 시에는 count 변수의 값이 1이기 때문에 

"1번째 입장했습니다."라는 문장이 출력된 후, count 변수에 1을 더해줍니다.

 

두 번째 접속 시에는 count 변수의 값이 2이기 때문에 

"2번째 입장했습니다."라는 문장이 출력된 후, count 변수에 1을 더해줍니다.

 

세 번째 접속 시에는 count 변수의 값이 3이기 때문에

"3번째 입장했습니다."라는 문장이 출력된 후, count 변수에 1을 더해줍니다.

 

4번째, 5번째, 6번째 접속 시에도 동일한 패턴으로 반복될 것입니다.

 

 

 

 

만약 플레이어 1 , 플레이어 2가 번갈아가며 3번씩 접속했다면 어떻게 될지 생각해봅시다.

 

플레이어 1이 첫 번째 접속했을 때 "1번째 입장했습니다."라는 문장이 출력되고

플레이어 2가 첫 번째 접속했을 때"2번째 입장했습니다."라는 문장이 출력되고

플레이어 1이 두 번째 접속했을 때"3번째 입장했습니다."라는 문장이 출력되고

플레이어 2가 두 번째 접속했을 때"4번째 입장했습니다."라는 문장이 출력되고

플레이어 1이 세 번째 접속했을 때"5번째 입장했습니다."라는 문장이 출력되고

플레이어 2가 세 번째 접속했을 때"6번째 입장했습니다."라는 문장이 출력됩니다.

 

 

 

 

만약 

플레이어 1이 첫 번째 접속했을 때"1번째 입장했습니다." 

플레이어 2가 첫 번째 접속했을 때"1번째 입장했습니다." 

플레이어 1이 두 번째 접속했을 때"2번째 입장했습니다." 

플레이어 2가 두 번째 접속했을 때"2번째 입장했습니다." 

플레이어 1이 세 번째 접속했을 때"3번째 입장했습니다." 

플레이어 2가 세 번째 접속했을 때"3번째 입장했습니다." 

라고 출력되게 하려면 어떻게 해야 될까요?

 

 

아래와 같이 플레이어 정보와 접속 횟수를 담을 수 있는 변수 2개를 모아서 관리한다면 가능할 것입니다.


2cfa00c09ad755cda72506822e8a4b13.jpeg


 

이 것을 코드로 구현하면 다음과 같이 작성할 수 있습니다.

 

(노란색 형광펜으로 표시한 부분이 바뀐 부분입니다.)

 


2cfa00c09ad755cda72506822e8a4b13.jpeg


 

import java.util.HashMap;
import java.util.UUID;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener {
    
    ConsoleCommandSender consol = Bukkit.getConsoleSender();
    HashMap<UUID, Integer> map = new HashMap<UUID, Integer>();
    
    @Override
    public void onEnable() {
        consol.sendMessage( ChatColor.AQUA + "[플러그인 활성화 중 입니다.]");
        getServer().getPluginManager().registerEvents(this, this);
    }
    
    @Override
    public void onDisable() {
        consol.sendMessage( ChatColor.AQUA + "[플러그인 비활성화 중 입니다.]");
    }
    
    @EventHandler
    public void join(PlayerJoinEvent e) {

        UUID uuid = e.getPlayer().getUniqueId();
        
        if(map.containsKey(uuid)) {
            map.put(uuid, map.get(uuid) + 1);
        } else {
            map.put(uuid, 1);
        }
        
        int count = map.get(uuid);
        
        e.setJoinMessage( count +"번째 입장했습니다!" );

        
    }
}

 결과가 잘 나오는지 확인해 보시길 바랍니다.

 

위와 같이 여러 가지 데이터들을 관리, 저장하는 방법들을 자료구조라고 부릅니다. 

 

자료구조의 한 종류인 HashMap은 아직 다루기에는 어려운 개념이지만 제가 마인크래프트 플러그인을 제작할 때 

 

가장 많이 사용하는 자료구조 이기 때문에 어떤 것인지 보여드렸습니다.

 

 

 

간단히 어떠한 과정으로 결과가 나오게 되는지 설명드리겠습니다.

(전체적인 내용은 int형 변수를 사용한 것과 다르지 않습니다.)

 

    HashMap<UUID, Integer> map = new HashMap<UUID, Integer>(); 

이라는 부분에서 map이라는 이름을 가진 HashMap 객체를 선언하고 대입해줍니다.

 

(자세한 객체에 개념과 HashMap 선언에 대해서는 나중에 차차 설명해드리겠습니다.)

 

그리고 player가 서버에 입장을 하면 PlayerJoinEvent가 발생되는데, 

 

@EventHandler
    public void join(PlayerJoinEvent e) {

        UUID uuid = e.getPlayer().getUniqueId();
        
        if(map.containsKey(uuid)) {
            map.put(uuid, map.get(uuid) + 1);
        } else {
            map.put(uuid, 1);
        }
        
        int count = map.get(uuid);
        
        e.setJoinMessage( count +"번째 입장했습니다!" );

        
    }

 PlayerJoinEvent가 발생되면 우리가 작성한 코드가 실행됩니다.

 

우리가 작성한 코드를 살펴보면 

 

1. 먼저 발생한 이벤트(PlayerJoinEvent)에서 player의 UUID(고유한 정보)를 얻어와 uuid라는 변수에 저장합니다. 

 

2. map이라는 자료구조에 player의 정보 값이 있는지 확인합니다.

2-1. 있다면 map의 정보를 갱신합니다.

2-2. 없다면 map에 정보를 넣습니다.

 

3. map에서 플레이어의 접속 횟수를 가져와 count라는 이름을 가진 int형 변수에 대입합니다.

 

4. 플레이어 입장 메시지를 출력합니다.

 

다음과 같습니다.

 

 

 

 

 

여기까지 하셨다면 서버를 종료한 후 다시 작동시켜 접속해보시기 바랍니다.

 

다시 접속한다면 사용했던 변수들이 모두 초기화되어 접속 횟수가 1부터 출력될 것입니다.

 

우리가 선언한 변수들은 서버가 off 된다면 모두 초기화되기 때문에,

 

서버를 off 시킨 후에도 다시 사용하려면 변수들을 파일로 저장해놓고 서버가 on 될 때 불러와 사용하는 방법을 택해야 합니다. 

 

 

 

 

 

다음 강좌에서는 변수에 대해 좀 더 자세히 알아보고

, 사용했던 변수들을 파일로 저장하는 방법에 대해서 알려드리겠습니다.

 

 

 

변수에 대해서 잘 이해하셨는지 모르겠네요! 만약 변수에 대해서 더 자세한 내용을 공부하고 싶은 분이라면

자바 변수, 데이터타입 검색어로 검색을 하여 좀 더 공부해보시길 바랍니다!




Warning
댓글이 없습니다.

새로운 댓글을 등록해 주세요!

뉴스 및 창작물
/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 4

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

/files/thumbnails/648/892/003/262x150.crop.jpg?20241002184058

아티클

마인크래프트 라이브 2024 후기: 무성의가 느껴졌던 '절망편' 라이브

라비

2024-10-02

4