fix //cut -e

This commit is contained in:
wea_ondara
2020-07-29 22:43:52 +02:00
parent 26110d336b
commit ae23794b43
7 changed files with 89 additions and 35 deletions

View File

@ -20,6 +20,7 @@ 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;
@ -111,7 +112,7 @@ public interface IChunkExtent<T extends IChunk> extends Extent {
default Entity createEntity(Location location, BaseEntity entity) {
final IChunk chunk = getOrCreateChunk(location.getBlockX() >> 4, location.getBlockZ() >> 4);
CompoundTag tag = entity.getNbtData();
Map<String, Tag> map = ReflectionUtils.getMap(tag.getValue());
Map<String, Tag> map = new HashMap<>(tag.getValue()); //do not modify original entity data
map.put("Id", new StringTag(entity.getType().getName()));
//Set pos
@ -147,8 +148,11 @@ public interface IChunkExtent<T extends IChunk> extends Extent {
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(tag);
return null;
return new IChunkEntity(this, location, newuuid, entity);
}
@Override
@ -156,4 +160,50 @@ public interface IChunkExtent<T extends IChunk> extends Extent {
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

@ -90,19 +90,6 @@ public class ReflectionUtils {
}
private static Class<?> UNMODIFIABLE_MAP = Collections.unmodifiableMap(Collections.EMPTY_MAP).getClass();
public static <T, V> Map<T, V> getMap(Map<T, V> map) {
try {
Class<? extends Map> clazz = map.getClass();
if (clazz != UNMODIFIABLE_MAP) return map;
Field m = clazz.getDeclaredField("m");
m.setAccessible(true);
return (Map<T, V>) m.get(map);
} catch (Throwable e) {
e.printStackTrace();
return map;
}
}
public static Object getHandle(Object wrapper) {
final Method getHandle = makeMethod(wrapper.getClass(), "getHandle");
return callMethod(getHandle, wrapper);

View File

@ -37,6 +37,8 @@ import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.entity.EntityTypes;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.jnbt.LongTag;
import java.util.UUID;
/**
* Copies entities provided to the function to the provided destination
@ -44,6 +46,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
*/
public class ExtentEntityCopy implements EntityFunction {
private final Extent source;
private final Extent destination;
private final Vector3 from;
private final Vector3 to;
@ -58,11 +61,13 @@ public class ExtentEntityCopy implements EntityFunction {
* @param to the destination position
* @param transform the transformation to apply to both position and orientation
*/
public ExtentEntityCopy(Vector3 from, Extent destination, Vector3 to, Transform transform) {
public ExtentEntityCopy(Extent source, Vector3 from, Extent destination, Vector3 to, Transform transform) {
checkNotNull(source);
checkNotNull(from);
checkNotNull(destination);
checkNotNull(to);
checkNotNull(transform);
this.source = source;
this.destination = destination;
this.from = from;
this.to = to;
@ -119,7 +124,18 @@ public class ExtentEntityCopy implements EntityFunction {
// Remove
if (isRemoving() && success) {
entity.remove();
//todo remove from source with Extent i guess? im confused now
UUID uuid = null;
if (tag.containsKey("UUID")) {
int[] arr = tag.getIntArray("UUID");
uuid = new UUID((long)arr[0] << 32 | (arr[1] & 0xFFFFFFFFL), (long)arr[2] << 32 | (arr[3] & 0xFFFFFFFFL));
} else if (tag.containsKey("UUIDMost")) {
uuid = new UUID(tag.getLong("UUIDMost"), tag.getLong("UUIDLeast"));
} else if (tag.containsKey("PersistentIDMSB")) {
uuid = new UUID(tag.getLong("PersistentIDMSB"), tag.getLong("PersistentIDLSB"));
}
if (uuid != null)
source.removeEntity(entity.getLocation().getBlockX(), entity.getLocation().getBlockY(), entity.getLocation().getBlockZ(), uuid);
}
return success;

View File

@ -393,7 +393,7 @@ public class ForwardExtentCopy implements Operation {
Operations.completeBlindly(blockCopy);
if (!entities.isEmpty()) {
ExtentEntityCopy entityCopy = new ExtentEntityCopy(from.toVector3(), destination, to.toVector3(), currentTransform);
ExtentEntityCopy entityCopy = new ExtentEntityCopy(source, from.toVector3(), destination, to.toVector3(), currentTransform);
entityCopy.setRemoving(removingEntities);
List<? extends Entity> entities2 = Lists.newArrayList(source.getEntities(region));
entities2.removeIf(entity -> {