Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

Worldhipe

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

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

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


Код:
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 просто модифицируй код под себя
 
Код:
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 просто модифицируй код под себя
upload_2023-3-30_23-18-0.png
upload_2023-3-30_23-18-23.png
Что за дурная защита?
 
Код:
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 просто модифицируй код под себя
Код:
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
 
Код:
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

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

Код:
{
  "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
  }
}
 

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

Назад
Верх