Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Я относительно недавно 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 просто модифицируй код под себяКод: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); } } }
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(); } } }
{
"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
}
}