Оптимизированный подсчёт блоков в чанке

Версия Minecraft
1.7.10
API
Forge
236
4
22
Всем здравствуйте. Есть такой вопрос: какой наиболее оптимизированный способ подсчёта определённых блоков в конкретном чанке? (И нет, не для лимитера блоков на чанк) Если что, мне нужна возможность, чтобы по worldObj + x и z координат + Block + meta(блока) можно было узнать, сколько таких блоков есть в проверяемом чанке. Притом возможность получить такую информацию мне нужна примерно раз в 4-5 секунд, может даже чаще (из ивентов вызываться будет, если что). На текущий момент, у меня в голове лишь 2 идеи, как такое реализовать. Но обе из них имеют большие проблемы по оптимизации....
1 способ - вложенные 3 цикла и перебор всех блоков в чанке с подсчётом нужных мне. Учитывая, что чанк очень большой (особенно в высоту) - это будут жёсткие тормоза.
2 способ - "кеш" в WSD. То есть создать WSD с разделением по мирам, а дальше внутри WSD мапа с чанками и обжеками, в которых будут блоки и их кол-во. В итоге при обращении к WSD для получения информации идёт проверка, есть ли такая информация в "кеше". Если есть - выдаём, иначе тут же 3 циклами перебираем чанк чтобы получить эту информацию, кладём в кеш и возвращаем её. Этот способ, конечно, лучше предыдущего, но требуется триггер на обновление блока в мире, чтобы поддерживать "кеш" в актуальном состоянии, собственно тут то и проблема в этом способе, ведь ивента на setBlock так такого нет, только ивенты с игроком, а если вызывается worldObj#setBlock из команды /setblock или просто в каком-то моде - триггериться нечем. Пихать свой хук в setBlock - не думаю, что лучший вариант...


Может быть у вас есть более хорошие способы, как быстро посчитать кол-во определённых блоков с опред. метой в указанном чанке? Главное, чтобы не было тормозов от просчёта. Возможно в самом Chunk есть какой-то кеш на подобный случай, но я его не нашёл. Во всяком случае, надеюсь, кто-нибудь мне поможет. Заранее спасибо!
 
3,005
192
592
236
4
22
Раз ты запарился с эвентами - можно написать свой и закинуть миксином(inject) в setblock
Так то я и через ASM могу вложить триггер, но думаю, что есть что-то более надёжное 🤔....

В отдельном потоке делай и все
Увы, хз как в потоке выполнять код из ивента
Доставай айди блока из сырого массива блоков в Chunk. Это будет достаточно быстро.
Можно примерчик? И ещё, как мне мету блока проверить?
Что-то вообще не вижу здесь никакого подсчёта определённых блоков в чанке.
 
3,005
192
592
7,099
324
1,510
Ивента BlockEvent.NeighborNotifyEvent в 1.7.10 еще не было?
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Можно примерчик? И ещё, как мне мету блока проверить?
Открой Chunk#getBlock и чекни)
1624265535748.png
extendedblockstorage.getBlockByExtId то что тебе нужно. Убираем в сумме две обработки исключений (а они тяжелые очень) и получаем по сути лишь простую операцию по получению значения из массива по индексу.
Можно даже и getBlockByExtId открыть и переписать чтобы возвращал айди блока, а не объект по айди (хотя хэшмапе в регистре пофиг и она не ест перфоманс)
С метадатой есть такой же метод.
 
Сверху