whguswo
대표칭호 없음
이해도 | 초보자 |
---|---|
게임버전 (JE) | 1.19.1 |
게임버전 (BE) | 관련없음 |
플레이어마다 돈이 다르고 플레이어의 돈을 표시하는 커스텀 인벤토리를 제작중인데
혼자 인벤토리를 열면 잘 작동하는데 다른 플레이어가 인벤토리를 열면 그 유저의 돈이 출력됩니다.
package auction; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; public class auctionPlugin extends JavaPlugin { @Override public void onEnable() { //플러그인 활성화시 실행 getLogger().info("플러그인이 활성화되었습니다!"); //서버의 로그에 출력 getCommand("game").setExecutor(new game()); getCommand("exchange").setExecutor(new exchange()); getCommand("auctionTest").setExecutor(new auctionCommand()); getServer().getPluginManager().registerEvents(new auctionInventory(), this); } @Override public void onDisable() { //플러그인 비활성화시 실행 getLogger().info("비활성화되었습니다."); //서버의 로그에 출력 } }
auctionCommand.java
package auction; import org.bukkit.Bukkit; 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; public class auctionCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { //명령어 실행 시 if(sender instanceof Player) { //명령어 사용자가 플레이어인 경우 //이벤트 객체 생성 OpenAuctionInventoryEvent event = new OpenAuctionInventoryEvent((Player)sender); //플러그인 관리자에 이벤트 호출 요청 Bukkit.getPluginManager().callEvent(event); return true; } else if(sender instanceof ConsoleCommandSender) { //명령어 사용자가 콘솔인 경우 sender.sendMessage("콘솔에서는 이 명령어를 실행할 수 없습니다."); return false; } return false; } }
auctionInventory.java
package auction; import org.bukkit.*; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import java.util.Arrays; import java.util.ArrayList; public class auctionInventory implements Listener { private final Inventory inv; ItemStack leftMoney = new ItemStack(Material.GOLD_INGOT); public auctionInventory() { inv = Bukkit.createInventory(null, 27, "경매장"); //인벤토리 초기화 ItemStack border = new ItemStack(Material.BLUE_STAINED_GLASS_PANE, 1); for (int i = 0; i < 3; i++) { for (int j = 0; j < 9; j++) { if(i == 0 || i==2 || j == 0 || j == 8) { inv.setItem(i * 9 + j, border); } } } ItemStack pro = product.getProduct(); inv.setItem(12, pro); } public auctionInventory(Inventory inv) { this.inv = inv; } @EventHandler public void onOpenAuctionInventory(OpenAuctionInventoryEvent e) { ItemMeta leftMoneyItemMeta = leftMoney.getItemMeta(); leftMoneyItemMeta.setDisplayName(ChatColor.GOLD +"잔액: $" + userMap.getMoney(e.player.getName())); Bukkit.getLogger().info(e.player.getName()); leftMoney.setItemMeta(leftMoneyItemMeta); inv.setItem(14, leftMoney); e.player.openInventory(inv); } @EventHandler public void onInventoryClick(InventoryClickEvent e) { if (e.getInventory() != inv) return; e.setCancelled(true); ItemStack clickedItem = e.getCurrentItem(); Player player = (Player) e.getWhoClicked(); if (clickedItem == null || clickedItem.getType() == Material.AIR) return; if (clickedItem.getType() == Material.DIAMOND_SWORD) { // 구매시 가격만큼 차감하게 바꾸기 // userMap.subMoney(player.getName(), 100); ItemMeta leftMoneyItemMeta = leftMoney.getItemMeta(); leftMoneyItemMeta.setDisplayName(ChatColor.GOLD +"잔액: $" + userMap.getMoney(player.getName())); leftMoney.setItemMeta(leftMoneyItemMeta); inv.setItem(14, leftMoney); player.getInventory().addItem(clickedItem); player.closeInventory(); product.resetProduct(); } else if (clickedItem.getType() == Material.STONE_BRICK_STAIRS) { World w = player.getWorld(); Location location = new Location(w, -337, 11, 75, -180, 0); player.teleport(location); } } @EventHandler public void onInventoryDrag(InventoryDragEvent e) { if (e.getInventory() == inv) { e.setCancelled(true); } } } class OpenAuctionInventoryEvent extends Event { private static final HandlerList HANDLERS = new HandlerList(); public Player player; public OpenAuctionInventoryEvent(Player player) { this.player = player; } public HandlerList getHandlers() { return HANDLERS; } public static HandlerList getHandlerList() { return HANDLERS; } }
잔액: $ + ( userMap에서 유저 돈 가져오는 함수 )
e.player.openInventory(inv) 을 사용했는데 명령어 사용자만 인벤토리 바뀌어야하는거 아닌가요?
0reo
2023.01.17InventoryHolder를 구현하는 클래스를 만들고, 거기서 인벤토리를 만든담에 생성자로 인벤토리 = Bukkit.createInventory(~~~) 하시고 불러오시면 매번 객체를 생성할때마다 새로운 인벤토리가 생겨서 안바뀌어요
0reo
2023.01.17지금 쓰시는건 인벤토리 하나를 몇명이서 공유하고있는겁니다 사실상
whguswo
2023.01.17덕분에 해결했습니다. 감사합니당!
0reo
2023.01.17👍