개인 자료란 (JE)

  서버 커뮤니티

한국 마인크래프트 포럼

마인크래프트 자료 및 커뮤니티 플랫폼

전체 회원수 122,901명 ( +21명 )

※ 장기간 미활동 회원 제외

Profile 개발자토미 정품인증자

Luni5 ae6ece18994b48deb33b7529b6f49b30

Profile

커뮤니티new 개발자란new 개발 질문new Java

Paper 플러그인 개발중인데 Shift 클릭하면 아이템의 갯수가 변경됩니다.

16 일 전 조회 수 74 추천 수 1
분야 플러그인 
API 기타 

    @EventHandler

    public void onClickShop(InventoryClickEvent e) {

        if (isSetting) return;

        for (String x : ShopData.getShopList()) {

            if (e.getView().title().equals(Component.text(x + " 상점"))) {

                e.setCancelled(true);

                for (String s : ShopData.getSlotList(x)) {

                    if (Objects.equals(e.getCurrentItem(), ShopData.getItemWithLore(x, s))) {

                        if (e.isLeftClick()) {

                            if (ShopData.getItemBuy(x, s) == 0) return;

                            if (e.isShiftClick()) {

                                if (Main.getEconomy().getBalance((OfflinePlayer) e.getWhoClicked()) >= 64 * ShopData.getItemBuy(x, s)) {

                                    if (ShopData.isLimitedItem(x, s) && ShopData.getLimitedAmount(x, s) <= 0) {

                                        e.getWhoClicked().sendMessage(index + "§c이미 다 팔린 상품입니다.");

                                        return;

                                    } else if (ShopData.isLimitedItem(x, s) && ShopData.getLimitedAmount(x, s) - 64 < 0) {

                                        e.getWhoClicked().sendMessage(index + "§c64개를 구입할 수 없습니다.");

                                        return;

                                    } else {

                                        if (e.getWhoClicked().getInventory().firstEmpty() == -1) {

                                            e.getWhoClicked().sendMessage(index + "§c인벤토리 공간이 부족합니다.");

                                            return;

                                        }

                                        EconomyResponse response = Main.getEconomy().withdrawPlayer((OfflinePlayer) e.getWhoClicked(), 64 * ShopData.getItemBuy(x, s));

                                        if (response.transactionSuccess()) {

                                            ItemStack item = ShopData.getItemShopSlot(x, s);

                                            item.lore(null);

                                            item.setAmount(64);

                                            e.getWhoClicked().getInventory().addItem(item);

                                            if (ShopData.getChangePriceList().contains(x)) {

                                                ShopPrice.buy.put(x + ":" + s, ShopPrice.buy.getOrDefault(x + ":" + s, 0) + 64);

                                                ShopPrice.shop.add(x);

                                            }

                                            e.getWhoClicked().sendMessage(index + "성공적으로 " + ShopData.getItemShopSlot(x, s).getType() + "을 64개 구매했습니다.");

                                            if (ShopData.isLimitedItem(x, s)) {

                                                ShopData.shopData.set("shop.price." + x + "." + s + ".realAmount", ShopData.getLimitedAmount(x, s) - 64);

                                                ShopData.saveData();

                                                e.getWhoClicked().closeInventory();

                                                e.getWhoClicked().openInventory(Objects.requireNonNull(ShopData.setupShop(x)));


                                            }

                                        } else {

                                            e.getWhoClicked().sendMessage(index + "§c당신은 구매에 실패했습니다.");

                                            e.getWhoClicked().sendMessage(index + ChatColor.RED + response.errorMessage);

                                        }

                                    }

                                } else e.getWhoClicked().sendMessage(index + "§c돈이 부족합니다.");

                            } else {

                                if (Main.getEconomy().getBalance((OfflinePlayer) e.getWhoClicked()) >= ShopData.getItemBuy(x, s)) {

                                    if (ShopData.isLimitedItem(x, s) && ShopData.getLimitedAmount(x, s) <= 0) {

                                        e.getWhoClicked().sendMessage(index + "§c이미 다 팔린 상품입니다.");

                                        return;

                                    } else {

                                        if (e.getWhoClicked().getInventory().firstEmpty() == -1) {

                                            boolean canMerge = false;

                                            for (ItemStack item : e.getWhoClicked().getInventory().getContents()) {

                                                if (item == null) continue;

                                                if (item.getType() == ShopData.getItemShopSlot(x, s).getType()) {

                                                    if (item.getAmount() < 64) {

                                                        canMerge = true;

                                                        break;

                                                    }

                                                }

                                            }

                                            if (!canMerge) {

                                                e.getWhoClicked().sendMessage(index + "§c인벤토리 공간이 부족합니다.");

                                                return;

                                            }

                                        }

                                        EconomyResponse response = Main.getEconomy().withdrawPlayer((OfflinePlayer) e.getWhoClicked(), ShopData.getItemBuy(x, s));

                                        if (response.transactionSuccess()) {

                                            ItemStack item = ShopData.getItemShopSlot(x, s);

                                            item.lore(null);

                                            item.setAmount(1);

                                            e.getWhoClicked().getInventory().addItem(item);

                                            if (ShopData.getChangePriceList().contains(x)) {

                                                ShopPrice.buy.put(x + ":" + s, ShopPrice.buy.getOrDefault(x + ":" + s, 0) + 1);

                                                ShopPrice.shop.add(x);

                                            }

                                            e.getWhoClicked().sendMessage(index + "성공적으로 " + ShopData.getItemShopSlot(x, s).getType() + "을 1개 구매했습니다.");

                                            if (ShopData.isLimitedItem(x, s)) {

                                                ShopData.shopData.set("shop.price." + x + "." + s + ".realAmount", ShopData.getLimitedAmount(x, s) - 1);

                                                ShopData.saveData();

                                                e.getWhoClicked().closeInventory();

                                                e.getWhoClicked().openInventory(Objects.requireNonNull(ShopData.setupShop(x)));


                                            }

                                        } else {

                                            e.getWhoClicked().sendMessage(index + "§c당신은 구매에 실패했습니다.");

                                            e.getWhoClicked().sendMessage(index + ChatColor.RED + response.errorMessage);

                                        }

                                    }

                                } else e.getWhoClicked().sendMessage(index + "§c돈이 부족합니다.");

                            }

                        } else if (e.isRightClick()) {

                            if (ShopData.getItemSell(x, s) == 0) return;

                            if (e.isShiftClick()) {

                                if (ShopData.ConsumeItems((Player) e.getWhoClicked(), ShopData.getItemShopSlot(x, s), 64)) {

                                    EconomyResponse response = Main.getEconomy().depositPlayer((OfflinePlayer) e.getWhoClicked(), 64 * ShopData.getItemSell(x, s));

                                    if (response.transactionSuccess()) {

                                        e.getWhoClicked().sendMessage(index + "성공적으로 " + ShopData.getItemShopSlot(x, s).getType() + "을 64개 판매했습니다.");

                                        if (ShopData.getChangePriceList().contains(x)) {

                                            ShopPrice.sell.put(x + ":" + s, ShopPrice.sell.getOrDefault(x + ":" + s, 0) + 1);

                                            ShopPrice.shop.add(x);

                                        }

                                    } else {

                                        e.getWhoClicked().sendMessage(index + "§c당신은 판매에 실패했습니다.");

                                        e.getWhoClicked().sendMessage(index + ChatColor.RED + response.errorMessage);

                                        ItemStack item = ShopData.getItemShopSlot(x, s);

                                        item.setAmount(64);

                                        e.getWhoClicked().getInventory().addItem(item);

                                    }

                                } else e.getWhoClicked().sendMessage(index + "§c물건이 부족합니다.");

                            } else {

                                if (ShopData.ConsumeItems((Player) e.getWhoClicked(), ShopData.getItemShopSlot(x, s), 1)) {

                                    EconomyResponse response = Main.getEconomy().depositPlayer((OfflinePlayer) e.getWhoClicked(), ShopData.getItemSell(x, s));

                                    if (response.transactionSuccess()) {

                                        e.getWhoClicked().sendMessage(index + "성공적으로 " + ShopData.getItemShopSlot(x, s).getType() + "을 1개 판매했습니다.");

                                        if (ShopData.getChangePriceList().contains(x)) {

                                            ShopPrice.sell.put(x + ":" + s, ShopPrice.sell.getOrDefault(x + ":" + s, 0) + 1);

                                            ShopPrice.shop.add(x);

                                        }

                                    } else {

                                        e.getWhoClicked().sendMessage(index + "§c당신은 판매에 실패했습니다.");

                                        e.getWhoClicked().sendMessage(index + ChatColor.RED + response.errorMessage);

                                        ItemStack item = ShopData.getItemShopSlot(x, s);

                                        item.setAmount(1);

                                        e.getWhoClicked().getInventory().addItem(item);

                                    }

                                } else e.getWhoClicked().sendMessage(index + "§c물건이 부족합니다.");

                            }

                        } else if (e.getClick().isCreativeAction()) {

                            if (ShopData.getItemSell(x, s) != 0 && ShopData.itemAmount((Player) e.getWhoClicked(), ShopData.getItemShopSlot(x, s)) != 0) {

                                int amount = ShopData.itemAmount((Player) e.getWhoClicked(), ShopData.getItemShopSlot(x, s));

                                if (ShopData.ConsumeItems((Player) e.getWhoClicked(), ShopData.getItemShopSlot(x, s), amount)) {

                                    EconomyResponse response = Main.getEconomy().depositPlayer((OfflinePlayer) e.getWhoClicked(), ShopData.getItemSell(x, s) * amount);

                                    if (response.transactionSuccess()) {

                                        e.getWhoClicked().sendMessage(index + "성공적으로 " + ShopData.getItemShopSlot(x, s).getType() + "을 " + amount + "개 판매했습니다.");

                                        if (ShopData.getChangePriceList().contains(x)) {

                                            ShopPrice.sell.put(x + ":" + s, ShopPrice.sell.getOrDefault(x + ":" + s, 0) + amount);

                                            ShopPrice.shop.add(x);

                                        }

                                    } else {

                                        e.getWhoClicked().sendMessage(index + "§c당신은 판매에 실패했습니다.");

                                        e.getWhoClicked().sendMessage(index + ChatColor.RED + response.errorMessage);

                                        ItemStack item = ShopData.getItemShopSlot(x, s);

                                        item.setAmount(amount);

                                        e.getWhoClicked().getInventory().addItem(item);

                                    }

                                } else e.getWhoClicked().sendMessage(index + "§c물건이 부족합니다.");

                            }

                        }

                    }

                }

            } else if (e.getView().title().toString().contains("상점 시세변동!")) e.setCancelled(true);

        }

    }


    @EventHandler

    public void onCloseInventory(InventoryCloseEvent e) {


        if (!isSetting) return;


        for (String x : ShopData.getShopList()) {

            if (e.getView().title().equals(Component.text(x + " 상점"))) {

                int slot = 0;

                for (ItemStack item : e.getInventory().getContents()) {

                    if (item != null) ShopData.setItem(x, item, slot);

                    else ShopData.removeItem(x, String.valueOf(slot));

                    slot++;

                }

                isSetting = false;

                break;

            }

        }

    }


