From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Martijn Muijsers Date: Sat, 26 Nov 2022 11:25:45 +0100 Subject: [PATCH] Reduce array allocations License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) Gale - https://galemc.org Enum's values returns anew array copy of the enums, this behavior is defined in `src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java#visitEnumDef` This is a defensive programming strategy to prevent enums from being modified. However, copying is unnecessary if we only have read calls. So we can cache the values result to avoid useless allocations. Cached as the array since it does not create iterator on the enhanced for loop, But the list does, and may spend more time than iterating using the array. One-time calls are excluded from this patch, since no need. The JMH benchmark of this patch can be found in SunBox's `CachedEnumValuesForLoop` This patch is based on the following patch: "reduce allocs" By: Simon Gardling As part of: JettPack (https://gitlab.com/Titaniumtown/JettPack) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java b/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java index b2bcfb3557a0326fd7ec1059f95d6da4568dfd80..fee4a7452178c274eb835d758b718d8e874d79d0 100644 --- a/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java +++ b/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java @@ -400,7 +400,6 @@ public final class ChunkEntitySlices { private static final class BasicEntityList { - private static final Entity[] EMPTY = new Entity[0]; private static final int DEFAULT_CAPACITY = 4; private E[] storage; @@ -411,7 +410,7 @@ public final class ChunkEntitySlices { } public BasicEntityList(final int cap) { - this.storage = (E[])(cap <= 0 ? EMPTY : new Entity[cap]); + this.storage = (E[])(cap <= 0 ? me.titaniumtown.ArrayConstants.emptyEntityArray : new Entity[cap]);// Gale - JettPack - reduce array allocations } public boolean isEmpty() { @@ -423,7 +422,7 @@ public final class ChunkEntitySlices { } private void resize() { - if (this.storage == EMPTY) { + if (this.storage == me.titaniumtown.ArrayConstants.emptyEntityArray) { // Gale - JettPack - reduce array allocations this.storage = (E[])new Entity[DEFAULT_CAPACITY]; } else { this.storage = Arrays.copyOf(this.storage, this.storage.length * 2); diff --git a/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/server/ServerEntityLookup.java b/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/server/ServerEntityLookup.java index 82824ae7ffbced513a8bcace684af94916135e84..47a600204ae1a1e7f166284dc26a1a7afc1dbecc 100644 --- a/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/server/ServerEntityLookup.java +++ b/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/server/ServerEntityLookup.java @@ -19,10 +19,8 @@ import net.minecraft.world.level.entity.LevelCallback; public final class ServerEntityLookup extends EntityLookup { - private static final Entity[] EMPTY_ENTITY_ARRAY = new Entity[0]; - private final ServerLevel serverWorld; - public final ReferenceList trackerEntities = new ReferenceList<>(EMPTY_ENTITY_ARRAY); // Moonrise - entity tracker + public final ReferenceList trackerEntities = new ReferenceList<>(me.titaniumtown.ArrayConstants.emptyEntityArray); // Moonrise - entity tracker // Gale - JettPack - reduce array allocations // Vanilla does not increment ticket timeouts if the chunk is progressing in generation. They made this change in 1.21.6 so that the ender pearl // ticket does not expire if the chunk fails to generate before the timeout expires. Rather than blindly adjusting the entire system behavior diff --git a/net/minecraft/nbt/ByteArrayTag.java b/net/minecraft/nbt/ByteArrayTag.java index 6fbb131b472a3093b137d8ced9889777a133bd5b..cecfd48f57bc11b84c18b4e5a723228fd3c18e23 100644 --- a/net/minecraft/nbt/ByteArrayTag.java +++ b/net/minecraft/nbt/ByteArrayTag.java @@ -144,7 +144,7 @@ public final class ByteArrayTag implements CollectionTag { @Override public void clear() { - this.data = new byte[0]; + this.data = me.titaniumtown.ArrayConstants.emptyByteArray; // Gale - JettPack - reduce array allocations } @Override diff --git a/net/minecraft/nbt/IntArrayTag.java b/net/minecraft/nbt/IntArrayTag.java index a8ea2aeb5a02903a37376fb78b49c10745147411..e50bbf1318e9f16f83723eab1389c189baf840a2 100644 --- a/net/minecraft/nbt/IntArrayTag.java +++ b/net/minecraft/nbt/IntArrayTag.java @@ -151,7 +151,7 @@ public final class IntArrayTag implements CollectionTag { @Override public void clear() { - this.data = new int[0]; + this.data = me.titaniumtown.ArrayConstants.emptyIntArray; // Gale - JettPack - reduce array allocations } @Override diff --git a/net/minecraft/nbt/LongArrayTag.java b/net/minecraft/nbt/LongArrayTag.java index c90024aecb4b2424b3ef37194b0686734ab43db9..fd8a4bfe065698ea320800bc2b22474b1c5c4ca9 100644 --- a/net/minecraft/nbt/LongArrayTag.java +++ b/net/minecraft/nbt/LongArrayTag.java @@ -150,7 +150,7 @@ public final class LongArrayTag implements CollectionTag { @Override public void clear() { - this.data = new long[0]; + this.data = me.titaniumtown.ArrayConstants.emptyLongArray; // Gale - JettPack - reduce array allocations } @Override diff --git a/net/minecraft/network/CipherBase.java b/net/minecraft/network/CipherBase.java index 121685cacef111fbec0057d386f748497bc3a36d..b4a4fafec1a8e279ec1e31e58fee2d5d34fb8289 100644 --- a/net/minecraft/network/CipherBase.java +++ b/net/minecraft/network/CipherBase.java @@ -7,8 +7,8 @@ import javax.crypto.ShortBufferException; public class CipherBase { private final Cipher cipher; - private byte[] heapIn = new byte[0]; - private byte[] heapOut = new byte[0]; + private byte[] heapIn = me.titaniumtown.ArrayConstants.emptyByteArray; // Gale - JettPack - reduce array allocations + private byte[] heapOut = me.titaniumtown.ArrayConstants.emptyByteArray; // Gale - JettPack - reduce array allocations protected CipherBase(Cipher cipher) { this.cipher = cipher; diff --git a/net/minecraft/network/chat/contents/TranslatableContents.java b/net/minecraft/network/chat/contents/TranslatableContents.java index 8ef16f98996b1ec0c9c3f158248ac95f1b07328f..6780b2493d625603b74e635c4996bb8303ce5b9a 100644 --- a/net/minecraft/network/chat/contents/TranslatableContents.java +++ b/net/minecraft/network/chat/contents/TranslatableContents.java @@ -29,7 +29,7 @@ import net.minecraft.util.ExtraCodecs; import net.minecraft.world.entity.Entity; public class TranslatableContents implements ComponentContents { - public static final Object[] NO_ARGS = new Object[0]; + public static final Object[] NO_ARGS = me.titaniumtown.ArrayConstants.emptyObjectArray; // Gale - JettPack - reduce array allocations private static final Codec PRIMITIVE_ARG_CODEC = ExtraCodecs.JAVA.validate(TranslatableContents::filterAllowedArguments); private static final Codec ARG_CODEC = Codec.either(PRIMITIVE_ARG_CODEC, ComponentSerialization.CODEC) .xmap( diff --git a/net/minecraft/server/level/ServerEntity.java b/net/minecraft/server/level/ServerEntity.java index 5df8ee3955593e70f0e67e91431e464d177bdeeb..b7581796dda77bca66c03e421f2a83a920f44ef1 100644 --- a/net/minecraft/server/level/ServerEntity.java +++ b/net/minecraft/server/level/ServerEntity.java @@ -366,7 +366,7 @@ public class ServerEntity { if (this.entity instanceof LivingEntity livingEntityx) { List> list = Lists.newArrayList(); - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations ItemStack itemBySlot = livingEntityx.getItemBySlot(equipmentSlot); if (!itemBySlot.isEmpty()) { list.add(Pair.of(equipmentSlot, itemBySlot.copy())); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java index 8159f75106bd88412d8a04fe17c0fee3ed2d0a0d..4015e93837ced87936fb3a868ff8186d9d5c2efc 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -1324,7 +1324,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public static List getCurrentlyTickingEntities() { Entity ticking = currentlyTickingEntity.get(); - List ret = java.util.Arrays.asList(ticking == null ? new Entity[0] : new Entity[] { ticking }); + List ret = java.util.Arrays.asList(ticking == null ? me.titaniumtown.ArrayConstants.emptyEntityArray : new Entity[] { ticking }); // Gale - JettPack - reduce array allocations return ret; } diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java index 3ef933e32bbc1b1bfd37b05eb39061b40af8f0c4..1f39e60b3e91018ded0b2e172e565d449337890e 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -1124,7 +1124,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.getInventory().getNonEquipmentItems().set(i, net.minecraft.world.item.ItemStack.EMPTY); } } - for (final EquipmentSlot value : EquipmentSlot.VALUES) { + for (final EquipmentSlot value : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations if (this.getInventory().equipment.has(value) && !shouldKeepDeathEventItem(event, this.getInventory().equipment.get(value))) { this.getInventory().equipment.set(value, net.minecraft.world.item.ItemStack.EMPTY); } diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java index 6c6e13e1103e1383e15b0cb062d57226dd0810ec..2c7f35ec3276f420875cf52596ada42b25fe64c8 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -2879,7 +2879,7 @@ public class ServerGamePacketListenerImpl // SPIGOT-7136 - Allays if (target instanceof net.minecraft.world.entity.animal.allay.Allay || target instanceof net.minecraft.world.entity.animal.horse.AbstractHorse) { // Paper - Fix horse armor desync ServerGamePacketListenerImpl.this.send(new net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket( - target.getId(), java.util.Arrays.stream(net.minecraft.world.entity.EquipmentSlot.values()) + target.getId(), java.util.Arrays.stream(net.minecraft.world.entity.EquipmentSlot.VALUES_ARRAY) // Gale - JettPack - reduce array allocations .map((slot) -> com.mojang.datafixers.util.Pair.of(slot, ((LivingEntity) target).getItemBySlot(slot).copy())) .collect(Collectors.toList()), true)); // Paper - sanitize player.containerMenu.sendAllDataToRemote(); diff --git a/net/minecraft/server/players/StoredUserList.java b/net/minecraft/server/players/StoredUserList.java index d445e8f126f077d8419c52fa5436ea963a1a42a4..39483f7b453d6faedeccc1ab1eda76669395ea5a 100644 --- a/net/minecraft/server/players/StoredUserList.java +++ b/net/minecraft/server/players/StoredUserList.java @@ -70,7 +70,7 @@ public abstract class StoredUserList> { } public String[] getUserList() { - return this.map.keySet().toArray(new String[0]); + return this.map.keySet().toArray(me.titaniumtown.ArrayConstants.emptyStringArray); // Gale - JettPack - reduce array allocations } public boolean isEmpty() { diff --git a/net/minecraft/util/ZeroBitStorage.java b/net/minecraft/util/ZeroBitStorage.java index 09fd99c9cbd23b5f3c899bfb00c9b89651948ed8..5c1103ef028e5ffe6ce0eadc861dd3b2c8f3ed9f 100644 --- a/net/minecraft/util/ZeroBitStorage.java +++ b/net/minecraft/util/ZeroBitStorage.java @@ -5,7 +5,7 @@ import java.util.function.IntConsumer; import org.apache.commons.lang3.Validate; public class ZeroBitStorage implements BitStorage { - public static final long[] RAW = new long[0]; + public static final long[] RAW = me.titaniumtown.ArrayConstants.emptyLongArray; // Gale - JettPack - reduce array allocations private final int size; public ZeroBitStorage(int size) { diff --git a/net/minecraft/world/entity/ConversionType.java b/net/minecraft/world/entity/ConversionType.java index 3eea236bd1fd401fefdf7c5cc553a3db335029c7..3739272cbc73b7c4f15a2fbe874905cf06175f64 100644 --- a/net/minecraft/world/entity/ConversionType.java +++ b/net/minecraft/world/entity/ConversionType.java @@ -37,7 +37,7 @@ public enum ConversionType { } if (conversionParams.keepEquipment()) { - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations ItemStack itemBySlot = oldMob.getItemBySlot(equipmentSlot); if (!itemBySlot.isEmpty()) { newMob.setItemSlot(equipmentSlot, itemBySlot.copyAndClear()); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java index 04425c357eedda8049d3e1780011b274ce3ec575..0c19cba4dd93df79d24d9e50ae538022dedf6724 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -3118,7 +3118,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } private boolean attemptToShearEquipment(Player player, InteractionHand hand, ItemStack stack, Mob mob) { - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations ItemStack itemBySlot = mob.getItemBySlot(equipmentSlot); Equippable equippable = itemBySlot.get(DataComponents.EQUIPPABLE); if (equippable != null diff --git a/net/minecraft/world/entity/EquipmentSlot.java b/net/minecraft/world/entity/EquipmentSlot.java index 0e44397c9d53ff30a96c9e8e392a363fa9ae0c55..dbf31389f0e9796c80afbffddf6a20cbaf184e6e 100644 --- a/net/minecraft/world/entity/EquipmentSlot.java +++ b/net/minecraft/world/entity/EquipmentSlot.java @@ -20,9 +20,12 @@ public enum EquipmentSlot implements StringRepresentable { SADDLE(EquipmentSlot.Type.SADDLE, 0, 1, 7, "saddle"); public static final int NO_COUNT_LIMIT = 0; - public static final List VALUES = List.of(values()); - public static final IntFunction BY_ID = ByIdMap.continuous(equipmentSlot -> equipmentSlot.id, values(), ByIdMap.OutOfBoundsStrategy.ZERO); - public static final StringRepresentable.EnumCodec CODEC = StringRepresentable.fromEnum(EquipmentSlot::values); + // Gale start - JettPack - reduce array allocations + public static final EquipmentSlot[] VALUES_ARRAY = values(); + public static final List VALUES = List.of(VALUES_ARRAY); + public static final IntFunction BY_ID = ByIdMap.continuous(equipmentSlot -> equipmentSlot.id, VALUES_ARRAY, ByIdMap.OutOfBoundsStrategy.ZERO); + public static final StringRepresentable.EnumCodec CODEC = StringRepresentable.fromEnum(() -> VALUES_ARRAY); + // Gale end - JettPack - reduce array allocations public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, equipmentSlot -> equipmentSlot.id); private final EquipmentSlot.Type type; private final int index; diff --git a/net/minecraft/world/entity/EquipmentSlotGroup.java b/net/minecraft/world/entity/EquipmentSlotGroup.java index 381e0a1c0af7e339713ed1df1c2f21121c1bbd0f..4e847c3f9d761da5dda11dec60582d9d9e630b37 100644 --- a/net/minecraft/world/entity/EquipmentSlotGroup.java +++ b/net/minecraft/world/entity/EquipmentSlotGroup.java @@ -24,6 +24,7 @@ public enum EquipmentSlotGroup implements StringRepresentable, Iterable BY_ID = ByIdMap.continuous( equipmentSlotGroup -> equipmentSlotGroup.id, values(), ByIdMap.OutOfBoundsStrategy.ZERO ); diff --git a/net/minecraft/world/entity/EquipmentTable.java b/net/minecraft/world/entity/EquipmentTable.java index b383836c200ca9f7bd84639367aa81b57868fb25..3af4a6dcc81afaf2860325fe5852c9a941f216d4 100644 --- a/net/minecraft/world/entity/EquipmentTable.java +++ b/net/minecraft/world/entity/EquipmentTable.java @@ -30,7 +30,7 @@ public record EquipmentTable(ResourceKey lootTable, Map createForAllSlots(float dropChance) { - return createForAllSlots(List.of(EquipmentSlot.values()), dropChance); + return createForAllSlots(List.of(EquipmentSlot.VALUES_ARRAY), dropChance); // Gale - JettPack - reduce array allocations } private static Map createForAllSlots(List equipmentSlots, float dropChance) { diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java index cca89a4ab166d57212fb8b65c91babd9297aaee1..b813bf88dc3e6add77e060df731211d1c57e7e69 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -3437,7 +3437,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin Map equipmentChanges = null; // Paper end - EntityEquipmentChangedEvent - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations ItemStack itemStack = this.lastEquipmentItems.get(equipmentSlot); ItemStack itemBySlot = this.getItemBySlot(equipmentSlot); if (this.equipmentHasChanged(itemStack, itemBySlot)) { @@ -3763,7 +3763,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin public boolean canGlide() { if (!this.onGround() && !this.isPassenger() && !this.hasEffect(MobEffects.LEVITATION)) { - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations if (canGlideUsing(this.getItemBySlot(equipmentSlot), equipmentSlot)) { return true; } diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java index b2026e29a0633f971bf551fad8be7161bb6293f3..eef6b4b6ccc02e23c5a2707eaeb3566e32e47362 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -362,7 +362,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab if (this.xpReward > 0) { int i = this.xpReward; - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations if (equipmentSlot.canIncreaseExperience()) { ItemStack itemBySlot = this.getItemBySlot(equipmentSlot); if (!itemBySlot.isEmpty() && this.dropChances.byEquipment(equipmentSlot) <= 1.0F) { @@ -988,7 +988,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab protected void dropCustomDeathLoot(ServerLevel level, DamageSource damageSource, boolean recentlyHit) { super.dropCustomDeathLoot(level, damageSource, recentlyHit); - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations if (this.shouldSkipLoot(equipmentSlot)) continue; // Paper ItemStack itemBySlot = this.getItemBySlot(equipmentSlot); float f = this.dropChances.byEquipment(equipmentSlot); @@ -1032,7 +1032,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab public Set dropPreservedEquipment(ServerLevel level, Predicate filter) { Set set = new HashSet<>(); - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations ItemStack itemBySlot = this.getItemBySlot(equipmentSlot); if (!itemBySlot.isEmpty()) { if (!filter.test(itemBySlot)) { @@ -1160,7 +1160,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab protected void populateDefaultEquipmentEnchantments(ServerLevelAccessor level, RandomSource random, DifficultyInstance difficulty) { this.enchantSpawnedWeapon(level, random, difficulty); - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations if (equipmentSlot.getType() == EquipmentSlot.Type.HUMANOID_ARMOR) { this.enchantSpawnedArmor(level, random, equipmentSlot, difficulty); } @@ -1567,7 +1567,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab protected void removeAfterChangingDimensions() { super.removeAfterChangingDimensions(); - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations ItemStack itemBySlot = this.getItemBySlot(equipmentSlot); if (!itemBySlot.isEmpty()) { itemBySlot.setCount(0); diff --git a/net/minecraft/world/entity/decoration/ArmorStand.java b/net/minecraft/world/entity/decoration/ArmorStand.java index 83fdd22eeb141079e05018ebf5cef70e7eb78726..95d835ce4c733cbea457427a0d065c05a59704d9 100644 --- a/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/net/minecraft/world/entity/decoration/ArmorStand.java @@ -460,7 +460,7 @@ public class ArmorStand extends LivingEntity { this.playBrokenSound(); // this.dropAllDeathLoot(level, damageSource); // CraftBukkit - moved down - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations ItemStack itemStack = this.equipment.get(equipmentSlot); // Paper - move equipment removal past event call if (!itemStack.isEmpty()) { this.drops.add(new DefaultDrop(itemStack, stack -> Block.popResource(this.level(), this.blockPosition().above(), stack))); // CraftBukkit - add to drops // Paper - Restore vanilla drops behavior; mirror so we can destroy it later - though this call site was safe & spawn drops correctly} @@ -469,7 +469,7 @@ public class ArmorStand extends LivingEntity { // Paper start - move equipment removal past event call org.bukkit.event.entity.EntityDeathEvent event = this.dropAllDeathLoot(level, damageSource); if (!event.isCancelled()) { - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations this.equipment.set(equipmentSlot, ItemStack.EMPTY); } } diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java index d72e338232b95826b63d784ac0731f5a20bf8dcb..84e4b4b97e00b65ea5258f5b35d39833942f3757 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java @@ -453,7 +453,7 @@ public abstract class Player extends LivingEntity { } private boolean isEquipped(Item item) { - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations ItemStack itemBySlot = this.getItemBySlot(equipmentSlot); Equippable equippable = itemBySlot.get(DataComponents.EQUIPPABLE); if (itemBySlot.is(item) && equippable != null && equippable.slot() == equipmentSlot) { diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java index d3892cc9ef3ab66a45fe3ab72e8a5ef8b904b7c0..08ae689a36d7c48ffa71fbcea20ef0b733d918ba 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java @@ -1179,7 +1179,7 @@ public final class ItemStack implements DataComponentHolder { private void addAttributeTooltips(Consumer tooltipAdder, TooltipDisplay tooltipDisplay, @Nullable Player player) { if (tooltipDisplay.shows(DataComponents.ATTRIBUTE_MODIFIERS)) { - for (EquipmentSlotGroup equipmentSlotGroup : EquipmentSlotGroup.values()) { + for (EquipmentSlotGroup equipmentSlotGroup : EquipmentSlotGroup.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations MutableBoolean mutableBoolean = new MutableBoolean(true); this.forEachModifier( equipmentSlotGroup, diff --git a/net/minecraft/world/item/crafting/ShapedRecipePattern.java b/net/minecraft/world/item/crafting/ShapedRecipePattern.java index bfda76974ea8d4397e2c2ebf5bdcb5d7e5f0bab5..cabbc93409ca99180d115e2f23419ee1824d5801 100644 --- a/net/minecraft/world/item/crafting/ShapedRecipePattern.java +++ b/net/minecraft/world/item/crafting/ShapedRecipePattern.java @@ -121,7 +121,7 @@ public final class ShapedRecipePattern { } if (pattern.size() == i3) { - return new String[0]; + return me.titaniumtown.ArrayConstants.emptyStringArray; // Gale - JettPack - reduce array allocations } else { String[] strings = new String[pattern.size() - i3 - i2]; diff --git a/net/minecraft/world/item/enchantment/Enchantment.java b/net/minecraft/world/item/enchantment/Enchantment.java index 7a620eb92b1e672cedd72ec4d986c01eba337686..0460da0124d2c48b7fed45fa182537fd8059135d 100644 --- a/net/minecraft/world/item/enchantment/Enchantment.java +++ b/net/minecraft/world/item/enchantment/Enchantment.java @@ -109,7 +109,7 @@ public record Enchantment(Component description, Enchantment.EnchantmentDefiniti public Map getSlotItems(LivingEntity entity) { Map map = Maps.newEnumMap(EquipmentSlot.class); - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations if (this.matchingSlot(equipmentSlot)) { ItemStack itemBySlot = entity.getItemBySlot(equipmentSlot); if (!itemBySlot.isEmpty()) { diff --git a/net/minecraft/world/item/enchantment/EnchantmentHelper.java b/net/minecraft/world/item/enchantment/EnchantmentHelper.java index e0cc0b49ea47bb38f7f4fe5ef3c793b0009d03c9..657ca9d8b1dc10777e73c450c9b8a4d52e314388 100644 --- a/net/minecraft/world/item/enchantment/EnchantmentHelper.java +++ b/net/minecraft/world/item/enchantment/EnchantmentHelper.java @@ -153,7 +153,7 @@ public class EnchantmentHelper { } private static void runIterationOnEquipment(LivingEntity entity, EnchantmentHelper.EnchantmentInSlotVisitor visitor) { - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations runIterationOnItem(entity.getItemBySlot(equipmentSlot), equipmentSlot, entity, visitor); } } @@ -467,7 +467,7 @@ public class EnchantmentHelper { public static Optional getRandomItemWith(DataComponentType componentType, LivingEntity entity, Predicate filter) { List list = new ArrayList<>(); - for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations ItemStack itemBySlot = entity.getItemBySlot(equipmentSlot); if (filter.test(itemBySlot)) { ItemEnchantments itemEnchantments = itemBySlot.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY); diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java index 40c2b4a5dc836055433f2402a63824dcdb451072..66f81b3a76b086ef95ea070894cf4d633e482038 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -1872,7 +1872,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl public org.bukkit.entity.Entity[] getChunkEntities(int chunkX, int chunkZ) { ca.spottedleaf.moonrise.patches.chunk_system.level.entity.ChunkEntitySlices slices = ((ServerLevel)this).moonrise$getEntityLookup().getChunk(chunkX, chunkZ); if (slices == null) { - return new org.bukkit.entity.Entity[0]; + return me.titaniumtown.ArrayConstants.emptyBukkitEntityArray; // Gale - JettPack - reduce array allocations } List ret = new java.util.ArrayList<>(); @@ -1883,7 +1883,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl } } - return ret.toArray(new org.bukkit.entity.Entity[0]); + return ret.toArray(me.titaniumtown.ArrayConstants.emptyBukkitEntityArray); // Gale - JettPack - reduce array allocations } // Paper end - rewrite chunk system diff --git a/net/minecraft/world/level/block/ComposterBlock.java b/net/minecraft/world/level/block/ComposterBlock.java index 3eb11df5d14ec63911be630ca99d8d9903723f9b..be9fe9147cca1293c09dbfae0109a3c07a5c1e16 100644 --- a/net/minecraft/world/level/block/ComposterBlock.java +++ b/net/minecraft/world/level/block/ComposterBlock.java @@ -448,7 +448,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { @Override public int[] getSlotsForFace(Direction side) { - return new int[0]; + return me.titaniumtown.ArrayConstants.emptyIntArray; // Gale - JettPack - reduce array allocations } @Override @@ -483,7 +483,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { @Override public int[] getSlotsForFace(Direction side) { - return side == Direction.UP ? new int[]{0} : new int[0]; + return side == Direction.UP ? me.titaniumtown.ArrayConstants.zeroSingletonIntArray : me.titaniumtown.ArrayConstants.emptyIntArray; // Gale - JettPack - reduce array allocations } @Override @@ -534,7 +534,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { @Override public int[] getSlotsForFace(Direction side) { - return side == Direction.DOWN ? new int[]{0} : new int[0]; + return side == Direction.DOWN ? me.titaniumtown.ArrayConstants.zeroSingletonIntArray : me.titaniumtown.ArrayConstants.emptyIntArray; // Gale - JettPack - reduce array allocations } @Override diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java index 57eae0dbb614f57e2a352613c7490145bbfeb5a1..beda1b89b8083c63b9e177495ef063a7e5574627 100644 --- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java @@ -44,7 +44,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit protected static final int SLOT_FUEL = 1; protected static final int SLOT_RESULT = 2; public static final int DATA_LIT_TIME = 0; - private static final int[] SLOTS_FOR_UP = new int[]{0}; + private static final int[] SLOTS_FOR_UP = me.titaniumtown.ArrayConstants.zeroSingletonIntArray; // Gale - JettPack - reduce array allocations private static final int[] SLOTS_FOR_DOWN = new int[]{2, 1}; private static final int[] SLOTS_FOR_SIDES = new int[]{1}; public static final int DATA_LIT_DURATION = 1; diff --git a/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java b/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java index 7bbeed6c998c91e68376d3f17a510d68e3cd0b27..bf01c9d54248ceb8f97cf1e1c0e4234a338cb8ce 100644 --- a/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java +++ b/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java @@ -259,7 +259,7 @@ public class MapItemSavedData extends SavedData { } private static boolean hasMapInvisibilityItemEquipped(Player player) { - for (EquipmentSlot equipmentSlot : EquipmentSlot.values()) { + for (EquipmentSlot equipmentSlot : EquipmentSlot.VALUES_ARRAY) { // Gale - JettPack - reduce array allocations if (equipmentSlot != EquipmentSlot.MAINHAND && equipmentSlot != EquipmentSlot.OFFHAND && player.getItemBySlot(equipmentSlot).is(ItemTags.MAP_INVISIBILITY_EQUIPMENT)) {