Optimize entity get (lazy nbt)

This commit is contained in:
Jesse Boyd
2019-04-14 00:00:38 +10:00
parent 0781c762e6
commit 110f782a5c
8 changed files with 108 additions and 30 deletions

View File

@ -149,11 +149,13 @@ public class FastWorldEditExtent extends AbstractDelegateExtent implements HasFa
@Override
public List<? extends Entity> getEntities() {
System.out.println("World cp * " + world + " | " + world.getClass());
return world.getEntities();
}
@Override
public List<? extends Entity> getEntities(final Region region) {
System.out.println("World cp rg " + world + " | " + world.getClass());
return world.getEntities(region);
}

View File

@ -22,6 +22,7 @@ package com.sk89q.worldedit.entity;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.util.Faceted;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.entity.EntityType;
import javax.annotation.Nullable;
@ -62,6 +63,11 @@ public interface Entity extends Faceted {
*/
boolean setLocation(Location location);
default EntityType getType() {
BaseEntity state = getState();
return state != null ? state.getType() : null;
}
/**
* Get the extent that this entity is on.
*

View File

@ -0,0 +1,32 @@
package com.sk89q.worldedit.entity;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.util.TaskManager;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.world.entity.EntityType;
import javax.annotation.Nullable;
import java.util.function.Supplier;
public class LazyBaseEntity extends BaseEntity {
private Supplier<CompoundTag> saveTag;
public LazyBaseEntity(EntityType type, Supplier<CompoundTag> saveTag) {
super(type, null);
this.saveTag = saveTag;
}
@Nullable
@Override
public CompoundTag getNbtData() {
Supplier<CompoundTag> tmp = saveTag;
if (tmp != null) {
saveTag = null;
if (Fawe.isMainThread()) {
setNbtData(tmp.get());
} else {
setNbtData(TaskManager.IMP.sync(tmp));
}
}
return super.getNbtData();
}
}

View File

@ -27,12 +27,14 @@ import com.boydti.fawe.object.function.block.BiomeCopy;
import com.boydti.fawe.object.function.block.CombinedBlockCopy;
import com.boydti.fawe.object.function.block.SimpleBlockCopy;
import com.boydti.fawe.util.MaskTraverser;
import com.google.common.base.Predicate;
import com.sk89q.worldedit.EditSession;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.Lists;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
@ -52,6 +54,9 @@ import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.transform.Identity;
import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.entity.EntityTypes;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@ -353,11 +358,15 @@ public class ForwardExtentCopy implements Operation {
List<? extends Entity> entities;
if (isCopyingEntities()) {
// filter players since they can't be copied
entities = source.getEntities()
entities = source.getEntities(region)
.stream()
.filter(entity -> entity.getState() != null &&
!entity.getState().getType().getId().equals("minecraft:player") &&
region.contains(entity.getLocation().toBlockPoint()))
.filter(new Predicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
BaseEntity state = input.getState();
return state != null && state.getType() != EntityTypes.PLAYER;
}
})
.collect(Collectors.toList());
} else {
entities = new ArrayList<>();