forValidRefs extension function
This commit is contained in:
parent
a63d9e15b5
commit
44647d1228
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user