1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Как сделать виртуальный сундук?

Тема в разделе "Разработка плагинов для новичков", создана пользователем Worldhipe, 30 мар 2023.

  1. Автор темы
    Worldhipe

    Worldhipe Новичок

    Баллы:
    6
    Имя в Minecraft:
    Worldhipe
    Я относительно недавно 2-3 недели начал изучать Java я бы хотел узнать как можно сделать виртуальный сундук с сохранением предметов, грубо говоря просто сундук через команду.

    Спасибо заранее!
     
  2. SlenderMix

    SlenderMix Активный участник Пользователь

    Баллы:
    76

    Код:
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.Chest;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.*********ventory.Inventory;
    import org.*********ventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
    
    import java.util.HashMap;
    
    public class VirtualChestPlugin extends JavaPlugin implements CommandExecutor {
    
        // Создаем HashMap для хранения инвентарей игроков
        private HashMap<String, Inventory> playerInventories = new HashMap<>();
    
        @Override
        public void onEnable() {
            // Регистрируем команду
            getCommand("virtualchest").setExecutor(this);
        }
    
        // Обработка команды
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (sender instanceof Player) {
                Player player = (Player) sender;
                Block block = player.getTargetBlock(null, 5);
    
                if (block.getType() == Material.CHEST) {
                    Chest chest = (Chest) block.getState();
                    String playerName = player.getName();
    
                    // Если у игрока уже есть виртуальный сундук, открываем его инвентарь
                    if (playerInventories.containsKey(playerName)) {
                        Inventory inventory = playerInventories.get(playerName);
                        player.openInventory(inventory);
                    } else {
                        // Иначе создаем новый виртуальный сундук и открываем его инвентарь
                        Inventory inventory = this.getServer().createInventory(player, chest.getInventory().getSize(), "Virtual Chest");
                        inventory.setContents(chest.getInventory().getContents());
                        playerInventories.put(playerName, inventory);
                        player.openInventory(inventory);
                    }
                } else {
                    player.sendMessage("Вы должны быть рядом с сундуком, чтобы открыть виртуальный сундук.");
                }
            } else {
                sender.sendMessage("Эта команда может быть выполнена только игроком.");
            }
    
            return true;
        }
    
        // Обработка события закрытия инвентаря игрока
        @EventHandler
        public void onInventoryClose(org.bukkit.event.inventory.InventoryCloseEvent event) {
            Player player = (Player) event.getPlayer();
            String playerName = player.getName();
    
            // Если игрок закрыл виртуальный сундук, сохраняем его содержимое
            if (playerInventories.containsKey(playerName)) {
                Inventory inventory = playerInventories.get(playerName);
                Chest chest = (Chest) player.getTargetBlock(null, 5).getState();
                chest.getInventory().setContents(inventory.getContents());
                playerInventories.remove(playerName);
            }
        }
    }
    
    Способ хранения можешь сам придумать sql, xml, json просто модифицируй код под себя
     
  3. SlenderMix

    SlenderMix Активный участник Пользователь

    Баллы:
    76
    upload_2023-3-30_23-18-0.png
    upload_2023-3-30_23-18-23.png
    Что за дурная защита?
     
  4. SlenderMix

    SlenderMix Активный участник Пользователь

    Баллы:
    76
    Код:
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.*********ventory.Inventory;
    import org.*********ventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.json.simple.JSONArray;
    import org.json.simple.JSONObject;
    import org.json.simple.parser.JSONParser;
    import org.json.simple.parser.ParseException;
    
    import java.io.*;
    
    public class VirtualChestPlugin extends JavaPlugin {
    
        private JSONObject chestData;
    
        @Override
        public void onEnable() {
            loadChestData();
        }
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (cmd.getName().equalsIgnoreCase("virtualchest")) {
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ChatColor.RED + "Эту команду может использовать только игрок!");
                    return true;
                }
                Player player = (Player) sender;
                Inventory chestInventory = getVirtualChestInventory(player);
                player.openInventory(chestInventory);
                return true;
            }
            return false;
        }
    
        private Inventory getVirtualChestInventory(Player player) {
            // Получаем данные виртуального сундука игрока
            JSONArray playerData = getPlayerChestData(player);
            Inventory chestInventory = getServer().createInventory(null, 27, "Виртуальный сундук");
            for (int i = 0; i < playerData.size(); i++) {
                JSONObject itemData = (JSONObject) playerData.get(i);
                int slot = Integer.parseInt(itemData.get("slot").toString());
                String materialName = itemData.get("material").toString();
                Material material = Material.getMaterial(materialName);
                if (material != null) {
                    int amount = Integer.parseInt(itemData.get("amount").toString());
                    ItemStack itemStack = new ItemStack(material, amount);
                    chestInventory.setItem(slot, itemStack);
                }
            }
            return chestInventory;
        }
    
        private JSONArray getPlayerChestData(Player player) {
            // Получаем данные виртуального сундука игрока из JSON
            String playerUUID = player.getUniqueId().toString();
            if (chestData.containsKey(playerUUID)) {
                JSONArray playerData = (JSONArray) chestData.get(playerUUID);
                return playerData;
            } else {
                JSONArray playerData = new JSONArray();
                chestData.put(playerUUID, playerData);
                saveChestData();
                return playerData;
            }
        }
    
        private void loadChestData() {
            // Загружаем данные виртуальных сундуков из JSON
            File chestDataFile = new File(getDataFolder(), "chest_data.json");
            if (chestDataFile.exists()) {
                try {
                    FileReader fileReader = new FileReader(chestDataFile);
                    JSONParser parser = new JSONParser();
                    Object obj = parser.parse(fileReader);
                    chestData = (JSONObject) obj;
                } catch (IOException | ParseException e) {
                    e.printStackTrace();
                }
            } else {
                chestData = new JSONObject();
            }
        }
    
        private void saveChestData() {
            // Сохраняем данные виртуальных сундуков в JSON 
          try {
                File chestDataFile = new File(getDataFolder(), "chest_data.json");
                FileWriter fileWriter = new FileWriter(chestDataFile);
                fileWriter.write(chestData.toJSONString());
                fileWriter.flush();
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    Библиотеку юзал json-simple.jar
     
  5. SlenderMix

    SlenderMix Активный участник Пользователь

    Баллы:
    76
    Структура файла с данными:

    Код:
    {
      "player1": {
        "contents": [
          {
            "item": "minecraft:diamond_sword",
            "amount": 1,
            "slot": 0
          },
          {
            "item": "minecraft:diamond_pickaxe",
            "amount": 1,
            "slot": 1
          }
        ],
        "size": 27
      },
      "player2": {
        "contents": [
          {
            "item": "minecraft:iron_sword",
            "amount": 1,
            "slot": 0
          }
        ],
        "size": 27
      }
    }
     
  6. Автор темы
    Worldhipe

    Worldhipe Новичок

    Баллы:
    6
    Имя в Minecraft:
    Worldhipe
    Хорошо, спасибо!
     

Поделиться этой страницей