위에는 소스코드입니다.
상점을 열게 되면 if (e.getView().title().equals(Component.text(x + " 상점"))) 안쪽 부분이 실행됩니다.
그러나 Shift + 좌클릭을 하게 되면 상점 gui에 있던 아이템이 64개로 늘어납니다.

gui의 아이템을 변경할려면 ShopData.setItem() 말고는 변경할 수 있는 방법이 없습니다.

왜 자꾸 바뀌는 것일까요?


8개의 댓글

서재형
16 일 전

음, 28번째줄에 setAmount(64)가 있네요

개발자토미
16 일 전
@서재형

코드를 더 자세히 보시면 아시겠지만, item이라는 객체는 방금 새로 만들어진 객체고 플레이어 인벤토리에 추가되는 겁니다.

서재형
16 일 전
@개발자토미

2칸 위를보면 item객체는 ShopData.getItemShopSlot(x, s)로 가져오는 객체네요. 또한 아래쪽에 setAmount(64)가 하나 더있는데 그것또한 ShopData.getItemShopSlot(x, s)으로 가져오는 객체고요.

ShopData.getItemShopSlot(x, s)부분을 ShopData.getItemShopSlot(x, s).clone()으로 바꾸시면 고쳐질거에요.

개발자토미
16 일 전
@서재형

