From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: wangxyper Date: Wed, 18 Jan 2023 14:39:17 +0800 Subject: [PATCH] Hearse: Some concurrent fixes Original license: MIT Original project: https://github.com/Era4FunMC/Hearse diff --git a/src/main/java/net/minecraft/world/entity/ai/gossip/GossipContainer.java b/src/main/java/net/minecraft/world/entity/ai/gossip/GossipContainer.java index 097007c1c25ba55d9916fc820dd1d1149d81f6f4..b15b47041ad891deca9ff9b3bc6d196598f27a68 100644 --- a/src/main/java/net/minecraft/world/entity/ai/gossip/GossipContainer.java +++ b/src/main/java/net/minecraft/world/entity/ai/gossip/GossipContainer.java @@ -30,7 +30,7 @@ import org.slf4j.Logger; public class GossipContainer { private static final Logger LOGGER = LogUtils.getLogger(); public static final int DISCARD_THRESHOLD = 2; - public final Map gossips = Maps.newHashMap(); + public final Map gossips = Maps.newConcurrentMap(); @VisibleForDebug public Map> getGossipEntries() { diff --git a/src/main/java/net/minecraft/world/entity/ai/memory/NearestVisibleLivingEntities.java b/src/main/java/net/minecraft/world/entity/ai/memory/NearestVisibleLivingEntities.java index d59857e9db945d5b659153e55dafa2d91c388458..3231a17627ab0d88d4a83371033dfd228c5169bc 100644 --- a/src/main/java/net/minecraft/world/entity/ai/memory/NearestVisibleLivingEntities.java +++ b/src/main/java/net/minecraft/world/entity/ai/memory/NearestVisibleLivingEntities.java @@ -1,10 +1,12 @@ package net.minecraft.world.entity.ai.memory; -import com.google.common.collect.Iterables; +import it.unimi.dsi.fastutil.objects.Object2BooleanMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanMaps; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import java.util.List; import java.util.Optional; import java.util.function.Predicate; +import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.sensing.Sensor; @@ -16,20 +18,14 @@ public class NearestVisibleLivingEntities { private NearestVisibleLivingEntities() { this.nearbyEntities = List.of(); - this.lineOfSightTest = (entity) -> { - return false; - }; + this.lineOfSightTest = (entity) -> false; } public NearestVisibleLivingEntities(LivingEntity owner, List entities) { this.nearbyEntities = entities; - Object2BooleanOpenHashMap object2BooleanOpenHashMap = new Object2BooleanOpenHashMap<>(entities.size()); - Predicate predicate = (entity) -> { - return Sensor.isEntityTargetable(owner, entity); - }; - this.lineOfSightTest = (entity) -> { - return object2BooleanOpenHashMap.computeIfAbsent(entity, predicate); - }; + Object2BooleanMap object2BooleanOpenHashMap = Object2BooleanMaps.synchronize(new Object2BooleanOpenHashMap<>(entities.size())); + Predicate predicate = (entity) -> Sensor.isEntityTargetable(owner, entity); + this.lineOfSightTest = (entity) -> object2BooleanOpenHashMap.computeIfAbsent(entity, predicate); } public static NearestVisibleLivingEntities empty() { @@ -47,15 +43,11 @@ public class NearestVisibleLivingEntities { } public Iterable findAll(Predicate predicate) { - return Iterables.filter(this.nearbyEntities, (entity) -> { - return predicate.test(entity) && this.lineOfSightTest.test(entity); - }); + return this.nearbyEntities.stream().filter((entity) -> predicate.test(entity) && this.lineOfSightTest.test(entity)).collect(Collectors.toList()); } public Stream find(Predicate predicate) { - return this.nearbyEntities.stream().filter((entity) -> { - return predicate.test(entity) && this.lineOfSightTest.test(entity); - }); + return this.nearbyEntities.stream().filter((entity) -> predicate.test(entity) && this.lineOfSightTest.test(entity)); } public boolean contains(LivingEntity entity) { diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestLivingEntitySensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/NearestLivingEntitySensor.java index 714cc41d6358ea57a23e2e663422fdba28efcf4d..0d0ca5d29f32286cb0609a1570a64731380f270c 100644 --- a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestLivingEntitySensor.java +++ b/src/main/java/net/minecraft/world/entity/ai/sensing/NearestLivingEntitySensor.java @@ -8,6 +8,7 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectLists; import net.minecraft.server.level.ServerLevel; @@ -34,7 +35,8 @@ public class NearestLivingEntitySensor extends Sensor this.entitiesCache.sort(Comparator.comparingDouble(compareCache::distanceToSqr)); Brain brain = entity.getBrain(); - final List list = this.entitiesCache.stream().map(EntityPositionCache::getCurrentEntity).toList(); + final List list = Lists.newCopyOnWriteArrayList(); + list.addAll(this.entitiesCache.stream().map(EntityPositionCache::getCurrentEntity).toList()); brain.setMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES,list); brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, new NearestVisibleLivingEntities(entity, list)); }finally {