forValidRefs extension function

This commit is contained in:
DBotThePony 2022-11-30 20:23:55 +07:00
parent a63d9e15b5
commit 44647d1228
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 31 additions and 41 deletions

View File

@ -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()
}
}
}
}

View File

@ -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 <T> Collection<T>.probablyParallelStream(): Stream<out T> {
fun <T> Array<T>.stream(): Stream<T> = Arrays.stream(this)
@Suppress("unchecked_cast")
fun <T> Stream<T?>.filterNotNull(): Stream<T> {
return filter { it != null } as Stream<T>
}
@Suppress("unchecked_cast")
inline fun <reified T> Stream<*>.filterIsInstance(): Stream<T> {
return filter { it is T } as Stream<T>
}
inline fun <T> MutableList<out Reference<out T>>.forValidRefs(fn: (T) -> Unit) {
val iterator = listIterator()
for (value in iterator) {
val get = value.get()
if (get == null) {
iterator.remove()
} else {
fn.invoke(get)
}
}
}