개인 자료란 (JE)

  서버 커뮤니티

Profile JSD-ITHAN 대표칭호 없음
Profile

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

[6강] 마인크래프트 플러그인 개발하기 - 명령어로 플레이어 발 밑에 블럭 소환하기

2020.01.23 조회 수 2052 추천 수 3
분야 플러그인 
게임버전 모든버전 

a57a01eef7b76af737bb88318e073f9d.png


안녕하세요! 오늘 할 강좌는 명령어를 사용하면 플레이어의 발 밑에 블럭을 소환하도록 만들어 보겠습니다.

0.프로젝트 생성하기

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

File -> New -> JavaProject ->  프로젝트 이름 설정 뒤 Finish -> 스피곳 Build Path하기(모르시는 분은 2강 참조) -> 패키지, 클래스 생성 

Project Name --------> LongCommand

package name ------->command

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

저는 이렇게 하겠습니다.

1.코드 작성하기

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

package command;

 

 

import org.bukkit.Material;

import org.bukkit.command.Command;

import org.bukkit.plugin.java.JavaPlugin;

import org.bukkit.command.CommandSender;

import org.bukkit.entity.Player;

 

public class Main extends JavaPlugin{

    

    @Override

    public void onEnable() {

        System.out.println("========================" + "\r\n" 

                + "                플러그인이 활성화되었습니다" + "\r\n"  

                + "                        Version1.0" + "\r\n"  

                + "                 ========================");

    }

    

    @Override

    public void onDisable() {

        System.out.println("[플러그인이 비활성화되었습니다].");

    }

 

    @Override

    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

        

        if(cmd.getName().equalsIgnoreCase("p")) {

            

            if(args.length == 0)  {

                

                sender.sendMessage("커맨드를 길게 쳐주세요");

            }

            else if(args[0].equalsIgnoreCase("w")) {

                

                Player p =(Player) sender;

                p.getLocation().getBlock().setType(Material.WATER);

            }

            

            else if(args[0].equalsIgnoreCase("l")) {

                

                Player p = (Player) sender;

                p.getLocation().getBlock().setType(Material.LAVA);

            }

            else if(args[0].equalsIgnoreCase("cs")) {

                

                Player p = (Player) sender;

                p.getLocation().getBlock().setType(Material.COBBLESTONE);

            }

            else if(args[0].equalsIgnoreCase("db")) {

                

                Player p = (Player) sender;

                p.getLocation().getBlock().setType(Material.DIAMOND_BLOCK);

            }

            else if(args[0].equalsIgnoreCase("ib")) {

                

                Player p = (Player) sender;

                p.getLocation().getBlock().setType(Material.IRON_BLOCK);

                

            }

            else if(args[0].equalsIgnoreCase("eb")) {

                

                Player p = (Player) sender;

                p.getLocation().getBlock().setType(Material.EMERALD_BLOCK);

                

            }

            else if(args[0].equalsIgnoreCase("g")) {

                

                Player p = (Player) sender;

                p.getLocation().getBlock().setType(Material.GRASS);

                

            }

             else if(args[0].equalsIgnoreCase("i")) {

                

                Player p = (Player) sender;

                p.getLocation().getBlock().setType(Material.ICE);

                

            }

             else if(args[0].equalsIgnoreCase("s")) {

                    

                    Player p = (Player) sender;

                    p.getLocation().getBlock().setType(Material.STONE);

                    

                }

             else if(args[0].equalsIgnoreCase("gb")) {

                    

                    Player p = (Player) sender;

                    p.getLocation().getBlock().setType(Material.GOLD_BLOCK);

                    

                }

             else if(args[0].equalsIgnoreCase("gl")) {

                    

                    Player p = (Player) sender;

                    p.getLocation().getBlock().setType(Material.GLASS);

                    

                }

             else if(args[0].equalsIgnoreCase("wl")) {

                    

                    Player p = (Player) sender;

                    p.getLocation().getBlock().setType(Material.WOOL);

                    

                }

             else if(args[0].equalsIgnoreCase("lb")) {

                    

                    Player p = (Player) sender;

                    p.getLocation().getBlock().setType(Material.LAPIS_BLOCK);

                    

                }

             else if(args[0].equalsIgnoreCase("b")) {

                    

                    Player p = (Player) sender;

                    p.getLocation().getBlock().setType(Material.BRICK);

                    

                }

             else if(args[0].equalsIgnoreCase("gs")) {

                    

                    Player p = (Player) sender;

                    p.getLocation().getBlock().setType(Material.GLOWSTONE);

                    

                }

             else if(args[0].equalsIgnoreCase("qb")) {

                    

                    Player p = (Player) sender;

                    p.getLocation().getBlock().setType(Material.QUARTZ_BLOCK);

                    

                }

             else if(args[0].equalsIgnoreCase("gp")) {

                    

                    Player p = (Player) sender;

                    p.getLocation().getBlock().setType(Material.GRASS_PATH);

                    

                }

        }

        

