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

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

ver6ena

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

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

Туториалов много: https://www.tutorialspoint.com/sqlite/sqlite_java.htm
 
Кстати, проще сериализовывать не мету, а сам ItemStack.

https://gist.github.com/graywolf336/8153678

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

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

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

Я создал в новом классе это
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;
    }

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

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

Назад
Верх