diff --git a/pom.xml b/pom.xml index 0b62476..3c5b574 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.sat7 DynamicShop - 3.14.0 + 3.14.1 jar DynamicShop diff --git a/src/main/java/me/sat7/dynamicshop/commands/Sell.java b/src/main/java/me/sat7/dynamicshop/commands/Sell.java index 8dca930..883d151 100644 --- a/src/main/java/me/sat7/dynamicshop/commands/Sell.java +++ b/src/main/java/me/sat7/dynamicshop/commands/Sell.java @@ -55,17 +55,42 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (args[0].equalsIgnoreCase("hand")) { - DynaShopAPI.QuickSell(player, player.getInventory().getItemInMainHand(), player.getInventory().getHeldItemSlot()); + ItemStack itemStack = player.getInventory().getItemInMainHand(); + if (itemStack == null || itemStack.getType().isAir()) + { + player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "ERR.HAND_EMPTY")); + return false; + } + + if (0 == DynaShopAPI.QuickSell(player, itemStack, player.getInventory().getHeldItemSlot())) + { + player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.NO_ITEM_TO_SELL_2")); + return false; + } + return true; } else if (args[0].equalsIgnoreCase("handall")) { - DynaShopAPI.QuickSell(player, player.getInventory().getItemInMainHand()); + ItemStack itemStack = player.getInventory().getItemInMainHand(); + if (itemStack == null || itemStack.getType().isAir()) + { + player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "ERR.HAND_EMPTY")); + return false; + } + + if (0 == DynaShopAPI.QuickSell(player, itemStack)) + { + player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.NO_ITEM_TO_SELL_2")); + return false; + } + return true; } else if (args[0].equalsIgnoreCase("all")) { ArrayList temp = new ArrayList<>(); + double sum = 0; for (ItemStack stack : player.getInventory().getStorageContents()) { @@ -76,10 +101,16 @@ else if (args[0].equalsIgnoreCase("all")) if (temp.contains(hash)) continue; - DynaShopAPI.QuickSell(player, stack); + sum += DynaShopAPI.QuickSell(player, stack); temp.add(hash); } + if (sum == 0) + { + player.sendMessage(DynamicShop.dsPrefix(player) + t(player, "MESSAGE.NO_ITEM_TO_SELL_2")); + return false; + } + return true; } else diff --git a/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java b/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java index 2bc0ab7..0c26406 100644 --- a/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java +++ b/src/main/java/me/sat7/dynamicshop/utilities/LangUtil.java @@ -186,7 +186,7 @@ public static void setupLangFile(String lang) ccLang.get().addDefault("ITEM_SETTING.CLOSE", "§f닫기"); ccLang.get().addDefault("ITEM_SETTING.CLOSE_LORE", "§f§n클릭: 닫기"); ccLang.get().addDefault("ITEM_SETTING.REMOVE", "§c제거"); - ccLang.get().addDefault("ITEM_SETTING.REMOVE_LORE", "§f이 아이탬을 상점에서 제거합니다."); + ccLang.get().addDefault("ITEM_SETTING.REMOVE_LORE", "§f이 아이템을 상점에서 제거합니다."); ccLang.get().addDefault("ITEM_SETTING.BUY", "§3§l구매: {num}"); ccLang.get().addDefault("ITEM_SETTING.SELL", "§3§l판매: {num}"); ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_SELL", "§f플레이어 당 판매량 제한"); @@ -198,11 +198,11 @@ public static void setupLangFile(String lang) ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER", "§f타이머 조정"); ccLang.get().addDefault("ITEM_SETTING.TRADE_LIMIT_TIMER_LORE", "§f{num}\n§f다음 리셋: {time}\n§e좌클릭: -1시간, 우클릭: +1시간, 씨프트 = x12"); - ccLang.get().addDefault("TRADE_TITLE", "§3아이탬 거래"); + ccLang.get().addDefault("TRADE_TITLE", "§3아이템 거래"); ccLang.get().addDefault("TRADE.TOGGLE_SELLABLE", "§e클릭: 판매전용 토글"); ccLang.get().addDefault("TRADE.TOGGLE_BUYABLE", "§e클릭: 구매전용 토글"); - ccLang.get().addDefault("TRADE.BUY_ONLY_LORE", "§f구매만 가능한 아이탬"); - ccLang.get().addDefault("TRADE.SELL_ONLY_LORE", "§f판매만 가능한 아이탬"); + ccLang.get().addDefault("TRADE.BUY_ONLY_LORE", "§f구매만 가능한 아이템"); + ccLang.get().addDefault("TRADE.SELL_ONLY_LORE", "§f판매만 가능한 아이템"); ccLang.get().addDefault("TRADE.BALANCE", "§3내 잔액"); ccLang.get().addDefault("TRADE.PRICE", "§f구매: {num}"); ccLang.get().addDefault("TRADE.SELL_PRICE", "§f판매: {num}"); @@ -277,8 +277,8 @@ public static void setupLangFile(String lang) ccLang.get().addDefault("STOCK_SIMULATOR.MEDIAN", "§f중앙값: {num}"); ccLang.get().addDefault("STOCK_SIMULATOR.STOCK", "§f재고: {num}"); - ccLang.get().addDefault("PALETTE_TITLE", "§3판매할 아이탬 선택"); - ccLang.get().addDefault("PALETTE_TITLE2", "§3아이탬 선택"); + ccLang.get().addDefault("PALETTE_TITLE", "§3판매할 아이템 선택"); + ccLang.get().addDefault("PALETTE_TITLE2", "§3아이템 선택"); ccLang.get().addDefault("PALETTE.LORE_PREMIUM", "§e좌클릭: 추가\n§e씨프트 좌클릭: 설정 후 추가\n§e우클릭: 장식으로 추가\n§e씨프트 우클릭: '{item}' 를 검색"); ccLang.get().addDefault("PALETTE.LORE2", "§e좌클릭: 선택\n§e씨프트 우클릭: '{item}' 를 검색"); ccLang.get().addDefault("PALETTE.SEARCH", "§f찾기"); @@ -291,7 +291,7 @@ public static void setupLangFile(String lang) ccLang.get().addDefault("QUICK_SELL_TITLE", "§3빠른 판매"); ccLang.get().addDefault("QUICK_SELL.GUIDE_TITLE", "§3§l빠른 판매 도움말"); - ccLang.get().addDefault("QUICK_SELL.GUIDE_LORE", "§a판매할 아이탬을 좌클릭 하세요.\n§a씨프트 좌클릭으로 같은 유형의 아이탬을 모두 팝니다.\n§a우클릭으로 해당 아이탬 상점으로 이동합니다."); + ccLang.get().addDefault("QUICK_SELL.GUIDE_LORE", "§a판매할 아이템을 좌클릭 하세요.\n§a씨프트 좌클릭으로 같은 유형의 아이템을 모두 팝니다.\n§a우클릭으로 해당 아이템 상점으로 이동합니다."); ccLang.get().addDefault("ARROW.UP", "§a⬆"); ccLang.get().addDefault("ARROW.DOWN", "§c⬇"); @@ -338,18 +338,19 @@ public static void setupLangFile(String lang) ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_JP", "§f{item} {amount}개를 {price}포인트에 판매함. 남은포인트: {bal}"); ccLang.get().addDefault("MESSAGE.BUY_SUCCESS_PP", "§f{item} {amount}개를 {price}포인트에 구매함. 남은포인트: {bal}"); ccLang.get().addDefault("MESSAGE.SELL_SUCCESS_PP", "§f{item} {amount}개를 {price}포인트에 판매함. 남은포인트: {bal}"); - ccLang.get().addDefault("MESSAGE.QSELL_NA", "§f해당 아이탬을 취급하는 상점이 없습니다."); + ccLang.get().addDefault("MESSAGE.QSELL_NA", "§f해당 아이템을 취급하는 상점이 없습니다."); ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE", "§f배달비: {fee}"); ccLang.get().addDefault("MESSAGE.DELIVERY_CHARGE_NA", "§f다른 월드로 배달할 수 없습니다."); ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_MONEY", "§f돈이 부족합니다. 잔액: {bal}"); ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_POINT", "§f포인트가 부족합니다. 잔액: {bal}"); ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_PLAYER_POINT", "§f플레이어 포인트가 부족합니다. 잔액: {bal}"); - ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL", "§f판매 할 아이탬이 없습니다."); + ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL", "§f판매 할 아이템이 없습니다."); + ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL_2", "§f판매 가능 한 아이템이 없습니다."); ccLang.get().addDefault("MESSAGE.INVENTORY_FULL", "§4인벤토리에 빈 공간이 없습니다!"); ccLang.get().addDefault("MESSAGE.IRREVERSIBLE", "§f이 행동은 되돌릴 수 없습니다!"); - ccLang.get().addDefault("MESSAGE.ITEM_ADDED", "아이탬 추가됨!"); - ccLang.get().addDefault("MESSAGE.ITEM_UPDATED", "아이탬 수정됨!"); - ccLang.get().addDefault("MESSAGE.ITEM_DELETED", "아이탬 제거됨!"); + ccLang.get().addDefault("MESSAGE.ITEM_ADDED", "아이템 추가됨!"); + ccLang.get().addDefault("MESSAGE.ITEM_UPDATED", "아이템 수정됨!"); + ccLang.get().addDefault("MESSAGE.ITEM_DELETED", "아이템 제거됨!"); ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED", "변경사항 적용됨. 새로운 값: "); ccLang.get().addDefault("MESSAGE.CHANGES_APPLIED_2", "변경사항 적용됨"); ccLang.get().addDefault("MESSAGE.RECOMMEND_APPLIED", "추천 값 적용됨. {playerNum}명 기준입니다. config파일에서 이 값을 바꿀 수 있습니다."); @@ -373,35 +374,35 @@ public static void setupLangFile(String lang) ccLang.get().addDefault("HELP.CREATE_SHOP", "상점을 새로 만듭니다."); ccLang.get().addDefault("HELP.CREATE_SHOP_2", "퍼미션(나중에 바꿀 수 있습니다.)\n true: dshop.user.shop.상점이름\n false: 아무나 접근가능(기본값)\n 임의 입력: 해당 퍼미션 필요"); ccLang.get().addDefault("HELP.DELETE_SHOP", "기존의 상점을 제거합니다."); - ccLang.get().addDefault("HELP.SHOP_ADD_HAND", "손에 들고 있는 아이탬을 상점에 추가합니다."); - ccLang.get().addDefault("HELP.SHOP_ADD_ITEM", "상점에 아이탬을 추가합니다."); - ccLang.get().addDefault("HELP.SHOP_EDIT", "상점에 있는 아이탬을 수정합니다."); + ccLang.get().addDefault("HELP.SHOP_ADD_HAND", "손에 들고 있는 아이템을 상점에 추가합니다."); + ccLang.get().addDefault("HELP.SHOP_ADD_ITEM", "상점에 아이템을 추가합니다."); + ccLang.get().addDefault("HELP.SHOP_EDIT", "상점에 있는 아이템을 수정합니다."); ccLang.get().addDefault("HELP.PRICE", "§7가격은 다음과 같이 계산됩니다: median*value/stock"); ccLang.get().addDefault("HELP.INF_STATIC", "§7median<0 == 고정가격 stock<0 == 무한재고"); - ccLang.get().addDefault("HELP.EDIT_ALL", "상점의 모든 아이탬을 한번에 수정합니다."); + ccLang.get().addDefault("HELP.EDIT_ALL", "상점의 모든 아이템을 한번에 수정합니다."); ccLang.get().addDefault("HELP.RELOAD", "플러그인을 재시작 합니다."); ccLang.get().addDefault("HELP.RELOADED", "플러그인 리로드됨!"); ccLang.get().addDefault("HELP.USAGE", "사용법"); ccLang.get().addDefault("HELP.ITEM_ALREADY_EXIST", "§7§o{item}(은)는 이미 판매중임.\n {info}\n 명령어를 입력하면 값이 수정됩니다."); ccLang.get().addDefault("HELP.ITEM_INFO", "§7§o{item}의 현재 설정:\n {info}"); - ccLang.get().addDefault("HELP.REMOVE_ITEM", "§f인자를 0으로 입력하면 이 아이탬을 상점에서 §4제거§f합니다."); - ccLang.get().addDefault("HELP.QSELL", "§f빠르게 아이탬을 판매합니다."); + ccLang.get().addDefault("HELP.REMOVE_ITEM", "§f인자를 0으로 입력하면 이 아이템을 상점에서 §4제거§f합니다."); + ccLang.get().addDefault("HELP.QSELL", "§f빠르게 아이템을 판매합니다."); ccLang.get().addDefault("HELP.DELETE_OLD_USER", "장기간 접속하지 않은 유저의 데이터를 삭제합니다."); ccLang.get().addDefault("HELP.ACCOUNT", "상점의 계좌 잔액을 설정합니다. -1 = 무제한"); ccLang.get().addDefault("HELP.SET_TO_REC_ALL", "§e상점의 모든 아이템 설정값을 권장값으로 §c초기화§e합니다."); ccLang.get().addDefault("HELP.SHOP_ENABLE", "상점을 활성화 또는 비활성화 합니다."); ccLang.get().addDefault("ERR.NO_USER_ID", "§6플레이어 uuid를 찾을 수 없습니다. 상점 이용 불가능."); - ccLang.get().addDefault("ERR.ITEM_NOT_EXIST", "상점에 해당 아이탬이 존재하지 않습니다."); - ccLang.get().addDefault("ERR.ITEM_FORBIDDEN", "사용할 수 없는 아이탬 입니다."); + ccLang.get().addDefault("ERR.ITEM_NOT_EXIST", "상점에 해당 아이템이 존재하지 않습니다."); + ccLang.get().addDefault("ERR.ITEM_FORBIDDEN", "사용할 수 없는 아이템 입니다."); ccLang.get().addDefault("ERR.NO_PERMISSION", "§e권한이 없습니다."); ccLang.get().addDefault("ERR.WRONG_USAGE", "잘못된 명령어 사용법. 도움말을 확인하세요."); ccLang.get().addDefault("ERR.NO_EMPTY_SLOT", "상점에 빈 공간이 없습니다."); ccLang.get().addDefault("ERR.WRONG_DATATYPE", "인자의 유형이 잘못 입력되었습니다."); ccLang.get().addDefault("ERR.VALUE_ZERO", "인자값이 0보다 커야 합니다."); - ccLang.get().addDefault("ERR.WRONG_ITEM_NAME", "유효하지 않은 아이탬 이름입니다."); - ccLang.get().addDefault("ERR.HAND_EMPTY", "아이탬을 손에 들고 있어야 합니다."); - ccLang.get().addDefault("ERR.HAND_EMPTY2", "§c§o아이탬을 손에 들고 있어야 합니다!"); + ccLang.get().addDefault("ERR.WRONG_ITEM_NAME", "유효하지 않은 아이템 이름입니다."); + ccLang.get().addDefault("ERR.HAND_EMPTY", "아이템을 손에 들고 있어야 합니다."); + ccLang.get().addDefault("ERR.HAND_EMPTY2", "§c§o아이템을 손에 들고 있어야 합니다!"); ccLang.get().addDefault("ERR.SHOP_NOT_FOUND", "§f해당 상점을 찾을 수 없습니다."); ccLang.get().addDefault("ERR.SHOP_EXIST", "해당 이름을 가진 상점이 이미 존재합니다."); ccLang.get().addDefault("ERR.SHOP_NOT_EXIST", "그런 이름을 가진 상점이 없습니다."); @@ -409,7 +410,7 @@ public static void setupLangFile(String lang) ccLang.get().addDefault("ERR.LOCAL_SHOP_REMOTE_ACCESS", "해당 상점은 직접 방문해야만 사용할 수 있습니다."); ccLang.get().addDefault("ERR.MAX_LOWER_THAN_MIN", "최대 가격은 최소 가격보다 커야합니다."); ccLang.get().addDefault("ERR.DEFAULT_VALUE_OUT_OF_RANGE", "기본 가격은 최소 가격과 최대 가격 사이의 값이어야 합니다."); - ccLang.get().addDefault("ERR.NO_RECOMMEND_DATA", "Worth.yml 파일에 이 아이탬의 정보가 없습니다."); + ccLang.get().addDefault("ERR.NO_RECOMMEND_DATA", "Worth.yml 파일에 이 아이템의 정보가 없습니다."); ccLang.get().addDefault("ERR.JOBS_REBORN_NOT_FOUND", "Jobs reborn 플러그인을 찾을 수 없습니다."); ccLang.get().addDefault("ERR.PLAYER_POINTS_NOT_FOUND", "Player points 플러그인을 찾을 수 없습니다."); ccLang.get().addDefault("ERR.SHOP_HAS_INF_BAL", "{shop} 상점은 무한계좌 상점입니다."); @@ -771,6 +772,7 @@ public static void setupLangFile(String lang) ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_POINT", "§fNot enough points. balance: {bal}"); ccLang.get().addDefault("MESSAGE.NOT_ENOUGH_PLAYER_POINT", "§fNot enough player points. balance: {bal}"); ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL", "§fThere are no items for sale."); + ccLang.get().addDefault("MESSAGE.NO_ITEM_TO_SELL_2", "§fThere are no items available for sale."); ccLang.get().addDefault("MESSAGE.INVENTORY_FULL", "§4There are no empty spaces in your inventory!"); ccLang.get().addDefault("MESSAGE.IRREVERSIBLE", "§fThis action is irreversible!"); ccLang.get().addDefault("MESSAGE.ITEM_ADDED", "Item added!");