mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-23 08:59:23 +00:00
105 lines
5.8 KiB
Diff
105 lines
5.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: wangxyper <wangxyper@163.com>
|
|
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<UUID, GossipContainer.EntityGossips> gossips = Maps.newHashMap();
|
|
+ public final Map<UUID, GossipContainer.EntityGossips> gossips = Maps.newConcurrentMap();
|
|
|
|
@VisibleForDebug
|
|
public Map<UUID, Object2IntMap<GossipType>> 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<LivingEntity> entities) {
|
|
this.nearbyEntities = entities;
|
|
- Object2BooleanOpenHashMap<LivingEntity> object2BooleanOpenHashMap = new Object2BooleanOpenHashMap<>(entities.size());
|
|
- Predicate<LivingEntity> predicate = (entity) -> {
|
|
- return Sensor.isEntityTargetable(owner, entity);
|
|
- };
|
|
- this.lineOfSightTest = (entity) -> {
|
|
- return object2BooleanOpenHashMap.computeIfAbsent(entity, predicate);
|
|
- };
|
|
+ Object2BooleanMap<LivingEntity> object2BooleanOpenHashMap = Object2BooleanMaps.synchronize(new Object2BooleanOpenHashMap<>(entities.size()));
|
|
+ Predicate<LivingEntity> 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<LivingEntity> findAll(Predicate<LivingEntity> 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<LivingEntity> find(Predicate<LivingEntity> 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<T extends LivingEntity> extends Sensor<T>
|
|
this.entitiesCache.sort(Comparator.comparingDouble(compareCache::distanceToSqr));
|
|
|
|
Brain<?> brain = entity.getBrain();
|
|
- final List<LivingEntity> list = this.entitiesCache.stream().map(EntityPositionCache::getCurrentEntity).toList();
|
|
+ final List<LivingEntity> 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 {
|