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.ChunkWatchEvent
|
||||||
import net.minecraftforge.event.level.LevelEvent
|
import net.minecraftforge.event.level.LevelEvent
|
||||||
import net.minecraftforge.event.server.ServerStoppingEvent
|
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.BlockEntitySyncPacket
|
||||||
import ru.dbotthepony.mc.otm.network.FieldSynchronizer
|
import ru.dbotthepony.mc.otm.network.FieldSynchronizer
|
||||||
import ru.dbotthepony.mc.otm.network.WorldNetworkChannel
|
import ru.dbotthepony.mc.otm.network.WorldNetworkChannel
|
||||||
@ -304,18 +305,11 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_:
|
|||||||
listIterator.remove()
|
listIterator.remove()
|
||||||
} else if (ref.players.isNotEmpty()) {
|
} else if (ref.players.isNotEmpty()) {
|
||||||
var hitObservers = false
|
var hitObservers = false
|
||||||
val blockIterator = ref.observingBlockEntities.listIterator()
|
|
||||||
|
|
||||||
for (bvalue in blockIterator) {
|
ref.observingBlockEntities.forValidRefs {
|
||||||
val bref = bvalue.get()
|
|
||||||
|
|
||||||
if (bref == null) {
|
|
||||||
blockIterator.remove()
|
|
||||||
} else {
|
|
||||||
hitObservers = true
|
hitObservers = true
|
||||||
hitAnyObservers = true
|
hitAnyObservers = true
|
||||||
bref.synchronizeToPlayers()
|
it.synchronizeToPlayers()
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hitObservers) {
|
if (!hitObservers) {
|
||||||
@ -340,16 +334,8 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_:
|
|||||||
|
|
||||||
onceServer(20) {
|
onceServer(20) {
|
||||||
if (!event.player.hasDisconnected()) {
|
if (!event.player.hasDisconnected()) {
|
||||||
val iterator = blocks.listIterator()
|
blocks.forValidRefs {
|
||||||
|
it.synchronizeToPlayers(false)
|
||||||
for (block in iterator) {
|
|
||||||
val deref = block.get()
|
|
||||||
|
|
||||||
if (deref == null) {
|
|
||||||
iterator.remove()
|
|
||||||
} else {
|
|
||||||
deref.synchronizeToPlayers(false)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -365,17 +351,8 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_:
|
|||||||
playerMap.get(event.level)?.remove(event.pos.toLong())
|
playerMap.get(event.level)?.remove(event.pos.toLong())
|
||||||
} else {
|
} else {
|
||||||
subs.changeset++
|
subs.changeset++
|
||||||
|
subs.blockEntities.forValidRefs {
|
||||||
val iterator = subs.blockEntities.listIterator()
|
it.synchronizer.removeEndpointFor(event.player)
|
||||||
|
|
||||||
for (block in iterator) {
|
|
||||||
val deref = block.get()
|
|
||||||
|
|
||||||
if (deref == null) {
|
|
||||||
iterator.remove()
|
|
||||||
} else {
|
|
||||||
deref.synchronizer.removeEndpointFor(event.player)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -386,14 +363,8 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_:
|
|||||||
val iterator = tree.iterator()
|
val iterator = tree.iterator()
|
||||||
|
|
||||||
for (entry in iterator) {
|
for (entry in iterator) {
|
||||||
val listIterator = entry.value.players.listIterator()
|
if (entry.value.players.remove(event.entity)) {
|
||||||
|
|
||||||
for (value in listIterator) {
|
|
||||||
if (value === event.entity) {
|
|
||||||
listIterator.remove()
|
|
||||||
entry.value.changeset++
|
entry.value.changeset++
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entry.value.isEmpty) {
|
if (entry.value.isEmpty) {
|
||||||
iterator.remove()
|
iterator.remove()
|
||||||
@ -402,4 +373,5 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,8 @@ import net.minecraftforge.items.IItemHandler
|
|||||||
import net.minecraftforge.registries.ForgeRegistries
|
import net.minecraftforge.registries.ForgeRegistries
|
||||||
import net.minecraftforge.registries.ForgeRegistry
|
import net.minecraftforge.registries.ForgeRegistry
|
||||||
import net.minecraftforge.registries.IForgeRegistry
|
import net.minecraftforge.registries.IForgeRegistry
|
||||||
|
import java.lang.ref.Reference
|
||||||
|
import java.lang.ref.WeakReference
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
import java.util.Arrays
|
import java.util.Arrays
|
||||||
import java.util.Spliterators
|
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)
|
fun <T> Array<T>.stream(): Stream<T> = Arrays.stream(this)
|
||||||
|
|
||||||
|
@Suppress("unchecked_cast")
|
||||||
fun <T> Stream<T?>.filterNotNull(): Stream<T> {
|
fun <T> Stream<T?>.filterNotNull(): Stream<T> {
|
||||||
return filter { it != null } as Stream<T>
|
return filter { it != null } as Stream<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("unchecked_cast")
|
||||||
inline fun <reified T> Stream<*>.filterIsInstance(): Stream<T> {
|
inline fun <reified T> Stream<*>.filterIsInstance(): Stream<T> {
|
||||||
return filter { it is T } as 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