GoldenSunsetMine
Пользователь
- Сообщения
- 121
- Решения
- 2
Столкнулся с проблемой: при выставлении предмета на продажу и вызове метода его сериализации учитывается, был ли инвентарь с этим предметом открыт хотя бы раз. Если инвентарь не был открыт, можно продать только тот предмет, инвентарь которого не был открыт. Если же инвентарь был открыт при выставлении предмета на продажу, то продать можно будет только предмет, инвентарь которого был открыт. Это нужно исправить и сделать чтобы в сериализации не учитывалась данная фигня.
Java:
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
Block clickedBlock = event.getClickedBlock();
if (clickedBlock != null && (clickedBlock.getType() == Material.CHEST || clickedBlock.getType() == Material.TRAPPED_CHEST)) {
Chest chest = (Chest) clickedBlock.getState();
Location loc = chest.getLocation();
String locString = loc.getWorld().getName() + ","
+ loc.getBlockX() + "," + loc.getBlockY() + "," + loc.getBlockZ();
if (shopManager.shopConfig.contains(locString)) {
event.setCancelled(true);
String action = shopManager.shopConfig.getString(locString + ".action");
int price = shopManager.shopConfig.getInt(locString + ".price");
ItemStack itemShop = shopManager.deserializeItemStack(shopManager.shopConfig.getString(locString + ".item"));
if (action.equalsIgnoreCase("buy")) {
if (player.getInventory().firstEmpty() != -1) {
if (Main.economy.getBalance(player) >= price) {
Main.economy.withdrawPlayer(player, price);
player.getInventory().addItem(itemShop);
String displayName = (itemShop.hasItemMeta() && itemShop.getItemMeta().hasDisplayName()) ? itemShop.getItemMeta().getDisplayName() : itemShop.getType().toString();
player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Вы купили &r" + displayName + " x" + itemShop.getAmount() + " &6за " + price + "$"));
} else {
player.sendMessage(ChatColor.RED + "У Вас недостаточно денег.");
}
} else {
player.sendMessage(ChatColor.RED + "Ваш инвентарь полон.");
}
} else if (action.equalsIgnoreCase("sell")) {
ItemStack itemStack = null;
for (ItemStack stack : player.getInventory().getContents()) {
if (stack != null && stack.isSimilar(itemShop)) {
itemStack = stack;
break;
}
}
if (itemStack != null && itemStack.getAmount() >= itemShop.getAmount()) {
ItemMeta itemMeta = itemShop.getItemMeta();
String displayName = (itemMeta == null || itemMeta.getDisplayName() == null) ? itemShop.getI18NDisplayName() : itemMeta.getDisplayName();
Main.economy.depositPlayer(player, price);
itemStack.setAmount(itemStack.getAmount() - itemShop.getAmount());
player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Вы продали &r" + displayName + " x" + itemShop.getAmount() + " &6за " + price + "$"));
} else {
player.sendMessage(ChatColor.RED + "Вашего товара недостаточно.");
}
}
}
}
}
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (sender instanceof Player) {
Player player = (Player) sender;
if (args.length == 1 && args[0].equalsIgnoreCase("list")) {
player.sendMessage(ChatColor.YELLOW + "Найдены следующие магазине на сервере:");
for (String locString : shopManager.shopConfig.getKeys(false)) {
String[] locData = locString.split(",");
String worldName = locData[0];
int x = Integer.parseInt(locData[1]);
int y = Integer.parseInt(locData[2]);
int z = Integer.parseInt(locData[3]);
Location loc = new Location(Bukkit.getWorld(worldName), x, y, z);
String itemString = shopManager.shopConfig.getString(locString + ".item");
ItemStack item = shopManager.deserializeItemStack(itemString);
String displayName = (item.hasItemMeta() && item.getItemMeta().hasDisplayName()) ? item.getItemMeta().getDisplayName() : item.getType().toString();
TextComponent jumpText = new TextComponent(ChatColor.translateAlternateColorCodes('&', " &f- &a" + loc.getWorld().getName() + "," + loc.getBlockX() + "," + loc.getBlockY() + "," + loc.getBlockZ() + " &f| " + displayName));
jumpText.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(ChatColor.GRAY + "Нажмите, для телепортации к магазину.").create()));
jumpText.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tp " + loc.getBlockX() + " " + loc.getBlockY() + " " + loc.getBlockZ()));
player.spigot().sendMessage(jumpText);
}
return true;
} else if (args.length == 2 && (args[0].equalsIgnoreCase("sell") || args[0].equalsIgnoreCase("buy"))) {
Block block = player.getTargetBlock(null, 5);
if (block == null || (block.getType() != Material.CHEST && block.getType() != Material.TRAPPED_CHEST)) {
player.sendMessage(ChatColor.RED + "Ошибка! Вы должны смотреть на сундук.");
return true;
}
String action = args[0];
int price;
try {
price = Integer.parseInt(args[1]);
} catch (NumberFormatException e) {
player.sendMessage(ChatColor.RED + "Ошибка! Ваша цена не является допустимой.");
return true;
}
ItemStack item = player.getInventory().getItemInMainHand();
Location loc = block.getLocation();
String locString = loc.getWorld().getName() + ","
+ loc.getBlockX() + "," + loc.getBlockY() + "," + loc.getBlockZ();
shopManager.shopConfig.set(locString + ".item", shopManager.serializeItemStack(item));
shopManager.shopConfig.set(locString + ".action", action);
shopManager.shopConfig.set(locString + ".price", price);
try {
shopManager.shopConfig.save(shopManager.shopFile);
} catch (IOException e) {
e.printStackTrace();
}
String displayName = (item.hasItemMeta() && item.getItemMeta().hasDisplayName()) ? item.getItemMeta().getDisplayName() : item.getType().toString();
player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6SkyPvP: &eМагазин успешно создан. Предмет: &r" + displayName + " x" + item.getAmount() + "&e, Действие: &f" + action + "&e, Цена: &f" + price + "$"));
return true;
} else {
player.sendMessage(ChatColor.RED + "Неверный формат команды. Используйте: ");
player.sendMessage(ChatColor.RED + "/skyshop list - Просмотреть список магазинов");
player.sendMessage(ChatColor.RED + "/skyshop <sell/buy> <цена> - Создать магазин для продажи/покупки предмета");
}
}
return true;
}
public String serializeItemStack(ItemStack itemStack) {
if (itemStack == null || itemStack.getType() == Material.AIR) {
return "";
}
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BukkitObjectOutputStream bukkitOutput = new BukkitObjectOutputStream(outputStream)) {
bukkitOutput.writeObject(itemStack);
return Base64.getEncoder().encodeToString(outputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
public ItemStack deserializeItemStack(String data) {
if (data == null || data.isEmpty()) {
return new ItemStack(Material.AIR);
}
try {
byte[] decodedData = Base64.getDecoder().decode(data);
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(decodedData);
BukkitObjectInputStream bukkitInput = new BukkitObjectInputStream(inputStream)) {
return (ItemStack) bukkitInput.readObject();
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return new ItemStack(Material.AIR);
}
}