방금 테스트 해봤는데 진짜로 setAmount 값에 따라 바뀌네요.. 그럼 이걸 해결 할만한 대책이 없을까요?

개발자토미
16 일 전
@서재형

.done()이 작동하지 않네용..

서재형
16 일 전
@개발자토미

아이템.clone()은 아이템을 말그대로 복사해서 가져오기때문에, 이거로 가져온걸 setAmount로 바꾸시면 원본 아이템은 안바뀔거에요

서재형
16 일 전
@개발자토미

done()이 아니라 c lone()입니당

개발자토미
16 일 전
@서재형

감사합니다. 처음 안 사실이라 몰랐네요.

컨텐츠
https://www.koreaminecraft.net/files/thumbnails/180/890/002/262x150.crop.jpg?20211025201038

시험지

한마탐 5주차 (한마포 마인크래프트 탐구 영역) (10 / 25) 3

베개냥이

2021-10-25

2

https://www.koreaminecraft.net/files/thumbnails/291/881/002/262x150.crop.jpg?20211021165153

데일리픽

초간단 전투기 만들기 8

megat88

2021-10-20

4

https://www.koreaminecraft.net/files/thumbnails/850/878/002/262x150.crop.jpg?20211018191640
(포션 시리즈) 3편 - 비 3

GlassesFilm

2021-10-18

4