Search in sources :

Example 1 with FloatTag

use of com.sk89q.jnbt.FloatTag in project FastAsyncWorldEdit by IntellectualSites.

the class ClipboardWriter method writeRotation.

default Tag writeRotation(Location location) {
    List<FloatTag> list = new ArrayList<>();
    list.add(new FloatTag(location.getYaw()));
    list.add(new FloatTag(location.getPitch()));
    return new ListTag(FloatTag.class, list);
}
Also used : FloatTag(com.sk89q.jnbt.FloatTag) ArrayList(java.util.ArrayList) ListTag(com.sk89q.jnbt.ListTag)

Example 2 with FloatTag

use of com.sk89q.jnbt.FloatTag in project FastAsyncWorldEdit by IntellectualSites.

the class ExtentEntityCopy method transformNbtData.

/**
 * Transform NBT data in the given entity state and return a new instance
 * if the NBT data needs to be transformed.
 *
 * @param state the existing state
 * @return a new state or the existing one
 */
private BaseEntity transformNbtData(BaseEntity state) {
    CompoundTag tag = state.getNbtData();
    if (tag != null) {
        // Handle leashed entities
        Tag leashTag = tag.getValue().get("Leash");
        if (leashTag instanceof CompoundTag) {
            CompoundTag leashCompound = (CompoundTag) leashTag;
            if (leashCompound.containsKey("X")) {
                // leashed to a fence
                Vector3 tilePosition = Vector3.at(leashCompound.asInt("X"), leashCompound.asInt("Y"), leashCompound.asInt("Z"));
                BlockVector3 newLeash = transform.apply(tilePosition.subtract(from)).add(to).toBlockPoint();
                return new BaseEntity(state.getType(), tag.createBuilder().put("Leash", leashCompound.createBuilder().putInt("X", newLeash.getBlockX()).putInt("Y", newLeash.getBlockY()).putInt("Z", newLeash.getBlockZ()).build()).build());
            }
        }
        // Handle hanging entities (paintings, item frames, etc.)
        boolean hasTilePosition = tag.containsKey("TileX") && tag.containsKey("TileY") && tag.containsKey("TileZ");
        boolean hasFacing = tag.containsKey("Facing");
        // FAWE Start
        boolean hasRotation = tag.containsKey("Rotation");
        if (hasTilePosition) {
            Vector3 tilePosition = Vector3.at(tag.asInt("TileX"), tag.asInt("TileY"), tag.asInt("TileZ"));
            BlockVector3 newTilePosition = transform.apply(tilePosition.subtract(from)).add(to).toBlockPoint();
            CompoundTagBuilder builder = tag.createBuilder().putInt("TileX", newTilePosition.getBlockX()).putInt("TileY", newTilePosition.getBlockY()).putInt("TileZ", newTilePosition.getBlockZ());
            if (hasFacing) {
                // Paintings have different facing values
                boolean isPainting = state.getType() == EntityTypes.PAINTING;
                Direction direction = isPainting ? MCDirections.fromHorizontalHanging(tag.asInt("Facing")) : MCDirections.fromHanging(tag.asInt("Facing"));
                if (direction != null) {
                    Vector3 vector = transform.apply(direction.toVector()).subtract(transform.apply(Vector3.ZERO)).normalize();
                    Direction newDirection = Direction.findClosest(vector, Flag.CARDINAL);
                    if (newDirection != null) {
                        builder.putByte("Facing", (byte) (isPainting ? MCDirections.toHorizontalHanging(newDirection) : MCDirections.toHanging(newDirection)));
                    }
                }
            }
            // FAWE start
            if (hasRotation) {
                ListTag orgrot = state.getNbtData().getListTag("Rotation");
                Vector3 orgDirection = new Location(source, 0, 0, 0, orgrot.getFloat(0), orgrot.getFloat(1)).getDirection();
                Vector3 newDirection = transform.apply(orgDirection).subtract(transform.apply(Vector3.ZERO)).normalize();
                builder.put("Rotation", new ListTag(FloatTag.class, Arrays.asList(new FloatTag((float) newDirection.toYaw()), new FloatTag((float) newDirection.toPitch()))));
            }
            return new BaseEntity(state.getType(), builder.build());
        } else if (hasRotation) {
            // armor stands do not have a tile pos
            CompoundTagBuilder builder = tag.createBuilder();
            ListTag orgrot = state.getNbtData().getListTag("Rotation");
            Vector3 orgDirection = new Location(source, 0, 0, 0, orgrot.getFloat(0), orgrot.getFloat(1)).getDirection();
            Vector3 newDirection = transform.apply(orgDirection).subtract(transform.apply(Vector3.ZERO)).normalize();
            builder.put("Rotation", new ListTag(FloatTag.class, Arrays.asList(new FloatTag((float) newDirection.toYaw()), new FloatTag((float) newDirection.toPitch()))));
            return new BaseEntity(state.getType(), builder.build());
        // FAWE end
        }
    }
    return state;
}
Also used : FloatTag(com.sk89q.jnbt.FloatTag) BaseEntity(com.sk89q.worldedit.entity.BaseEntity) BlockVector3(com.sk89q.worldedit.math.BlockVector3) Vector3(com.sk89q.worldedit.math.Vector3) ListTag(com.sk89q.jnbt.ListTag) FloatTag(com.sk89q.jnbt.FloatTag) CompoundTag(com.sk89q.jnbt.CompoundTag) Tag(com.sk89q.jnbt.Tag) BlockVector3(com.sk89q.worldedit.math.BlockVector3) Direction(com.sk89q.worldedit.util.Direction) ListTag(com.sk89q.jnbt.ListTag) CompoundTag(com.sk89q.jnbt.CompoundTag) CompoundTagBuilder(com.sk89q.jnbt.CompoundTagBuilder) Location(com.sk89q.worldedit.util.Location)

Aggregations

FloatTag (com.sk89q.jnbt.FloatTag)2 ListTag (com.sk89q.jnbt.ListTag)2 CompoundTag (com.sk89q.jnbt.CompoundTag)1 CompoundTagBuilder (com.sk89q.jnbt.CompoundTagBuilder)1 Tag (com.sk89q.jnbt.Tag)1 BaseEntity (com.sk89q.worldedit.entity.BaseEntity)1 BlockVector3 (com.sk89q.worldedit.math.BlockVector3)1 Vector3 (com.sk89q.worldedit.math.Vector3)1 Direction (com.sk89q.worldedit.util.Direction)1 Location (com.sk89q.worldedit.util.Location)1 ArrayList (java.util.ArrayList)1