// Path: src/main/java/craftedcart/smblevelworkshop/util/ITransformable.java
// public interface ITransformable {
// 
//     default void setPosition(PosXYZ position) { throw new UnsupportedOperationException(); }
//     default PosXYZ getPosition() { throw new UnsupportedOperationException(); }
// 
//     default boolean canMoveX() { return true; }
//     default boolean canMoveY() { return true; }
//     default boolean canMoveZ() { return true; }
// 
//     default void setRotation(PosXYZ rotation) { throw new UnsupportedOperationException(); }
//     default PosXYZ getRotation() { throw new UnsupportedOperationException(); }
// 
//     default boolean canRotate() { return true; }
// 
//     default void setScale(PosXYZ scale) { throw new UnsupportedOperationException(); }
//     default PosXYZ getScale() { throw new UnsupportedOperationException(); }
// 
//     default boolean canScale() { return true; }
// 
// }
// 
// Path: src/main/java/craftedcart/smblevelworkshop/util/LogHelper.java
// public class LogHelper {
// 
//     public static List<LogEntry> log = new ArrayList<>();
// 
//     private static void log(Class clazz, Level logLevel, Object object) {
//         LogManager.getLogger(clazz).log(logLevel, object);
//         log.add(new LogEntry(clazz, logLevel, object));
//         if (log.size() > 1024) {
//             log.remove(0);
//         }
//     }
// 
//     public static void all(Class clazz, Object object) {
//         log(clazz, Level.ALL, object);
//     }
// 
//     public static void fatal(Class clazz, Object object) {
//         log(clazz, Level.FATAL, object);
//     }
// 
//     public static void error(Class clazz, Object object) {
//         log(clazz, Level.ERROR, object);
//     }
// 
//     public static void warn(Class clazz, Object object) {
//         log(clazz, Level.WARN, object);
//     }
// 
//     public static void info(Class clazz, Object object) {
//         log(clazz, Level.INFO, object);
//     }
// 
//     public static void debug(Class clazz, Object object) {
//         log(clazz, Level.DEBUG, object);
//     }
// 
//     public static void trace(Class clazz, Object object) {
//         log(clazz, Level.TRACE, object);
//     }
// 
//     public static void off(Class clazz, Object object) {
//         log(clazz, Level.OFF, object);
//     }
// 
//     public static String stackTraceToString(Throwable e) {
//         StringBuilder sb = new StringBuilder();
//         for (StackTraceElement element : e.getStackTrace()) {
//             sb.append("    at ");
//             sb.append(element.toString());
//             sb.append("\n");
//         }
//         return sb.toString();
//     }
// 
//     public static class LogEntry {
// 
//         public Class clazz;
//         public Level logLevel;
//         public Object object;
// 
//         public LogEntry(Class clazz, Level logLevel, Object object) {
//             this.clazz = clazz;
//             this.logLevel = logLevel;
//             this.object = object;
//         }
// 
//     }
// 
// }
// 
// Path: src/main/java/craftedcart/smblevelworkshop/util/PosXYZ.java
// public class PosXYZ {
// 
//     public double x;
//     public double y;
//     public double z;
// 
//     public PosXYZ() {}
// 
//     public PosXYZ(double x, double y, double z) {
//         this.x = x;
//         this.y = y;
//         this.z = z;
//     }
// 
//     public PosXYZ(craftedcart.smbworkshopexporter.util.Vec3f vec3f) {
//         this.x = vec3f.x;
//         this.y = vec3f.y;
//         this.z = vec3f.z;
//     }
// 
//     public PosXYZ add(PosXYZ pos) {
//         return new PosXYZ(this.x + pos.x, this.y + pos.y, this.z + pos.z);
//     }
// 
//     public PosXYZ add(double x, double y, double z) {
//         return new PosXYZ(this.x + x, this.y + y, this.z + z);
//     }
// 
//     public PosXYZ subtract(PosXYZ pos) {
//         return new PosXYZ(this.x - pos.x, this.y - pos.y, this.z - pos.z);
//     }
// 
//     public PosXYZ subtract(double x, double y, double z) {
//         return new PosXYZ(this.x - x, this.y - y, this.z - z);
//     }
// 
//     public PosXYZ multiply(double factor) {
//         return new PosXYZ(x * factor, y * factor, z * factor);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj instanceof PosXYZ) {
//             PosXYZ posObj = (PosXYZ) obj;
//             return posObj.x == x && posObj.y == y && posObj.z == z;
//         } else {
//             return false;
//         }
//     }
// 
//     public PosXYZ getCopy() {
//         return new PosXYZ(x, y, z);
//     }
// 
// }


