Оптимизация по поиску блоков

Версия Minecraft
1.11.2
1,015
9
102
У меня в GUI в блоке, при установке значения слайдером, проверяются все блоки 100x100x100 вокруг на присутствие интерфейса и всяких премудростей. Вот код, который вызывается:
@Override
public void applyLinkedBlocks(){
   brokeLinksAll();
   if (energy != 0) {
       for (int z = -radius; z < radius; z++)
           for (int y = -radius; y < radius; y++)
               for (int x = -radius; x < radius; x++) {
                   BlockPos newPos = new BlockPos(x + getPos().getX(), y + getPos().getY(), z + getPos().getZ());
                   TileEntity te = world.getTileEntity(newPos);
                   if (te instanceof IFieldReceiverEnergy && ((IFieldReceiverEnergy) te).getFrequency() == frequency) {
                       IFieldReceiverEnergy block = (IFieldReceiverEnergy) te;

                       if (block.getLink() == null) {
                           createLink(te.getPos());
                           block.applyStats(ConvertVoltage(voltage));
                       } else if (((IFieldCreatorEnergy) world.getTileEntity(block.getLink())).getVoltage() < voltage) {
                           ((IFieldCreatorEnergy) world.getTileEntity(block.getLink())).brokeLink(te.getPos());
                           createLink(te.getPos());
                           block.applyStats(ConvertVoltage(voltage));
                       }
                   }
               }
   }
}
Раньше это у меня вызывалось каждый тик, и так сильно лагало, что пришлось переписать код. И я сделал так, что бы конкретные блоки искались только при обновлении значений. Просто так лагать перестало, но не при подмене значений. И тут я понял, что те конкретные блоки можно искать не перебором всех блоков, а перебором только конкретных. То есть я хочу, что бы когда игрок ставил блок, то позиция куба бы записывалась на сервер (именно куда, я не знаю, просто на сервер) в лист. А потом при подмене значения просто бы перебирались именно те блоки, которые есть в том листе


Проблема в том, что я, во-первых, не знаю куда пихать этот лист, что бы он был всегда, и был на сервере, во-вторых, если мы это будем хранить не в блоках, не в предметах и не в энтити, то как это записать в NBT?
 
Решение
У тебя тайлы, по-этому нет смысла проверять все блоки.
Достань лист тайлов из мира, проверь что они на нужных координатах и делай с ними все что хочешь, это будет очень быстро.
World#loadedTileEntities.
3,005
192
592
Minebot написал(а):
во-вторых, если мы это будем хранить не в блоках, не в предметах и не в энтити, то как это записать в NBT?

Есть WorldSavedData, в которой можно хранить список.
 
1,015
9
102
Doc написал(а):
Minebot написал(а):
во-вторых, если мы это будем хранить не в блоках, не в предметах и не в энтити, то как это записать в NBT?

Есть WorldSavedData, в которой можно хранить список.
Класс нашел. Только как получить его экземпляр, который в данном мире? Или новый надо создавать?

UPD: Нашел world.getMapStorage().getOrLoadData()
 

tox1cozZ

aka Agravaine
8,455
598
2,892
У тебя тайлы, по-этому нет смысла проверять все блоки.
Достань лист тайлов из мира, проверь что они на нужных координатах и делай с ними все что хочешь, это будет очень быстро.
World#loadedTileEntities.
 
7,099
324
1,510
А если тайлов будет больше чем 100*100*100?
 
3,005
192
592
В итоге, что та, что та проверка будет работать с лагами.
 
7,099
324
1,510
Меньше всего будет лагать то, что предложил сам автор: запоминать в кастомном контейнере позиции поставленных блоков
 
3,005
192
592
Minebot написал(а):
с помощью WorldSaveData, и было сток багов и крашей

Есть 1 лист.
При добавлении блока - добавить в лист.
При ломании блока - убрать из листа.
При проверке - проверять лист.
"сток багов и крашей" :heart:
Хз, как ты юзал, но ты делал класс, наследование класса (WorldSaveData)?
 
1,015
9
102
Doc написал(а):
Minebot написал(а):
с помощью WorldSaveData, и было сток багов и крашей

Есть 1 лист.
При добавлении блока - добавить в лист.
При ломании блока - убрать из листа.
При проверке - проверять лист.
"сток багов и крашей" :heart:
Хз, как ты юзал, но ты делал класс, наследование класса (WorldSaveData)?
Да, конечно. В эвенте, при заходе клиента на сервер, добавлял его в мир, если есть, а если нет, то создавал и синхронил с клиентом с помощью пакетов. Вроде все по логике было нормально, но на практике были проблемы с синхронизацией. Одни null экшепшены
 
Сверху