Merge pull request #518 from aurorasmiles/fixEntities

start reimplementing entities
This commit is contained in:
NotMyFault
2020-08-21 18:27:25 +02:00
committed by GitHub
19 changed files with 280 additions and 99 deletions

View File

@ -2,12 +2,26 @@ package com.boydti.fawe.beta.implementation;
import com.boydti.fawe.beta.IChunk;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.DoubleTag;
import com.sk89q.jnbt.IntArrayTag;
import com.sk89q.jnbt.ListTag;
import com.sk89q.jnbt.LongTag;
import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
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.util.Location;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.jetbrains.annotations.Range;
public interface IChunkExtent<T extends IChunk> extends Extent {
@ -91,4 +105,88 @@ public interface IChunkExtent<T extends IChunk> extends Extent {
final IChunk chunk = getOrCreateChunk(x >> 4, z >> 4);
return chunk.getOpacity(x & 15, y, z & 15);
}
@Override
default Entity createEntity(Location location, BaseEntity entity) {
final IChunk chunk = getOrCreateChunk(location.getBlockX() >> 4, location.getBlockZ() >> 4);
Map<String, Tag> map = new HashMap<>(entity.getNbtData().getValue()); //do not modify original entity data
map.put("Id", new StringTag(entity.getType().getName()));
//Set pos
List<DoubleTag> posList = new ArrayList<>();
posList.add(new DoubleTag(location.getX()));
posList.add(new DoubleTag(location.getY()));
posList.add(new DoubleTag(location.getZ()));
map.put("Pos", new ListTag(DoubleTag.class, posList));
//set new uuid
UUID newuuid = UUID.randomUUID();
int[] uuidArray = new int[4];
uuidArray[0] = (int) (newuuid.getMostSignificantBits() >> 32);
uuidArray[1] = (int) newuuid.getMostSignificantBits();
uuidArray[2] = (int) (newuuid.getLeastSignificantBits() >> 32);
uuidArray[3] = (int) newuuid.getLeastSignificantBits();
map.put("UUID", new IntArrayTag(uuidArray));
map.put("UUIDMost", new LongTag(newuuid.getMostSignificantBits()));
map.put("UUIDLeast", new LongTag(newuuid.getLeastSignificantBits()));
map.put("PersistentIDMSB", new LongTag(newuuid.getMostSignificantBits()));
map.put("PersistentIDLSB", new LongTag(newuuid.getLeastSignificantBits()));
chunk.setEntity(new CompoundTag(map));
return new IChunkEntity(this, location, newuuid, entity);
}
@Override
default void removeEntity(int x, int y, int z, UUID uuid) {
final IChunk chunk = getOrCreateChunk(x >> 4, z >> 4);
chunk.removeEntity(uuid);
}
class IChunkEntity implements Entity {
private final Extent extent;
private final Location location;
private final UUID uuid;
private final BaseEntity base;
public IChunkEntity(Extent extent, Location location, UUID uuid, BaseEntity base) {
this.extent = extent;
this.location = location;
this.uuid = uuid;
this.base = base;
}
@Override
public BaseEntity getState() {
return base;
}
@Override
public boolean remove() {
extent.removeEntity(location.getBlockX(), location.getBlockY(), location.getBlockZ(), uuid);
return true;
}
@Override
public <T> T getFacet(Class<? extends T> cls) {
return null;
}
@Override
public Location getLocation() {
return location;
}
@Override
public boolean setLocation(Location location) {
return false;
}
@Override
public Extent getExtent() {
return extent;
}
}
}

View File

@ -78,12 +78,12 @@ public class MutableEntityChange implements Change {
return;
}
List<DoubleTag> pos = (List<DoubleTag>) posTag.getValue();
int x = MathMan.roundInt(pos.get(0).getValue());
int y = MathMan.roundInt(pos.get(1).getValue());
int z = MathMan.roundInt(pos.get(2).getValue());
double x = pos.get(0).getValue();
double y = pos.get(1).getValue();
double z = pos.get(2).getValue();
Extent extent = context.getExtent();
Location location = new Location(extent, x, y, z, 0, 0);
String id = tag.getString("id");
String id = tag.getString("Id");
EntityType type = EntityTypes.parse(id);
BaseEntity entity = new BaseEntity(type, tag);
context.getExtent().createEntity(location, entity);

View File

@ -43,6 +43,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
/**
@ -437,6 +438,11 @@ public class DiskOptimizedClipboard extends LinearClipboard implements Closeable
public List<? extends Entity> getEntities() {
return new ArrayList<>(entities);
}
@Override
public List<? extends Entity> getEntities(Region region) {
return new ArrayList<>(entities.stream().filter(e -> region.contains(e.getLocation().toBlockPoint())).collect(Collectors.toList()));
}
@Override
public void removeEntity(Entity entity) {

View File

@ -27,6 +27,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
public class MemoryOptimizedClipboard extends LinearClipboard {
@ -292,11 +293,15 @@ public class MemoryOptimizedClipboard extends LinearClipboard {
return new ArrayList<>(entities);
}
@Override
public List<? extends Entity> getEntities(Region region) {
return new ArrayList<>(entities.stream().filter(e -> region.contains(e.getLocation().toBlockPoint())).collect(Collectors.toList()));
}
@Override
public void removeEntity(Entity entity) {
if (entity instanceof ClipboardEntity) {
this.entities.remove(entity);
}
}
}