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

Помогите Как правильно установить и считать MetaData (в блоке)?

Ken12345

Активный участник
Пользователь
Баллы
61
Делаю плагин для своей мини-игры. Один из предметов должен создавать блок паутины, который смогут сломать простые игроки, и он его успешно создает, но ивент почему-то не видит эту МетаДату и всё равно отменяет событие, не давая сломать блок. Почему?
Ивент зарегистрирован, плагин передается, что ему ещё надо то?
TDPV38bQ_vg.jpg

R_dPdrrEMA8.jpg

-B0Es7SLJ0o.jpg
 
Никак, сохраняй локацию блока где-то.
У обычных блоков не сохраняются такие вещи.
 
Никак, сохраняй локацию блока где-то.
У обычных блоков не сохраняются такие вещи.
Metadata вроде должна храниться до рестарта (не путать с PDH), иначе бы блоки и Metadatable не расширяли.
Делаю плагин для своей мини-игры. Один из предметов должен создавать блок паутины, который смогут сломать простые игроки, и он его успешно создает, но ивент почему-то не видит эту МетаДату и всё равно отменяет событие, не давая сломать блок. Почему?
Ивент зарегистрирован, плагин передается, что ему ещё надо то?
TDPV38bQ_vg.jpg

R_dPdrrEMA8.jpg

-B0Es7SLJ0o.jpg
Только что проверил у себя, и проблем с добавлением и проверки меты нет. Так что могу лишь сказать, что делаешь что-то не так. Для начала просто убери проверку на isOp.
 
Для начала просто убери проверку на isOp.
Проверка работает нормально, не думаю, что дело в ней.
Скорее всего, я делаю что-то не так с вписыванием значения "plugin".
Не мог бы ты показать свой работающий код, дабы я сравнил? (главный класс и класс слушателя)
Заранее спасибо.

Если можешь предложить какой-то более хороший способ разделить блоки на разрушаемые и неразрушаемые для арены мини-игры - я внимательно слушаю.
 
Проверка работает нормально, не думаю, что дело в ней.
Но убрать все равно стоит для чистоты эксперимента.
Скорее всего, я делаю что-то не так с вписыванием значения "plugin".
Вряд ли. Разве что если ты вписываешь null в plugin, но тогда бы у тебя ошибки сыпались.
Не мог бы ты показать свой работающий код, дабы я сравнил? (главный класс и класс слушателя)
Это минимальный сетап, показывать толком и нечего - всё в одном классе выполнено.
PHP:
@Override
public void onEnable() {
    getServer().getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onBreak(BlockBreakEvent event) {
    if (event.getBlock().hasMetadata("MyCoolMeta")) {
        event.getPlayer().sendMessage("Has meta");
    } else {
        event.getPlayer().sendMessage("No meta");
    }
}

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    Player player = (Player) sender;
    player.getTargetBlock(10).setMetadata("MyCoolMeta", new FixedMetadataValue(this, 1));
    return true;
}
Стабильно показывает "Has meta" на отмеченных командой блоках, и "No meta" на других.
Если можешь предложить какой-то более хороший способ разделить блоки на разрушаемые и неразрушаемые для арены мини-игры - я внимательно слушаю.
Использование Metadata в данном случае более чем приемлемо. Но, как предлагал HauserGrim, можно вручную записывать локации блоков в какой-нибудь Set<Location> и проверять наличие блоков там при разрушении.

По теме в принципе - может, ты где-то ещё отменяет разрушение блока?
 
В общем, я не понимаю в чем действительно проблема. Может это какой-то баг/несовместимость. Ближе к сути:
После создание этой темы я попробовал по-другому:
Создал приватное статическое поле ДжаваПлагина в главном классе, прописываю plugin = this в OnEnable(), создаю геттер и меняю везде прошлую запись "plugin" на использование этого геттера "ГлКласс.getPlugin()". РАБОТАЕТ.
Сижу себе дальше, делаю инвентари, айтемы, конфиг, всё что связано с метадатой вообще не трогал. Запускаю сервер. НЕ РАБОТАЕТ.
Я знаю, что метадата, как и хэшмап сбрасывают все значения при перезапуске сервера, но у меня то оно вообще не работает, я ставлю блок, а сломать не могу.
Мучаюсь, мучаюсь, меняю всё обратно на передачу плагина из конструктора, как показано на моих скриншотах в теме выше - РАБОТАЕТ. типо.. чо?
Далее опять такая же ситуация, после написания ещё пары-тройки айтемов и инвентарей. Надоело, решил полностью всё поменять. Убрал Метадату, создал Хешмап, в общем то тут суть та же, добавляю локацию блока - проверяю - удаляю. Запустил. РАБОТАЕТ.
А после нескольких добавлений кода в другую часть проекта, как думаете что? НЕ РАБОТАЕТ.
Решил по приколу сменить версию Джавы в pom - РАБОТАЕТ.
А потом что же случилось через часик-другой??? НЕ РАБОТАЕТ.

Я не думаю, что будь это какая-то синтаксическая ошибка в коде, Метадата и Хэшмап вели бы себя так. Они работают. Иногда. Может кто-то и сталкивался с такой проблемой, но меня эти качели уже знатно достали.

Версия Джавы в pom: изначально 1.8, смена на 17 дала результат до следующего обновления кода проекта.
Версия ядра локального сервера: purpur-1.19.3-1895
Плагин создаю в Интеллидж с помощью плагина для Майнкрафта (конкретнее: выбираю paper 1.19.3, maven).
 
Как правило, любые подобные непостоянства все равно являются следствием каких-либо действий разработчика, будь то в коде или на сервере. Могу лишь посоветовать закинуть рабочие классы куда-нибудь онлайн, сможем посмотреть. Если с Metadata ещё есть какой-то шанс, что дело в сервере, то когда работаешь с HashMap, сервер тут уже вряд ли чего сможет вытворить.
 

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

Назад
Верх