aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGlease <4586901+Glease@users.noreply.github.com>2023-02-21 15:05:14 +0800
committerGitHub <noreply@github.com>2023-02-21 08:05:14 +0100
commita4141b9f20b854f7c0ae3bfe6f4ef886780e9631 (patch)
treec3c3f9fe8d0124403c01f83abc116c9a5767ad49 /src
parente9f5d040a25b7e01f34ca4de84fa3bdba03f2352 (diff)
downloadGT5-Unofficial-a4141b9f20b854f7c0ae3bfe6f4ef886780e9631.tar.gz
GT5-Unofficial-a4141b9f20b854f7c0ae3bfe6f4ef886780e9631.tar.bz2
GT5-Unofficial-a4141b9f20b854f7c0ae3bfe6f4ef886780e9631.zip
Fix possible race condition between client and server thread over config circuit list (#1757)
Signed-off-by: Glease <4586901+Glease@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/main/java/gregtech/api/GregTech_API.java38
1 files changed, 16 insertions, 22 deletions
diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java
index 30f8961d0b..223d967895 100644
--- a/src/main/java/gregtech/api/GregTech_API.java
+++ b/src/main/java/gregtech/api/GregTech_API.java
@@ -5,17 +5,7 @@ import static gregtech.api.enums.GT_Values.L;
import static gregtech.api.enums.GT_Values.M;
import static gregtech.api.enums.GT_Values.MOD_ID_IC2;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TreeMap;
+import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import java.util.function.IntFunction;
@@ -194,7 +184,7 @@ public class GregTech_API {
private static final Multimap<Integer, ItemStack> sRealConfigurationList = Multimaps
.newListMultimap(new TreeMap<>(), ArrayList::new);
- private static final Map<Integer, List<ItemStack>> sConfigurationLists = new HashMap<>();
+ private static final Map<Integer, List<ItemStack>> sConfigurationLists = new ConcurrentHashMap<>();
private static final Map<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> sRealCircuitProgrammerList = new LinkedHashMap<>();
public static final Map<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> sCircuitProgrammerList = Collections
.unmodifiableMap(sRealCircuitProgrammerList);
@@ -744,8 +734,12 @@ public class GregTech_API {
if (GT_Utility.areStacksEqual(tRegistered, aStack)) return;
ItemStack stack = GT_Utility.copyAmount(0, aStack);
sRealConfigurationList.put(minTier, stack);
- sConfigurationLists.entrySet().stream().filter(e -> e.getKey() >= minTier)
- .forEach(e -> e.getValue().add(stack));
+ for (Map.Entry<Integer, List<ItemStack>> e : sConfigurationLists.entrySet()) {
+ if (e.getKey() >= minTier) {
+ e.getValue().add(stack);
+ e.getValue().sort(getConfigurationCircuitsComparator());
+ }
+ }
}
/**
@@ -757,12 +751,11 @@ public class GregTech_API {
*/
public static List<ItemStack> getConfigurationCircuitList(int machineTier) {
return Collections.unmodifiableList(
- sConfigurationLists
- .computeIfAbsent(
- machineTier,
- (t) -> sRealConfigurationList.entries().stream().filter(e -> e.getKey() <= machineTier)
- .map(Map.Entry::getValue).collect(Collectors.toList()))
- .stream().sorted(getConfigurationCircuitsComparator()).collect(Collectors.toList()));
+ sConfigurationLists.computeIfAbsent(
+ machineTier,
+ (t) -> sRealConfigurationList.entries().stream().filter(e -> e.getKey() <= machineTier)
+ .map(Map.Entry::getValue).sorted(getConfigurationCircuitsComparator())
+ .collect(Collectors.toList())));
}
public static Comparator<ItemStack> getConfigurationCircuitsComparator() {
@@ -771,8 +764,9 @@ public class GregTech_API {
// player is exposed
if (GT_Mod.gregtechproxy.mCircuitsOrder.isEmpty())
return is.getItem() instanceof GT_IntegratedCircuit_Item ? 0 : 1;
- return GT_Mod.gregtechproxy.mCircuitsOrder
- .getOrDefault(GameRegistry.findUniqueIdentifierFor(is.getItem()).toString(), Integer.MAX_VALUE);
+ return GT_Mod.gregtechproxy.mCircuitsOrder.getOrDefault(
+ String.valueOf(GameRegistry.findUniqueIdentifierFor(is.getItem())),
+ Integer.MAX_VALUE);
}).thenComparing(ItemStack::getUnlocalizedName).thenComparing(ItemStack::getItemDamage);
}