Переопредение метода onBlockAdded (@Deprecated, 1.19.4)

Версия Minecraft
1.19.4
API
Fabric
Новичок, вопрос наверняка тупой. Обычно докапывааю ChatGPT, но тут и он выбросил белый флаг.

Дисклеймер: учусь на чужом опыте, пытаюсь дублировать механику зараженной листвы мода Ex Nihilo на 1.7.10, но мод делаю на 1.19.4, API Fabric.

Итак, я создаю блок зараженной листвы, который наследует ванильный блок листвы. В момент появления в мире он должен запустить таймер заражения, по мере которого листва должна постепенно обесцвечиваться до белого. Для этого пытаюсь переопределить метод onBlockAdded:

LeavesInfestedBlock:
public class LeavesInfestedBlock extends LeavesBlock {

    public LeavesInfestedBlock(){
        super(FabricBlockSettings.of(Material.LEAVES).sounds(BlockSoundGroup.GRASS));
    }

    @Override
    public void onBlockAdded(World world, BlockPos pos, BlockState state, boolean notify){
        super.[S]onBlockAdded[/S](world, pos, state, notify);
        startDecay(world, pos);
    }

    private void startDecay(World world, BlockPos pos){
//запуск таймера
    }

Однако, я сталкиваюсь с нетривиальной проблемой. Дело в том, что метод onBlockAdded берется из класса AbstactBlock, прадеда для моего LeavesInfestedBlock, и там есть два одноименных метода:

AbstractBlock:
public abstract class AbstractBlock implements ToggleableFeature {
  
    @Deprecated
    public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) {
    }
  
    public void onBlockAdded(World world, BlockPos pos, BlockState state, boolean notify) {
            this.getBlock().onBlockAdded(this.asBlockState(), world, pos, state, notify);
        }

По идее среда разработки (IDEA) должна по передаваемым параметрам понять, какой из них я хочу переопределить. Однако этого не происходит... В выделенной строке:

super.[S]onBlockAdded[/S](world, pos, state, notify);

перечеркивание указывает на использование устаревшего метода, который с аннотацией @Deprecated, при наведении в выпадающей подсказке это подтверждается. Соответственно передаваемые параметры этим методом уже не принимаются.

Что, блин, происходит, и как это исправить?
 
Последнее редактирование:
1,371
112
241
Названия у методов может быть и одинаковы, но сигнатуры разные. Java сама подберёт необходимый метод.
Deprecated - значит устаревшее использование (со след. версией могут убрать). В последних версиях майна таких аннотаций огромная туча даже на тех методах, что не меняются уже года 3.
Пока можешь на это забить.

Ну и собственно, встречный вопрос: а есть ли какая-то особая причина не использовать public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) вместо public void onBlockAdded(World world, BlockPos pos, BlockState state, boolean notify) , тем более, что последний вызывает первый?
 
@_SupCM_ , особой причины нет, я вообще впервые сталкиваюсь с задачей переопределения метода. На этом примере вообще и узнала, что так бывает (меня учит ChatGPT, да, грешна). Тупо забить не могу, потому что у меня вот такая картина:

Безымянный.png

Мне, выходит, переключиться на использование устаревшего метода? Типа забить, что он устаревший, добавить параметр BlockState oldState в обе строки и просто работать дальше?

Просто казалось, что это прям реально некомильфо устаревший метод использовать. Вдобавок, если уж возникла такая проблема, хочется разобраться, чтобы вообще уметь решать подобные вопросы.
 
1,371
112
241
@_SupCM_ , особой причины нет, я вообще впервые сталкиваюсь с задачей переопределения метода. На этом примере вообще и узнала, что так бывает (меня учит ChatGPT, да, грешна). Тупо забить не могу, потому что у меня вот такая картина:

Посмотреть вложение 17448

Мне, выходит, переключиться на использование устаревшего метода? Типа забить, что он устаревший, добавить параметр BlockState oldState в обе строки и просто работать дальше?

Просто казалось, что это прям реально некомильфо устаревший метод использовать. Вдобавок, если уж возникла такая проблема, хочется разобраться, чтобы вообще уметь решать подобные вопросы.
Я, конечно, всё понимаю, но ты уверен, что такой метод вообще существует в родителях?

Если я не ошибаюсь, то тебе нужен метод onPlace, у него и сигнатура та же.
 
346
25
94
перечеркивание указывает на использование устаревшего метода, который с аннотацией @Deprecated, при наведении в выпадающей подсказке это подтверждается.
Вешай @SupressWarnings("deprecation") на класс и не парься. В Forge эта аннотация используется не по прямому её назначению, тут идёт пометка, что вызывать это не стоит. К примеру в блоках, напрямую этого делать не нужно, ибо есть соответствующий метод в BlockState. Есть deprecated метод getWorld в ChunkRegion, который намекает, что модифицировать чанки тут не нужно.
 
@fukkivdan аннотацию подсвечивает как раз потому, что идет ошибка в переопределении, ибо там по мнению среды разработки неподходящие аргументы. Если скормить ему параметры устаревшего метода, то все становится окей:

Безымянный.png

@_SupCM_ да, я в первом посте даже код выложила из AbstractBlock. Про onPlace даже не знала 😅 попробую с ним, спасибо. Вроде onBlockAdded нужен для блоков, которые предварительно уведомляют о своем появлении соседние, это, кажется, единственное его принципиальное отличие. Не знаю, насколько это мой случай, но буду экспериментировать, благодарствую

@mts2200 да собственно с тем же успехом можно и тупо не писать @Override 😄

@will0376 собственно, почему и Fabric, да... Тоже Forge уже костью в горле
 
346
25
94
да собственно с тем же успехом можно и тупо не писать @Override 😄
Это костыль. Тем более, если у тебя нормально настроена инспекция Java кода, то IDEA будет также ругаться на отсутствие Override.
 
Сверху