diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java
index 42b3eecbf..6ba9d5eaf 100644
--- a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java
+++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java
@@ -20,9 +20,11 @@
package com.sk89q.worldedit.bukkit;
import com.sk89q.worldedit.Vector;
+import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.Vectors;
import com.sk89q.worldedit.world.World;
+import org.bukkit.Bukkit;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -45,6 +47,26 @@ final class BukkitAdapter {
return new BukkitWorld(world);
}
+ /**
+ * Create a Bukkit world from a WorldEdit world.
+ *
+ * @param world the WorldEdit world
+ * @return a Bukkit world
+ */
+ public static org.bukkit.World adapt(World world) {
+ checkNotNull(world);
+ if (world instanceof BukkitWorld) {
+ return ((BukkitWorld) world).getWorld();
+ } else {
+ org.bukkit.World match = Bukkit.getServer().getWorld(world.getName());
+ if (match != null) {
+ return match;
+ } else {
+ throw new IllegalArgumentException("Can't find a Bukkit world for " + world);
+ }
+ }
+ }
+
/**
* Create a WorldEdit location from a Bukkit location.
*
@@ -58,4 +80,36 @@ final class BukkitAdapter {
return new com.sk89q.worldedit.util.Location(adapt(location.getWorld()), position, direction);
}
+ /**
+ * Create a Bukkit location from a WorldEdit location.
+ *
+ * @param location the WorldEdit location
+ * @return a Bukkit location
+ */
+ public static org.bukkit.Location adapt(Location location) {
+ checkNotNull(location);
+ Vector position = location.toVector();
+ Vector direction = location.getDirection();
+ final double eyeX = direction.getX();
+ final double eyeZ = direction.getZ();
+ final float yaw = (float) Math.toDegrees(Math.atan2(-eyeX, eyeZ));
+ final double length = Math.sqrt(eyeX * eyeX + eyeZ * eyeZ);
+ final float pitch = (float) Math.toDegrees(Math.atan2(-direction.getY(), length));
+ return new org.bukkit.Location(
+ adapt(location.getWorld()),
+ position.getX(), position.getY(), position.getZ(),
+ yaw, pitch);
+ }
+
+ /**
+ * Create a WorldEdit entity from a Bukkit entity.
+ *
+ * @param entity the Bukkit entity
+ * @return a WorldEdit entity
+ */
+ public static Entity adapt(org.bukkit.entity.Entity entity) {
+ checkNotNull(entity);
+ return new BukkitEntity(entity);
+ }
+
}
diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitBaseEntity.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitBaseEntity.java
new file mode 100644
index 000000000..25fe7c4f4
--- /dev/null
+++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitBaseEntity.java
@@ -0,0 +1,44 @@
+/*
+ * WorldEdit, a Minecraft world manipulation toolkit
+ * Copyright (C) sk89q
+ * Copyright (C) WorldEdit team and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.worldedit.bukkit;
+
+import com.sk89q.worldedit.entity.AbstractBaseEntity;
+import com.sk89q.worldedit.entity.BaseEntity;
+import org.bukkit.entity.EntityType;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * An implementation of a {@link BaseEntity} for Bukkit.
+ */
+public class BukkitBaseEntity extends AbstractBaseEntity {
+
+ private final EntityType type;
+
+ public BukkitBaseEntity(EntityType type) {
+ checkNotNull(type);
+ this.type = type;
+ }
+
+ public EntityType getBukkitType() {
+ return type;
+ }
+
+}
diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java
index e2067fd90..842eb4c55 100644
--- a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java
+++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java
@@ -20,6 +20,7 @@
package com.sk89q.worldedit.bukkit;
import com.sk89q.worldedit.*;
+import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.extent.inventory.BlockBag;
import com.sk89q.worldedit.util.Location;
import org.bukkit.command.CommandSender;
@@ -92,6 +93,11 @@ public class BukkitCommandSender extends LocalPlayer {
throw new PlayerNeededException();
}
+ @Override
+ public BaseEntity getState() {
+ throw new UnsupportedOperationException("Cannot create a state from this object");
+ }
+
@Override
public Location getLocation() {
throw new PlayerNeededException();
diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitEntity.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitEntity.java
index a2b749248..247135b47 100644
--- a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitEntity.java
+++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitEntity.java
@@ -19,16 +19,20 @@
package com.sk89q.worldedit.bukkit;
+import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.entity.metadata.Tameable;
-import com.sk89q.worldedit.internal.util.AbstractAdapter;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.World;
+import static com.google.common.base.Preconditions.checkNotNull;
+
/**
* An adapter to adapt a Bukkit entity into a WorldEdit one.
*/
-class BukkitEntity extends AbstractAdapter implements Entity {
+class BukkitEntity implements Entity {
+
+ private final org.bukkit.entity.Entity entity;
/**
* Create a new instance.
@@ -36,13 +40,23 @@ class BukkitEntity extends AbstractAdapter implements
* @param entity the entity
*/
BukkitEntity(org.bukkit.entity.Entity entity) {
- super(entity);
+ checkNotNull(entity);
+ this.entity = entity;
+ }
+
+ /**
+ * Get the underlying Bukkit entity.
+ *
+ * @return the Bukkit entity
+ */
+ protected org.bukkit.entity.Entity getEntity() {
+ return entity;
}
@SuppressWarnings("unchecked")
T getMetaData(Class metaDataClass) {
- if (metaDataClass == Tameable.class && getHandle() instanceof org.bukkit.entity.Tameable) {
- return (T) new TameableAdapter((org.bukkit.entity.Tameable) getHandle());
+ if (metaDataClass == Tameable.class && getEntity() instanceof org.bukkit.entity.Tameable) {
+ return (T) new TameableAdapter((org.bukkit.entity.Tameable) getEntity());
} else {
return null;
}
@@ -50,11 +64,17 @@ class BukkitEntity extends AbstractAdapter implements
@Override
public World getWorld() {
- return BukkitAdapter.adapt(getHandle().getWorld());
+ return BukkitAdapter.adapt(getEntity().getWorld());
}
@Override
public Location getLocation() {
- return BukkitAdapter.adapt(getHandle().getLocation());
+ return BukkitAdapter.adapt(getEntity().getLocation());
}
+
+ @Override
+ public BaseEntity getState() {
+ return new BukkitBaseEntity(getEntity().getType());
+ }
+
}
diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java
index 1499cd09f..7d3dbdeeb 100644
--- a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java
+++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java
@@ -21,6 +21,7 @@ package com.sk89q.worldedit.bukkit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
+import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.util.Vectors;
import org.bukkit.GameMode;
import org.bukkit.Location;
@@ -170,6 +171,11 @@ public class BukkitPlayer extends LocalPlayer {
player.setFlying(true);
}
+ @Override
+ public BaseEntity getState() {
+ throw new UnsupportedOperationException("Cannot create a state from this object");
+ }
+
@Override
public com.sk89q.worldedit.util.Location getLocation() {
Location nativeLocation = player.getLocation();
diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java
index d8ac86841..7aab7e8fd 100644
--- a/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java
+++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/BukkitWorld.java
@@ -26,7 +26,7 @@ import com.sk89q.worldedit.blocks.*;
import com.sk89q.worldedit.blocks.ContainerBlock;
import com.sk89q.worldedit.blocks.NoteBlock;
import com.sk89q.worldedit.bukkit.entity.BukkitEntity;
-import com.sk89q.worldedit.entity.BaseEntity;
+import com.sk89q.worldedit.entity.*;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.TreeGenerator;
import com.sk89q.worldedit.world.mapping.NullResolver;
@@ -36,6 +36,7 @@ import org.bukkit.Location;
import org.bukkit.block.*;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.*;
+import org.bukkit.entity.Entity;
import org.bukkit.inventory.DoubleChestInventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
@@ -171,6 +172,27 @@ public class BukkitWorld extends LocalWorld {
}
}
+ @Override
+ public List getEntities() {
+ List list = new ArrayList();
+ for (Entity entity : getWorld().getEntities()) {
+ list.add(BukkitAdapter.adapt(entity));
+ }
+ return list;
+ }
+
+ @Nullable
+ @Override
+ public com.sk89q.worldedit.entity.Entity createEntity(com.sk89q.worldedit.util.Location location, BaseEntity entity) {
+ if (entity instanceof BukkitBaseEntity) {
+ BukkitBaseEntity bukkitBaseEntity = (BukkitBaseEntity) entity;
+ Entity nativeEntity = getWorld().spawnEntity(BukkitAdapter.adapt(location), bukkitBaseEntity.getBukkitType());
+ return BukkitAdapter.adapt(nativeEntity);
+ } else {
+ return null;
+ }
+ }
+
private class NmsBlockClassLoader extends ClassLoader {
public File searchDir;
public NmsBlockClassLoader(ClassLoader parent, File searchDir) {
diff --git a/src/forge/java/com/sk89q/worldedit/forge/ForgePlayer.java b/src/forge/java/com/sk89q/worldedit/forge/ForgePlayer.java
index 01e178f71..20ca43ad3 100644
--- a/src/forge/java/com/sk89q/worldedit/forge/ForgePlayer.java
+++ b/src/forge/java/com/sk89q/worldedit/forge/ForgePlayer.java
@@ -24,6 +24,7 @@ import com.sk89q.worldedit.LocalPlayer;
import com.sk89q.worldedit.ServerInterface;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldVector;
+import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.extent.inventory.BlockBag;
import com.sk89q.worldedit.internal.LocalWorldAdapter;
import com.sk89q.worldedit.internal.cui.CUIEvent;
@@ -51,6 +52,11 @@ public class ForgePlayer extends LocalPlayer {
return this.player.username;
}
+ @Override
+ public BaseEntity getState() {
+ throw new UnsupportedOperationException("Cannot create a state from this object");
+ }
+
@Override
public Location getLocation() {
Vector position = new Vector(this.player.posX, this.player.posY, this.player.posZ);
diff --git a/src/forge/java/com/sk89q/worldedit/forge/ForgeWorld.java b/src/forge/java/com/sk89q/worldedit/forge/ForgeWorld.java
index 2b3a91eb6..ebb90d33d 100644
--- a/src/forge/java/com/sk89q/worldedit/forge/ForgeWorld.java
+++ b/src/forge/java/com/sk89q/worldedit/forge/ForgeWorld.java
@@ -26,6 +26,7 @@ import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.blocks.LazyBlock;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.regions.Region;
+import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.TreeGenerator.TreeType;
import com.sk89q.worldedit.world.AbstractWorld;
import com.sk89q.worldedit.world.mapping.NullResolver;
@@ -54,6 +55,7 @@ import net.minecraft.world.gen.ChunkProviderServer;
import javax.annotation.Nullable;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
+import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
@@ -501,6 +503,17 @@ public class ForgeWorld extends AbstractWorld {
return null;
}
+ @Override
+ public List getEntities() {
+ return Collections.emptyList();
+ }
+
+ @Nullable
+ @Override
+ public com.sk89q.worldedit.entity.Entity createEntity(Location location, BaseEntity entity) {
+ return null;
+ }
+
/**
* Thrown when the reference to the world is lost.
*/
diff --git a/src/main/java/com/sk89q/worldedit/EditSession.java b/src/main/java/com/sk89q/worldedit/EditSession.java
index 487395cd1..d246b3893 100644
--- a/src/main/java/com/sk89q/worldedit/EditSession.java
+++ b/src/main/java/com/sk89q/worldedit/EditSession.java
@@ -22,6 +22,8 @@ package com.sk89q.worldedit;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.BlockID;
import com.sk89q.worldedit.blocks.BlockType;
+import com.sk89q.worldedit.entity.BaseEntity;
+import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.event.extent.EditSessionEvent;
import com.sk89q.worldedit.extent.ChangeSetExtent;
import com.sk89q.worldedit.extent.Extent;
@@ -70,8 +72,7 @@ import com.sk89q.worldedit.regions.shape.ArbitraryBiomeShape;
import com.sk89q.worldedit.regions.shape.ArbitraryShape;
import com.sk89q.worldedit.regions.shape.RegionShape;
import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment;
-import com.sk89q.worldedit.util.Countable;
-import com.sk89q.worldedit.util.TreeGenerator;
+import com.sk89q.worldedit.util.*;
import com.sk89q.worldedit.util.collection.DoubleArrayList;
import com.sk89q.worldedit.util.eventbus.EventBus;
import com.sk89q.worldedit.world.NullWorld;
@@ -572,6 +573,17 @@ public class EditSession implements Extent {
return getBlock(position).isAir() && setBlock(position, block);
}
+ @Override
+ public List getEntities() {
+ return world.getEntities();
+ }
+
+ @Override
+ @Nullable
+ public Entity createEntity(com.sk89q.worldedit.util.Location location, BaseEntity entity) {
+ return world.createEntity(location, entity);
+ }
+
/**
* Insert a contrived block change into the history.
*
diff --git a/src/main/java/com/sk89q/worldedit/entity/AbstractBaseEntity.java b/src/main/java/com/sk89q/worldedit/entity/AbstractBaseEntity.java
new file mode 100644
index 000000000..c1c4bca1b
--- /dev/null
+++ b/src/main/java/com/sk89q/worldedit/entity/AbstractBaseEntity.java
@@ -0,0 +1,51 @@
+/*
+ * WorldEdit, a Minecraft world manipulation toolkit
+ * Copyright (C) sk89q
+ * Copyright (C) WorldEdit team and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.worldedit.entity;
+
+import com.sk89q.jnbt.CompoundTag;
+import com.sk89q.worldedit.world.DataException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * An abstract implementation of {@link BaseEntity} that implementations can
+ * subclass to simplify implementation.
+ */
+public abstract class AbstractBaseEntity implements BaseEntity {
+
+ private CompoundTag nbtData;
+
+ @Override
+ public boolean hasNbtData() {
+ return getNbtData() != null;
+ }
+
+ @Override
+ public CompoundTag getNbtData() {
+ return nbtData;
+ }
+
+ @Override
+ public void setNbtData(CompoundTag nbtData) throws DataException {
+ checkNotNull(nbtData);
+ this.nbtData = nbtData;
+ }
+
+}
diff --git a/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java b/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java
index 2cb248a69..2b1fb2193 100644
--- a/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java
+++ b/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java
@@ -19,79 +19,11 @@
package com.sk89q.worldedit.entity;
-import com.sk89q.jnbt.CompoundTag;
-import com.sk89q.jnbt.StringTag;
-import com.sk89q.jnbt.Tag;
-import com.sk89q.worldedit.world.DataException;
import com.sk89q.worldedit.world.NbtValued;
-import java.util.HashMap;
-import java.util.Map;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
/**
* A snapshot of an entity that can be reused and passed around.
*/
-public class BaseEntity implements NbtValued {
-
- private CompoundTag nbtData;
-
- /**
- * Create a new entity with the given entity ID.
- *
- * @param id the ID of the entity, which determines its type
- */
- public BaseEntity(String id) {
- checkNotNull(id);
- Map map = new HashMap();
- map.put("id", new StringTag("id", id));
- this.nbtData = new CompoundTag("", map);
- }
-
- /**
- * Create a new entity with the given NBT data.
- *
- * @param nbtData the NBT data
- */
- public BaseEntity(CompoundTag nbtData) {
- checkNotNull(nbtData);
- this.nbtData = nbtData;
- }
-
- /**
- * Get the ID of the entity, which determines the type of entity.
- * An example of an entity ID would be "CaveSpider".
- *
- * @return the entity ID, which may be an empty string
- */
- public String getEntityId() {
- CompoundTag nbtData = getNbtData();
- if (nbtData == null) {
- return "";
- }
- Tag idTag = nbtData.getValue().get("id");
- if (idTag != null && idTag instanceof StringTag) {
- return ((StringTag) idTag).getValue();
- } else {
- return "";
- }
- }
-
- @Override
- public boolean hasNbtData() {
- return getNbtData() != null;
- }
-
- @Override
- public CompoundTag getNbtData() {
- return nbtData;
- }
-
- @Override
- public void setNbtData(CompoundTag nbtData) throws DataException {
- checkNotNull(nbtData);
- this.nbtData = nbtData;
- }
+public interface BaseEntity extends NbtValued {
}
diff --git a/src/main/java/com/sk89q/worldedit/entity/Entity.java b/src/main/java/com/sk89q/worldedit/entity/Entity.java
index 8f3c4be73..88473d6f8 100644
--- a/src/main/java/com/sk89q/worldedit/entity/Entity.java
+++ b/src/main/java/com/sk89q/worldedit/entity/Entity.java
@@ -35,6 +35,13 @@ import com.sk89q.worldedit.world.World;
*/
public interface Entity {
+ /**
+ * Get a copy of the entity's state.
+ *
+ * @return the entity's state
+ */
+ BaseEntity getState();
+
/**
* Get the location of this entity.
*
diff --git a/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java b/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java
index b9c4c1158..666c33872 100644
--- a/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java
+++ b/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java
@@ -22,11 +22,16 @@ package com.sk89q.worldedit.extent;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
+import com.sk89q.worldedit.entity.BaseEntity;
+import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.OperationQueue;
+import com.sk89q.worldedit.util.Location;
import javax.annotation.Nullable;
+import java.util.List;
+
import static com.google.common.base.Preconditions.checkNotNull;
/**
@@ -70,6 +75,17 @@ public abstract class AbstractDelegateExtent implements Extent {
return extent.setBlock(location, block);
}
+ @Override
+ @Nullable
+ public Entity createEntity(Location location, BaseEntity entity) {
+ return extent.createEntity(location, entity);
+ }
+
+ @Override
+ public List getEntities() {
+ return extent.getEntities();
+ }
+
@Override
public Vector getMinimumPoint() {
return extent.getMinimumPoint();
diff --git a/src/main/java/com/sk89q/worldedit/extent/Extent.java b/src/main/java/com/sk89q/worldedit/extent/Extent.java
index 34d86d298..14bacb425 100644
--- a/src/main/java/com/sk89q/worldedit/extent/Extent.java
+++ b/src/main/java/com/sk89q/worldedit/extent/Extent.java
@@ -20,6 +20,12 @@
package com.sk89q.worldedit.extent;
import com.sk89q.worldedit.Vector;
+import com.sk89q.worldedit.entity.BaseEntity;
+import com.sk89q.worldedit.entity.Entity;
+import com.sk89q.worldedit.util.Location;
+
+import javax.annotation.Nullable;
+import java.util.List;
/**
* A world, portion of a world, clipboard, or other object that can have blocks
@@ -50,4 +56,24 @@ public interface Extent extends InputExtent, OutputExtent {
*/
Vector getMaximumPoint();
+ /**
+ * Get a list of all entities.
+ *
+ * If the extent is not wholly loaded (i.e. a world being simulated in the
+ * game will not have every chunk loaded), then this list may not be
+ * incomplete.
+ *
+ * @return a list of entities
+ */
+ List getEntities();
+
+ /**
+ * Create an entity at the given location.
+ *
+ * @param entity the entity
+ * @param location the location
+ * @return a reference to the created entity, or null if the entity could not be created
+ */
+ @Nullable Entity createEntity(Location location, BaseEntity entity);
+
}
diff --git a/src/main/java/com/sk89q/worldedit/extent/NullExtent.java b/src/main/java/com/sk89q/worldedit/extent/NullExtent.java
index f291bc2f2..5f8f84644 100644
--- a/src/main/java/com/sk89q/worldedit/extent/NullExtent.java
+++ b/src/main/java/com/sk89q/worldedit/extent/NullExtent.java
@@ -22,9 +22,14 @@ package com.sk89q.worldedit.extent;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
+import com.sk89q.worldedit.entity.BaseEntity;
+import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.function.operation.Operation;
+import com.sk89q.worldedit.util.Location;
import javax.annotation.Nullable;
+import java.util.Collections;
+import java.util.List;
/**
* An extent that returns air blocks for all blocks and does not
@@ -44,6 +49,17 @@ public class NullExtent implements Extent {
return nullPoint;
}
+ @Override
+ public List getEntities() {
+ return Collections.emptyList();
+ }
+
+ @Nullable
+ @Override
+ public Entity createEntity(Location location, BaseEntity entity) {
+ return null;
+ }
+
@Override
public BaseBlock getBlock(Vector position) {
return new BaseBlock(0);
diff --git a/src/main/java/com/sk89q/worldedit/internal/LocalWorldAdapter.java b/src/main/java/com/sk89q/worldedit/internal/LocalWorldAdapter.java
index 9dc583878..9ed250c7f 100644
--- a/src/main/java/com/sk89q/worldedit/internal/LocalWorldAdapter.java
+++ b/src/main/java/com/sk89q/worldedit/internal/LocalWorldAdapter.java
@@ -32,6 +32,7 @@ import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.mapping.Resolver;
import javax.annotation.Nullable;
+import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -339,6 +340,17 @@ public class LocalWorldAdapter extends LocalWorld {
return world.getMetaData(entity, metaDataClass);
}
+ @Override
+ @Nullable
+ public Entity createEntity(com.sk89q.worldedit.util.Location location, BaseEntity entity) {
+ return world.createEntity(location, entity);
+ }
+
+ @Override
+ public List getEntities() {
+ return world.getEntities();
+ }
+
public static LocalWorldAdapter wrap(World world) {
return new LocalWorldAdapter(world);
}
diff --git a/src/main/java/com/sk89q/worldedit/world/NullWorld.java b/src/main/java/com/sk89q/worldedit/world/NullWorld.java
index ba7b9d0d7..35cc1a863 100644
--- a/src/main/java/com/sk89q/worldedit/world/NullWorld.java
+++ b/src/main/java/com/sk89q/worldedit/world/NullWorld.java
@@ -26,11 +26,14 @@ import com.sk89q.worldedit.blocks.BlockID;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.regions.Region;
+import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.TreeGenerator.TreeType;
import com.sk89q.worldedit.world.mapping.NullResolver;
import com.sk89q.worldedit.world.mapping.Resolver;
import javax.annotation.Nullable;
+import java.util.Collections;
+import java.util.List;
/**
* A null implementation of {@link World} that drops all changes and
@@ -128,4 +131,15 @@ public class NullWorld extends AbstractWorld {
public T getMetaData(BaseEntity entity, Class metaDataClass) {
return null;
}
+
+ @Override
+ public List getEntities() {
+ return Collections.emptyList();
+ }
+
+ @Nullable
+ @Override
+ public Entity createEntity(Location location, BaseEntity entity) {
+ return null;
+ }
}