Skip to content

Commit 63f7871

Browse files
authored
feat: improved entity operations (#2356)
- Add new extent that does an action on chunk GET load - closes #1826
1 parent 69d8543 commit 63f7871

File tree

52 files changed

+1355
-324
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1355
-324
lines changed

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks.java

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.fastasyncworldedit.bukkit.adapter.BukkitGetBlocks;
44
import com.fastasyncworldedit.bukkit.adapter.DelegateSemaphore;
5+
import com.fastasyncworldedit.bukkit.adapter.NativeEntityFunctionSet;
56
import com.fastasyncworldedit.core.Fawe;
67
import com.fastasyncworldedit.core.FaweCache;
78
import com.fastasyncworldedit.core.configuration.Settings;
@@ -17,6 +18,7 @@
1718
import com.fastasyncworldedit.core.util.NbtUtils;
1819
import com.fastasyncworldedit.core.util.collection.AdaptedMap;
1920
import com.sk89q.worldedit.bukkit.BukkitAdapter;
21+
import com.sk89q.worldedit.bukkit.BukkitEntity;
2022
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
2123
import com.sk89q.worldedit.internal.Constants;
2224
import com.sk89q.worldedit.internal.util.LogManagerCompat;
@@ -70,6 +72,7 @@
7072
import javax.annotation.Nonnull;
7173
import javax.annotation.Nullable;
7274
import java.util.AbstractCollection;
75+
import java.util.AbstractSet;
7376
import java.util.ArrayList;
7477
import java.util.Arrays;
7578
import java.util.Collection;
@@ -89,6 +92,7 @@
8992
import java.util.concurrent.locks.ReentrantLock;
9093
import java.util.concurrent.locks.ReentrantReadWriteLock;
9194
import java.util.function.Function;
95+
import java.util.stream.Collectors;
9296

9397
import static net.minecraft.core.registries.Registries.BIOME;
9498

@@ -146,11 +150,13 @@ public PaperweightGetBlocks(ServerLevel serverLevel, int chunkX, int chunkZ) {
146150
this.chunkPos = new IntPair(chunkX, chunkZ);
147151
}
148152

149-
public int getChunkX() {
153+
@Override
154+
public int getX() {
150155
return chunkX;
151156
}
152157

153-
public int getChunkZ() {
158+
@Override
159+
public int getZ() {
154160
return chunkZ;
155161
}
156162

@@ -369,49 +375,24 @@ public int[] getHeightMap(HeightMapType type) {
369375

370376
@Override
371377
public Collection<FaweCompoundTag> entities() {
372-
ensureLoaded(serverLevel, chunkX, chunkZ);
373-
List<Entity> entities = PaperweightPlatformAdapter.getEntities(getChunk());
378+
List<Entity> entities = PaperweightPlatformAdapter.getEntities(ensureLoaded(serverLevel, chunkX, chunkZ));
374379
if (entities.isEmpty()) {
375380
return Collections.emptyList();
376381
}
377-
int size = entities.size();
378-
return new AbstractCollection<>() {
379-
@Override
380-
public int size() {
381-
return size;
382-
}
383-
384-
@Override
385-
public boolean isEmpty() {
386-
return false;
387-
}
388-
389-
@Override
390-
public boolean contains(Object get) {
391-
if (!(get instanceof FaweCompoundTag getTag)) {
392-
return false;
393-
}
394-
UUID getUUID = NbtUtils.uuid(getTag);
395-
for (Entity entity : entities) {
396-
UUID uuid = entity.getUUID();
397-
if (uuid.equals(getUUID)) {
398-
return true;
399-
}
400-
}
401-
return false;
402-
}
382+
return new NativeEntityFunctionSet<>(entities, Entity::getUUID, e -> {
383+
net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag();
384+
e.save(tag);
385+
return FaweCompoundTag.of(() -> (LinCompoundTag) adapter.toNativeLin(tag));
386+
});
387+
}
403388

404-
@Nonnull
405-
@Override
406-
public Iterator<FaweCompoundTag> iterator() {
407-
Iterable<FaweCompoundTag> result = entities.stream().map(input -> {
408-
CompoundTag tag = new CompoundTag();
409-
input.save(tag);
410-
return FaweCompoundTag.of((LinCompoundTag) adapter.toNativeLin(tag));
411-
})::iterator;
412-
return result.iterator();
413-
}
414-
};
389+
@Override
390+
public Set<com.sk89q.worldedit.entity.Entity> getFullEntities() {
391+
List<Entity> entities = PaperweightPlatformAdapter.getEntities(ensureLoaded(serverLevel, chunkX, chunkZ));
392+
if (entities.isEmpty()) {
393+
return Collections.emptySet();
394+
}
395+
return new NativeEntityFunctionSet<>(entities, Entity::getUUID, e -> new BukkitEntity(e.getBukkitEntity()));
415396
}
416397

417398
private void removeEntity(Entity entity) {

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightGetBlocks_Copy.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public class PaperweightGetBlocks_Copy implements IChunkGet {
4646
private final char[][] blocks;
4747
private final int minHeight;
4848
private final int maxHeight;
49+
private final int chunkX;
50+
private final int chunkZ;
4951
final ServerLevel serverLevel;
5052
final LevelChunk levelChunk;
5153
private Holder<Biome>[][] biomes = null;
@@ -56,6 +58,8 @@ protected PaperweightGetBlocks_Copy(LevelChunk levelChunk) {
5658
this.minHeight = serverLevel.getMinBuildHeight();
5759
this.maxHeight = serverLevel.getMaxBuildHeight() - 1; // Minecraft max limit is exclusive.
5860
this.blocks = new char[getSectionCount()][];
61+
this.chunkX = levelChunk.locX;
62+
this.chunkZ = levelChunk.locZ;
5963
}
6064

6165
protected void storeTile(BlockEntity blockEntity) {
@@ -94,6 +98,11 @@ public Collection<FaweCompoundTag> entities() {
9498
return null;
9599
}
96100

101+
@Override
102+
public Set<com.sk89q.worldedit.entity.Entity> getFullEntities() {
103+
throw new UnsupportedOperationException("Cannot get full entities from GET copy.");
104+
}
105+
97106
@Override
98107
public boolean isCreateCopy() {
99108
return false;
@@ -136,6 +145,16 @@ public int getMinSectionPosition() {
136145
return minHeight >> 4;
137146
}
138147

148+
@Override
149+
public int getX() {
150+
return chunkX;
151+
}
152+
153+
@Override
154+
public int getZ() {
155+
return chunkZ;
156+
}
157+
139158
@Override
140159
public BiomeType getBiomeType(int x, int y, int z) {
141160
Holder<Biome> biome = biomes[(y >> 4) - getMinSectionPosition()][(y & 12) << 2 | (z & 12) | (x & 12) >> 2];

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightPostProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public Extent construct(final Extent child) {
112112

113113
@Override
114114
public ProcessorScope getScope() {
115-
return ProcessorScope.READING_SET_BLOCKS;
115+
return ProcessorScope.READING_BLOCKS;
116116
}
117117

118118
private boolean wasAdjacentToWater(char[] get, char[] set, int i, int x, int y, int z) {

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks.java

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.fastasyncworldedit.bukkit.adapter.BukkitGetBlocks;
44
import com.fastasyncworldedit.bukkit.adapter.DelegateSemaphore;
5+
import com.fastasyncworldedit.bukkit.adapter.NativeEntityFunctionSet;
56
import com.fastasyncworldedit.core.Fawe;
67
import com.fastasyncworldedit.core.FaweCache;
78
import com.fastasyncworldedit.core.configuration.Settings;
@@ -17,6 +18,7 @@
1718
import com.fastasyncworldedit.core.util.NbtUtils;
1819
import com.fastasyncworldedit.core.util.collection.AdaptedMap;
1920
import com.sk89q.worldedit.bukkit.BukkitAdapter;
21+
import com.sk89q.worldedit.bukkit.BukkitEntity;
2022
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
2123
import com.sk89q.worldedit.internal.Constants;
2224
import com.sk89q.worldedit.internal.util.LogManagerCompat;
@@ -70,6 +72,7 @@
7072
import javax.annotation.Nonnull;
7173
import javax.annotation.Nullable;
7274
import java.util.AbstractCollection;
75+
import java.util.AbstractSet;
7376
import java.util.ArrayList;
7477
import java.util.Arrays;
7578
import java.util.Collection;
@@ -89,6 +92,7 @@
8992
import java.util.concurrent.locks.ReentrantLock;
9093
import java.util.concurrent.locks.ReentrantReadWriteLock;
9194
import java.util.function.Function;
95+
import java.util.stream.Collectors;
9296

9397
import static net.minecraft.core.registries.Registries.BIOME;
9498

@@ -146,11 +150,13 @@ public PaperweightGetBlocks(ServerLevel serverLevel, int chunkX, int chunkZ) {
146150
this.chunkPos = new IntPair(chunkX, chunkZ);
147151
}
148152

149-
public int getChunkX() {
153+
@Override
154+
public int getX() {
150155
return chunkX;
151156
}
152157

153-
public int getChunkZ() {
158+
@Override
159+
public int getZ() {
154160
return chunkZ;
155161
}
156162

@@ -369,49 +375,24 @@ public int[] getHeightMap(HeightMapType type) {
369375

370376
@Override
371377
public Collection<FaweCompoundTag> entities() {
372-
ensureLoaded(serverLevel, chunkX, chunkZ);
373-
List<Entity> entities = PaperweightPlatformAdapter.getEntities(getChunk());
378+
List<Entity> entities = PaperweightPlatformAdapter.getEntities(ensureLoaded(serverLevel, chunkX, chunkZ));
374379
if (entities.isEmpty()) {
375380
return Collections.emptyList();
376381
}
377-
int size = entities.size();
378-
return new AbstractCollection<>() {
379-
@Override
380-
public int size() {
381-
return size;
382-
}
383-
384-
@Override
385-
public boolean isEmpty() {
386-
return false;
387-
}
388-
389-
@Override
390-
public boolean contains(Object get) {
391-
if (!(get instanceof FaweCompoundTag getTag)) {
392-
return false;
393-
}
394-
UUID getUUID = NbtUtils.uuid(getTag);
395-
for (Entity entity : entities) {
396-
UUID uuid = entity.getUUID();
397-
if (uuid.equals(getUUID)) {
398-
return true;
399-
}
400-
}
401-
return false;
402-
}
382+
return new NativeEntityFunctionSet<>(entities, Entity::getUUID, e -> {
383+
net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag();
384+
e.save(tag);
385+
return FaweCompoundTag.of(() -> (LinCompoundTag) adapter.toNativeLin(tag));
386+
});
387+
}
403388

404-
@Nonnull
405-
@Override
406-
public Iterator<FaweCompoundTag> iterator() {
407-
Iterable<FaweCompoundTag> result = entities.stream().map(input -> {
408-
net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag();
409-
input.save(tag);
410-
return FaweCompoundTag.of((LinCompoundTag) adapter.toNativeLin(tag));
411-
})::iterator;
412-
return result.iterator();
413-
}
414-
};
389+
@Override
390+
public Set<com.sk89q.worldedit.entity.Entity> getFullEntities() {
391+
List<Entity> entities = PaperweightPlatformAdapter.getEntities(ensureLoaded(serverLevel, chunkX, chunkZ));
392+
if (entities.isEmpty()) {
393+
return Collections.emptySet();
394+
}
395+
return new NativeEntityFunctionSet<>(entities, Entity::getUUID, e -> new BukkitEntity(e.getBukkitEntity()));
415396
}
416397

417398
private void removeEntity(Entity entity) {

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightGetBlocks_Copy.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public class PaperweightGetBlocks_Copy implements IChunkGet {
4646
private final char[][] blocks;
4747
private final int minHeight;
4848
private final int maxHeight;
49+
private final int chunkX;
50+
private final int chunkZ;
4951
final ServerLevel serverLevel;
5052
final LevelChunk levelChunk;
5153
private Holder<Biome>[][] biomes = null;
@@ -56,6 +58,8 @@ protected PaperweightGetBlocks_Copy(LevelChunk levelChunk) {
5658
this.minHeight = serverLevel.getMinBuildHeight();
5759
this.maxHeight = serverLevel.getMaxBuildHeight() - 1; // Minecraft max limit is exclusive.
5860
this.blocks = new char[getSectionCount()][];
61+
this.chunkX = levelChunk.locX;
62+
this.chunkZ = levelChunk.locZ;
5963
}
6064

6165
protected void storeTile(BlockEntity blockEntity) {
@@ -94,6 +98,11 @@ public Collection<FaweCompoundTag> entities() {
9498
return null;
9599
}
96100

101+
@Override
102+
public Set<com.sk89q.worldedit.entity.Entity> getFullEntities() {
103+
throw new UnsupportedOperationException("Cannot get full entities from GET copy.");
104+
}
105+
97106
@Override
98107
public boolean isCreateCopy() {
99108
return false;
@@ -136,6 +145,16 @@ public int getMinSectionPosition() {
136145
return minHeight >> 4;
137146
}
138147

148+
@Override
149+
public int getX() {
150+
return chunkX;
151+
}
152+
153+
@Override
154+
public int getZ() {
155+
return chunkZ;
156+
}
157+
139158
@Override
140159
public BiomeType getBiomeType(int x, int y, int z) {
141160
Holder<Biome> biome = biomes[(y >> 4) - getMinSectionPosition()][(y & 12) << 2 | (z & 12) | (x & 12) >> 2];

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightPostProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public Extent construct(final Extent child) {
112112

113113
@Override
114114
public ProcessorScope getScope() {
115-
return ProcessorScope.READING_SET_BLOCKS;
115+
return ProcessorScope.READING_BLOCKS;
116116
}
117117

118118
private boolean wasAdjacentToWater(char[] get, char[] set, int i, int x, int y, int z) {

0 commit comments

Comments
 (0)