개인 자료란 (JE)

  서버 커뮤니티

Profile 팬달03 대표칭호 없음
Profile

질문하기 플러그인

[플러그인 질문] 플레이어 전체에게 랜덤한 아이템 지급

2024.07.23 조회 수 78 추천 수 0
이해도 입문자 
게임버전 (JE) 관련없음 
게임버전 (BE) 관련없음 

플러그인을 이용하여 온라인 플레이어들에게 겹치지 않는 랜덤한 색의 양털을 지급하려 합니다.


온라인 플레이어들에게 아이템을 지급하는 코드까지 짠 상태이고(친구가 자는 중이라 실험은 못해봤습니다),

겹치지 않는 랜덤한 색의 양털을 지급하는 방법이 궁금합니다.


아래는 코드입니다.

package me.pandal.randomwool;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

import static org.bukkit.Material.*;

public final class Randomwool extends JavaPlugin implements Listener, CommandExecutor {
    public void onEnable() {
        getLogger().info("랜덤양털 정상작동");
        getServer().getPluginManager().registerEvents(this, this);
        this.getCommand("랜덤게임").setExecutor(this);
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        Player player = (Player) sender;
        ItemStack red_wool = new ItemStack(Material.RED_WOOL);
        ItemStack orange_wool = new ItemStack(ORANGE_WOOL);
        ItemStack yellow_wool = new ItemStack(YELLOW_WOOL);
        ItemStack green_wool = new ItemStack(GREEN_WOOL);

        red_wool.setAmount(8);

        for (Player all : Bukkit.getOnlinePlayers())

            if (cmd.getName().equalsIgnoreCase("랜덤게임")) {
                if (args.length == 0) {
                    player.sendMessage(ChatColor.GREEN + "양털 색 확인!!");
                    }
                else if(args[0].equalsIgnoreCase("random")){
                    int random = (int) (Math.random() * 4);

                    switch (random) {
                        case 0:
                            player.getInventory().addItem(red_wool);
                            break;
                        case 1:
                            player.getInventory().addItem(orange_wool);
                            break;
                        case 2:
                            player.getInventory().addItem(yellow_wool);
                            break;
                        case 3:
                            player.getInventory().addItem(green_wool);
                            break;
                        default:
                            player.sendMessage(ChatColor.RED+"WARNING 오류 발생!!");
                            break;
                    }
                }
                }
        return false;
    }
    }

5개의 댓글

lanthanide
2024.07.24

답변 이전에 코드에 문제가 하나 있습니다. 지금 코드는 모든 양털을 명령어 실행자에게 지급합니다. 위 코드에서는  player.getInventory().addItem(...)
이 아니라 all.getInventory().addItem(...) 을 사용하시는 게 맞습니다. 아니면 아예 player를 sender로 정의하지 말고 for문 안에서 all 대신 player라는 이름을 쓰든지요.

모든 양털이 겹치지 않게 하고자 한다면 양털을 랜덤으로 지급할 게 아니라, 플레이어 목록을 순회하면서 순서대로 빨강, 파랑, 초록... 색의 양털을 주면 되는 것 아닌가요? 양털을 모두 담은 리스트인 woolList: List<ItemStack>를 만들고 첫 번째 플레이어에겐 woolList[0], 두 번째 플레이어에센 woolList[1]을 주는 식으로 작성하면 될 것 같습니다.
명령어 실행시마다 각 플레이어에게 주는 양털이 고정되어 있다면 for문 이전에 두 리스트 중 하나를 랜덤하게 섞으면 될 것이고요.
또, 플레이어 수가 양털 수보다 많은 경우는 예외처리를 하셔야 합니다. woolList를 다시 처음부터 돌리거나 아예 명령어 실행을 끊고 에러를 보여주어야 하겠지요.

팬달03
2024.07.24
@lanthanide

아이고 자세히 알려주셔서 고맙습니다!

다시 열심히 만들어보겠습니다!

팬달03
2024.07.25
@lanthanide

인터넷 보면서 해봤는데 List 이렇게 하는 게 맞을까요?

{
    import java.util.ArrayList;
    public static void randomwool(String[] args) {
        List<String> wools = new ArrayList<String>();

        wools.add("red_wool");
        wools.add("orange_wool");
        wools.add("yellow_wool");
        wools.add("green_wool");
        wools.add("blue_wool");

        System.out.println("red_woll, orange_wool, yellow_wool, green_wool, blue_wool:");
        for (String wool : wools) {
            System.out.println(wool);
        }

        int size = wools.size();
        System.out.println("5:" + size);
    }
lanthanide
2024.07.25
@팬달03

http://tpcg.io/_Y4IAUF

실행해보니 잘 되네요.

팬달03
2024.07.25
@lanthanide

헤헤 고맙습니다 :b