From 50f60da69fefc325c9b6186ff03f8fd48ab1ab55 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Tue, 2 Jan 2018 20:49:36 +1000 Subject: [PATCH] Prevent players and complex parts being pasted in schematics. --- .../com/sk89q/worldedit/bukkit/BukkitEntityType.java | 7 +++++++ .../sk89q/worldedit/entity/metadata/EntityType.java | 7 +++++++ .../function/operation/ForwardExtentCopy.java | 11 +++++++++++ .../com/sk89q/worldedit/forge/ForgeEntityType.java | 7 +++++++ .../com/sk89q/worldedit/sponge/SpongeEntityType.java | 7 +++++++ 5 files changed, 39 insertions(+) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitEntityType.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitEntityType.java index 57e57c29b..43d20b6b9 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitEntityType.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitEntityType.java @@ -24,6 +24,7 @@ import com.sk89q.worldedit.util.Enums; import org.bukkit.entity.Ambient; import org.bukkit.entity.Animals; import org.bukkit.entity.Boat; +import org.bukkit.entity.ComplexEntityPart; import org.bukkit.entity.Entity; import org.bukkit.entity.ExperienceOrb; import org.bukkit.entity.FallingBlock; @@ -34,6 +35,7 @@ import org.bukkit.entity.ItemFrame; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Minecart; import org.bukkit.entity.Painting; +import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.TNTPrimed; import org.bukkit.entity.Tameable; @@ -143,4 +145,9 @@ class BukkitEntityType implements EntityType { public boolean isArmorStand() { return entity.getType() == armorStandType; } + + @Override + public boolean isPasteable() { + return !(entity instanceof Player || entity instanceof ComplexEntityPart); + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/metadata/EntityType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/metadata/EntityType.java index f13cfd808..44bf37888 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/metadata/EntityType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/metadata/EntityType.java @@ -154,4 +154,11 @@ public interface EntityType { * @return true if an armor stand */ boolean isArmorStand(); + + /** + * Test whether this entity can be pasted. + * + * @return true if pasteable + */ + boolean isPasteable(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java index 3883ec5b4..7017fd300 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java @@ -22,6 +22,7 @@ package com.sk89q.worldedit.function.operation; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.Entity; +import com.sk89q.worldedit.entity.metadata.EntityType; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.CombinedRegionFunction; import com.sk89q.worldedit.function.RegionFunction; @@ -36,6 +37,7 @@ import com.sk89q.worldedit.math.transform.Identity; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; +import java.util.Iterator; import java.util.List; import static com.google.common.base.Preconditions.checkArgument; @@ -255,6 +257,15 @@ public class ForwardExtentCopy implements Operation { ExtentEntityCopy entityCopy = new ExtentEntityCopy(from, destination, to, currentTransform); entityCopy.setRemoving(removingEntities); List entities = source.getEntities(region); + // Switch to entities.removeIf after Java 8 cutoff. + Iterator entityIterator = entities.iterator(); + while (entityIterator.hasNext()) { + EntityType type = entityIterator.next().getFacet(EntityType.class); + + if (type != null && !type.isPasteable()) { + entityIterator.remove(); + } + } EntityVisitor entityVisitor = new EntityVisitor(entities.iterator(), entityCopy); return new DelegateOperation(this, new OperationQueue(blockVisitor, entityVisitor)); } else { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntityType.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntityType.java index a7a4b3cbd..59d7c2eb3 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntityType.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntityType.java @@ -25,6 +25,7 @@ import net.minecraft.entity.EntityLiving; import net.minecraft.entity.IMerchant; import net.minecraft.entity.INpc; import net.minecraft.entity.IProjectile; +import net.minecraft.entity.MultiPartEntityPart; import net.minecraft.entity.item.EntityArmorStand; import net.minecraft.entity.item.EntityBoat; import net.minecraft.entity.item.EntityEnderEye; @@ -40,6 +41,7 @@ import net.minecraft.entity.passive.EntityAmbientCreature; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.passive.EntityTameable; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import static com.google.common.base.Preconditions.checkNotNull; @@ -141,4 +143,9 @@ public class ForgeEntityType implements EntityType { public boolean isArmorStand() { return entity instanceof EntityArmorStand; } + + @Override + public boolean isPasteable() { + return !(entity instanceof EntityPlayerMP || entity instanceof MultiPartEntityPart); + } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntityType.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntityType.java index d3d73cffa..4dcab172c 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntityType.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntityType.java @@ -30,7 +30,9 @@ import org.spongepowered.api.entity.hanging.ItemFrame; import org.spongepowered.api.entity.hanging.Painting; import org.spongepowered.api.entity.living.*; import org.spongepowered.api.entity.living.animal.Animal; +import org.spongepowered.api.entity.living.complex.ComplexLivingPart; import org.spongepowered.api.entity.living.golem.Golem; +import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.projectile.Projectile; import org.spongepowered.api.entity.vehicle.Boat; import org.spongepowered.api.entity.vehicle.minecart.Minecart; @@ -139,4 +141,9 @@ public class SpongeEntityType implements EntityType { public boolean isArmorStand() { return entity instanceof ArmorStand; } + + @Override + public boolean isPasteable() { + return !(entity instanceof Player || entity instanceof ComplexLivingPart); + } }