Pily7 db22eed523b6474c8d914cf21ee09eb5
이해도 | 초보자 |
---|---|
게임버전 (JE) | 관련없음 |
게임버전 (BE) | 1.16.x |
[01:04:41 ERROR]: Error occurred while enabling emeraldrush v1.0-SNAPSHOT (Is it up to date?)
java.lang.NullPointerException: null
at pily.emeraldrush.Emeraldrush.onEnable(Emeraldrush.java:34) ~[?:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.16.5.jar:git-Paper-794]
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[patched_1.16.5.jar:git-Paper-794]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:500) ~[patched_1.16.5.jar:git-Paper-794]
at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugin(CraftServer.java:518) ~[patched_1.16.5.jar:git-Paper-794]
at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugins(CraftServer.java:432) ~[patched_1.16.5.jar:git-Paper-794]
at net.minecraft.server.v1_16_R3.MinecraftServer.loadWorld(MinecraftServer.java:599) ~[patched_1.16.5.jar:git-Paper-794]
at net.minecraft.server.v1_16_R3.DedicatedServer.init(DedicatedServer.java:298) ~[patched_1.16.5.jar:git-Paper-794]
at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1074) ~[patched_1.16.5.jar:git-Paper-794]
at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:291) ~[patched_1.16.5.jar:git-Paper-794]
at net.minecraft.server.v1_16_R3.MinecraftServer$$Lambda$3136/0x0000000000000000.run(Unknown Source) ~[?:?]
at java.lang.Thread.run(Thread.java:866) [?:?]
[01:04:41 INFO]: [emeraldrush] Disabling emeraldrush v1.0-SNAPSHOT
이렇게 오류가 나면서 실행이 안됩니다 ㅠㅠㅠ 왜 그런건가요?
package pily.emeraldrush; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; import java.util.HashMap; import java.util.Map; public class Emeraldrush extends JavaPlugin implements Listener { private Map<String, Location> teamSpawnPoints = new HashMap<>(); private Map<String, Location> teamProtectPoints = new HashMap<>(); private Map<String, Integer> teamLives = new HashMap<>(); private Map<String, Material> teamWoolColors = new HashMap<>(); private Map<String, Integer> teamEmeralds = new HashMap<>(); @Override public void onEnable() { getCommand("emeraldrush").setExecutor(new EmeraldRushCommand(this)); getServer().getPluginManager().registerEvents(this, this); } private class EmeraldRushCommand implements CommandExecutor { private final Emeraldrush plugin; public EmeraldRushCommand(Emeraldrush plugin) { this.plugin = plugin; } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args){ if (!(sender instanceof Player)) { sender.sendMessage(ChatColor.RED + "플레이어만 이 명령어를 사용할 수 있습니다."); return false; } Player player = (Player) sender; if (args.length == 2 && args[0].equalsIgnoreCase("start")) { startGame(); return true; } if (args.length < 4) { player.sendMessage(ChatColor.RED + "올바른 명령어 형식이 아닙니다."); return false; } String teamName = args[1].toLowerCase(); String action = args[0].toLowerCase(); double x = Double.parseDouble(args[2]); double y = Double.parseDouble(args[3]); double z = Double.parseDouble(args[4]); Location location = new Location(player.getWorld(), x, y, z); if (action.equals("emerald_spawn")) { teamSpawnPoints.put(teamName, location); player.sendMessage(ChatColor.GREEN + "에메랄드 스폰 지점이 설정되었습니다."); } else if (action.equals("team")) { handleTeamCommand(player, args); } else { player.sendMessage(ChatColor.RED + "올바른 명령어 형식이 아닙니다."); return false; } return true; } private void startGame() { // 게임 시작 로직 구현 for (Player player : getServer().getOnlinePlayers()) { preparePlayerForGame(player); } // 게임 시작 전 대기 시간 설정 getServer().getScheduler().runTaskLater(Emeraldrush.this, () -> { for (Player player : getServer().getOnlinePlayers()) { player.sendMessage("게임이 시작되었습니다!"); player.playSound(player.getLocation(), Sound.ENTITY_ENDER_DRAGON_GROWL, 1.0f, 1.0f); placeWoolBlocks(player); } }, 5 * 20L); // 5초 대기 (20 틱 = 1초) } private void preparePlayerForGame(Player player) { // 부활할 때 갑옷, 무기, 도구 설정 player.setGameMode(GameMode.SURVIVAL); player.setHealth(20); player.setFoodLevel(20); ItemStack sword = new ItemStack(Material.IRON_SWORD); ItemStack pickaxe = new ItemStack(Material.IRON_PICKAXE); ItemStack axe = new ItemStack(Material.IRON_AXE); ItemStack shears = new ItemStack(Material.SHEARS); ItemStack wool = new ItemStack(Material.WHITE_WOOL, 64); player.getInventory().clear(); // 인벤토리 초기화 player.getInventory().addItem(sword, pickaxe, axe, shears, wool); // 5초 동안 움직일 수 없도록 설정 player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 5 * 20, 255, false, false)); // 팀 스폰 지점으로 이동 String teamName = getTeamName(player); Location spawnPoint = teamSpawnPoints.getOrDefault(teamName, player.getWorld().getSpawnLocation()); player.teleport(spawnPoint); // 5초 동안 대기하는 타이틀 표시 player.sendTitle("", "게임 시작까지 5초", 10, 70, 20); } private void placeWoolBlocks(Player player) { String teamName = getTeamName(player); Location protectPoint = teamProtectPoints.getOrDefault(teamName, player.getWorld().getSpawnLocation()); Material woolColor = teamWoolColors.getOrDefault(teamName, Material.WHITE_WOOL); protectPoint.getBlock().setType(woolColor); } private void handleTeamCommand(Player player, String[] args) { if (args.length < 5) { player.sendMessage(ChatColor.RED + "올바른 명령어 형식이 아닙니다."); return; } String teamName = args[1].toLowerCase(); String subCommand = args[2].toLowerCase(); double x = Double.parseDouble(args[3]); double y = Double.parseDouble(args[4]); double z = Double.parseDouble(args[5]); Location location = new Location(player.getWorld(), x, y, z); if (subCommand.equals("spawnpoint")) { teamSpawnPoints.put(teamName, location); player.sendMessage(ChatColor.GREEN + "스폰 지점이 설정되었습니다."); } else if (subCommand.equals("protectpoint")) { teamProtectPoints.put(teamName, location); player.sendMessage(ChatColor.GREEN + "보호 지점이 설정되었습니다."); } else { player.sendMessage(ChatColor.RED + "올바른 명령어 형식이 아닙니다."); } } private String getTeamName(Player player) { // 팀 이름을 가져오는 로직을 추가하세요. // 예: 플레이어의 팀 정보를 저장하는 플레이어 데이터 사용 return "Red"; // 임시로 Red를 반환 } } private String getTeamName(Player player) { // 플레이어의 팀 정보를 가져오는 로직을 추가하세요. // 여기에서는 teamWoolColors 맵을 사용하여 팀 이름을 가져오는 예시를 보여줍니다. for (Map.Entry<String, Material> entry : teamWoolColors.entrySet()) { if (player.getInventory().contains(entry.getValue())) { return entry.getKey(); } } // 팀을 찾지 못한 경우 기본값으로 "Unknown"을 반환합니다. return "Unknown"; } @EventHandler public void onBlockBreak(BlockBreakEvent event) { Player player = event.getPlayer(); String teamName = getTeamName(player); if (isWoolBlock(event.getBlock().getType(), teamName)) { event.setCancelled(true); handleWoolBreak(player, event.getBlock().getLocation()); } } private boolean isWoolBlock(Material material, String teamName) { // 양털 블록이며 특정 팀에 해당하는지 확인하는 로직을 추가하세요. Material woolColor = teamWoolColors.get(teamName); return material == woolColor; } private void handleWoolBreak(Player player, Location woolLocation) { String teamName = getTeamName(player); int currentLives = teamLives.getOrDefault(teamName, 0); if (currentLives > 0) { // 플레이어의 팀 목숨이 0보다 큰 경우에만 부활 및 처리 respawnPlayer(player); player.sendMessage(ChatColor.RED + "팀 목숨이 감소했습니다. 부활하셨습니다."); // 애매랄드 생성 지점 로직 추가 spawnEmeralds(teamName); } else { // 플레이어의 팀 목숨이 0인 경우 처리 player.sendMessage(ChatColor.RED + "팀 목숨이 모두 소진되었습니다. 부활할 수 없습니다."); } woolLocation.getBlock().setType(Material.AIR); // 양털 블록 파괴 } private void respawnPlayer(Player player) { String teamName = getTeamName(player); Location spawnLocation = teamSpawnPoints.getOrDefault(teamName, player.getWorld().getSpawnLocation()); // 갑옷, 무기, 도구 설정 player.setGameMode(GameMode.SURVIVAL); player.setHealth(20); player.setFoodLevel(20); ItemStack sword = new ItemStack(Material.IRON_SWORD); ItemStack pickaxe = new ItemStack(Material.IRON_PICKAXE); ItemStack axe = new ItemStack(Material.IRON_AXE); ItemStack shears = new ItemStack(Material.SHEARS); ItemStack wool = new ItemStack(Material.WHITE_WOOL, 64); player.getInventory().clear(); // 인벤토리 초기화 player.getInventory().addItem(sword, pickaxe, axe, shears, wool); // 5초 동안 움직일 수 없도록 설정 player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 5 * 20, 255, false, false)); // 팀 스폰 지점으로 이동 player.teleport(spawnLocation); // 5초 동안 대기하는 타이틀 표시 player.sendTitle("", "게임 시작까지 5초", 10, 70, 20); } private void spawnEmeraldAtLocation(Location location) { location.getBlock().setType(Material.EMERALD_BLOCK); } private void spawnEmeralds(String teamName) { Location emeraldSpawnLocation = teamProtectPoints.getOrDefault(teamName, null); if (emeraldSpawnLocation != null) { new BukkitRunnable() { @Override public void run() { // 애매랄드 스폰 로직 spawnEmeraldAtLocation(emeraldSpawnLocation); } }.runTaskTimer(this, 0, 30 * 20); // 30초 간격으로 스폰 } }}
qsef1256
2024.01.12getCommand("emeraldrush")의 값이 null 인 것 같네요, 커맨드가 제대로 등록이 안되면 null을 대신 반환하는걸로 알고 있는데 plugin.yml 같은거 확인 해보세요
fpdhpily
2024.01.12plugin.yml을 만들었습니다
그런데도 계속 오류가 나네요...
NoEul
2024.01.12Bukkit Command API 대신 Mojang Brigadier를 사용해 보는게 어떨까욘?
fpdhpily
2024.01.12구체적으로 어떻게 수정해야하나요?
NoEul
2024.01.12https://github.com/Mojang/brigadier 예제를 확인해 보세욘