From 44647d1228b674022a46c3359155bcd551500b32 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Wed, 30 Nov 2022 20:23:55 +0700 Subject: [PATCH] forValidRefs extension function --- .../block/entity/SynchronizedBlockEntity.kt | 54 +++++-------------- .../kotlin/ru/dbotthepony/mc/otm/core/Ext.kt | 18 +++++++ 2 files changed, 31 insertions(+), 41 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/SynchronizedBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/SynchronizedBlockEntity.kt index 6b5088e5a..8ff9ad739 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/SynchronizedBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/SynchronizedBlockEntity.kt @@ -16,6 +16,7 @@ import net.minecraftforge.event.entity.player.PlayerEvent import net.minecraftforge.event.level.ChunkWatchEvent import net.minecraftforge.event.level.LevelEvent import net.minecraftforge.event.server.ServerStoppingEvent +import ru.dbotthepony.mc.otm.core.forValidRefs import ru.dbotthepony.mc.otm.network.BlockEntitySyncPacket import ru.dbotthepony.mc.otm.network.FieldSynchronizer import ru.dbotthepony.mc.otm.network.WorldNetworkChannel @@ -304,18 +305,11 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: listIterator.remove() } else if (ref.players.isNotEmpty()) { var hitObservers = false - val blockIterator = ref.observingBlockEntities.listIterator() - for (bvalue in blockIterator) { - val bref = bvalue.get() - - if (bref == null) { - blockIterator.remove() - } else { - hitObservers = true - hitAnyObservers = true - bref.synchronizeToPlayers() - } + ref.observingBlockEntities.forValidRefs { + hitObservers = true + hitAnyObservers = true + it.synchronizeToPlayers() } if (!hitObservers) { @@ -340,16 +334,8 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: onceServer(20) { if (!event.player.hasDisconnected()) { - val iterator = blocks.listIterator() - - for (block in iterator) { - val deref = block.get() - - if (deref == null) { - iterator.remove() - } else { - deref.synchronizeToPlayers(false) - } + blocks.forValidRefs { + it.synchronizeToPlayers(false) } } } @@ -365,17 +351,8 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: playerMap.get(event.level)?.remove(event.pos.toLong()) } else { subs.changeset++ - - val iterator = subs.blockEntities.listIterator() - - for (block in iterator) { - val deref = block.get() - - if (deref == null) { - iterator.remove() - } else { - deref.synchronizer.removeEndpointFor(event.player) - } + subs.blockEntities.forValidRefs { + it.synchronizer.removeEndpointFor(event.player) } } } @@ -386,18 +363,13 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: val iterator = tree.iterator() for (entry in iterator) { - val listIterator = entry.value.players.listIterator() + if (entry.value.players.remove(event.entity)) { + entry.value.changeset++ - for (value in listIterator) { - if (value === event.entity) { - listIterator.remove() - entry.value.changeset++ + if (entry.value.isEmpty) { + iterator.remove() } } - - if (entry.value.isEmpty) { - iterator.remove() - } } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt index 614b49645..5466189c0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt @@ -28,6 +28,8 @@ import net.minecraftforge.items.IItemHandler import net.minecraftforge.registries.ForgeRegistries import net.minecraftforge.registries.ForgeRegistry import net.minecraftforge.registries.IForgeRegistry +import java.lang.ref.Reference +import java.lang.ref.WeakReference import java.math.BigInteger import java.util.Arrays import java.util.Spliterators @@ -421,10 +423,26 @@ fun Collection.probablyParallelStream(): Stream { fun Array.stream(): Stream = Arrays.stream(this) +@Suppress("unchecked_cast") fun Stream.filterNotNull(): Stream { return filter { it != null } as Stream } +@Suppress("unchecked_cast") inline fun Stream<*>.filterIsInstance(): Stream { return filter { it is T } as Stream } + +inline fun MutableList>.forValidRefs(fn: (T) -> Unit) { + val iterator = listIterator() + + for (value in iterator) { + val get = value.get() + + if (get == null) { + iterator.remove() + } else { + fn.invoke(get) + } + } +}