geforkt von Mirrors/FastAsyncWorldEdit
Added basic entity handling with copy and paste.
Paintings do not currently respawn properly, entity pastes cannot be undone yet, and schematics do not yet store entities @celticminstrel needs to fix painting spawning
Dieser Commit ist enthalten in:
Ursprung
03f7d4ecfb
Commit
c76f119fa4
@ -26,6 +26,9 @@ import com.sk89q.worldedit.schematic.SchematicFormat;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The clipboard remembers the state of a cuboid region.
|
* The clipboard remembers the state of a cuboid region.
|
||||||
*
|
*
|
||||||
@ -45,6 +48,7 @@ public class CuboidClipboard {
|
|||||||
private Vector offset;
|
private Vector offset;
|
||||||
private Vector origin;
|
private Vector origin;
|
||||||
private Vector size;
|
private Vector size;
|
||||||
|
private List<CopiedEntity> entities = new ArrayList<CopiedEntity>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs the clipboard.
|
* Constructs the clipboard.
|
||||||
@ -263,6 +267,11 @@ public class CuboidClipboard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void paste(EditSession editSession, Vector newOrigin, boolean noAir)
|
||||||
|
throws MaxChangedBlocksException {
|
||||||
|
paste(editSession, newOrigin, noAir, false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paste from the clipboard.
|
* Paste from the clipboard.
|
||||||
*
|
*
|
||||||
@ -271,9 +280,12 @@ public class CuboidClipboard {
|
|||||||
* @param noAir True to not paste air
|
* @param noAir True to not paste air
|
||||||
* @throws MaxChangedBlocksException
|
* @throws MaxChangedBlocksException
|
||||||
*/
|
*/
|
||||||
public void paste(EditSession editSession, Vector newOrigin, boolean noAir)
|
public void paste(EditSession editSession, Vector newOrigin, boolean noAir, boolean entities)
|
||||||
throws MaxChangedBlocksException {
|
throws MaxChangedBlocksException {
|
||||||
place(editSession, newOrigin.add(offset), noAir);
|
place(editSession, newOrigin.add(offset), noAir);
|
||||||
|
if (entities) {
|
||||||
|
pasteEntities(newOrigin.add(offset));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -298,6 +310,21 @@ public class CuboidClipboard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LocalEntity[] pasteEntities(Vector pos) {
|
||||||
|
LocalEntity[] entities = new LocalEntity[this.entities.size()];
|
||||||
|
for (int i = 0; i < this.entities.size(); ++i) {
|
||||||
|
CopiedEntity copied = this.entities.get(i);
|
||||||
|
if (copied.entity.spawn(copied.entity.getPosition().setPosition(copied.relativePosition.add(pos)))) {
|
||||||
|
entities[i] = copied.entity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void storeEntity(LocalEntity entity) {
|
||||||
|
this.entities.add(new CopiedEntity(entity));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get one point in the copy. The point is relative to the origin
|
* Get one point in the copy. The point is relative to the origin
|
||||||
* of the copy (0, 0, 0) and not to the actual copy origin.
|
* of the copy (0, 0, 0) and not to the actual copy origin.
|
||||||
@ -384,4 +411,14 @@ public class CuboidClipboard {
|
|||||||
public void setOffset(Vector offset) {
|
public void setOffset(Vector offset) {
|
||||||
this.offset = offset;
|
this.offset = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class CopiedEntity {
|
||||||
|
private final LocalEntity entity;
|
||||||
|
private final Vector relativePosition;
|
||||||
|
|
||||||
|
public CopiedEntity(LocalEntity entity) {
|
||||||
|
this.entity = entity;
|
||||||
|
this.relativePosition = entity.getPosition().getPosition().subtract(getOrigin());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
40
src/main/java/com/sk89q/worldedit/LocalEntity.java
Normale Datei
40
src/main/java/com/sk89q/worldedit/LocalEntity.java
Normale Datei
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit
|
||||||
|
* Copyright (C) 2012 sk89q <http://www.sk89q.com> and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.sk89q.worldedit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zml2008
|
||||||
|
*/
|
||||||
|
public abstract class LocalEntity {
|
||||||
|
private final Location position;
|
||||||
|
|
||||||
|
protected LocalEntity(Location position) {
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean spawn() {
|
||||||
|
return spawn(getPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean spawn(Location loc);
|
||||||
|
}
|
@ -501,4 +501,12 @@ public abstract class LocalWorld {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LocalEntity[] getEntities(Region region) {
|
||||||
|
return new LocalEntity[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public int killEntities(LocalEntity... entities) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,16 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.bukkit.entity.BukkitEntity;
|
||||||
|
import com.sk89q.worldedit.bukkit.entity.BukkitExpOrb;
|
||||||
|
import com.sk89q.worldedit.bukkit.entity.BukkitItem;
|
||||||
|
import com.sk89q.worldedit.bukkit.entity.BukkitPainting;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.ExperienceOrb;
|
||||||
|
import org.bukkit.entity.Item;
|
||||||
|
import org.bukkit.entity.Painting;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
@ -139,4 +147,18 @@ public class BukkitUtil {
|
|||||||
public static World toWorld(final LocalWorld world) {
|
public static World toWorld(final LocalWorld world) {
|
||||||
return ((BukkitWorld) world).getWorld();
|
return ((BukkitWorld) world).getWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static BukkitEntity toLocalEntity(Entity e) {
|
||||||
|
switch (e.getType()) {
|
||||||
|
case EXPERIENCE_ORB:
|
||||||
|
return new BukkitExpOrb(toLocation(e.getLocation()), e.getUniqueId(), ((ExperienceOrb)e).getExperience());
|
||||||
|
/*case PAINTING: // TODO: Figure out what celticminstrel broke
|
||||||
|
Painting paint = (Painting) e;
|
||||||
|
return new BukkitPainting(toLocation(e.getLocation()), paint.getArt(), paint.getFacing(), e.getUniqueId());*/
|
||||||
|
case DROPPED_ITEM:
|
||||||
|
return new BukkitItem(toLocation(e.getLocation()), ((Item)e).getItemStack(), e.getUniqueId());
|
||||||
|
default:
|
||||||
|
return new BukkitEntity(toLocation(e.getLocation()), e.getType(), e.getUniqueId());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,11 +19,19 @@
|
|||||||
|
|
||||||
package com.sk89q.worldedit.bukkit;
|
package com.sk89q.worldedit.bukkit;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.LocalEntity;
|
||||||
import com.sk89q.worldedit.WorldEdit;
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
|
import com.sk89q.worldedit.bukkit.entity.BukkitEntity;
|
||||||
import com.sk89q.worldedit.util.TreeGenerator;
|
import com.sk89q.worldedit.util.TreeGenerator;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
@ -892,4 +900,34 @@ public class BukkitWorld extends LocalWorld {
|
|||||||
public void simulateBlockMine(Vector pt) {
|
public void simulateBlockMine(Vector pt) {
|
||||||
world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).breakNaturally();
|
world.getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()).breakNaturally();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LocalEntity[] getEntities(Region region) {
|
||||||
|
List<BukkitEntity> entities = new ArrayList<BukkitEntity>();
|
||||||
|
for (Vector2D pt : region.getChunks()) {
|
||||||
|
if (world.isChunkLoaded(pt.getBlockX(), pt.getBlockZ())) {
|
||||||
|
Entity[] ents = world.getChunkAt(pt.getBlockX(), pt.getBlockZ()).getEntities();
|
||||||
|
for (Entity ent : ents) {
|
||||||
|
if (region.contains(BukkitUtil.toVector(ent.getLocation()))) {
|
||||||
|
entities.add(BukkitUtil.toLocalEntity(ent));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entities.toArray(new BukkitEntity[entities.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int killEntities(LocalEntity... entities) {
|
||||||
|
int amount = 0;
|
||||||
|
Set<UUID> toKill = new HashSet<UUID>();
|
||||||
|
for (LocalEntity entity : entities) {
|
||||||
|
toKill.add(((BukkitEntity) entity).getEntityId());
|
||||||
|
}
|
||||||
|
for (Entity entity : world.getEntities()) {
|
||||||
|
if (toKill.contains(entity.getUniqueId())) {
|
||||||
|
entity.remove();
|
||||||
|
++amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
50
src/main/java/com/sk89q/worldedit/bukkit/entity/BukkitEntity.java
Normale Datei
50
src/main/java/com/sk89q/worldedit/bukkit/entity/BukkitEntity.java
Normale Datei
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit
|
||||||
|
* Copyright (C) 2012 sk89q <http://www.sk89q.com> and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.sk89q.worldedit.bukkit.entity;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.LocalEntity;
|
||||||
|
import com.sk89q.worldedit.Location;
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitUtil;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zml2008
|
||||||
|
*/
|
||||||
|
public class BukkitEntity extends LocalEntity {
|
||||||
|
private final EntityType type;
|
||||||
|
private final UUID entityId;
|
||||||
|
|
||||||
|
public BukkitEntity(Location loc, EntityType type, UUID entityId) {
|
||||||
|
super(loc);
|
||||||
|
this.type = type;
|
||||||
|
this.entityId = entityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getEntityId() {
|
||||||
|
return entityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean spawn(Location weLoc) {
|
||||||
|
org.bukkit.Location loc = BukkitUtil.toLocation(weLoc);
|
||||||
|
return loc.getWorld().spawnCreature(loc, type) != null;
|
||||||
|
}
|
||||||
|
}
|
49
src/main/java/com/sk89q/worldedit/bukkit/entity/BukkitExpOrb.java
Normale Datei
49
src/main/java/com/sk89q/worldedit/bukkit/entity/BukkitExpOrb.java
Normale Datei
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit
|
||||||
|
* Copyright (C) 2012 sk89q <http://www.sk89q.com> and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.sk89q.worldedit.bukkit.entity;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.Location;
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitUtil;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.ExperienceOrb;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zml2008
|
||||||
|
*/
|
||||||
|
public class BukkitExpOrb extends BukkitEntity {
|
||||||
|
private final int amount;
|
||||||
|
|
||||||
|
public BukkitExpOrb(Location loc, UUID entityId, int amount) {
|
||||||
|
super(loc, EntityType.EXPERIENCE_ORB, entityId);
|
||||||
|
this.amount = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean spawn(Location weLoc) {
|
||||||
|
org.bukkit.Location loc = BukkitUtil.toLocation(weLoc);
|
||||||
|
ExperienceOrb orb = loc.getWorld().spawn(loc, ExperienceOrb.class);
|
||||||
|
if (orb != null) {
|
||||||
|
orb.setExperience(amount);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
43
src/main/java/com/sk89q/worldedit/bukkit/entity/BukkitItem.java
Normale Datei
43
src/main/java/com/sk89q/worldedit/bukkit/entity/BukkitItem.java
Normale Datei
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit
|
||||||
|
* Copyright (C) 2012 sk89q <http://www.sk89q.com> and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.sk89q.worldedit.bukkit.entity;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.Location;
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitUtil;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zml2008
|
||||||
|
*/
|
||||||
|
public class BukkitItem extends BukkitEntity {
|
||||||
|
private final ItemStack stack;
|
||||||
|
public BukkitItem(Location loc, ItemStack stack, UUID entityId) {
|
||||||
|
super(loc, EntityType.DROPPED_ITEM, entityId);
|
||||||
|
this.stack = stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean spawn(Location weLoc) {
|
||||||
|
org.bukkit.Location loc = BukkitUtil.toLocation(weLoc);
|
||||||
|
return loc.getWorld().dropItem(loc, stack) != null;
|
||||||
|
}
|
||||||
|
}
|
52
src/main/java/com/sk89q/worldedit/bukkit/entity/BukkitPainting.java
Normale Datei
52
src/main/java/com/sk89q/worldedit/bukkit/entity/BukkitPainting.java
Normale Datei
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit
|
||||||
|
* Copyright (C) 2012 sk89q <http://www.sk89q.com> and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.sk89q.worldedit.bukkit.entity;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.Location;
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitUtil;
|
||||||
|
import org.bukkit.Art;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Painting;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zml2008
|
||||||
|
*/
|
||||||
|
public class BukkitPainting extends BukkitEntity {
|
||||||
|
private final Art art;
|
||||||
|
private final BlockFace facingDirection;
|
||||||
|
public BukkitPainting(Location loc, Art art, BlockFace facingDirection, UUID entityId) {
|
||||||
|
super(loc, EntityType.PAINTING, entityId);
|
||||||
|
this.art = art;
|
||||||
|
this.facingDirection = facingDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean spawn(Location weLoc) {
|
||||||
|
org.bukkit.Location loc = BukkitUtil.toLocation(weLoc);
|
||||||
|
Painting paint = loc.getWorld().spawn(loc, Painting.class);
|
||||||
|
if (paint != null) {
|
||||||
|
paint.setFacingDirection(facingDirection);
|
||||||
|
paint.setArt(art);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -48,8 +48,12 @@ public class ClipboardCommands {
|
|||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
aliases = { "/copy" },
|
aliases = { "/copy" },
|
||||||
usage = "",
|
flags = "e",
|
||||||
desc = "Copy the selection to the clipboard",
|
desc = "Copy the selection to the clipboard",
|
||||||
|
help = "Copy the selection to the clipboard\n" +
|
||||||
|
"Flags:\n" +
|
||||||
|
" -e controls whether entities are copied\n" +
|
||||||
|
"WARNING: Pasting entities cannot yet be undone!",
|
||||||
min = 0,
|
min = 0,
|
||||||
max = 0
|
max = 0
|
||||||
)
|
)
|
||||||
@ -66,6 +70,11 @@ public class ClipboardCommands {
|
|||||||
max.subtract(min).add(new Vector(1, 1, 1)),
|
max.subtract(min).add(new Vector(1, 1, 1)),
|
||||||
min, min.subtract(pos));
|
min, min.subtract(pos));
|
||||||
clipboard.copy(editSession);
|
clipboard.copy(editSession);
|
||||||
|
if (args.hasFlag('e')) {
|
||||||
|
for (LocalEntity entity : player.getWorld().getEntities(region)) {
|
||||||
|
clipboard.storeEntity(entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
session.setClipboard(clipboard);
|
session.setClipboard(clipboard);
|
||||||
|
|
||||||
player.print("Block(s) copied.");
|
player.print("Block(s) copied.");
|
||||||
@ -75,6 +84,11 @@ public class ClipboardCommands {
|
|||||||
aliases = { "/cut" },
|
aliases = { "/cut" },
|
||||||
usage = "[leave-id]",
|
usage = "[leave-id]",
|
||||||
desc = "Cut the selection to the clipboard",
|
desc = "Cut the selection to the clipboard",
|
||||||
|
help = "Copy the selection to the clipboard\n" +
|
||||||
|
"Flags:\n" +
|
||||||
|
" -e controls whether entities are copied\n" +
|
||||||
|
"WARNING: Cutting and pasting entities cannot yet be undone!",
|
||||||
|
flags = "e",
|
||||||
min = 0,
|
min = 0,
|
||||||
max = 1
|
max = 1
|
||||||
)
|
)
|
||||||
@ -84,12 +98,13 @@ public class ClipboardCommands {
|
|||||||
EditSession editSession) throws WorldEditException {
|
EditSession editSession) throws WorldEditException {
|
||||||
|
|
||||||
BaseBlock block = new BaseBlock(BlockID.AIR);
|
BaseBlock block = new BaseBlock(BlockID.AIR);
|
||||||
|
LocalWorld world = player.getWorld();
|
||||||
|
|
||||||
if (args.argsLength() > 0) {
|
if (args.argsLength() > 0) {
|
||||||
block = we.getBlock(player, args.getString(0));
|
block = we.getBlock(player, args.getString(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
Region region = session.getSelection(player.getWorld());
|
Region region = session.getSelection(world);
|
||||||
Vector min = region.getMinimumPoint();
|
Vector min = region.getMinimumPoint();
|
||||||
Vector max = region.getMaximumPoint();
|
Vector max = region.getMaximumPoint();
|
||||||
Vector pos = session.getPlacementPosition(player);
|
Vector pos = session.getPlacementPosition(player);
|
||||||
@ -98,9 +113,16 @@ public class ClipboardCommands {
|
|||||||
max.subtract(min).add(new Vector(1, 1, 1)),
|
max.subtract(min).add(new Vector(1, 1, 1)),
|
||||||
min, min.subtract(pos));
|
min, min.subtract(pos));
|
||||||
clipboard.copy(editSession);
|
clipboard.copy(editSession);
|
||||||
|
if (args.hasFlag('e')) {
|
||||||
|
LocalEntity[] entities = world.getEntities(region);
|
||||||
|
for (LocalEntity entity : entities) {
|
||||||
|
clipboard.storeEntity(entity);
|
||||||
|
}
|
||||||
|
world.killEntities(entities);
|
||||||
|
}
|
||||||
session.setClipboard(clipboard);
|
session.setClipboard(clipboard);
|
||||||
|
|
||||||
editSession.setBlocks(session.getSelection(player.getWorld()), block);
|
editSession.setBlocks(session.getSelection(world), block);
|
||||||
player.print("Block(s) cut.");
|
player.print("Block(s) cut.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,11 +150,12 @@ public class ClipboardCommands {
|
|||||||
if (atOrigin) {
|
if (atOrigin) {
|
||||||
Vector pos = session.getClipboard().getOrigin();
|
Vector pos = session.getClipboard().getOrigin();
|
||||||
session.getClipboard().place(editSession, pos, pasteNoAir);
|
session.getClipboard().place(editSession, pos, pasteNoAir);
|
||||||
|
session.getClipboard().pasteEntities(pos);
|
||||||
player.findFreePosition();
|
player.findFreePosition();
|
||||||
player.print("Pasted to copy origin. Undo with //undo");
|
player.print("Pasted to copy origin. Undo with //undo");
|
||||||
} else {
|
} else {
|
||||||
Vector pos = session.getPlacementPosition(player);
|
Vector pos = session.getPlacementPosition(player);
|
||||||
session.getClipboard().paste(editSession, pos, pasteNoAir);
|
session.getClipboard().paste(editSession, pos, pasteNoAir, true);
|
||||||
player.findFreePosition();
|
player.findFreePosition();
|
||||||
player.print("Pasted relative to you. Undo with //undo");
|
player.print("Pasted relative to you. Undo with //undo");
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,11 @@ public class SchematicCommands {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!format.isOfFormat(f)) {
|
||||||
|
player.printError(fileName + " is not of the " + format.getName() + " schematic format!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String filePath = f.getCanonicalPath();
|
String filePath = f.getCanonicalPath();
|
||||||
String dirPath = dir.getCanonicalPath();
|
String dirPath = dir.getCanonicalPath();
|
||||||
|
64
src/main/java/com/sk89q/worldedit/spout/SpoutEntity.java
Normale Datei
64
src/main/java/com/sk89q/worldedit/spout/SpoutEntity.java
Normale Datei
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit
|
||||||
|
* Copyright (C) 2012 sk89q <http://www.sk89q.com> and contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.sk89q.worldedit.spout;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.LocalEntity;
|
||||||
|
import com.sk89q.worldedit.Location;
|
||||||
|
import org.spout.api.entity.Controller;
|
||||||
|
import org.spout.api.entity.Entity;
|
||||||
|
import org.spout.api.entity.type.ControllerType;
|
||||||
|
import org.spout.api.geo.World;
|
||||||
|
import org.spout.api.geo.discrete.Point;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zml2008
|
||||||
|
*/
|
||||||
|
public class SpoutEntity extends LocalEntity {
|
||||||
|
private final ControllerType type;
|
||||||
|
private final int entityId;
|
||||||
|
|
||||||
|
public SpoutEntity(Location position, int id, Controller controller) {
|
||||||
|
super(position);
|
||||||
|
type = controller.getType();
|
||||||
|
this.entityId = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getEntityId() {
|
||||||
|
return entityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean spawn(Location loc) {
|
||||||
|
World world = ((SpoutWorld) loc.getWorld()).getWorld();
|
||||||
|
Point pos = SpoutUtil.toPoint(world, loc.getPosition());
|
||||||
|
Controller controller = type.createController();
|
||||||
|
if (controller == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Entity e = world.createAndSpawnEntity(pos, controller);
|
||||||
|
|
||||||
|
if (e != null) {
|
||||||
|
e.setPitch(loc.getPitch());
|
||||||
|
e.setYaw(loc.getYaw());
|
||||||
|
// TODO: Copy datatable info
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -24,9 +24,11 @@ package com.sk89q.worldedit.spout;
|
|||||||
import com.sk89q.worldedit.BlockVector;
|
import com.sk89q.worldedit.BlockVector;
|
||||||
import com.sk89q.worldedit.BlockWorldVector;
|
import com.sk89q.worldedit.BlockWorldVector;
|
||||||
import com.sk89q.worldedit.LocalWorld;
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
|
import com.sk89q.worldedit.Location;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
import com.sk89q.worldedit.WorldVector;
|
import com.sk89q.worldedit.WorldVector;
|
||||||
import org.spout.api.Game;
|
import org.spout.api.Game;
|
||||||
|
import org.spout.api.entity.Entity;
|
||||||
import org.spout.api.geo.World;
|
import org.spout.api.geo.World;
|
||||||
import org.spout.api.geo.cuboid.Block;
|
import org.spout.api.geo.cuboid.Block;
|
||||||
import org.spout.api.geo.discrete.Point;
|
import org.spout.api.geo.discrete.Point;
|
||||||
@ -105,4 +107,8 @@ public class SpoutUtil {
|
|||||||
public static World toWorld(WorldVector pt) {
|
public static World toWorld(WorldVector pt) {
|
||||||
return ((SpoutWorld) pt.getWorld()).getWorld();
|
return ((SpoutWorld) pt.getWorld()).getWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Location toLocation(Entity ent) {
|
||||||
|
return new Location(getLocalWorld(ent.getWorld()), toVector(ent.getPosition()), ent.getYaw(), ent.getPitch());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ import com.sk89q.worldedit.BiomeType;
|
|||||||
import com.sk89q.worldedit.BlockVector2D;
|
import com.sk89q.worldedit.BlockVector2D;
|
||||||
import com.sk89q.worldedit.EditSession;
|
import com.sk89q.worldedit.EditSession;
|
||||||
import com.sk89q.worldedit.EntityType;
|
import com.sk89q.worldedit.EntityType;
|
||||||
|
import com.sk89q.worldedit.LocalEntity;
|
||||||
import com.sk89q.worldedit.LocalWorld;
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
|
import com.sk89q.worldedit.MaxChangedBlocksException;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
@ -49,6 +50,9 @@ import org.spout.vanilla.controller.object.projectile.Arrow;
|
|||||||
import org.spout.vanilla.controller.object.vehicle.Boat;
|
import org.spout.vanilla.controller.object.vehicle.Boat;
|
||||||
import org.spout.vanilla.controller.object.vehicle.Minecart;
|
import org.spout.vanilla.controller.object.vehicle.Minecart;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class SpoutWorld extends LocalWorld {
|
public class SpoutWorld extends LocalWorld {
|
||||||
private World world;
|
private World world;
|
||||||
|
|
||||||
@ -732,4 +736,35 @@ public class SpoutWorld extends LocalWorld {
|
|||||||
*/
|
*/
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SpoutEntity[] getEntities(Region region) {
|
||||||
|
List<SpoutEntity> entities = new ArrayList<SpoutEntity>();
|
||||||
|
for (Vector pt : region.getChunkCubes()) {
|
||||||
|
Chunk chunk = world.getChunk(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ(), false);
|
||||||
|
if (chunk == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (Entity ent : chunk.getEntities()) {
|
||||||
|
if (region.contains(SpoutUtil.toVector(ent.getPosition()))) {
|
||||||
|
entities.add(new SpoutEntity(SpoutUtil.toLocation(ent), ent.getId(), ent.getController()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entities.toArray(new SpoutEntity[entities.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int killEntities(LocalEntity[] entities) {
|
||||||
|
int amount = 0;
|
||||||
|
for (LocalEntity weEnt : entities) {
|
||||||
|
SpoutEntity entity = (SpoutEntity) weEnt;
|
||||||
|
Entity spoutEntity = world.getEntity(entity.getEntityId());
|
||||||
|
if (spoutEntity != null) {
|
||||||
|
spoutEntity.kill();
|
||||||
|
++amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren