개인 자료란 (JE)

  서버 커뮤니티

Profile whguswo 대표칭호 없음
Profile

질문하기 Java

플레이어 인벤토리 관련 질문

2023.01.17 조회 수 61 추천 수 0
이해도 초보자 
게임버전 (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) 을 사용했는데 명령어 사용자만 인벤토리 바뀌어야하는거 아닌가요?


4개의 댓글

0reo
2023.01.17

InventoryHolder를 구현하는 클래스를 만들고, 거기서 인벤토리를 만든담에 생성자로 인벤토리 = Bukkit.createInventory(~~~) 하시고 불러오시면 매번 객체를 생성할때마다 새로운 인벤토리가 생겨서 안바뀌어요

0reo
2023.01.17
@0reo

지금 쓰시는건 인벤토리 하나를 몇명이서 공유하고있는겁니다 사실상

whguswo
2023.01.17
@0reo

덕분에 해결했습니다. 감사합니당!

0reo
2023.01.17
@whguswo

👍

뉴스 및 창작물
/files/thumbnails/268/789/003/262x150.crop.jpg?20240515192032

레드스톤

벌레먹은 돌 빠르게 제거하는 법

GlassesFilm

2024-05-15

0

/files/thumbnails/797/788/003/262x150.crop.jpg?20240515090924

건축

마인크래프트로 구현한 카르카손 보드게임

Warak

2024-05-15

1

/files/thumbnails/487/784/003/262x150.crop.jpg?20240508233607

모드

Windows Borderless 모드에서 악성코드 발견

학교가기싫다

2024-05-08

1

/files/thumbnails/384/778/003/262x150.crop.jpg?20240512002324

업데이트

마인크래프트 자바 에디션 스냅샷 24w18a

학교가기싫다

2024-05-06

0

/files/thumbnails/855/781/003/262x150.crop.jpg?20240505141129

레드스톤

레이저 클리너

GlassesFilm

2024-05-05

1