import craftedcart.smblevelworkshop.util.ITransformable;
import craftedcart.smblevelworkshop.util.LogHelper;
import craftedcart.smblevelworkshop.util.PosXYZ;
import craftedcart.smbworkshopexporter.placeables.*;
import org.jetbrains.annotations.NotNull;
    @Override
    public boolean canScale() {
        return getAsset().canScale();
    }

    public void setRotation(@NotNull PosXYZ rotation) {
        this.rotation = rotation;
    }

    @NotNull
    public PosXYZ getRotation() {
        return rotation;
    }

    public void setScale(@NotNull PosXYZ scale) {
        this.scale = scale;
    }

    @NotNull
    public PosXYZ getScale() {
        return scale;
    }

    public Placeable getCopy() {
        try {
            IAsset newAsset = asset.getCopy();
            Placeable newPlaceable = (Placeable) clone();
            newPlaceable.setAsset(newAsset);
            return newPlaceable;
        } catch (CloneNotSupportedException e) {
// Path: src/main/java/craftedcart/smblevelworkshop/util/ITransformable.java
// public interface ITransformable {
// 
//     default void setPosition(PosXYZ position) { throw new UnsupportedOperationException(); }
//     default PosXYZ getPosition() { throw new UnsupportedOperationException(); }
// 
//     default boolean canMoveX() { return true; }
//     default boolean canMoveY() { return true; }
//     default boolean canMoveZ() { return true; }
// 
//     default void setRotation(PosXYZ rotation) { throw new UnsupportedOperationException(); }
//     default PosXYZ getRotation() { throw new UnsupportedOperationException(); }
// 
//     default boolean canRotate() { return true; }
// 
//     default void setScale(PosXYZ scale) { throw new UnsupportedOperationException(); }
//     default PosXYZ getScale() { throw new UnsupportedOperationException(); }
// 
//     default boolean canScale() { return true; }
// 
// }
// 
// Path: src/main/java/craftedcart/smblevelworkshop/util/LogHelper.java
// public class LogHelper {
// 
//     public static List<LogEntry> log = new ArrayList<>();
// 
//     private static void log(Class clazz, Level logLevel, Object object) {
//         LogManager.getLogger(clazz).log(logLevel, object);
//         log.add(new LogEntry(clazz, logLevel, object));
//         if (log.size() > 1024) {
//             log.remove(0);
//         }
//     }
// 
//     public static void all(Class clazz, Object object) {
//         log(clazz, Level.ALL, object);
//     }
// 
//     public static void fatal(Class clazz, Object object) {
//         log(clazz, Level.FATAL, object);
//     }
// 
//     public static void error(Class clazz, Object object) {
//         log(clazz, Level.ERROR, object);
//     }
// 
//     public static void warn(Class clazz, Object object) {
//         log(clazz, Level.WARN, object);
//     }
// 
//     public static void info(Class clazz, Object object) {
//         log(clazz, Level.INFO, object);
//     }
// 
//     public static void debug(Class clazz, Object object) {
//         log(clazz, Level.DEBUG, object);
//     }
// 
//     public static void trace(Class clazz, Object object) {
//         log(clazz, Level.TRACE, object);
//     }
// 
//     public static void off(Class clazz, Object object) {
//         log(clazz, Level.OFF, object);
//     }
// 
//     public static String stackTraceToString(Throwable e) {
//         StringBuilder sb = new StringBuilder();
//         for (StackTraceElement element : e.getStackTrace()) {
//             sb.append("    at ");
//             sb.append(element.toString());
//             sb.append("\n");
//         }
//         return sb.toString();
//     }
// 
//     public static class LogEntry {
// 
//         public Class clazz;
//         public Level logLevel;
//         public Object object;
// 
//         public LogEntry(Class clazz, Level logLevel, Object object) {
//             this.clazz = clazz;
//             this.logLevel = logLevel;
//             this.object = object;
//         }
// 
//     }
// 
// }
// 
// Path: src/main/java/craftedcart/smblevelworkshop/util/PosXYZ.java
// public class PosXYZ {
// 
//     public double x;
//     public double y;
//     public double z;
// 
//     public PosXYZ() {}
// 
//     public PosXYZ(double x, double y, double z) {
//         this.x = x;
//         this.y = y;
//         this.z = z;
//     }
// 
//     public PosXYZ(craftedcart.smbworkshopexporter.util.Vec3f vec3f) {
//         this.x = vec3f.x;
//         this.y = vec3f.y;
//         this.z = vec3f.z;
//     }
// 
//     public PosXYZ add(PosXYZ pos) {
//         return new PosXYZ(this.x + pos.x, this.y + pos.y, this.z + pos.z);
//     }
// 
//     public PosXYZ add(double x, double y, double z) {
//         return new PosXYZ(this.x + x, this.y + y, this.z + z);
//     }
// 
//     public PosXYZ subtract(PosXYZ pos) {
//         return new PosXYZ(this.x - pos.x, this.y - pos.y, this.z - pos.z);
//     }
// 
//     public PosXYZ subtract(double x, double y, double z) {
//         return new PosXYZ(this.x - x, this.y - y, this.z - z);
//     }
// 
//     public PosXYZ multiply(double factor) {
//         return new PosXYZ(x * factor, y * factor, z * factor);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (obj instanceof PosXYZ) {
//             PosXYZ posObj = (PosXYZ) obj;
//             return posObj.x == x && posObj.y == y && posObj.z == z;
//         } else {
//             return false;
//         }
//     }
// 
//     public PosXYZ getCopy() {
//         return new PosXYZ(x, y, z);
//     }
// 
// }


// Path: src/main/java/craftedcart/smblevelworkshop/asset/Placeable.java
import craftedcart.smblevelworkshop.util.ITransformable;
import craftedcart.smblevelworkshop.util.LogHelper;
import craftedcart.smblevelworkshop.util.PosXYZ;
import craftedcart.smbworkshopexporter.placeables.*;
import org.jetbrains.annotations.NotNull;

    @Override
    public boolean canScale() {
        return getAsset().canScale();
    }

    public void setRotation(@NotNull PosXYZ rotation) {
        this.rotation = rotation;
    }

    @NotNull
    public PosXYZ getRotation() {
        return rotation;
    }

    public void setScale(@NotNull PosXYZ scale) {
        this.scale = scale;
    }

    @NotNull
    public PosXYZ getScale() {
        return scale;
    }

    public Placeable getCopy() {
        try {
            IAsset newAsset = asset.getCopy();
            Placeable newPlaceable = (Placeable) clone();
            newPlaceable.setAsset(newAsset);
            return newPlaceable;
        } catch (CloneNotSupportedException e) {
            LogHelper.error(getClass(), "Failed to clone Placeable");