        return true;

    }

 

}    


Colored by Color Scripter

cs

이렇게 해서 코드를 완성하였습니다.

2.코드 해석

public boolean onCommand(Command Sender, Command cmd, String label, string[] args

이 코드는 전에도 말씀드렸지만 명령하는자, 커맨드 등을 정의 해주는 논리형 구문입니다.

논리형은 마지막에 꼭 true 아니면 false 값을 적어 주어야 합니다.

if(cmd.getName().equalsIgnoreCase("p"))

제가 위에서 Command를 cmd로 정의 했습니다.

그 말은 "명령어" = cmd 가 되는 거죠.

그래서 cmd.getName()은 플레이어가 입력한 명령을 받는 것입니다.

만야 그 명령이 "p"일 때 라고 해석 할 수 있겠죠.

저번 날씨 강좌에서도 말씀드렸지만

if(args.length == 0)

이라는 구문은 플레이어가 p만 입력하고 그 뒤의 명령어를 사용하지 않았을 때가 되겠습니다.

그 때는 명령어를 길게 쳐 달라고 메세지를 출력하게 만들었습니다.

그다음은 else if(args[0].equalsIgnoreCase("명령이름"))

명령 이름에 원하시는 이름을 쓰시고

어떤 블럭을 소환할지 고르시고

게임에서 /p  명령이름

이렇게 쓰시면 선택하신 블럭이 소환됩니다.

먼저 블럭을 소환하려면 블럭을 지정하고 소환할 장소를 골라야겠죠.

플레이어 먼저 정의해주도록 하겠습니다.

먼저 sender는 명령하는자 즉 플레이어가 되겠습니다.

Player은 org.bukkit.entity.Player로 import 할 수 있습니다.

그래서 Player을 정의 해 줄 때 이렇게 씁니다.

Player p = (Player) sender;

이제 p = Player이 되었습니다.

p.getLocation().getBlock().setType(Material.블럭 이름);

이제 이렇게 하면 플레이어의 위치를 가져 와서 거기에다가 우리가 정해주는 Material을 소환하게 되는 겁니다.

예를 들어서


else if(args[0].equalsIgnoreCase("db")) {                                 

Player p = (Player) sender;                

p.getLocation().getBlock().setType(Material.DIAMOND_BLOCK);            }

이런 구문이 있다면 플레이어가 /p db 라고 쳤을 때 플레이어 위치에 다이아몬드 블럭을 소환합니다.


3.plugin.yml 작성하기

프로젝트 우클릭 -> New -> File-> plugin.yml입력하고 엔터 

name: longCommand
version: 1.0
main: command.main
commands:
  p:

main에는 패키지 이름.클래스 이름을 쓰셔야 합니다.

이번 강좌에는 커맨드가 들어가기 때문에 commands를 추가해줍니다.

4.Jar Export

이제 마지막 단계인 프로젝트를 내보내도록 하겠습니다.

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

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


플러그인 작동 영상<-----이거 누르시면 이 플러그인의 작동 영상을 보실 수 있습니다(유튜브와 연결되어있습니다)


이것으로 오늘 강좌를 마치도록 하겠습니다!

오늘도 제 강좌를 보러와 주신 분들 감사합니다!:D




4개의 댓글

DDang_
2020.01.23

좋은 글 감사합니다

겸손한젤리봇
2020.01.23
@DDang_
77ㅓ억.. 앗 들렸나요 DDang_님? ㅎㅎ.. 무슨 소리냐구요? 당신의 포인트를 먹는 소리★ (-2)
DRDTF
2020.02.27

좋은강좌감사합니다 이해가 잘 됩니다

킬육
2022.02.10

명령어를 실행한 좌표에 소환하는게 아니고 실행한 좌표에서 y좌표를 바꿔서 소환하는건 안되나요?

 

뉴스 및 창작물
/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