asdcawca
대표칭호 없음
이해도 | 입문자 |
---|---|
게임버전 (JE) | 1.20.1 |
게임버전 (BE) | 관련없음 |
스크립트 애드온 | package com.yourplugin.liracurrency; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; import java.io.*; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; public class LiraCurrencyPlugin extends JavaPlugin implements Listener { private final Map<UUID, Integer> playerBalances = new HashMap<>(); // 플레이어 UUID와 잔액 private final Map<Material, Integer> itemPrices = new HashMap<>(); // 아이템 가격 private final Logger logger = Bukkit.getLogger(); // 로그 출력을 위한 로거 @Override public void onEnable() { // 가격 설정 itemPrices.put(Material.COAL, 1); itemPrices.put(Material.IRON_INGOT, 2); itemPrices.put(Material.COPPER_INGOT, 2); itemPrices.put(Material.LAPIS_LAZULI, 2); itemPrices.put(Material.REDSTONE, 2); itemPrices.put(Material.DIAMOND, 20); itemPrices.put(Material.GOLD_INGOT, 4); itemPrices.put(Material.EMERALD, 50); // 플레이어 잔액 파일 로드 loadPlayerBalances(); // 이벤트 리스너 등록 Bukkit.getPluginManager().registerEvents(this, this); // 명령어 등록 Objects.requireNonNull(this.getCommand("Lira")).setExecutor((sender, command, label, args) -> { if (sender instanceof Player player) { int balance = playerBalances.getOrDefault(player.getUniqueId(), 0); player.sendMessage(ChatColor.GREEN + "현재 Lira 잔액: " + ChatColor.YELLOW + balance + " Lira"); } return true; }); } @Override public void onDisable() { // 플레이어 잔액 저장 savePlayerBalances(); } // 플레이어의 Lira 잔액 불러오기 private void loadPlayerBalances() { File file = new File(getDataFolder(), "balances.txt"); if (!file.exists()) { return; // 파일이 없으면 그냥 종료 } try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String line; while ((line = reader.readLine()) != null) { String[] data = line.split(":"); if (data.length == 2) { UUID playerUUID = UUID.fromString(data[0]); int balance = Integer.parseInt(data[1]); playerBalances.put(playerUUID, balance); } } } catch (IOException e) { // printStackTrace 대신 로깅을 사용 logger.log(Level.SEVERE, "Failed to load player balances.", e); } } // 플레이어의 Lira 잔액 저장 private void savePlayerBalances() { File file = new File(getDataFolder(), "balances.txt"); try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { for (Map.Entry<UUID, Integer> entry : playerBalances.entrySet()) { writer.write(entry.getKey().toString() + ":" + entry.getValue()); writer.newLine(); } } catch (IOException e) { // printStackTrace 대신 로깅을 사용 logger.log(Level.SEVERE, "Failed to save player balances.", e); } } // Lira를 플레이어에게 추가하는 메서드 private void addLiraToPlayer(Player player, int amount) { UUID playerUUID = player.getUniqueId(); int newBalance = playerBalances.getOrDefault(playerUUID, 0) + amount; playerBalances.put(playerUUID, newBalance); // 예쁜 메시지와 색깔 추가 player.sendMessage(ChatColor.GREEN + "" + ChatColor.BOLD + "Lira가 " + amount + " 만큼 추가되었습니다!"); player.sendMessage(ChatColor.AQUA + "현재 잔액: " + ChatColor.YELLOW + newBalance + " Lira"); } @EventHandler public void onInventoryClick(InventoryClickEvent event) { Inventory inventory = event.getInventory(); Player player = (Player) event.getWhoClicked(); // "Lira 교환상자"라는 이름을 가진 상자에서 아이템을 팔 수 있도록 처리 if (event.getView().getTitle().equals("Lira 교환상자")) { // 상자의 이름을 확인 ItemStack item = event.getCurrentItem(); if (item == null || item.getAmount() <= 0) return; // 아이템이 없으면 종료 Integer price = itemPrices.get(item.getType()); if (price != null) { // 아이템 팔고 Lira 추가 int amount = item.getAmount(); int totalPrice = price * amount; addLiraToPlayer(player, totalPrice); // 클릭된 아이템 제거 event.setCurrentItem(null); // 메시지 전송 (어떤 아이템이 몇 개 팔렸는지 표시) player.sendMessage(ChatColor.GREEN + item.getType().toString() + " " + amount + "개가 팔렸습니다! " + ChatColor.YELLOW + totalPrice + " Lira를 획득했습니다."); event.setCancelled(true); // 상자 아이템 클릭 이벤트 취소 } } } } |
챗지피티행님의 도움을 받아 코드를 작성해봤는데 printStackTrace()'의 호출을 더 강력한 로깅으로 바꿔야 할 것입니다. 라고 뜨면서 실행이 안되네요. 해결법 아시는분 댓글부탁드려요!!
댓글이 없습니다.
새로운 댓글을 등록해 주세요!