Помогите Создание уникального сундука

l_Slime_l

Активный участник
Пользователь
Баллы
76
При вводе команды будет создаваться уникальный сундук. При клике на сундук будет выполняться определённый код. Как сделать этот уникальный сундук? Думаю, что нужно координаты сундука из List<Location> сравнивать с координатами сундука, на который кликнул игрок) Можно пример, а то у меня что-то не получается. Я сам не понял, что я написал, но думаю вы поймете 😁
 
Команда
Код:
private HashMap<Location, Chest> unichest = new HashMap<>();


public boolean onCommand(CommandSender sender, Command cmd, String lbl, String[] args){
if(lbl.equalsIgnoreCase("cmd")){ //Твоя команда
  Player player = (Player) sender;
  Location loc = player.getLocation();
  loc.getBlock().setType(Material.CHEST); //Возможно говнокод
  Chest chest = (Chest) loc.getBlock().getState();
  unichest.put(chest.getLocation(), chest);
}
return true;
}
Эвент
Код:
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event){
    Action a = event.getAction();
    if(a != Action.RIGHT_CLICK_BLOCK) return;
    Block block = event.getClickedBlock();
    if(block.getType() == Material.AIR) return;
    Chest chest = (Chest)block.getState();
    if(chest == unichest.get(chest.getLocation())){
         event.setCancelled(true);
        //TODO делай дальше чё хочешь.
    } else{
        return;
    }
}
}


Вот мой примерный говнокод(наверно). Думаю поможет.
Если прям очень надо можешь это ещё куда-нибудь сохранять. А то просто после перезагрузки этот сундук станет обычным.
 
Последнее редактирование:
Не рабо
Команда
Код:
private HashMap<Location, Chest> unichest = new HashMap<>();


public boolean onCommand(CommandSender sender, Command cmd, String lbl, String[] args){
if(lbl.equalsIgnoreCase("cmd")){ //Твоя команда
  Player player = (Player) sender;
  Location loc = player.getLocation();
  loc.getBlock().setType(Material.CHEST); //Возможно говнокод
  Chest chest = (Chest) loc.getBlock().getState();
  unichest.put(chest.getLocation(), chest);
}
return true;
}
Эвент
Код:
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event){
    Action a = event.getAction();
    if(a != Action.RIGHT_CLICK_BLOCK) return;
    Block block = event.getClickedBlock();
    if(block.getType() == Material.AIR) return;
    Chest chest = (Chest)block.getState();
    if(chest == unichest.get(chest.getLocation())){
        //TODO делай дальше чё хочешь.
    } else{
        return;
    }
}
}


Вот мой примерный говнокод(наверно). Думаю поможет.
Если прям очень надо можешь это ещё куда-нибудь сохранять. А то просто после перезагрузки этот сундук станет обычным.
Не работает ☹️
 
Неа. Посмотри как будет выполняться код.
  1. Проверяем тип взаимодействия. Если он не будет ровняться Клику по блоку то ничего не делаем.
  2. Получаем блок на который кликаем.
  3. Если он ровняется воздуху ничего не делаем.
  4. Кастуем этот блок к сундуку.
  5. Если это тот сундук который в мапе то отменяем взаимодействие и выполняем код дальше.
Всё просто!
 
Вот код, не работает.
Код:
public class command implements CommandExecutor, Listener {
    private HashMap<Location, Chest> chests = new HashMap<>();
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if(!(sender instanceof Player)) {
            return true;
        }
        if(cmd.getName().equalsIgnoreCase("cmd")) {
            Player p = (Player) sender;
            Location pl = p.getLocation();
            pl.getBlock().setType(Material.CHEST);
            Chest chest = (Chest) pl.getBlock().getState();
            chests.put(chest.getLocation(), chest);
            return true;
        }
        return true;
    }
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent e) {
        Action a = e.getAction();
        Player p = e.getPlayer();
        if(a != Action.RIGHT_CLICK_BLOCK) return;
        Block block = e.getClickedBlock();
        if(block.getType() == Material.AIR) return;
        Chest chest = (Chest) block.getState();
        if(chest == chests.get(chest.getLocation())) {
            e.setCancelled(true);
            p.sendMessage("chest");
        } else {
            p.sendMessage("not chest!");
            return;
        }
    }
}
 
А ты эту команду зарегал?
Говорю же, все сундуки у меня как обычные, т.е. при открытии любого сундука(даже того, который я создал командой) выполняется код, который в else { }
 
Знаю, это просто для теста)
Для теста будет выглядеть вот так.
Код:
//тут импорты
public class Main extends JavaPlugin implements Listener{
   private HashMap<Location, Chest> chests = new HashMap<>();

public void onEnable(){
        Bukkit.getPluginManager().registerEvents(this, this);
}
   public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
       if(!(sender instanceof Player)) {
           return true;
       }
       if(cmd.getName().equalsIgnoreCase("cmd")) {
           Player p = (Player) sender;
           Location pl = p.getLocation();
           pl.getBlock().setType(Material.CHEST);
           Chest chest = (Chest) pl.getBlock().getState();
           chests.put(chest.getLocation(), chest);
           return true;
       }
       return true;
   }
   @EventHandler
   public void onPlayerInteract(PlayerInteractEvent e) {
       Action a = e.getAction();
       Player p = e.getPlayer();
       if(a != Action.RIGHT_CLICK_BLOCK) return;
       Block block = e.getClickedBlock();
       if(block.getType() == Material.AIR) return;
       Chest chest = (Chest) block.getState();
       if(chest == chests.get(chest.getLocation())) {
           e.setCancelled(true);
           p.sendMessage("chest");
       } else {
           p.sendMessage("not chest!");
           return;
       }
   }
}
 
Для теста будет выглядеть вот так.
Код:
//тут импорты
public class Main extends JavaPlugin implements Listener{
   private HashMap<Location, Chest> chests = new HashMap<>();

public void onEnable(){
        Bukkit.getPluginManager().registerEvents(this, this);
}
   public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
       if(!(sender instanceof Player)) {
           return true;
       }
       if(cmd.getName().equalsIgnoreCase("cmd")) {
           Player p = (Player) sender;
           Location pl = p.getLocation();
           pl.getBlock().setType(Material.CHEST);
           Chest chest = (Chest) pl.getBlock().getState();
           chests.put(chest.getLocation(), chest);
           return true;
       }
       return true;
   }
   @EventHandler
   public void onPlayerInteract(PlayerInteractEvent e) {
       Action a = e.getAction();
       Player p = e.getPlayer();
       if(a != Action.RIGHT_CLICK_BLOCK) return;
       Block block = e.getClickedBlock();
       if(block.getType() == Material.AIR) return;
       Chest chest = (Chest) block.getState();
       if(chest == chests.get(chest.getLocation())) {
           e.setCancelled(true);
           p.sendMessage("chest");
       } else {
           p.sendMessage("not chest!");
           return;
       }
   }
}
Та какая разница?)
 
Назад
Верх