- 1,369
- 112
- 241
Я хочу создать карту, которую потом буду записывать в World Saved Data, содержащую String и ChunkPos. Вопрос вот в чём: в каком ивенте получать эти чанки?
Пока сделал вот это, но примерно в 2 случаях из 3 при загрузке мира майн намертво зависает. Очевидно, это из-за того, что ивент вызывается при каждой прогрузке чанка. Есть какие альтернативы?
Пока сделал вот это, но примерно в 2 случаях из 3 при загрузке мира майн намертво зависает. Очевидно, это из-за того, что ивент вызывается при каждой прогрузке чанка. Есть какие альтернативы?
В EventBusSubscriber, Forge:
public static Map<String, ChunkPos> nodes = Maps.newHashMap();
@SubscribeEvent public static void generateNodes(ChunkEvent.Load e) {
if(e.getWorld() instanceof ServerWorld) {
ServerWorld world = (ServerWorld) e.getWorld();
Random rand = new Random(world.getSeed());
ChunkPos pos = e.getChunk().getPos();
if(world.getChunk(world.getSharedSpawnPos()) == e.getChunk()) {
tryPutChunkInMap(pos, createRandKey(rand), rand);
} else {
if(rand.nextInt(20) == 0) {//Добавить в карту с 5% шансом
tryPutChunkInMap(pos, createRandKey(rand), rand);
}
}
}
}
@SubscribeEvent public static void onPlayerTick(LivingEvent.LivingUpdateEvent e) {
if(!e.getEntityLiving().level.isClientSide) {
if(nodes.containsValue(e.getEntityLiving().level
.getChunkAt(e.getEntityLiving().blockPosition()).getPos())) {
System.out.println(nodes); //Ялвяется ли узлом чанк, в котором стоит игрок
}
}
}
private static String createRandKey(Random rand) { //Временное решение
StringBuilder key = new StringBuilder();
for(int i = 0; i < 9; i++)
key.append(rand.nextInt(9));
return key.toString();
}
private static void tryPutChunkInMap(ChunkPos pos, String key, Random rand) {
if(nodes.keySet().contains(key)) {
tryPutChunkInMap(pos, createRandKey(rand), rand);
} else
nodes.put(key, pos);
}