[Minecraft plugin] HotTime Event - 모든 사람에게 OP가 들고 있는 아이템 지급

jong·2021년 3월 9일
0

취미

목록 보기
9/12

이전에 찾았던 플러그인은 아이템에 부여된 능력치가 복사되지 않고 순수 템만 지급되었었다. 지금 사용하는건 타 유저가 개발해둔 스크립트를 사용하고 있었지만 내 입맛에 맞게 플러그인으로 만들기로 했다.

플러그인 기능 추가

명령어 등록

내가 사용할 명령어를 등록해준다.

commands:
	...

  GiveAll:
    description: 모든 유저에게 아이템을 지급합니다.
    usage: /GiveAll 혹은 /GiveAll now
    permission: hottimeevent.giveall
    permission-message: You do not have permission to use this command.

permissions:
	...
  hottimeevent.giveall:
    default: op

config.yml 생성

이걸 생성하는 이유는 브로드캐스트를 할 때 앞에 붙을 양식을 정하기 위해서다.

format: "[ §cHotTime Event§f ] "

명령어 클래스 생성

해당 명령어를 입력하면 작동할 기능을 넣을 클래스를 생성한다.

GiveAll 로 이름을 정했다.

메인 클래스에 명령어와 설정 추가

    @Override
    public void onEnable() {
        //플러그인 활성화
        getLogger().info("§cHotTime Event plugin on");
+       this.saveDefaultConfig();

        //플러그인 활성화
        getCommand("hottimeeventtest").setExecutor(new TestCommand());
+       getCommand("giveall").setExecutor(new GiveAll());
    }

GiveAll 코드 채우기

public class GiveAll implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String s, String[] strings) {
        String format = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getConfig().getString("format");
        if (sender instanceof Player) { //플레이어야 명령어 실행 가능
            Bukkit.broadcastMessage(format + "곧 아이템이 지급됩니다! 인벤토리를 비워주세요!");

            ItemStack tempItem = ((Player) sender).getInventory().getItemInMainHand(); //유저가 들고 있는 아이템 정보 가져오기
            ItemStack giveItem = new ItemStack(tempItem); //유저가 가지고 있던 아이템 복사
            int value = 0; //아이템 갯수

            if (strings.length >= 1) { //strings 값이 있는지 확인
                if (strings[0].equals("now")) { //딜레이 없이 바로 지급 하고자 한다면, 아니라면 바로 일반 명령어로 넘어감
                    if (strings.length == 1) { //값이 없으면 기본 값 1
                        value = 1;
                    } else {
                        value = Integer.parseInt(strings[1]);
                    }
                    giveItem.setAmount(value); //유저가 입력한 아이텝 지금 갯수를 등록
                    giveAll(giveItem);

                    return true; //다음으로 넘어가지 않도록 return
                }
            }

            if (strings.length < 1) { //갯수 값이 없으면 기본 값 1
                value = 1;
            } else {
                value = Integer.parseInt(strings[0]);
            }

            giveItem.setAmount(value);

            //여기서 부턴 딜레이 후 아이템 지급
            BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getServer().getScheduler();
            scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("HotTimeEvent"), new Runnable() {
                @Override
                public void run() {
                    Bukkit.broadcastMessage(format + 5 + "초 후 지급!");

                    BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getServer().getScheduler();
                    scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("HotTimeEvent"), new Runnable() {
                        @Override
                        public void run() {
                            Bukkit.broadcastMessage(format + 4 + "초 후 지급!");

                            BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getServer().getScheduler();
                            scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("HotTimeEvent"), new Runnable() {
                                @Override
                                public void run() {
                                    Bukkit.broadcastMessage(format + 3 + "초 후 지급!");

                                    BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getServer().getScheduler();
                                    scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("HotTimeEvent"), new Runnable() {
                                        @Override
                                        public void run() {
                                            Bukkit.broadcastMessage(format + 2 + "초 후 지급!");

                                            BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getServer().getScheduler();
                                            scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("HotTimeEvent"), new Runnable() {
                                                @Override
                                                public void run() {
                                                    Bukkit.broadcastMessage(format + 1 + "초 후 지급!");

                                                    BukkitScheduler scheduler = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getServer().getScheduler();
                                                    scheduler.scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("HotTimeEvent"), new Runnable() {
                                                        @Override
                                                        public void run() {
                                                            giveAll(giveItem);
                                                        }
                                                    }, 20L);
                                                }
                                            }, 20L);
                                        }
                                    }, 20L);
                                }
                            }, 20L);
                        }
                    }, 20L);
                }
            }, 20L);


            return true;
        } else if (sender instanceof CommandSender) {
            sender.sendMessage(format + "플레이어가 아닙니다.");
            return true;
        }
        return false;
    }

    public void giveAll(ItemStack itemStack) {
        String format = Bukkit.getPluginManager().getPlugin("HotTimeEvent").getConfig().getString("format");
        Bukkit.broadcastMessage(format + "지급이 시작됩니다!");

        for (Player player : Bukkit.getOnlinePlayers()) {
            player.getInventory().addItem(itemStack);
            player.sendMessage(format + player.getName() + "님 인벤토리로 아이템이 지급 되었습니다.");
        }

        Bukkit.broadcastMessage(format + "지급이 완료되었습니다!");
    }
}

하나의 명령어에 기능을 두 가지를 넣었다.

  • /giveall now (갯수 defult: 1)
    유저들에게 바로 아이템을 지급한다. 개수를 적지 않으면 기본으로 1개가 지급된다.
  • /giveall (갯수 defult: 1)
    약 5초 뒤에 아이템이 지급된다.


사진과 같이 정상적으로 지급되는 것을 알 수 있습니다.

profile
공부 기록

0개의 댓글