mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-27 02:49:19 +00:00
Originally vanilla logic is to use stream, and Mojang switched it to Guava's Collections2 since 1.21.4. It is much faster than using stream or manually adding to a new ArrayList. Manually adding to a new ArrayList requires allocating a new object array. However, the Collections2 lazy handles filter condition on iteration, so much better.
82 lines
3.5 KiB
Diff
82 lines
3.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Samsuik <kfian294ma4@gmail.com>
|
|
Date: Sun, 2 Feb 2025 17:05:05 +0000
|
|
Subject: [PATCH] Sakura: copy EntityList implementation to BasicEntityList
|
|
|
|
|
|
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 9a2539e1fe2cee30066634ef47a991fa5837a5e4..5ebc1b2cf186b512da5b62fedba16b612f2fa6ed 100644
|
|
--- a/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java
|
|
+++ b/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java
|
|
@@ -437,6 +437,13 @@ public final class ChunkEntitySlices {
|
|
|
|
private E[] storage;
|
|
private int size;
|
|
+ // Sakura start - use methods from EntityList
|
|
+ private it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap entityToIndex = null;
|
|
+ private void setupIndexMap() {
|
|
+ this.entityToIndex = new it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap(2, 0.8f);
|
|
+ this.entityToIndex.defaultReturnValue(Integer.MIN_VALUE);
|
|
+ }
|
|
+ // Sakura end - use methods from EntityList
|
|
|
|
public BasicEntityList() {
|
|
this(0);
|
|
@@ -457,6 +464,7 @@ public final class ChunkEntitySlices {
|
|
private void resize() {
|
|
if (this.storage == me.titaniumtown.ArrayConstants.emptyEntityArray) { // Gale - JettPack - reduce array allocations
|
|
this.storage = (E[])new Entity[DEFAULT_CAPACITY];
|
|
+ this.setupIndexMap(); // Sakura - use methods from EntityList
|
|
} else {
|
|
this.storage = Arrays.copyOf(this.storage, this.storage.length * 2);
|
|
}
|
|
@@ -470,6 +478,7 @@ public final class ChunkEntitySlices {
|
|
} else {
|
|
this.storage[idx] = entity;
|
|
}
|
|
+ this.entityToIndex.put(entity.getId(), idx); // Sakura - use methods from EntityList
|
|
}
|
|
|
|
public int indexOf(final E entity) {
|
|
@@ -485,24 +494,32 @@ public final class ChunkEntitySlices {
|
|
}
|
|
|
|
public boolean remove(final E entity) {
|
|
- final int idx = this.indexOf(entity);
|
|
- if (idx == -1) {
|
|
+ // Sakura start - use methods from EntityList
|
|
+ if (this.entityToIndex == null) {
|
|
return false;
|
|
}
|
|
|
|
- final int size = --this.size;
|
|
- final E[] storage = this.storage;
|
|
- if (idx != size) {
|
|
- System.arraycopy(storage, idx + 1, storage, idx, size - idx);
|
|
+ final int index = this.entityToIndex.remove(entity.getId());
|
|
+ if (index == Integer.MIN_VALUE) {
|
|
+ return false;
|
|
}
|
|
|
|
- storage[size] = null;
|
|
+ // move the entity at the end to this index
|
|
+ final int endIndex = --this.size;
|
|
+ final E end = this.storage[endIndex];
|
|
+ if (index != endIndex) {
|
|
+ // not empty after this call
|
|
+ this.entityToIndex.put(end.getId(), index); // update index
|
|
+ }
|
|
+ this.storage[index] = end;
|
|
+ this.storage[endIndex] = null;
|
|
+ // Sakura end - use methods from EntityList
|
|
|
|
return true;
|
|
}
|
|
|
|
public boolean has(final E entity) {
|
|
- return this.indexOf(entity) != -1;
|
|
+ return this.entityToIndex != null && this.entityToIndex.containsKey(entity.getId()); // Sakura - use methods from EntityList
|
|
}
|
|
}
|
|
|