Skip to content

Commit 47b1a23

Browse files
committed
Avoid quadratic behavior in item frames updating player pins on maps
1 parent c70352b commit 47b1a23

File tree

5 files changed

+55
-0
lines changed

5 files changed

+55
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package net.caffeinemc.mods.lithium.mixin.entity.framed_maps;
2+
3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
5+
import com.llamalad7.mixinextras.sugar.Local;
6+
import net.minecraft.world.entity.player.Player;
7+
import net.minecraft.world.item.ItemStack;
8+
import net.minecraft.world.level.saveddata.SavedData;
9+
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
10+
import org.spongepowered.asm.mixin.Final;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.Shadow;
13+
import org.spongepowered.asm.mixin.injection.At;
14+
15+
import java.util.List;
16+
import java.util.Map;
17+
import java.util.Objects;
18+
19+
@Mixin(MapItemSavedData.class)
20+
public abstract class MapItemSavedDataMixin extends SavedData {
21+
22+
@Shadow
23+
@Final
24+
private Map<Player, MapItemSavedData.HoldingPlayer> carriedByPlayers;
25+
26+
@WrapOperation(
27+
method = "tickCarriedBy(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/item/ItemStack;)V",
28+
at = @At(value = "INVOKE", target = "Ljava/util/List;size()I")
29+
)
30+
private int sizeOrOne(List<MapItemSavedData.HoldingPlayer> instance, Operation<Integer> original, @Local(argsOnly = true) ItemStack mapStack) {
31+
return mapStack.isFramed() ? 1 : original.call(instance);
32+
}
33+
34+
@WrapOperation(
35+
method = "tickCarriedBy(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/item/ItemStack;)V",
36+
at = @At(value = "INVOKE", target = "Ljava/util/List;get(I)Ljava/lang/Object;")
37+
)
38+
private <E> E getOrGetThePlayer(List<E> instance, int i, Operation<E> original, @Local(argsOnly = true) Player player, @Local(argsOnly = true) ItemStack mapStack) {
39+
//noinspection unchecked
40+
return mapStack.isFramed() ? (E) Objects.requireNonNull(this.carriedByPlayers.get(player)) : original.call(instance, i);
41+
}
42+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@MixinConfigOption(description = "Avoid map items in item frames performing inventory scanning quadratic in the number of online players. Instead, scan each player inventory once per map item in item frame only.")
2+
package net.caffeinemc.mods.lithium.mixin.entity.framed_maps;
3+
4+
import net.caffeinemc.gradle.MixinConfigOption;

common/src/main/resources/lithium.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
"entity.fast_hand_swing.LivingEntityMixin",
126126
"entity.fast_powder_snow_check.LivingEntityMixin",
127127
"entity.fast_retrieval.EntitySectionStorageMixin",
128+
"entity.framed_maps.MapItemSavedDataMixin",
128129
"entity.inactive_navigations.HappyGhastMixin",
129130
"entity.inactive_navigations.LivingEntityMixin",
130131
"entity.inactive_navigations.MobMixin",

lithium-fabric-mixin-config.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,10 @@ Skip checking whether an entity is inside powder snow for movement speed slowdow
336336
(default: `true`)
337337
Access entities faster when accessing a relatively small number of entity sections
338338

339+
### `mixin.entity.framed_maps`
340+
(default: `true`)
341+
Avoid map items in item frames performing inventory scanning quadratic in the number of online players. Instead, scan each player inventory once per map item in item frame only.
342+
339343
### `mixin.entity.inactive_navigations`
340344
(default: `true`)
341345
Block updates skip notifying mobs that won't react to the block update anyways

lithium-neoforge-mixin-config.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,10 @@ Skip checking whether an entity is inside powder snow for movement speed slowdow
323323
(default: `true`)
324324
Access entities faster when accessing a relatively small number of entity sections
325325

326+
### `mixin.entity.framed_maps`
327+
(default: `true`)
328+
Avoid map items in item frames performing inventory scanning quadratic in the number of online players. Instead, scan each player inventory once per map item in item frame only.
329+
326330
### `mixin.entity.inactive_navigations`
327331
(default: `true`)
328332
Block updates skip notifying mobs that won't react to the block update anyways

0 commit comments

Comments
 (0)