From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: JRoy Date: Wed, 1 Jul 2020 18:01:49 -0400 Subject: [PATCH] Remove streams from classes related villager gossip 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 e316f83a7adc7bba06a6a3fdab55cc9c004cb835..bd661bcaf5eb65a4f34eec268ced84894d7d0898 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 @@ -8,6 +8,7 @@ import com.mojang.serialization.Dynamic; import com.mojang.serialization.DynamicOps; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; // Paper import it.unimi.dsi.fastutil.objects.ObjectIterator; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import java.util.Arrays; @@ -60,8 +61,21 @@ public class GossipContainer { }); } + // Paper start - Remove streams from reputation + private List decompress() { + List list = new ObjectArrayList<>(); + for (Map.Entry entry : getReputations().entrySet()) { + for (GossipContainer.GossipEntry cur : entry.getValue().decompress(entry.getKey())) { + if (cur.weightedValue() != 0) + list.add(cur); + } + } + return list; + } + // Paper end + private Collection selectGossipsForTransfer(Random random, int count) { - List list = this.unpack().collect(Collectors.toList()); + List list = decompress(); // Paper - Remove streams from reputation if (list.isEmpty()) { return Collections.emptyList(); } else { @@ -154,9 +168,9 @@ public class GossipContainer { } - public Dynamic store(DynamicOps dynamicOps) { - return new Dynamic<>(dynamicOps, dynamicOps.createList(this.unpack().map((gossipEntry) -> { - return gossipEntry.store(dynamicOps); + public Dynamic store(DynamicOps dynamicops) { + return new Dynamic(dynamicops, dynamicops.createList(this.decompress().stream().map((reputation_b) -> { + return reputation_b.store(dynamicops); }).map(Dynamic::getValue))); } @@ -181,11 +195,23 @@ public class GossipContainer { final Object2IntMap entries = new Object2IntOpenHashMap<>(); public int weightedValue(Predicate gossipTypeFilter) { - return this.entries.object2IntEntrySet().stream().filter((entry) -> { - return gossipTypeFilter.test(entry.getKey()); - }).mapToInt((entry) -> { - return entry.getIntValue() * (entry.getKey()).weight; - }).sum(); + // Paper start - Remove streams from reputation + int weight = 0; + for (Object2IntMap.Entry entry : entries.object2IntEntrySet()) { + if (gossipTypeFilter.test(entry.getKey())) { + weight += entry.getIntValue() * entry.getKey().getWeight(); + } + } + return weight; + } + + public List decompress(UUID uuid) { + List list = new ObjectArrayList<>(); + for (Object2IntMap.Entry entry : entries.object2IntEntrySet()) { + list.add(new GossipContainer.GossipEntry(uuid, entry.getKey(), entry.getIntValue())); + } + return list; + // Paper - end } public Stream unpack(UUID target) { diff --git a/src/main/java/net/minecraft/world/entity/ai/gossip/GossipType.java b/src/main/java/net/minecraft/world/entity/ai/gossip/GossipType.java index c82b26dd4a16d77b7ed06c2919082edd62a3dffc..ad1b49cfa201fe6e80b3cd0204f8ffaf6115c081 100644 --- a/src/main/java/net/minecraft/world/entity/ai/gossip/GossipType.java +++ b/src/main/java/net/minecraft/world/entity/ai/gossip/GossipType.java @@ -17,7 +17,7 @@ public enum GossipType { public static final int REPUTATION_CHANGE_PER_EVERLASTING_MEMORY = 20; public static final int REPUTATION_CHANGE_PER_TRADE = 2; public final String id; - public final int weight; + public final int weight; public int getWeight() { return weight; } // Paper - OBFHELPER public final int max; public final int decayPerDay; public final int decayPerTransfer;