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

Помогите При ломании конкретного блока выданного командой выпадает обычный блок

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

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

    ver6ena Активный участник

    Баллы:
    61
    Имя в Minecraft:
    ver6ena
    Возможно по теме не понятно. Смотрите, есть команда на выдачу блока, в этом блоке есть описание, название, ну вообщем ItemMeta присутствует. Я получаю этот блок и хочу поставить. Если я его поставлю и захочу снова его сломать, выпадает тот же блок, но без названия и описания. Я думаю если делать еще ивенты к этому блоку, если его поставить, то они будут работать на всех блоках, у которых дефолтное название. Как сделать, чтобы при ломании этого блока, выпадал тот же блок, который я сломал(с названием, описанием и тд)?
     
  2. NoLogic

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

    Баллы:
    66
    Так всегда было. Это ожидаемое поведение. Тебе нужно самостоятельно сериализовать мету блока и сохранить её где-нибудь вместе с координатами (датабаза или обычный файл в директории плагина, тут без разницы), а потом отследить BlockBreakEvent: если координаты сломанного блока есть в датабазе, то мета дропа изменится на мету из ДБ.
     
  3. Автор темы
    ver6ena

    ver6ena Активный участник

    Баллы:
    61
    Имя в Minecraft:
    ver6ena
    Ни разу не связывался с этим, не подскажешь как работать с датабазой? Как ее создать и передавать с плагина в нее?
     
  4. NoLogic

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

    Баллы:
    66
    Проще всего воспользоваться SQLite, т. к. такая ДБ может храниться локально, прямо в директории плагина. Там нет ничего сложного, но если для тебя это первый раз, постарайся не запутаться в синтаксисе SQL. Если будут какие-нибудь вопросы — спрашивай.

    Туториалов много: https://www.tutorialspoint.com/sqlite/sqlite_java.htm
     
  5. NoLogic

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

    Баллы:
    66
  6. Автор темы
    ver6ena

    ver6ena Активный участник

    Баллы:
    61
    Имя в Minecraft:
    ver6ena
    Я так и не понял, нужно получается создать новый класс, где создается сама база данных?
    Или же нужно создать базу данных в onEnable?

    Я вообще впервые работаю с базой данных. Да и вообще только учусь делать плагины :)

    Я создал в новом классе это
    HTML:
    package noob.bagalast.kalyan;
    
    import java.sql.*;
    
    public class Database {
        public static void main(String args[]){
            Connection c = null;
            Statement stmt = null;
    
            try {
                Class.forName("org.sqite.JDBC");
                c = DriverManager.getConnection("jdbc:sqlite:test.db");
                stmt = c.createStatement();
                String sql = "CREATE TABLE LOCATION " +
                        "(ID INT PRIMARY KEY     NOT NULL," +
                        " X           INT, " +
                        " Y            INT, " +
                        " Z        INT, ";
    
                stmt.executeUpdate(sql);
                stmt.close();
                c.close();
            } catch (SQLException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    
    Как мне передать loc_x,loc_y,loc_z?
    HTML:
    package noob.bagalast.kalyan;
    
    import org.bukkit.Effect;
    
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.block.BlockPlaceEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.*********ventory.ItemStack;
    
    
    public class Kalik implements Listener {
    
    //на это забейте)
        public void OnRightClick(PlayerInteractEvent event) {
            Player player = (Player) event.getPlayer();
            if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
                Effect effect = Effect.SMOKE;
            }
        }
    //
        public ItemStack PlaceBlock(BlockPlaceEvent event){
            ItemStack item = new giveKalik().kalik();
            if (event.getBlockPlaced().getBlockData().getMaterial().equals(item.getType())){
                loc_x = event.getBlockPlaced().getLocation().getBlockX();
                loc_y = event.getBlockPlaced().getLocation().getBlockY();
                loc_z = event.getBlockPlaced().getLocation().getBlockZ();
            }
            return null;
        }
    
    }
    
     
    Последнее редактирование: 8 июл 2023
  7. NoLogic

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

    Баллы:
    66
    1. Советую зайти на метанит и почитать про конструкцию try-with-resources. Местами упрощает тебе работу и делает код слегка читабельнее.
    2. Базу данных можешь создавать в любом месте своей программы. Но обычно проверки и инициализация происходят на этапе запуска плагина, да.
    3. Чтобы сохранить локацию блока, тебе нужно получить координаты, подключиться к ДБ, подготовить запрос INSERT и на его основе создать PreparedStatement, после чего заполнить его данными и вызывать PreparedStatement#executeUpdate(). Советую пройти туториал, т. к. это буквально азы. Из SQL тебе сейчас нужно всего лишь три ключевых слова: INSERT, UPDATE и SELECT, так что времени это много не займёт.
     

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